Added Files

This commit is contained in:
Manmadedrummer
2026-01-01 19:26:27 -05:00
parent 088ce4faa7
commit 7a40c9a78f
10 changed files with 1154 additions and 0 deletions

View 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)

View 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)

View 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)

View 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);