mirror of
https://github.com/araxiaonline/Delves.git
synced 2026-06-13 03:42:24 -04:00
Added Files
This commit is contained in:
389
BOSS Scripts (Lua)/Mustafar/BobaFett.lua
Normal file
389
BOSS Scripts (Lua)/Mustafar/BobaFett.lua
Normal file
@@ -0,0 +1,389 @@
|
|||||||
|
--------------------------------------------------------------------------------
|
||||||
|
-- Boba Fett - Bounty Hunter Supreme (10-Man Raid Boss)
|
||||||
|
-- NPC ID: 9500637
|
||||||
|
-- Created by: Manmadedrummer | Star Wars Boss Collection
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
-- DESCRIPTION:
|
||||||
|
-- Legendary Mandalorian bounty hunter - 10-man raid encounter
|
||||||
|
-- Multi-phase gadget specialist with mobility and weapon variety
|
||||||
|
-- Inspired by SWTOR Bounty Hunter class and WotLK raid design
|
||||||
|
-- Solo boss - pure mechanical execution fight with mobility requirements
|
||||||
|
--
|
||||||
|
-- PHASE 1 (100% - 60%): Hunting Protocol
|
||||||
|
-- - Ranged combat with wrist rockets and flamethrower
|
||||||
|
-- - Explosive Shot, Electrified Net, Flamethrower
|
||||||
|
-- - Ice Tomb (Carbonite Freezing) every 60s
|
||||||
|
-- - Jump Attack repositioning every 30s
|
||||||
|
--
|
||||||
|
-- PHASE 2 (60% - 30%): Advanced Arsenal (ADDS abilities, keeps Phase 1)
|
||||||
|
-- - ADDS: Sonic Burst (stun explosion)
|
||||||
|
-- - ADDS: Focused Laser (channeled beam)
|
||||||
|
-- - ADDS: Incendiary Missile barrage
|
||||||
|
-- - All Phase 1 abilities continue
|
||||||
|
-- - Size increase to 1.15x
|
||||||
|
--
|
||||||
|
-- PHASE 3 (30% - 10%): Heavy Ordinance (ADDS abilities, keeps P1+P2)
|
||||||
|
-- - ADDS: Throw Dynamite (explosive zones)
|
||||||
|
-- - All Phase 1 + Phase 2 abilities continue
|
||||||
|
-- - Size increase to 1.2x
|
||||||
|
--
|
||||||
|
-- PHASE 4 (10% - 5%): Desperate Speed (ADDS Double Speed, keeps all)
|
||||||
|
-- - ADDS: Double Speed buff [ONE TIME at 10%]
|
||||||
|
-- - All Phase 1 + Phase 2 + Phase 3 abilities continue
|
||||||
|
-- - Size increase to 1.25x
|
||||||
|
--
|
||||||
|
-- ENRAGE (<5%): Mandalorian Berserk (ADDS Berserk, keeps all)
|
||||||
|
-- - ADDS: Berserk damage buff [ONE TIME at 5%]
|
||||||
|
-- - All previous abilities continue with Double Speed active
|
||||||
|
-- - Final burn phase
|
||||||
|
--
|
||||||
|
-- ABILITIES - PHASE 1:
|
||||||
|
-- - Explosive Shot: Heavy ranged damage (12-15s random CD)
|
||||||
|
-- - Electrified Net: Snare + damage (25-30s random CD)
|
||||||
|
-- - Flamethrower: Cone fire damage (30-35s random CD)
|
||||||
|
-- - Ice Tomb: Carbonite freeze on random player (60s CD)
|
||||||
|
-- - Jump Attack: Leap to random location (45s CD)
|
||||||
|
--
|
||||||
|
-- ABILITIES - PHASE 2 (60% HP) - ADDS TO PHASE 1:
|
||||||
|
-- - Sonic Burst: AOE stun explosion (40s CD) [NEW]
|
||||||
|
-- - Focused Laser: Channeled beam on random player (50s CD) [NEW]
|
||||||
|
-- - Incendiary Missile: Fire missile on random area (35s CD) [NEW]
|
||||||
|
-- - All 5 Phase 1 abilities continue
|
||||||
|
-- - Total: 8 abilities
|
||||||
|
--
|
||||||
|
-- ABILITIES - PHASE 3 (30% HP) - ADDS TO P1+P2:
|
||||||
|
-- - Throw Dynamite: Explosive zones (30s CD) [NEW]
|
||||||
|
-- - All 8 previous abilities continue
|
||||||
|
-- - Total: 9 abilities
|
||||||
|
--
|
||||||
|
-- ABILITIES - PHASE 4 (10% HP) - ADDS TO ALL:
|
||||||
|
-- - Double Speed: 2x speed buff [NEW, ONE TIME]
|
||||||
|
-- - All 9 previous abilities continue at 2x speed
|
||||||
|
-- - Total: 9 abilities + Double Speed buff
|
||||||
|
--
|
||||||
|
-- ENRAGE (<5% HP) - ADDS TO ALL:
|
||||||
|
-- - Berserk: Massive damage buff [NEW, ONE TIME]
|
||||||
|
-- - All 9 abilities + Double Speed + Berserk
|
||||||
|
-- - Total: 9 abilities + 2 permanent buffs
|
||||||
|
--
|
||||||
|
-- MECHANICS:
|
||||||
|
-- - GUIDLow-safe phase tracking
|
||||||
|
-- - Jump Attack repositioning creates unpredictable movement
|
||||||
|
-- - Ice Tomb requires dispel or breaks on damage
|
||||||
|
-- - Throw Dynamite creates danger zones
|
||||||
|
-- - Double Speed increases all ability frequency
|
||||||
|
-- - Berserk makes final burn critical
|
||||||
|
-- - No adds - pure boss mechanics
|
||||||
|
--
|
||||||
|
-- RETAIL-LIKE FEATURES:
|
||||||
|
-- - Mimiron-style jump repositioning
|
||||||
|
-- - Sindragosa-style Ice Tomb (Carbonite Freeze)
|
||||||
|
-- - XT-002-style Throw Dynamite (explosive zones)
|
||||||
|
-- - Progressive ability spam (9 abilities by Phase 3)
|
||||||
|
-- - Permanent buffs stack (Double Speed + Berserk)
|
||||||
|
-- - Mobility-based encounter (constant movement)
|
||||||
|
--
|
||||||
|
-- DIFFICULTY: 10-Man Raid Boss
|
||||||
|
-- LEVEL: 85
|
||||||
|
-- LOCATION: Star Wars Encounter Area
|
||||||
|
-- ESTIMATED DURATION: 8-10 minutes
|
||||||
|
-- HARD ENRAGE: Berserk at 5% HP
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
print("Star Wars Raid Boss - Boba Fett Loaded")
|
||||||
|
|
||||||
|
local BOSS_ID = 9500637
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
-- SPELLS - PHASE 1 (Hunting Protocol)
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
local SPELL_EXPLOSIVE_SHOT = 67985 -- Heavy ranged damage
|
||||||
|
local SPELL_ELECTRIFIED_NET = 35107 -- Snare + damage
|
||||||
|
local SPELL_FLAMETHROWER = 45467 -- Cone fire damage
|
||||||
|
local SPELL_ICE_TOMB = 16869 -- Carbonite freeze (Ice Tomb)
|
||||||
|
local SPELL_JUMP_ATTACK = 56113 -- Jump repositioning
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
-- SPELLS - PHASE 2 (Advanced Arsenal)
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
local SPELL_SONIC_BURST = 39052 -- Stun explosion
|
||||||
|
local SPELL_FOCUSED_LASER = 64683 -- Channeled beam
|
||||||
|
local SPELL_INCENDIARY_MISSILE = 66541 -- Fire missile
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
-- SPELLS - PHASE 3 (Heavy Ordinance)
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
local SPELL_THROW_DYNAMITE = 29579 -- Explosive zones
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
-- PHASE 4 & ENRAGE
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
local SPELL_DOUBLE_SPEED = 59737 -- 2x speed at 10%
|
||||||
|
local SPELL_BERSERK = 26662 -- Damage buff at 5%
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
-- TIMERS & COOLDOWNS (Retail 10-Man Tuned)
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
-- Phase 1 - Core rotation with breathing room
|
||||||
|
local EXPLOSIVE_SHOT_MIN = 12000 -- 12-15s (main filler)
|
||||||
|
local EXPLOSIVE_SHOT_MAX = 15000
|
||||||
|
local ELECTRIFIED_NET_MIN = 25000 -- 25-30s (cc/snare)
|
||||||
|
local ELECTRIFIED_NET_MAX = 30000
|
||||||
|
local FLAMETHROWER_MIN = 30000 -- 30-35s (cone damage)
|
||||||
|
local FLAMETHROWER_MAX = 35000
|
||||||
|
local ICE_TOMB_CD = 60000 -- 60s (major mechanic)
|
||||||
|
local JUMP_ATTACK_CD = 45000 -- 45s (repositioning)
|
||||||
|
|
||||||
|
-- Phase 2 - Additional complexity
|
||||||
|
local SONIC_BURST_CD = 40000 -- 40s (aoe stun)
|
||||||
|
local FOCUSED_LASER_CD = 50000 -- 50s (channeled beam)
|
||||||
|
local INCENDIARY_MISSILE_CD = 35000 -- 35s (fire damage)
|
||||||
|
|
||||||
|
-- Phase 3 - Heavy pressure
|
||||||
|
local THROW_DYNAMITE_CD = 30000 -- 30s (explosive zones)
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
-- THRESHOLDS
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
local TH_60 = 60
|
||||||
|
local TH_30 = 30
|
||||||
|
local TH_10 = 10
|
||||||
|
local TH_05 = 5
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
-- EVENT IDs
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
local EVENT_EXPLOSIVE_SHOT = 101
|
||||||
|
local EVENT_ELECTRIFIED_NET = 102
|
||||||
|
local EVENT_FLAMETHROWER = 103
|
||||||
|
local EVENT_ICE_TOMB = 104
|
||||||
|
local EVENT_JUMP_ATTACK = 105
|
||||||
|
|
||||||
|
local EVENT_SONIC_BURST = 201
|
||||||
|
local EVENT_FOCUSED_LASER = 202
|
||||||
|
local EVENT_INCENDIARY_MISSILE = 203
|
||||||
|
|
||||||
|
local EVENT_THROW_DYNAMITE = 301
|
||||||
|
|
||||||
|
local EVENT_PHASE_CHECK = 999
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
-- YELLS
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
local YELLS = {
|
||||||
|
AGGRO = "You're worth a lot to me dead. I might even take you alive if you beg.",
|
||||||
|
ICE_TOMB = "You're no good to me frozen... Actually, yes you are.",
|
||||||
|
JUMP_ATTACK = "Death from above!",
|
||||||
|
PHASE_2 = "Let's see how you handle a REAL bounty hunter!",
|
||||||
|
PHASE_3 = "No disintegrations? Fine. I'll just use everything else!",
|
||||||
|
DOUBLE_SPEED = "Time to finish this quickly!",
|
||||||
|
BERSERK = "You've made this personal. Time to collect!",
|
||||||
|
WIPE = "As you wish.",
|
||||||
|
DEATH = "Impossible... The Fett legacy... ends here..."
|
||||||
|
}
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
-- GUID-SAFE PHASE TABLE
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
local phases = {}
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
-- TARGET HELPERS
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
local function GetTank(self)
|
||||||
|
return self:GetVictim()
|
||||||
|
end
|
||||||
|
|
||||||
|
local function GetRandomPlayer(self)
|
||||||
|
return self:GetAITarget(0, true)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function GetRandomRanged(self)
|
||||||
|
local players = self:GetPlayersInRange(100)
|
||||||
|
local rangedPlayers = {}
|
||||||
|
for _, p in ipairs(players) do
|
||||||
|
if p:IsAlive() and self:GetDistance(p) > 10 then
|
||||||
|
table.insert(rangedPlayers, p)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if #rangedPlayers > 0 then
|
||||||
|
return rangedPlayers[math.random(#rangedPlayers)]
|
||||||
|
end
|
||||||
|
return GetRandomPlayer(self)
|
||||||
|
end
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
-- PHASE 1 ABILITIES
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
local function CastExplosiveShot(_, _, _, self)
|
||||||
|
if not self:IsInCombat() then return end
|
||||||
|
local target = GetRandomPlayer(self)
|
||||||
|
if target then self:CastSpell(target, SPELL_EXPLOSIVE_SHOT, true) end
|
||||||
|
|
||||||
|
-- Re-register with random timer
|
||||||
|
local next = math.random(EXPLOSIVE_SHOT_MIN, EXPLOSIVE_SHOT_MAX)
|
||||||
|
self:RegisterEvent(CastExplosiveShot, next, 1, EVENT_EXPLOSIVE_SHOT)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function CastElectrifiedNet(_, _, _, self)
|
||||||
|
if not self:IsInCombat() then return end
|
||||||
|
local target = GetRandomPlayer(self)
|
||||||
|
if target then self:CastSpell(target, SPELL_ELECTRIFIED_NET, true) end
|
||||||
|
|
||||||
|
-- Re-register with random timer
|
||||||
|
local next = math.random(ELECTRIFIED_NET_MIN, ELECTRIFIED_NET_MAX)
|
||||||
|
self:RegisterEvent(CastElectrifiedNet, next, 1, EVENT_ELECTRIFIED_NET)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function CastFlamethrower(_, _, _, self)
|
||||||
|
if not self:IsInCombat() then return end
|
||||||
|
local target = GetTank(self)
|
||||||
|
if target then self:CastSpell(target, SPELL_FLAMETHROWER, true) end
|
||||||
|
|
||||||
|
-- Re-register with random timer
|
||||||
|
local next = math.random(FLAMETHROWER_MIN, FLAMETHROWER_MAX)
|
||||||
|
self:RegisterEvent(CastFlamethrower, next, 1, EVENT_FLAMETHROWER)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function CastIceTomb(_, _, _, self)
|
||||||
|
if not self:IsInCombat() then return end
|
||||||
|
local target = GetRandomRanged(self)
|
||||||
|
if target then
|
||||||
|
self:SendUnitYell(YELLS.ICE_TOMB, 0)
|
||||||
|
self:CastSpell(target, SPELL_ICE_TOMB, true)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function CastJumpAttack(_, _, _, self)
|
||||||
|
if not self:IsInCombat() then return end
|
||||||
|
|
||||||
|
-- Jump to random player location
|
||||||
|
local target = GetRandomPlayer(self)
|
||||||
|
if target then
|
||||||
|
self:SendUnitYell(YELLS.JUMP_ATTACK, 0)
|
||||||
|
self:CastSpell(target, SPELL_JUMP_ATTACK, true)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
-- PHASE 2 ABILITIES
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
local function CastSonicBurst(_, _, _, self)
|
||||||
|
if not self:IsInCombat() then return end
|
||||||
|
self:CastSpell(self, SPELL_SONIC_BURST, true)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function CastFocusedLaser(_, _, _, self)
|
||||||
|
if not self:IsInCombat() then return end
|
||||||
|
local target = GetRandomPlayer(self)
|
||||||
|
if target then self:CastSpell(target, SPELL_FOCUSED_LASER, true) end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function CastIncendiaryMissile(_, _, _, self)
|
||||||
|
if not self:IsInCombat() then return end
|
||||||
|
local target = GetRandomPlayer(self)
|
||||||
|
if target then self:CastSpell(target, SPELL_INCENDIARY_MISSILE, true) end
|
||||||
|
end
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
-- PHASE 3 ABILITIES
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
local function CastThrowDynamite(_, _, _, self)
|
||||||
|
if not self:IsInCombat() then return end
|
||||||
|
local target = GetRandomPlayer(self)
|
||||||
|
if target then self:CastSpell(target, SPELL_THROW_DYNAMITE, true) end
|
||||||
|
end
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
-- PHASE CHECKER - GUIDLow-safe
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
local function PhaseCheck(eventId, _, _, self)
|
||||||
|
if not self:IsInCombat() or self:IsDead() then
|
||||||
|
self:RemoveEventById(eventId)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
local guid = self:GetGUIDLow()
|
||||||
|
phases[guid] = phases[guid] or {}
|
||||||
|
local p = phases[guid]
|
||||||
|
local hp = self:GetHealthPct()
|
||||||
|
|
||||||
|
if hp <= TH_05 and not p[5] then
|
||||||
|
p[5] = true
|
||||||
|
-- ENRAGE: Berserk
|
||||||
|
self:SendUnitYell(YELLS.BERSERK, 0)
|
||||||
|
|
||||||
|
-- Add Berserk buff (keeps all abilities + Double Speed)
|
||||||
|
self:CastSpell(self, SPELL_BERSERK, true)
|
||||||
|
|
||||||
|
-- Stop phase checking
|
||||||
|
self:RemoveEventById(eventId)
|
||||||
|
|
||||||
|
elseif hp <= TH_10 and not p[10] then
|
||||||
|
p[10] = true
|
||||||
|
-- PHASE 4: Desperate Speed
|
||||||
|
self:SendUnitYell(YELLS.DOUBLE_SPEED, 0)
|
||||||
|
self:SetScale(1.25) -- Size increase
|
||||||
|
|
||||||
|
-- Add Double Speed buff (keeps all 9 abilities)
|
||||||
|
self:CastSpell(self, SPELL_DOUBLE_SPEED, true)
|
||||||
|
|
||||||
|
elseif hp <= TH_30 and not p[30] then
|
||||||
|
p[30] = true
|
||||||
|
-- PHASE 3: Heavy Ordinance
|
||||||
|
self:SendUnitYell(YELLS.PHASE_3, 0)
|
||||||
|
self:SetScale(1.2) -- Size increase
|
||||||
|
|
||||||
|
-- ADD Phase 3 abilities (keeps all P1+P2)
|
||||||
|
self:RegisterEvent(CastThrowDynamite, THROW_DYNAMITE_CD, 0, EVENT_THROW_DYNAMITE)
|
||||||
|
|
||||||
|
elseif hp <= TH_60 and not p[60] then
|
||||||
|
p[60] = true
|
||||||
|
-- PHASE 2: Advanced Arsenal
|
||||||
|
self:SendUnitYell(YELLS.PHASE_2, 0)
|
||||||
|
self:SetScale(1.15) -- Size increase
|
||||||
|
|
||||||
|
-- ADD Phase 2 abilities (keeps all Phase 1)
|
||||||
|
self:RegisterEvent(CastSonicBurst, SONIC_BURST_CD, 0, EVENT_SONIC_BURST)
|
||||||
|
self:RegisterEvent(CastFocusedLaser, FOCUSED_LASER_CD, 0, EVENT_FOCUSED_LASER)
|
||||||
|
self:RegisterEvent(CastIncendiaryMissile, INCENDIARY_MISSILE_CD, 0, EVENT_INCENDIARY_MISSILE)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
-- COMBAT EVENTS
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
local function OnEnterCombat(event, creature, target)
|
||||||
|
creature:SendUnitYell(YELLS.AGGRO, 0)
|
||||||
|
|
||||||
|
local guid = creature:GetGUIDLow()
|
||||||
|
phases[guid] = {}
|
||||||
|
|
||||||
|
-- PHASE 1 - Start all basic abilities with random first timers
|
||||||
|
creature:RegisterEvent(CastExplosiveShot, math.random(EXPLOSIVE_SHOT_MIN, EXPLOSIVE_SHOT_MAX), 1, EVENT_EXPLOSIVE_SHOT)
|
||||||
|
creature:RegisterEvent(CastElectrifiedNet, math.random(ELECTRIFIED_NET_MIN, ELECTRIFIED_NET_MAX), 1, EVENT_ELECTRIFIED_NET)
|
||||||
|
creature:RegisterEvent(CastFlamethrower, math.random(FLAMETHROWER_MIN, FLAMETHROWER_MAX), 1, EVENT_FLAMETHROWER)
|
||||||
|
creature:RegisterEvent(CastIceTomb, ICE_TOMB_CD, 0, EVENT_ICE_TOMB)
|
||||||
|
creature:RegisterEvent(CastJumpAttack, JUMP_ATTACK_CD, 0, EVENT_JUMP_ATTACK)
|
||||||
|
|
||||||
|
-- Phase checker
|
||||||
|
creature:RegisterEvent(PhaseCheck, 1000, 0, EVENT_PHASE_CHECK)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function OnLeaveCombat(event, creature)
|
||||||
|
creature:RemoveEvents()
|
||||||
|
creature:SendUnitYell(YELLS.WIPE, 0)
|
||||||
|
creature:SetScale(1.0) -- Reset size
|
||||||
|
phases[creature:GetGUIDLow()] = nil
|
||||||
|
end
|
||||||
|
|
||||||
|
local function OnDied(event, creature, killer)
|
||||||
|
creature:RemoveEvents()
|
||||||
|
creature:SendUnitYell(YELLS.DEATH, 0)
|
||||||
|
creature:SetScale(1.0) -- Reset size
|
||||||
|
phases[creature:GetGUIDLow()] = nil
|
||||||
|
end
|
||||||
|
|
||||||
|
RegisterCreatureEvent(BOSS_ID, 1, OnEnterCombat)
|
||||||
|
RegisterCreatureEvent(BOSS_ID, 2, OnLeaveCombat)
|
||||||
|
RegisterCreatureEvent(BOSS_ID, 4, OnDied)
|
||||||
385
BOSS Scripts (Lua)/Mustafar/NarulFlameseeker.lua
Normal file
385
BOSS Scripts (Lua)/Mustafar/NarulFlameseeker.lua
Normal file
@@ -0,0 +1,385 @@
|
|||||||
|
--------------------------------------------------------------------------------
|
||||||
|
-- Narul the Flameseeker - Raid Boss
|
||||||
|
-- NPC ID: 888432
|
||||||
|
-- Original Script: Kreegoth (OwnedCore - ArcEmu)
|
||||||
|
-- Source: https://www.ownedcore.com/forums/world-of-warcraft/world-of-warcraft-emulator-servers/wow-emu-general-releases/166352-lua-sql-narul-flameseeker.html
|
||||||
|
-- AzerothCore Port & Enhancement: Manmadedrummer
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
-- DESCRIPTION:
|
||||||
|
-- Multi-phase warrior boss with Dancing Sword adds
|
||||||
|
-- Progressive transformation through 4 distinct phases
|
||||||
|
-- WotLK retail-style with additive abilities and controlled add waves
|
||||||
|
--
|
||||||
|
-- PHASE 1 (100% - 76%): Mortal Combat
|
||||||
|
-- - Basic warrior abilities and fire magic
|
||||||
|
-- - Fires aura, Smoke visual
|
||||||
|
-- - Behead, Disembowel, Dismember rotation
|
||||||
|
--
|
||||||
|
-- PHASE 2 (76% - 49%): Worgen Transformation (ADDS abilities, keeps Phase 1)
|
||||||
|
-- - Transforms to Worgen form + Fel Form visual
|
||||||
|
-- - ADDS: Deft Slice, Harrowing Slash, Upward Thrust
|
||||||
|
-- - ADDS: 3 Dancing Sword summons [ONE TIME]
|
||||||
|
-- - Size increase to 1.1x
|
||||||
|
-- - All Phase 1 abilities continue
|
||||||
|
--
|
||||||
|
-- PHASE 3 (49% - 20%): Shadow Ascension (ADDS abilities, keeps P1+P2)
|
||||||
|
-- - Shadow transformation visual
|
||||||
|
-- - ADDS: Shadow spell, Quake, Flame Blade, Quick Strike, Phalanx
|
||||||
|
-- - ADDS: 3 more Dancing Sword summons [ONE TIME]
|
||||||
|
-- - Size increase to 1.2x
|
||||||
|
-- - All Phase 1 + Phase 2 abilities continue
|
||||||
|
--
|
||||||
|
-- PHASE 4 (<20%): Final Awakening (ADDS abilities, keeps all)
|
||||||
|
-- - Final phase transformation
|
||||||
|
-- - ADDS: 3 final Dancing Sword summons [ONE TIME]
|
||||||
|
-- - Size increase to 1.3x
|
||||||
|
-- - ALL 13 abilities active simultaneously
|
||||||
|
--
|
||||||
|
-- ABILITIES - PHASE 1:
|
||||||
|
-- - Fires: Fire aura (constant)
|
||||||
|
-- - Smoke: Smoke visual (constant)
|
||||||
|
-- - Behead: Random player attack (8s CD)
|
||||||
|
-- - Disembowel: Self buff (6s CD)
|
||||||
|
-- - Dismember: Tank attack (5s CD)
|
||||||
|
--
|
||||||
|
-- ABILITIES - PHASE 2 (76% HP) - ADDS TO PHASE 1:
|
||||||
|
-- - Worgen Form: Transform visual [ONE TIME]
|
||||||
|
-- - Fel Form: Fel visual [ONE TIME]
|
||||||
|
-- - Deft Slice: Tank attack (11s CD) [NEW]
|
||||||
|
-- - Harrowing Slash: Tank attack (2s CD) [NEW]
|
||||||
|
-- - Upward Thrust: AOE knockup (7s CD) [NEW]
|
||||||
|
-- - Summon 3 Dancing Swords [ONE TIME]
|
||||||
|
--
|
||||||
|
-- ABILITIES - PHASE 3 (49% HP) - ADDS TO P1+P2:
|
||||||
|
-- - Shadow: Shadow visual [ONE TIME]
|
||||||
|
-- - Quake: AOE damage (6s CD) [NEW]
|
||||||
|
-- - Flame Blade: Tank fire attack (7s CD) [NEW]
|
||||||
|
-- - Quick Strike: Tank rapid attack (3s CD) [NEW]
|
||||||
|
-- - Phalanx: Defensive buff (7s CD) [NEW]
|
||||||
|
-- - Summon 3 Dancing Swords [ONE TIME]
|
||||||
|
--
|
||||||
|
-- ABILITIES - PHASE 4 (20% HP) - ADDS TO ALL:
|
||||||
|
-- - Final Phase: Transformation visual [ONE TIME]
|
||||||
|
-- - Summon 3 Dancing Swords [ONE TIME]
|
||||||
|
-- - All 13 abilities continue
|
||||||
|
--
|
||||||
|
-- ADDS:
|
||||||
|
-- - Dancing Sword (NPC 21093)
|
||||||
|
-- - Summoned in waves of 3 per phase
|
||||||
|
-- - Total possible: 9 swords (3 per phase at 76%, 49%, 20%)
|
||||||
|
-- - 60-second auto-despawn timer
|
||||||
|
--
|
||||||
|
-- MECHANICS:
|
||||||
|
-- - GUIDLow-safe phase tracking (one-time triggers only)
|
||||||
|
-- - Retail-style additive phases (abilities stack, not replace)
|
||||||
|
-- - Controlled add waves (3 swords per phase transition)
|
||||||
|
-- - Progressive size increase (1.0x → 1.1x → 1.2x → 1.3x)
|
||||||
|
-- - Progressive difficulty increase through ability spam
|
||||||
|
-- - No memory leaks (proper cleanup)
|
||||||
|
--
|
||||||
|
-- FIXES FROM ORIGINAL:
|
||||||
|
-- - Fixed infinite sword spawning bug (was spawning every 1s)
|
||||||
|
-- - Added GUIDLow-safe phase tracking
|
||||||
|
-- - Converted to additive phases (retail-style)
|
||||||
|
-- - Added explicit event IDs for safe removal
|
||||||
|
-- - Added proper memory cleanup
|
||||||
|
-- - Added size progression for visual feedback
|
||||||
|
--
|
||||||
|
-- RETAIL-LIKE FEATURES:
|
||||||
|
-- - Additive phase design (like Lich King, Sindragosa)
|
||||||
|
-- - Add management (Dancing Swords)
|
||||||
|
-- - Progressive transformation visuals
|
||||||
|
-- - Size scaling with phases
|
||||||
|
-- - Multiple simultaneous abilities by Phase 4
|
||||||
|
--
|
||||||
|
-- DIFFICULTY: Raid Boss
|
||||||
|
-- LEVEL: 80+
|
||||||
|
-- ESTIMATED DURATION: 6-8 minutes
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
print("Raid Boss - Narul the Flameseeker Loaded")
|
||||||
|
|
||||||
|
local BOSS_ID = 888432
|
||||||
|
local SWORD_ID = 21093
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
-- SPELLS - PHASE 1 (Mortal Combat)
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
local SPELL_FIRES = 42971
|
||||||
|
local SPELL_SMOKE = 42355
|
||||||
|
local SPELL_BEHEAD = 25814
|
||||||
|
local SPELL_DISEMBOWEL = 22924
|
||||||
|
local SPELL_DISMEMBER = 34073
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
-- SPELLS - PHASE 2 (Worgen Transformation)
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
local SPELL_FFORM = 36114
|
||||||
|
local SPELL_WORGEN = 32819
|
||||||
|
local SPELL_DEFTSLICE = 44533
|
||||||
|
local SPELL_HARROWINGSLASH = 36110
|
||||||
|
local SPELL_UPWARD_THRUST = 43547
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
-- SPELLS - PHASE 3 (Shadow Ascension)
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
local SPELL_SHADOW = 39490
|
||||||
|
local SPELL_QUAKE = 17742
|
||||||
|
local SPELL_FLAMEBLADE = 38917
|
||||||
|
local SPELL_PHALYNX = 41629
|
||||||
|
local SPELL_QUICKSTRIKE = 5271
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
-- SPELLS - PHASE 4 (Final Awakening)
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
local SPELL_FINAL_PHASE = 36876
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
-- THRESHOLDS
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
local TH_76 = 76 -- Phase 2: Worgen
|
||||||
|
local TH_49 = 49 -- Phase 3: Shadow
|
||||||
|
local TH_20 = 20 -- Phase 4: Final
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
-- EVENT IDs
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
local EVENT_FIRES = 101
|
||||||
|
local EVENT_SMOKE = 102
|
||||||
|
local EVENT_BEHEAD = 103
|
||||||
|
local EVENT_DISEMBOWEL = 104
|
||||||
|
local EVENT_DISMEMBER = 105
|
||||||
|
|
||||||
|
local EVENT_DEFTSLICE = 201
|
||||||
|
local EVENT_HARROWINGSLASH = 202
|
||||||
|
local EVENT_UPWARD_THRUST = 203
|
||||||
|
|
||||||
|
local EVENT_QUAKE = 301
|
||||||
|
local EVENT_FLAMEBLADE = 302
|
||||||
|
local EVENT_QUICKSTRIKE = 303
|
||||||
|
local EVENT_PHALYNX = 304
|
||||||
|
|
||||||
|
local EVENT_PHASE_CHECK = 999
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
-- YELLS
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
local YELLS = {
|
||||||
|
AGGRO = "In the face of death, Fear strikes the heart of even the strongest!",
|
||||||
|
PHASE_2 = "I was trained, No. I was Bred for this...You will not Defeat me!",
|
||||||
|
PHASE_3 = "Your hour of Doom Fast Approaches! Behold the true Vision that is Narul!",
|
||||||
|
PHASE_4 = "It is an insult that one such as you even challenged me...",
|
||||||
|
DEATH = "How...No..No...It cannot be"
|
||||||
|
}
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
-- GUID-SAFE PHASE TABLE
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
local phases = {}
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
-- TARGET HELPERS
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
local function GetTank(self)
|
||||||
|
return self:GetVictim()
|
||||||
|
end
|
||||||
|
|
||||||
|
local function GetRandomPlayer(self)
|
||||||
|
return self:GetAITarget(0, true)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function SpawnSwords(self)
|
||||||
|
local x, y, z = self:GetLocation()
|
||||||
|
for i = 1, 3 do
|
||||||
|
-- Spawn in triangular formation
|
||||||
|
local angle = (i - 1) * (math.pi * 2 / 3)
|
||||||
|
local dist = 8
|
||||||
|
local spawnX = x + math.cos(angle) * dist
|
||||||
|
local spawnY = y + math.sin(angle) * dist
|
||||||
|
self:SpawnCreature(SWORD_ID, spawnX, spawnY, z, 0, 3, 60000)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
-- PHASE 1 ABILITIES
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
local function CastFires(_, _, _, self)
|
||||||
|
if not self:IsInCombat() then return end
|
||||||
|
self:CastSpell(self, SPELL_FIRES, true)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function CastSmoke(_, _, _, self)
|
||||||
|
if not self:IsInCombat() then return end
|
||||||
|
self:CastSpell(self, SPELL_SMOKE, true)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function CastBehead(_, _, _, self)
|
||||||
|
if not self:IsInCombat() then return end
|
||||||
|
local target = GetRandomPlayer(self)
|
||||||
|
if target then self:CastSpell(target, SPELL_BEHEAD, true) end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function CastDisembowel(_, _, _, self)
|
||||||
|
if not self:IsInCombat() then return end
|
||||||
|
self:CastSpell(self, SPELL_DISEMBOWEL, true)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function CastDismember(_, _, _, self)
|
||||||
|
if not self:IsInCombat() then return end
|
||||||
|
local tank = GetTank(self)
|
||||||
|
if tank then self:CastSpell(tank, SPELL_DISMEMBER, true) end
|
||||||
|
end
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
-- PHASE 2 ABILITIES
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
local function CastDeftslice(_, _, _, self)
|
||||||
|
if not self:IsInCombat() then return end
|
||||||
|
local tank = GetTank(self)
|
||||||
|
if tank then self:CastSpell(tank, SPELL_DEFTSLICE, true) end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function CastHarrowingslash(_, _, _, self)
|
||||||
|
if not self:IsInCombat() then return end
|
||||||
|
local tank = GetTank(self)
|
||||||
|
if tank then self:CastSpell(tank, SPELL_HARROWINGSLASH, true) end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function CastUpwardThrust(_, _, _, self)
|
||||||
|
if not self:IsInCombat() then return end
|
||||||
|
self:CastSpell(self, SPELL_UPWARD_THRUST, true)
|
||||||
|
end
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
-- PHASE 3 ABILITIES
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
local function CastShadow(_, _, _, self)
|
||||||
|
if not self:IsInCombat() then return end
|
||||||
|
self:CastSpell(self, SPELL_SHADOW, true)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function CastQuake(_, _, _, self)
|
||||||
|
if not self:IsInCombat() then return end
|
||||||
|
self:CastSpell(self, SPELL_QUAKE, true)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function CastFlameblade(_, _, _, self)
|
||||||
|
if not self:IsInCombat() then return end
|
||||||
|
local tank = GetTank(self)
|
||||||
|
if tank then self:CastSpell(tank, SPELL_FLAMEBLADE, true) end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function CastPhalynx(_, _, _, self)
|
||||||
|
if not self:IsInCombat() then return end
|
||||||
|
self:CastSpell(self, SPELL_PHALYNX, true)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function CastQuickstrike(_, _, _, self)
|
||||||
|
if not self:IsInCombat() then return end
|
||||||
|
local target = GetTank(self)
|
||||||
|
if target then self:CastSpell(target, SPELL_QUICKSTRIKE, true) end
|
||||||
|
end
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
-- PHASE CHECKER - GUIDLow-safe
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
local function PhaseCheck(eventId, _, _, self)
|
||||||
|
if not self:IsInCombat() or self:IsDead() then
|
||||||
|
self:RemoveEventById(eventId)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
local guid = self:GetGUIDLow()
|
||||||
|
phases[guid] = phases[guid] or {}
|
||||||
|
local p = phases[guid]
|
||||||
|
local hp = self:GetHealthPct()
|
||||||
|
|
||||||
|
if hp <= TH_20 and not p[20] then
|
||||||
|
p[20] = true
|
||||||
|
-- PHASE 4: Final Awakening
|
||||||
|
self:SendUnitYell(YELLS.PHASE_4, 0)
|
||||||
|
self:SetScale(1.3) -- Final size increase
|
||||||
|
|
||||||
|
-- Final transformation
|
||||||
|
self:CastSpell(self, SPELL_FINAL_PHASE, true)
|
||||||
|
|
||||||
|
-- Spawn 3 final swords (ONE TIME)
|
||||||
|
SpawnSwords(self)
|
||||||
|
|
||||||
|
-- Stop phase checking - all abilities continue
|
||||||
|
self:RemoveEventById(eventId)
|
||||||
|
|
||||||
|
elseif hp <= TH_49 and not p[49] then
|
||||||
|
p[49] = true
|
||||||
|
-- PHASE 3: Shadow Ascension
|
||||||
|
self:SendUnitYell(YELLS.PHASE_3, 0)
|
||||||
|
self:SetScale(1.2) -- Size increase
|
||||||
|
|
||||||
|
-- Shadow transformation
|
||||||
|
self:CastSpell(self, SPELL_SHADOW, true)
|
||||||
|
|
||||||
|
-- ADD Phase 3 abilities (keeps all previous)
|
||||||
|
self:RegisterEvent(CastQuake, 6000, 0, EVENT_QUAKE)
|
||||||
|
self:RegisterEvent(CastFlameblade, 7000, 0, EVENT_FLAMEBLADE)
|
||||||
|
self:RegisterEvent(CastQuickstrike, 3000, 0, EVENT_QUICKSTRIKE)
|
||||||
|
self:RegisterEvent(CastPhalynx, 7000, 0, EVENT_PHALYNX)
|
||||||
|
|
||||||
|
-- Spawn 3 swords (ONE TIME)
|
||||||
|
SpawnSwords(self)
|
||||||
|
|
||||||
|
elseif hp <= TH_76 and not p[76] then
|
||||||
|
p[76] = true
|
||||||
|
-- PHASE 2: Worgen Transformation
|
||||||
|
self:SendUnitYell(YELLS.PHASE_2, 0)
|
||||||
|
self:SetScale(1.1) -- Size increase
|
||||||
|
|
||||||
|
-- Transform to Worgen + Fel Form
|
||||||
|
self:CastSpell(self, SPELL_WORGEN, true)
|
||||||
|
self:CastSpell(self, SPELL_FFORM, true)
|
||||||
|
|
||||||
|
-- ADD Phase 2 abilities (keeps all Phase 1)
|
||||||
|
self:RegisterEvent(CastDeftslice, 11000, 0, EVENT_DEFTSLICE)
|
||||||
|
self:RegisterEvent(CastHarrowingslash, 2000, 0, EVENT_HARROWINGSLASH)
|
||||||
|
self:RegisterEvent(CastUpwardThrust, 7000, 0, EVENT_UPWARD_THRUST)
|
||||||
|
|
||||||
|
-- Spawn 3 swords (ONE TIME)
|
||||||
|
SpawnSwords(self)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
-- COMBAT EVENTS
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
local function OnEnterCombat(event, creature, target)
|
||||||
|
creature:SendUnitYell(YELLS.AGGRO, 0)
|
||||||
|
|
||||||
|
local guid = creature:GetGUIDLow()
|
||||||
|
phases[guid] = {}
|
||||||
|
|
||||||
|
-- PHASE 1 - Start initial abilities
|
||||||
|
creature:RegisterEvent(CastFires, 12000, 0, EVENT_FIRES)
|
||||||
|
creature:RegisterEvent(CastSmoke, 3000, 0, EVENT_SMOKE)
|
||||||
|
creature:RegisterEvent(CastBehead, 8000, 0, EVENT_BEHEAD)
|
||||||
|
creature:RegisterEvent(CastDisembowel, 6000, 0, EVENT_DISEMBOWEL)
|
||||||
|
creature:RegisterEvent(CastDismember, 5000, 0, EVENT_DISMEMBER)
|
||||||
|
|
||||||
|
-- Phase checker
|
||||||
|
creature:RegisterEvent(PhaseCheck, 1000, 0, EVENT_PHASE_CHECK)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function OnLeaveCombat(event, creature)
|
||||||
|
creature:RemoveEvents()
|
||||||
|
creature:SetScale(1.0) -- Reset size
|
||||||
|
phases[creature:GetGUIDLow()] = nil
|
||||||
|
end
|
||||||
|
|
||||||
|
local function OnDied(event, creature, killer)
|
||||||
|
creature:RemoveEvents()
|
||||||
|
creature:SendUnitYell(YELLS.DEATH, 0)
|
||||||
|
creature:SetScale(1.0) -- Reset size
|
||||||
|
phases[creature:GetGUIDLow()] = nil
|
||||||
|
end
|
||||||
|
|
||||||
|
RegisterCreatureEvent(BOSS_ID, 1, OnEnterCombat)
|
||||||
|
RegisterCreatureEvent(BOSS_ID, 2, OnLeaveCombat)
|
||||||
|
RegisterCreatureEvent(BOSS_ID, 4, OnDied)
|
||||||
371
BOSS Scripts (Lua)/Mustafar/Vader.lua
Normal file
371
BOSS Scripts (Lua)/Mustafar/Vader.lua
Normal file
@@ -0,0 +1,371 @@
|
|||||||
|
--------------------------------------------------------------------------------
|
||||||
|
-- Darth Vader - Star Destroyer Bridge (10-Man Raid Boss)
|
||||||
|
-- NPC ID: 9500644
|
||||||
|
-- Created by: Manmadedrummer | Star Wars Boss Collection
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
-- DESCRIPTION:
|
||||||
|
-- Dark Lord of the Sith - 10-man raid encounter inspired by WotLK design philosophy
|
||||||
|
-- Multi-phase Dark Side channeler with Force abilities and lightsaber combat
|
||||||
|
-- Combines elements of Arthas, Sindragosa, and Blood Queen Lana'thel encounter design
|
||||||
|
-- SOLO BOSS - No adds or summons, pure mechanical execution fight
|
||||||
|
--
|
||||||
|
-- PHASE 1 (100% - 50%): Lightsaber Combat & Basic Force Powers
|
||||||
|
-- - Cleave spam, Chain Lightning, periodic Thunderstorm
|
||||||
|
-- - Force Choke every 60s (Death Grip on FARTHEST player)
|
||||||
|
-- - Random Shadow Fury fear zones
|
||||||
|
--
|
||||||
|
-- PHASE 2 (50% - 25%): Dark Side Unleashed (ADDS abilities, keeps all Phase 1)
|
||||||
|
-- - Increased size/intensity
|
||||||
|
-- - ADDS Force Blast (knockback mechanic every 30s)
|
||||||
|
-- - ADDS Force Lightning Storm (raid-wide damage every 50s)
|
||||||
|
-- - All Phase 1 abilities continue
|
||||||
|
--
|
||||||
|
-- PHASE 3 (25% - 5%): Imperial Fury (ADDS abilities, keeps all previous)
|
||||||
|
-- - Final stand with maximum aggression
|
||||||
|
-- - ADDS Death Grip on random players (25s CD)
|
||||||
|
-- - ADDS Drain Life channels (60s CD - healing Vader while damaging target)
|
||||||
|
-- - All Phase 1 + Phase 2 abilities continue
|
||||||
|
--
|
||||||
|
-- ENRAGE (<5%): Permanent Frenzy until death (keeps ALL abilities)
|
||||||
|
--
|
||||||
|
-- ABILITIES - PHASE 1:
|
||||||
|
-- - Cleave: Frontal cone damage (30-60s random)
|
||||||
|
-- - Chain Lightning: Chain damage on current target (45s CD)
|
||||||
|
-- - Thunderstorm: AOE nature damage (30-60s random)
|
||||||
|
-- - Shadow Fury: Fear zone on tank position (15-60s random)
|
||||||
|
-- - Force Choke: Death Grip on farthest player (60s CD)
|
||||||
|
--
|
||||||
|
-- ABILITIES - PHASE 2 (50% HP) - ADDS TO PHASE 1:
|
||||||
|
-- - Force Blast: Knockback all nearby players (30s CD) [NEW]
|
||||||
|
-- - Force Lightning Storm: Raid-wide shadow damage over 6s (50s CD) [NEW]
|
||||||
|
-- - Size increase to 1.15x
|
||||||
|
-- - All Phase 1 abilities continue at same frequency
|
||||||
|
--
|
||||||
|
-- ABILITIES - PHASE 3 (25% HP) - ADDS TO PHASE 1+2:
|
||||||
|
-- - Death Grip: Pulls random ranged player to melee (25s CD) [NEW]
|
||||||
|
-- - Drain Life: Channels healing on Vader while damaging target (60s CD) [NEW]
|
||||||
|
-- - Size increase to 1.3x
|
||||||
|
-- - All Phase 1 + Phase 2 abilities continue
|
||||||
|
--
|
||||||
|
-- ENRAGE (<5% HP) - ADDS TO ALL:
|
||||||
|
-- - Permanent Frenzy buff (massive damage increase) [NEW]
|
||||||
|
-- - Does NOT fade until Vader dies
|
||||||
|
-- - All previous abilities continue during Frenzy
|
||||||
|
-- - Final burn phase
|
||||||
|
--
|
||||||
|
-- MECHANICS:
|
||||||
|
-- - GUIDLow-safe phase tracking (supports multiple spawns in testing)
|
||||||
|
-- - Force Choke (Death Grip) targets FARTHEST player
|
||||||
|
-- - Death Grip disrupts ranged safety
|
||||||
|
-- - Drain Life creates healing pressure windows
|
||||||
|
-- - Permanent Frenzy creates final burn phase
|
||||||
|
-- - Pure execution fight - no add management
|
||||||
|
--
|
||||||
|
-- RETAIL-LIKE FEATURES:
|
||||||
|
-- - Sindragosa-style Force Choke (grip farthest player)
|
||||||
|
-- - Blood Queen-style size increases
|
||||||
|
-- - Arthas-style phase transitions
|
||||||
|
-- - Permanent enrage mechanic (like Brutallus)
|
||||||
|
-- - Proper tank-and-spank with periodic raid damage
|
||||||
|
-- - Movement mechanics (Force Blast, Death Grip)
|
||||||
|
-- - No add management - pure boss mechanics
|
||||||
|
--
|
||||||
|
-- DIFFICULTY: 10-Man Raid Boss
|
||||||
|
-- LEVEL: 83
|
||||||
|
-- HARD ENRAGE: Permanent Frenzy at 5% HP
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
print("Star Wars Raid Boss - Darth Vader Loaded")
|
||||||
|
|
||||||
|
local BOSS_ID = 9500644
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
-- SPELLS - PHASE 1 (Lightsaber Combat)
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
local CLEAVE = 30014 -- Frontal cone
|
||||||
|
local SHADOWFURY = 45270 -- Fear zone
|
||||||
|
local THUNDERSTORM = 59154 -- AOE nature damage
|
||||||
|
local CHAIN_LIGHTNING = 28167 -- Chain spell
|
||||||
|
local DEATH_GRIP = 61094 -- Force Choke = Death Grip
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
-- SPELLS - PHASE 2 (Dark Side Unleashed)
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
local FORCE_BLAST = 39039 -- Knockback (was Force Push)
|
||||||
|
local LIGHTNING_STORM = 43648 -- Raid-wide damage over time
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
-- SPELLS - PHASE 3 (Imperial Fury)
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
local DRAIN_LIFE = 64159 -- Healing channel
|
||||||
|
local FRENZY = 24318 -- Permanent enrage at 5%
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
-- TIMERS & COOLDOWNS
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
-- Phase 1
|
||||||
|
local CLEAVE_MIN = 30000
|
||||||
|
local CLEAVE_MAX = 60000
|
||||||
|
local SHADOWFURY_MIN = 15000
|
||||||
|
local SHADOWFURY_MAX = 60000
|
||||||
|
local THUNDER_MIN = 30000
|
||||||
|
local THUNDER_MAX = 60000
|
||||||
|
local CHAIN_LIGHT_CD = 45000
|
||||||
|
local FORCE_CHOKE_CD_P1 = 60000
|
||||||
|
|
||||||
|
-- Phase 2
|
||||||
|
local FORCE_BLAST_CD = 30000
|
||||||
|
local LIGHTNING_STORM_CD = 50000
|
||||||
|
|
||||||
|
-- Phase 3
|
||||||
|
local DEATH_GRIP_CD = 25000
|
||||||
|
local DRAIN_LIFE_CD = 60000
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
-- THRESHOLDS
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
local TH_75 = 75
|
||||||
|
local TH_50 = 50
|
||||||
|
local TH_25 = 25
|
||||||
|
local TH_05 = 5
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
-- EVENT IDs
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
local EVENT_CLEAVE = 101
|
||||||
|
local EVENT_SHADOWFURY = 102
|
||||||
|
local EVENT_THUNDERSTORM = 103
|
||||||
|
local EVENT_CHAIN_LIGHT = 104
|
||||||
|
local EVENT_FORCE_CHOKE = 105
|
||||||
|
|
||||||
|
local EVENT_FORCE_BLAST = 201
|
||||||
|
local EVENT_LIGHTNING_STORM = 202
|
||||||
|
|
||||||
|
local EVENT_DEATH_GRIP = 301
|
||||||
|
local EVENT_DRAIN_LIFE = 302
|
||||||
|
|
||||||
|
local EVENT_PHASE_CHECK = 999
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
-- YELLS
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
local YELLS = {
|
||||||
|
AGGRO = "I find your lack of faith disturbing!",
|
||||||
|
FORCE_CHOKE = "Your feeble skills are no match for the power of the Dark Side!",
|
||||||
|
PHASE_2 = "You have failed me for the last time! NOW YOU WILL KNOW THE POWER OF THE DARK SIDE!",
|
||||||
|
PHASE_3 = "The circle is now complete. Your destruction is inevitable!",
|
||||||
|
FORCE_BLAST = "The Force is strong with me!",
|
||||||
|
LIGHTNING_STORM = "Unlimited POWER!",
|
||||||
|
DEATH_GRIP_PULL = "Come to me!",
|
||||||
|
DRAIN_LIFE = "I will drain your very essence!",
|
||||||
|
FRENZY = "NOW YOU WILL EXPERIENCE THE FULL POWER OF THE DARK SIDE!",
|
||||||
|
PHASE_75 = "Your resistance is impressive... but futile!",
|
||||||
|
PHASE_10 = "You cannot win. The Dark Side is too strong!",
|
||||||
|
WIPE = "All too easy...",
|
||||||
|
DEATH = "You have won... nothing. The Empire will endure... always..."
|
||||||
|
}
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
-- GUID-SAFE PHASE TABLE
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
local phases = {}
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
-- TARGET HELPERS
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
local function GetTank(self)
|
||||||
|
return self:GetVictim()
|
||||||
|
end
|
||||||
|
|
||||||
|
local function GetFarthestPlayer(self)
|
||||||
|
return self:GetAITarget(4, true) or self:GetAITarget(0, true)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function GetRandomRanged(self)
|
||||||
|
-- Get a random player not in melee range
|
||||||
|
local players = self:GetPlayersInRange(100)
|
||||||
|
local rangedPlayers = {}
|
||||||
|
for _, p in ipairs(players) do
|
||||||
|
if p:IsAlive() and self:GetDistance(p) > 10 then
|
||||||
|
table.insert(rangedPlayers, p)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if #rangedPlayers > 0 then
|
||||||
|
return rangedPlayers[math.random(#rangedPlayers)]
|
||||||
|
end
|
||||||
|
return self:GetAITarget(0, true)
|
||||||
|
end
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
-- PHASE 1 ABILITIES
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
local function CastCleave(_, _, _, self)
|
||||||
|
if not self:IsInCombat() then return end
|
||||||
|
local t = GetTank(self)
|
||||||
|
if t then self:CastSpell(t, CLEAVE, true) end
|
||||||
|
|
||||||
|
-- Re-register with random timer
|
||||||
|
local next = math.random(CLEAVE_MIN, CLEAVE_MAX)
|
||||||
|
self:RegisterEvent(CastCleave, next, 1, EVENT_CLEAVE)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function CastShadowfury(_, _, _, self)
|
||||||
|
if not self:IsInCombat() then return end
|
||||||
|
local t = GetTank(self)
|
||||||
|
if t then self:CastSpell(t, SHADOWFURY, true) end
|
||||||
|
|
||||||
|
-- Re-register with random timer
|
||||||
|
local next = math.random(SHADOWFURY_MIN, SHADOWFURY_MAX)
|
||||||
|
self:RegisterEvent(CastShadowfury, next, 1, EVENT_SHADOWFURY)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function CastThunderstorm(_, _, _, self)
|
||||||
|
if not self:IsInCombat() then return end
|
||||||
|
self:CastSpell(self, THUNDERSTORM, true)
|
||||||
|
|
||||||
|
-- Re-register with random timer
|
||||||
|
local next = math.random(THUNDER_MIN, THUNDER_MAX)
|
||||||
|
self:RegisterEvent(CastThunderstorm, next, 1, EVENT_THUNDERSTORM)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function CastChainLightning(_, _, _, self)
|
||||||
|
if not self:IsInCombat() then return end
|
||||||
|
local t = GetTank(self)
|
||||||
|
if t then self:CastSpell(t, CHAIN_LIGHTNING, true) end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- FORCE CHOKE - Death Grip on farthest player
|
||||||
|
local function CastForceChoke(_, _, _, self)
|
||||||
|
if not self:IsInCombat() then return end
|
||||||
|
|
||||||
|
local target = GetFarthestPlayer(self)
|
||||||
|
if target and target:IsAlive() then
|
||||||
|
self:SendUnitYell(YELLS.FORCE_CHOKE, 0)
|
||||||
|
self:CastSpell(target, DEATH_GRIP, true)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
-- PHASE 2 ABILITIES (50% HP)
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
local function CastForceBlast(_, _, _, self)
|
||||||
|
if not self:IsInCombat() then return end
|
||||||
|
self:SendUnitYell(YELLS.FORCE_BLAST, 0)
|
||||||
|
self:CastSpell(self, FORCE_BLAST, true) -- AOE knockback
|
||||||
|
end
|
||||||
|
|
||||||
|
local function CastLightningStorm(_, _, _, self)
|
||||||
|
if not self:IsInCombat() then return end
|
||||||
|
self:SendUnitYell(YELLS.LIGHTNING_STORM, 0)
|
||||||
|
self:CastSpell(self, LIGHTNING_STORM, true) -- Raid-wide DOT
|
||||||
|
end
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
-- PHASE 3 ABILITIES (25% HP)
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
local function CastDeathGrip(_, _, _, self)
|
||||||
|
if not self:IsInCombat() then return end
|
||||||
|
|
||||||
|
local target = GetRandomRanged(self)
|
||||||
|
if target then
|
||||||
|
self:SendUnitYell(YELLS.DEATH_GRIP_PULL, 0)
|
||||||
|
self:CastSpell(target, DEATH_GRIP, true)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function CastDrainLife(_, _, _, self)
|
||||||
|
if not self:IsInCombat() then return end
|
||||||
|
self:SendUnitYell(YELLS.DRAIN_LIFE, 0)
|
||||||
|
|
||||||
|
-- Cast Drain Life on random player (heals Vader, damages target)
|
||||||
|
local target = self:GetAITarget(0, true)
|
||||||
|
if target then
|
||||||
|
self:CastSpell(target, DRAIN_LIFE, true)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
-- PHASE CHECKER - GUIDLow-safe
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
local function PhaseCheck(eventId, _, _, self)
|
||||||
|
if not self:IsInCombat() or self:IsDead() then
|
||||||
|
self:RemoveEventById(eventId)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
local guid = self:GetGUIDLow()
|
||||||
|
phases[guid] = phases[guid] or {}
|
||||||
|
local p = phases[guid]
|
||||||
|
local hp = self:GetHealthPct()
|
||||||
|
|
||||||
|
if hp <= TH_05 and not p[5] then
|
||||||
|
p[5] = true
|
||||||
|
-- PERMANENT FRENZY - does not fade until death
|
||||||
|
self:SendUnitYell(YELLS.FRENZY, 0)
|
||||||
|
self:CastSpell(self, FRENZY, true)
|
||||||
|
self:CastSpell(self, THUNDERSTORM, true) -- Immediate storm
|
||||||
|
self:RemoveEventById(eventId) -- Stop phase checking
|
||||||
|
|
||||||
|
elseif hp <= TH_25 and not p[25] then
|
||||||
|
p[25] = true
|
||||||
|
-- PHASE 3: Imperial Fury
|
||||||
|
self:SendUnitYell(YELLS.PHASE_3, 0)
|
||||||
|
self:SetScale(1.3) -- Increase size
|
||||||
|
|
||||||
|
-- Start Phase 3 abilities
|
||||||
|
self:RegisterEvent(CastDeathGrip, DEATH_GRIP_CD, 0, EVENT_DEATH_GRIP)
|
||||||
|
self:RegisterEvent(CastDrainLife, DRAIN_LIFE_CD, 0, EVENT_DRAIN_LIFE)
|
||||||
|
|
||||||
|
elseif hp <= TH_50 and not p[50] then
|
||||||
|
p[50] = true
|
||||||
|
-- PHASE 2: Dark Side Unleashed
|
||||||
|
self:SendUnitYell(YELLS.PHASE_2, 0)
|
||||||
|
self:SetScale(1.15) -- Slightly larger
|
||||||
|
|
||||||
|
-- ADD Phase 2 abilities (keeps all Phase 1 abilities)
|
||||||
|
self:RegisterEvent(CastForceBlast, FORCE_BLAST_CD, 0, EVENT_FORCE_BLAST)
|
||||||
|
self:RegisterEvent(CastLightningStorm, LIGHTNING_STORM_CD, 0, EVENT_LIGHTNING_STORM)
|
||||||
|
|
||||||
|
elseif hp <= TH_75 and not p[75] then
|
||||||
|
p[75] = true
|
||||||
|
self:SendUnitYell(YELLS.PHASE_75, 0)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
-- COMBAT EVENTS
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
local function OnEnterCombat(event, creature, target)
|
||||||
|
creature:SendUnitYell(YELLS.AGGRO, 0)
|
||||||
|
|
||||||
|
local guid = creature:GetGUIDLow()
|
||||||
|
phases[guid] = {}
|
||||||
|
|
||||||
|
-- PHASE 1 - Start all basic abilities with random first timers
|
||||||
|
creature:RegisterEvent(CastCleave, math.random(CLEAVE_MIN, CLEAVE_MAX), 1, EVENT_CLEAVE)
|
||||||
|
creature:RegisterEvent(CastShadowfury, math.random(SHADOWFURY_MIN, SHADOWFURY_MAX), 1, EVENT_SHADOWFURY)
|
||||||
|
creature:RegisterEvent(CastThunderstorm, math.random(THUNDER_MIN, THUNDER_MAX), 1, EVENT_THUNDERSTORM)
|
||||||
|
creature:RegisterEvent(CastChainLightning, CHAIN_LIGHT_CD, 0, EVENT_CHAIN_LIGHT)
|
||||||
|
creature:RegisterEvent(CastForceChoke, FORCE_CHOKE_CD_P1, 0, EVENT_FORCE_CHOKE)
|
||||||
|
|
||||||
|
-- Phase checker
|
||||||
|
creature:RegisterEvent(PhaseCheck, 1000, 0, EVENT_PHASE_CHECK)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function OnLeaveCombat(event, creature)
|
||||||
|
creature:RemoveEvents()
|
||||||
|
creature:SendUnitYell(YELLS.WIPE, 0)
|
||||||
|
creature:SetScale(1.0) -- Reset size
|
||||||
|
phases[creature:GetGUIDLow()] = nil
|
||||||
|
end
|
||||||
|
|
||||||
|
local function OnDied(event, creature, killer)
|
||||||
|
creature:RemoveEvents()
|
||||||
|
creature:SendUnitYell(YELLS.DEATH, 0)
|
||||||
|
creature:SetScale(1.0) -- Reset size
|
||||||
|
phases[creature:GetGUIDLow()] = nil
|
||||||
|
end
|
||||||
|
|
||||||
|
RegisterCreatureEvent(BOSS_ID, 1, OnEnterCombat)
|
||||||
|
RegisterCreatureEvent(BOSS_ID, 2, OnLeaveCombat)
|
||||||
|
RegisterCreatureEvent(BOSS_ID, 4, OnDied)
|
||||||
9
Server SQL/creature_model_info_insert.sql
Normal file
9
Server SQL/creature_model_info_insert.sql
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
INSERT INTO `creature_model_info` (`DisplayID`, `BoundingRadius`, `CombatReach`, `Gender`, `DisplayID_Other_Gender`) VALUES (34076, 1, 1, 2, 0);
|
||||||
|
INSERT INTO `creature_model_info` (`DisplayID`, `BoundingRadius`, `CombatReach`, `Gender`, `DisplayID_Other_Gender`) VALUES (34077, 1, 1, 2, 0);
|
||||||
|
INSERT INTO `creature_model_info` (`DisplayID`, `BoundingRadius`, `CombatReach`, `Gender`, `DisplayID_Other_Gender`) VALUES (34078, 1, 1, 2, 0);
|
||||||
|
INSERT INTO `creature_model_info` (`DisplayID`, `BoundingRadius`, `CombatReach`, `Gender`, `DisplayID_Other_Gender`) VALUES (34079, 1, 1, 2, 0);
|
||||||
|
INSERT INTO `creature_model_info` (`DisplayID`, `BoundingRadius`, `CombatReach`, `Gender`, `DisplayID_Other_Gender`) VALUES (34080, 1, 1, 2, 0);
|
||||||
|
INSERT INTO `creature_model_info` (`DisplayID`, `BoundingRadius`, `CombatReach`, `Gender`, `DisplayID_Other_Gender`) VALUES (34081, 1, 1, 2, 0);
|
||||||
|
INSERT INTO `creature_model_info` (`DisplayID`, `BoundingRadius`, `CombatReach`, `Gender`, `DisplayID_Other_Gender`) VALUES (34082, 1, 1, 2, 0);
|
||||||
|
INSERT INTO `creature_model_info` (`DisplayID`, `BoundingRadius`, `CombatReach`, `Gender`, `DisplayID_Other_Gender`) VALUES (34083, 1, 1, 2, 0);
|
||||||
|
INSERT INTO `creature_model_info` (`DisplayID`, `BoundingRadius`, `CombatReach`, `Gender`, `DisplayID_Other_Gender`) VALUES (34084, 1, 1, 2, 0);
|
||||||
Reference in New Issue
Block a user