Compare commits

...

128 Commits

Author SHA1 Message Date
github-actions[bot] 482d348f50 chore(DB): import pending files
Referenced commit(s): 51f3ebebc0
2026-05-31 13:11:37 +00:00
Andrew 51f3ebebc0 feat(Scripts/Commands): default battle id to Wintergrasp when omitted (#26035)
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-31 10:10:27 -03:00
github-actions[bot] 1b026d2e0b chore(DB): import pending files
Referenced commit(s): 87a92873de
2026-05-31 08:04:36 +00:00
MacWarrior 87a92873de fix(DB/locales): Update frFR item name & description (#23745)
Co-authored-by: Ludwig <sudlud@users.noreply.github.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-31 10:03:26 +02:00
Andrew f8ceac0468 fix(Core/Battlefield): collapse BfCapturePoint::ActivePlayers to single set (#26034)
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-30 21:20:20 -03:00
Andrew 919eefef7e refactor(Core/Battlefield): fire OnBattlefieldWarEnd before OnBattleEnd (#26030)
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-30 19:45:51 -03:00
github-actions[bot] 2b932e5cb0 chore(DB): import pending files
Referenced commit(s): c5d44c54ff
2026-05-30 18:32:14 +00:00
MacWarrior d67cf56812 fix(DB/locales): Update esES item name & description (#23747)
Co-authored-by: Francesco Borzì <borzifrancesco@gmail.com>
Co-authored-by: Ludwig <sudlud@users.noreply.github.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-30 20:31:12 +02:00
MacWarrior c5d44c54ff fix(DB/locales): Update esMX item name & description (#23748)
Co-authored-by: Francesco Borzì <borzifrancesco@gmail.com>
Co-authored-by: Ludwig <sudlud@users.noreply.github.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-30 20:30:56 +02:00
github-actions[bot] f0808fba8b chore(DB): import pending files
Referenced commit(s): 046dd2e89b
2026-05-30 18:29:18 +00:00
MacWarrior 046dd2e89b fix(DB/locales): Update koKR item name & description (#23749)
Co-authored-by: Ludwig <sudlud@users.noreply.github.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-30 20:28:05 +02:00
github-actions[bot] ec3cba8c1d chore(DB): import pending files
Referenced commit(s): 111ebf715e
2026-05-30 18:09:50 +00:00
MacWarrior 111ebf715e fix(DB/locales): Update zhCN item name & description (#23751)
Co-authored-by: Ludwig <sudlud@users.noreply.github.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-30 20:08:35 +02:00
github-actions[bot] 942751c775 chore(DB): import pending files
Referenced commit(s): efb8fa54a4
2026-05-30 14:24:49 +00:00
MacWarrior efb8fa54a4 fix(DB/locale): Update zhTW item name & description (#23752)
Co-authored-by: Ludwig <sudlud@users.noreply.github.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-30 16:23:37 +02:00
github-actions[bot] c914ef3233 chore(DB): import pending files
Referenced commit(s): f009288a29
2026-05-30 13:38:23 +00:00
MacWarrior f009288a29 fix(DB/locales): Update ruRU item name & description (#23750)
Co-authored-by: Ryan Turner <16946913+TheSCREWEDSoftware@users.noreply.github.com>
Co-authored-by: Ludwig <sudlud@users.noreply.github.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-30 15:37:09 +02:00
github-actions[bot] df16ebd894 chore(DB): import pending files
Referenced commit(s): 5f053117d5
2026-05-30 11:23:53 +00:00
MacWarrior 87e0aa4ff6 fix(DB/locales): Update deDE item name & description (#23746)
Co-authored-by: Ludwig <sudlud@users.noreply.github.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-30 13:17:52 +02:00
sogladev 5f053117d5 fix(Scripts/Spells): feast spells refer to invoker's name (#26021) 2026-05-30 13:16:36 +02:00
github-actions[bot] 46be8a5080 chore(DB): import pending files
Referenced commit(s): f7019beda4
2026-05-30 11:14:15 +00:00
sogladev dab09941a5 fix(DB/SpellCone): implement spell_cone table and radius calculation (#26024) 2026-05-30 08:11:09 -03:00
sogladev cbb4937ee6 fix(Scripts/Commands): change waypoint script parameter type (#26026) 2026-05-30 08:10:55 -03:00
Florent f7019beda4 fix(Scripts/MagtheridonsLair): prevent Hellfire Channelers from respawning during boss fight (#25603)
Co-authored-by: sogla <sogladev@gmail.com>
2026-05-30 08:08:38 -03:00
EricksOliveira e675151983 fix(Scripts/IcecrownCitadel): fix Lord Marrowgar MaxDistance bonestorm (#25906) 2026-05-29 21:13:56 -03:00
Andrew 4f1745483d fix(Core/Groups): preserve BoP trade window when mailing roll-won items (#26023)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-29 21:12:45 -03:00
blinkysc 46f0d4033a fix(Core/Combat): drop dangling current victim on phase change crash (#26020)
Co-authored-by: blinkysc <blinkysc@users.noreply.github.com>
2026-05-29 09:22:01 -05:00
Andrew c029eab828 feat(Core/Wintergrasp): optional Essence buff for both factions (#26017) 2026-05-29 00:16:57 -03:00
Andrew dabb8f722c fix(Core/Battlefield): block invites and kicks from BF raids (#26015)
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-29 00:08:15 -03:00
Andrew 43e16de514 fix(Core/Wintergrasp): disband raid groups on battle end (#26014)
Co-authored-by: Xfurry <xfurry.cmangos@outlook.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 22:37:06 -03:00
Andrew 419af5796e feat(Core/Battlefield): grace period for mid-war logout/relog (#26013)
Co-authored-by: Yaki Khadafi <ElSolDolLo@gmail.com>
Co-authored-by: Xfurry <xfurry.cmangos@outlook.com>
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-28 21:18:24 -03:00
Crow 74da7dda12 fix(Core/Spells): Archimonde's Doomfire should not be subject to fire resistance (#25181)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-05-28 20:44:57 -03:00
sogladev c1baf53887 fix(Scripts/Karazhan): Moroes vanish reset (#26009) 2026-05-28 14:13:29 -03:00
sogladev 1cccafbe0c fix(Core/Unit): prevent self-immunity in IsImmunedToSpell (#25984)
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-05-28 08:17:39 +02:00
Grimfeather 74b798c8b5 fix(Scripts/World): Arcane Charges (#25806) 2026-05-27 23:32:46 -03:00
sogladev ffc5094300 fix(Core/LFG): Sort players by role in LFG proposals (#25954) 2026-05-27 23:31:56 -03:00
Andrew f8205c8b67 fix(Core/Wintergrasp): remove redundant chamber teleport on battle start (#26004)
Co-authored-by: Xfurry <xfurry.cmangos@outlook.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 23:28:16 -03:00
Andrew 0a9c55f308 feat(Core/Wintergrasp): aura-driven resurrect queue (#26002)
Co-authored-by: Balrok <balrok@getmangos.com>
Co-authored-by: Xfurry <xfurry.cmangos@outlook.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 22:44:54 -03:00
Andrew e588638749 refactor(Core/Wintergrasp): Use helper to clear tracking references (#26003) 2026-05-27 22:43:35 -03:00
github-actions[bot] ae8866ac46 chore(DB): import pending files
Referenced commit(s): 5f38fc7a6f
2026-05-28 01:19:41 +00:00
Angelo Venturini 5f38fc7a6f fix(DB/Creature): Crash on Fathomlord Karathress (#26001) 2026-05-27 22:18:33 -03:00
Andrew a73b1b2269 fix(Core/Battlefield): pre-clear stale tracking on enter (#25989)
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-26 23:10:09 -03:00
Andrew d9d011727b fix(Scripts/Wintergrasp): Use TeamId for vehicle teleporter (#25988)
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-26 21:42:43 -03:00
Andrew 1ff5147b85 feat(Core/Battlefield): Skip GMs from war invites (#25987)
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-26 21:11:25 -03:00
github-actions[bot] 08e458a62b chore(DB): import pending files
Referenced commit(s): 7094270b8e
2026-05-26 16:13:52 +00:00
sogladev 7094270b8e fix(DB/Conditions): prevent Dragonflayer Runecaster shielding a rat (#25955) 2026-05-26 18:12:39 +02:00
Andrew af2c766a8c fix(Scripts/Karazhan): Clear Moroes immunity flag on reset (#25972)
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-25 23:34:36 -03:00
Andrew fd256afab3 fix(Core/Battlefield): reject expired war invites (#25971)
Co-authored-by: Yaki Khadafi <ElSolDolLo@gmail.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-25 20:39:04 -03:00
github-actions[bot] 30a0a9a816 chore(DB): import pending files
Referenced commit(s): 7f736fb4ba
2026-05-25 07:49:02 +00:00
Andrew 7f736fb4ba fix(DB/Wintergrasp): Phase Whispering Wind during battle (#25961)
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-25 09:47:52 +02:00
Francesco Borzì e312aa547b docs: improve CLAUDE.md (#25797)
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-25 04:27:38 -03:00
Andrew e7cf13a4a8 fix(Core/Battlefield): Restrict WG relic-room kick to wartime (#25960)
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 20:01:11 -03:00
mpfans 3b58c9afad fix(Scripts/Kalimdor): prevent starting Caravan escort when in progress (#25776) 2026-05-24 18:33:23 -03:00
github-actions[bot] d7fca81ac2 chore(DB): import pending files
Referenced commit(s): 921caed718
2026-05-24 21:33:06 +00:00
Grimfeather 25bf0f9f07 fix(Core/Scripts) Alterac Valley - Iceblood Tower (#25953) 2026-05-24 18:32:48 -03:00
Andrew 503735c540 feat(Core/Commands): add .pet rename command (#25951)
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 18:32:35 -03:00
Andrew 110cb0874d feat(Core/Battlegrounds): Add PvP announce opt-out flags (#25957)
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 18:32:20 -03:00
github-actions[bot] 921caed718 chore(DB): import pending files
Referenced commit(s): cd2c30d73e
2026-05-24 21:32:02 +00:00
Andrew f05d5375aa fix(DB/Conditions): Subjugated Iskalder despawns mid-quest 13133 (#25949)
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 18:31:58 -03:00
v-mstrs cd2c30d73e fix(DB/Creature): Add immunities to Web Wraps (Naxxramas) (#25947) 2026-05-24 18:30:52 -03:00
Andrew f6bbbcc67f feat(Core/Wintergrasp): toggle for VoA pre-battle kick (#25942)
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 09:34:08 -03:00
Andrew e0046d8ba8 fix(Core/Battlefield): Restrict Within Our Grasp to attackers (#25945)
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 09:26:47 -03:00
sogladev 8bf01db849 feat(VSCode): Add commit message generation instructions for Copilot (#25908) 2026-05-24 04:18:34 -03:00
Robin Gustafsson 0f1f1615e2 feat(Core/Scripting): Add Player SetSkill hook (#25599) 2026-05-24 04:16:56 -03:00
Rocco Silipo e1beea25e9 fix(Core/Unit): Recalculate run speed on dismount from taxi flight. (#25936) 2026-05-23 23:50:04 +02:00
github-actions[bot] 34a5902e04 chore(DB): import pending files
Referenced commit(s): 5183bd1032
2026-05-23 15:07:04 +00:00
EricksOliveira 5183bd1032 fix(DB/Creature): Remove spiritual immunity from creature after setting spirit (#25916) 2026-05-23 12:05:49 -03:00
github-actions[bot] b99d6c7698 chore(DB): import pending files
Referenced commit(s): 90f635b147
2026-05-22 12:56:02 +00:00
Andrew 90f635b147 fix(DB/SAI): Deadliest Trap Ever Laid counter survives evade (#25923)
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 09:54:49 -03:00
Andrew 2d92b338d7 feat(Core/SmartAI): add SMART_ACTION_INC_DATA (242) (#25922)
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 07:58:23 -03:00
sogladev 027306fa0a fix(Core/Player): increase jumpRadius of melee chain to 10y (#25815) 2026-05-21 21:16:58 -03:00
github-actions[bot] eda6343164 chore(DB): import pending files
Referenced commit(s): 7a942fea38
2026-05-20 15:04:38 +00:00
Ryan Turner 7a942fea38 fix(DB/CompletionText) - Corrected the text for the quest "Vejrek" (#25812)
Co-authored-by: FlyingArowana <TheSCREWEDSoftware@users.noreply.github.com>
2026-05-20 16:02:41 +01:00
blinkysc e944605b9b fix(Core/SotA): stuck-in-combat after damaging cannons/demolishers (#25905)
Co-authored-by: blinkysc <blinkysc@users.noreply.github.com>
2026-05-19 22:05:14 -03:00
Andrew 169e31f2c6 feat(Core/Groups): mail roll-won items when inventory is full (#25909)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-19 21:41:11 -03:00
github-actions[bot] a5c11d081d chore(DB): import pending files
Referenced commit(s): b9e2bcd680
2026-05-19 14:34:10 +00:00
Rocco Silipo b9e2bcd680 fix(DB/Creature): Add Kodo Packs and waypoints. (#25892) 2026-05-19 11:32:55 -03:00
github-actions[bot] e897d22e8f chore(DB): import pending files
Referenced commit(s): 2a48cbc9e1
2026-05-19 09:43:50 +00:00
sudlud 2a48cbc9e1 fix(DB/Creature): Sniffed Values for 'Ludin Farrow' spawns (#25899) 2026-05-19 11:42:35 +02:00
Dinkledork ed3a6a1bd0 fix(Scripts/GruulsLair): Fix time unit typo (#25900) 2026-05-19 09:11:48 +02:00
kb31 771253f43d chore(CMake): enable standard conforming MSVC preprocessor (#25828) 2026-05-18 21:44:19 -03:00
Andrew dfa1009869 fix(Core/Chat): fix crash when using GetModuleString() from console (#25896)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 21:37:17 -03:00
github-actions[bot] 3474fb94fb chore(DB): import pending files
Referenced commit(s): e9840ab602
2026-05-18 23:48:56 +00:00
Rocco Silipo e9840ab602 fix(DB/SAI): Lost Soul now have 4 spawn points and right behaviors. (#25895) 2026-05-18 20:47:46 -03:00
kb31 47046c4cb6 chore(vscode): C++20 (#25891) 2026-05-19 00:32:26 +02:00
Andrew f79b594261 fix(Scripts/CoS): prevent Arthas from spamming Exorcism (#25889)
Co-authored-by: ccrs <4329612+ccrs@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 11:25:22 +02:00
github-actions[bot] e5ba1bde34 chore(DB): import pending files
Referenced commit(s): 693e20535e
2026-05-18 01:15:58 +00:00
Rocco Silipo 693e20535e fix(DB/Creature): Add Baron Longshore missing spawnpoints and pool. (#25886) 2026-05-18 03:14:29 +02:00
github-actions[bot] d7b037f242 chore(DB): import pending files
Referenced commit(s): 36234f03ad
2026-05-18 00:47:55 +00:00
Rocco Silipo 36234f03ad fix(DB/SAI): Solve waypoint and behavior issues for Fizzle Darkstorm and other creatures near him. (#25888) 2026-05-18 02:46:47 +02:00
github-actions[bot] 08a01ab6f7 chore(DB): import pending files
Referenced commit(s): 53f2c04b32
2026-05-17 23:26:52 +00:00
Vox 53f2c04b32 fix(DB/Creature): Remove 'Dead Alliance Soldier' from Icecrown spawn (#25827) 2026-05-18 01:25:43 +02:00
blinkysc 7e229e99fa fix(Scripts/HoR): drop player combat with Arthas on chase end (#25884)
Co-authored-by: blinkysc <blinkysc@users.noreply.github.com>
Co-authored-by: MitchesD <majklprofik@seznam.cz>
Co-authored-by: joschiwald <joschiwald.trinity@gmail.com>
2026-05-17 17:09:00 -05:00
github-actions[bot] 6a21c7419c chore(DB): import pending files
Referenced commit(s): 5cdd837edf
2026-05-17 17:50:08 +00:00
Tereneckla 5cdd837edf fix(DB/Loot): equalize gem drop chance of Small Velvet Bag (#25883) 2026-05-17 12:48:38 -05:00
github-actions[bot] 00bbc7c6b4 chore(DB): import pending files
Referenced commit(s): 1624d908ec
2026-05-17 17:36:28 +00:00
kb31 1624d908ec fix(DB/Spells): Scourgebane Infusion and Scourgebane Draught should stack (#25823) 2026-05-17 12:35:16 -05:00
sogladev 2430168263 fix(Core/Vehicle): parachute on vehicle exit (#25848) 2026-05-17 12:22:47 -05:00
blinkysc 380f6cb60f fix(Core/Spells): Stop JoL/JoW from procing caster's heal trinkets (#25881)
Co-authored-by: blinkysc <blinkysc@users.noreply.github.com>
2026-05-17 12:08:28 -05:00
github-actions[bot] 108039fdb7 chore(DB): import pending files
Referenced commit(s): 56ba43501a
2026-05-17 16:55:55 +00:00
Marchy 32759d7078 fix(DB/Quest): Reward bag contains 0 gems (#25858) 2026-05-17 13:54:18 -03:00
EricksOliveira 56ba43501a fix(DB/Text): SMART_ACTION_TALK error worldserver. (#25666) 2026-05-17 13:42:59 -03:00
github-actions[bot] af3f304a37 chore(DB): import pending files
Referenced commit(s): 6350a611d0
2026-05-17 16:34:33 +00:00
Andrew 5e3050c2d3 feat(Core/DB): split debug command RBAC into three permission tiers (#25882)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-17 13:32:57 -03:00
github-actions[bot] 48f37cc3d0 chore(DB): import pending files
Referenced commit(s): c3214bade4
2026-05-17 16:10:17 +00:00
blinkysc 6350a611d0 fix(DB/Commands): Help text for 7 missing commands (#25878)
Co-authored-by: blinkysc <blinkysc@users.noreply.github.com>
2026-05-17 11:04:08 -05:00
blinkysc 9722cd4f13 fix(Scripts/Spells): Mark of Conquest energize wrong spell ID (#25877)
Co-authored-by: blinkysc <blinkysc@users.noreply.github.com>
2026-05-17 11:03:40 -05:00
blinkysc b97fc0a873 fix(DB/SAI): The Second Trial champions not attacking (#25879)
Co-authored-by: blinkysc <blinkysc@users.noreply.github.com>
2026-05-17 11:03:25 -05:00
blinkysc c3214bade4 fix(DB/Spell): Reckoning extra attack on miss/dodge/parry (#25880)
Co-authored-by: blinkysc <blinkysc@users.noreply.github.com>
2026-05-17 11:03:04 -05:00
Andrew 8f293d00ee feat(Core): add OnPlayerQuestAccept hook to PlayerScript (#25875)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-17 08:06:40 -03:00
Andrew 5f5c287cd3 feat(Core/Battlefield): Add OnBattlefieldPlayerKill script hook (#25871)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-17 01:12:04 -03:00
Andrew ac12f5d27c fix(Core/Battlefield): fire OnBattlefieldPlayerLeaveZone before HasPlayer guard (#25870)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-16 20:22:14 -03:00
github-actions[bot] d45e01e1ea chore(DB): import pending files
Referenced commit(s): 9cdcccff30
2026-05-16 22:50:34 +00:00
sogladev 9cdcccff30 fix(DB/PlayerShapeshiftModel): Night Elf shapeshift models (#25862) 2026-05-16 19:49:23 -03:00
blinkysc 076016836e fix(Core/Player): preserve extra_flags when GM-state restore gate skips (#25861)
Co-authored-by: blinkysc <blinkysc@users.noreply.github.com>
2026-05-16 11:41:24 -05:00
UndeadRogue 84a66e345b chore(Docker): Upgrade Ubuntu to 24.04 (#24459)
Co-authored-by: sogladev <sogladev@gmail.com>
2026-05-16 13:31:41 +02:00
github-actions[bot] c0c86d21da chore(DB): import pending files
Referenced commit(s): 9d182cf129
2026-05-16 10:40:30 +00:00
Stephen Schlie 9d182cf129 fix(DB/Text): One of the Nifflevar in Howling Fjord shouts in Orcish (#25857) 2026-05-16 07:39:20 -03:00
github-actions[bot] f0f61042eb chore(DB): import pending files
Referenced commit(s): cefdcb92b7
2026-05-16 07:30:30 +00:00
Rocco Silipo cefdcb92b7 fix(DB/SAI): Add Trok and Karu behavior. (#25853) 2026-05-16 09:29:22 +02:00
Andrew 04dff51418 fix(Scripts/Karazhan): fix Moroes guests not respawning on evade (#25851)
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-15 22:40:22 -03:00
github-actions[bot] 46a649c6f6 chore(DB): import pending files
Referenced commit(s): de9461976d
2026-05-15 17:39:23 +00:00
armedprophet de9461976d fix(DB/SAI): Rampage! chain bunnies not arming on spawn (#25808)
Co-authored-by: sogla <sogladev@gmail.com>
2026-05-15 14:38:12 -03:00
Marchy 0b30b3f99f fix(Scripts/Gundrak): Dispell puncture aura from players after killing Gal'darah (#25830) 2026-05-14 16:25:09 -03:00
Andrew 61e99f9c44 fix(Core/Maps): fix pooled creature/GO respawn in instanced maps (#25826)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 09:58:16 -03:00
github-actions[bot] b1e226db96 chore(DB): import pending files
Referenced commit(s): 1dd2236a06
2026-05-14 09:50:45 +00:00
Andrew 485769354c feat(Scripts/Commands): add respawn guid/entry' command and expand list resp… (#25787)
Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>
2026-05-14 06:50:43 -03:00
sigman 1dd2236a06 fix(Scripts/Spells): Fix 'still in combat' status after hunter tames a beast (in quest) (#25811) 2026-05-14 06:49:29 -03:00
121 changed files with 116768 additions and 586 deletions
+6 -4
View File
@@ -1,9 +1,11 @@
### TITLE
## Type(Scope/Subscope): Commit ultra short explanation
## |---- Write below the examples with a maximum of 50 characters ----|
## |---- Write below the examples with a maximum of 72 characters ----|
## Example 1: fix(DB/SAI): Missing spell to NPC Hogger
## Example 2: fix(CORE/Raid): Phase 2 of Ragnaros
## Example 3: feat(CORE/Commands): New GM command to do something
## Example 2: feat(Scripts/Commands): Add .mail list and .mail return commands
## Example 3: refactor(Scripts/Ulduar): Leverage DoorData and persistent data
## Example 4: fix(Scripts/SlavePens): Despawn Frozen Core after Ahune emerges
## Example 5: fix(Scripts/VioletHold): Prevent Sinclari from despawning
### DESCRIPTION
@@ -46,7 +48,7 @@
## More info here https://www.conventionalcommits.org/en/v1.0.0-beta.2/
## =======================================================
## "Scope" can be:
## CORE (core related, c++)
## Core (core related, c++)
## DB (database related, sql)
## =======================================================
## "Subscope" is optional and depends on the nature of the commit.
+6 -1
View File
@@ -1,4 +1,9 @@
{
"github.copilot.chat.commitMessageGeneration.instructions": [
{
"file": ".git_commit_template.txt"
},
],
"files.associations": {
"*.dist": "properties",
"*.crash": "properties",
@@ -120,7 +125,7 @@
"deno.path": "deps/deno/bin/deno",
"deno.lint": true,
"C_Cpp.default.compileCommands": "${workspaceFolder}/build/compile_commands.json",
"C_Cpp.default.cppStandard": "c++17",
"C_Cpp.default.cppStandard": "c++20",
"C_Cpp.default.configurationProvider": "ms-vscode.cmake-tools",
"C_Cpp.default.compilerPath": "/usr/bin/clang",
"cmake.sourceDirectory": ["${workspaceFolder}"],
+74 -96
View File
@@ -1,126 +1,104 @@
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
AzerothCore is a C++ MMORPG server emulator for World of Warcraft 3.3.5a (WotLK), built with CMake, backed by MySQL.
## Project Overview
## Agent rules
AzerothCore is an open-source MMORPG server emulator for World of Warcraft patch 3.3.5a (Wrath of the Lich King). It's a C++ project built with CMake, using MySQL for data storage. Licensed under GNU GPL v2.
- **Do not configure or build unless explicitly asked.** Builds are slow (CMake + compile of a large C++ codebase) and rarely needed to make code changes.
- **Never edit SQL files outside `data/sql/updates/pending_db_*/`.** `data/sql/base/`, `data/sql/archive/`, and `data/sql/updates/db_*/` are immutable (do not modify).
- **Do not run git commands that modify repo state** (commit, branch, merge, rebase, reset, push, …) unless explicitly requested, and do not include them in plans. Read-only git (status, diff, log) is fine.
## Build Commands
## Build
### Configure and build (out-of-source build required)
- Skip building unless explicitly requested.
Out-of-source build is required (in-source is blocked by CMake).
```bash
# Create build directory and configure
mkdir -p build && cd build
cmake .. -DCMAKE_INSTALL_PREFIX=$HOME/azeroth-server -DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DSCRIPTS=static -DMODULES=static
# Build (use appropriate core count)
make -j$(nproc)
make install
make -j$(nproc) && make install
```
### Key CMake options
Compiler: **C++20** required (`CMAKE_CXX_STANDARD 20`). Useful CMake flags: `BUILD_TESTING=ON` (Google Test), `NOPCH=1` (disable precompiled headers). Full flag set in `conf/dist/config.cmake`. `compile_commands.json` is exported automatically.
- `SCRIPTS`: none, static, dynamic, minimal-static, minimal-dynamic (default: static)
- `MODULES`: none, static, dynamic (default: static)
- `APPS_BUILD`: none, all, auth-only, world-only (default: all)
- `TOOLS_BUILD`: none, all, db-only, maps-only (default: none)
- `BUILD_TESTING`: Enable unit tests (default: OFF)
- `USE_COREPCH` / `USE_SCRIPTPCH`: Precompiled headers (default: ON)
Tests (Google Test, in `src/test/`): configure with `-DBUILD_TESTING=ON`, then `ctest` or `./src/test/unit_tests` from the build dir.
### Unit tests
## Repository layout
- `src/common/` — networking (Asio), crypto, config, logging, shared utilities.
- `src/server/game/` — core gameplay; compiled into worldserver.
- `src/server/scripts/` — content scripts grouped by region (`EasternKingdoms/`, `Northrend/`, …), class (`Spells/spell_mage.cpp`, …), and domain (`Commands/`, `Pet/`, `OutdoorPvP/`, `World/`).
- `src/server/database/` — DB abstraction and schema updater.
- `src/server/shared/` — code shared by auth and world servers.
- `src/server/apps/{authserver,worldserver}/` — entry points (ports 3724 and 8085).
- `src/test/` — Google Test unit tests + mocks.
- `data/sql/``base/` (historical schema), `updates/db_*/` (merged), `updates/pending_db_*/` (in-flight, **edit here**), `custom/` (gitignored).
- `modules/` — external modules (each a subdir with its own `CMakeLists.txt`). Disable with `-DDISABLED_AC_MODULES="mod1;mod2"`. See `modules/how_to_make_a_module.md`.
- `apps/` — helper scripts; `apps/codestyle/` holds the lint scripts (see below).
- `conf/dist/` — distributed config templates; `conf/*.conf` is gitignored.
- `deps/` — vendored third-party dependencies.
## Adding SQL updates
1. `cd data/sql/updates/pending_db_world/` (or `pending_db_auth` / `pending_db_characters`).
2. `./create_sql.sh` generates an empty `rev_<timestamp>.sql` you write into.
3. Required SQL conventions (enforced by `apps/codestyle/codestyle-sql.py`):
- Every `INSERT` must be preceded by a matching `DELETE` (idempotency).
- 4-space indent (no tabs), trailing newline, no double semicolons, no multiple blank lines.
- Tables must use the InnoDB engine.
The three databases:
- `acore_auth` — accounts, realm list, IP/account bans, session keys. Shared across all realms.
- `acore_characters` — per-character state: characters, inventory, in-progress quests, mail, guilds, arena teams, achievements. One per realm.
- `acore_world` — static game content: creature/gameobject/item/quest templates, spawn lists, loot tables, SmartAI scripts, gossip, conditions. Read-mostly; rebuilt from SQL.
## Code style
Run the linters before claiming a change is done:
```bash
# Configure with testing enabled
cmake .. -DBUILD_TESTING=ON
make -j$(nproc)
# Run tests
./src/test/unit_tests
# or
ctest
python apps/codestyle/codestyle-cpp.py # C++
python apps/codestyle/codestyle-sql.py # SQL (compares to origin/master)
```
Tests use Google Test and live in `src/test/`. The test binary links against the `game` library.
Hard rules (also enforced by CI with `-Werror`):
## Architecture
- 4-space indent for C++ (tabs forbidden); 2-space for JSON/YAML/sh/ts/js. UTF-8, LF, max 80 cols, trailing newline.
- Allman braces. No braces around single-line statements. `if (x)` — never `if(x)` or `if ( x )`.
- `auto const&` (not `const auto&`); `Type const*` (not `const Type*`).
- Use `{}` format specifiers (`fmt`-style), not `%u`/`%s`.
- Use the typed helpers, not raw flag access:
- `IsPlayer()`, `IsCreature()`, `IsItem()`, … instead of `GetTypeId() == TYPEID_*`.
- `GetNpcFlags()`, `HasNpcFlag()`, `SetNpcFlag()`, `RemoveNpcFlag()`, `ReplaceAllNpcFlags()` instead of `*Flag(UNIT_NPC_FLAGS, …)`.
- `IsRefundable()`, `IsBOPTradable()`, `IsWrapped()` instead of `HasFlag(ITEM_FIELD_FLAGS, …)`.
- `HasFlag(ItemFlag)` / `HasFlag2(ItemFlag2)` / `HasFlagCu(ItemFlagsCustom)` instead of bitwise `Flags & ITEM_FLAG…`.
- `ObjectGuid::ToString().c_str()` instead of `ObjectGuid::GetCounter()`.
### Two server executables
- **authserver** (`src/server/apps/authserver/`): Handles authentication and realm selection (port 3724)
- **worldserver** (`src/server/apps/worldserver/`): Main game server handling all gameplay (port 8085)
CI also runs `cppcheck`.
### Source layout (`src/`)
## Project conventions
- **`src/common/`** - Shared libraries: networking (Asio), cryptography, configuration, logging, threading, collision detection, utilities
- **`src/server/game/`** - Core game logic (~52 subsystems), the heart of the worldserver
- **`src/server/scripts/`** - Content scripts (bosses, spells, commands, instances)
- **`src/server/database/`** - Database abstraction layer and schema updater
- **`src/server/shared/`** - Code shared between auth and world servers (packets, network, realm definitions)
- **`src/test/`** - Unit tests (Google Test)
- **Logging**: `LOG_INFO("category.sub", "msg with {}", arg)` (also `LOG_WARN`, `LOG_ERROR`, `LOG_DEBUG`, `LOG_TRACE`). Categories are hierarchical, dot-separated (e.g. `server.loading`, `entities.player`, `sql.dev`). No `printf`-style; no `sLog->`; no `TC_LOG_*`. Macro in `src/common/Logging/Log.h`.
- **Random**: use project helpers from `src/common/Utilities/Random.h``urand`, `irand`, `frand`, `rand32`, `rand_chance`, `roll_chance_f`, `roll_chance_i`. Do not use `std::rand` or `<random>` directly.
- **Strings**: `Acore::StringFormat(fmt, args...)` (wraps `fmt::format`, `{}` placeholders) — `src/common/Utilities/StringFormat.h`.
- **Config**: read options with `sConfigMgr->GetOption<T>("Name", default)`.
- **Namespace**: project-wide is `Acore::` (no `Trinity::` remnants — agents porting from upstream forks must rename).
- **Long-lived references**: do not store a raw `Player*` / `Creature*` / `Unit*` past the current call/tick — the object can be removed (logout, despawn, instance unload) and the pointer dangles. Store the `ObjectGuid` and resolve at use time via `ObjectAccessor::FindPlayer(guid)`, `ObjectAccessor::GetCreature(*from, guid)`, `Map::GetCreature(guid)`, etc.
- **DB queries**: use `PreparedStatement` (via `WorldDatabase` / `CharacterDatabase` / `LoginDatabase` and the prepared-statement enums) rather than raw query strings. Reads that don't need to block the world tick go through the async path: `_queryProcessor.AddCallback(db.AsyncQuery(stmt).WithPreparedCallback(...))` (or `WithCallback` for non-prepared). Multi-statement writes wrap in `SQLTransaction` + `Execute` / `AppendPreparedStatement`.
- **Timed actions in AI**: use `EventMap` (event id → delay; simple) or `TaskScheduler` (lambdas, repeats, cancellation). Both are members of `CreatureAI`; see any boss script under `src/server/scripts/` for examples — don't roll your own tick counters.
### Key game subsystems (`src/server/game/`)
## Scripting registration
- **Entities/** - Core game objects: `Player`, `Creature`, `Unit`, `Item`, `GameObject`
- **Spells/** - Spell mechanics, aura system, spell effects
- **Maps/** - Map management, grid system, instancing
- **Handlers/** - Client packet handlers (one file per system: `MovementHandler.cpp`, `SpellHandler.cpp`, etc.). These are methods on `WorldSession`
- **AI/** - Creature AI framework
- **Scripting/** - Script system with typed base classes (`ScriptObject` subclasses: `CreatureScript`, `SpellScript`, `InstanceMapScript`, `GameObjectScript`, `CommandScript`, etc.)
- **Server/** - `WorldSession` (per-player connection), `World` (global state), opcode definitions
Scripts inherit from a `ScriptObject` subclass (`SpellScript`, `AuraScript`, `CreatureScript`, `InstanceMapScript`, `GameObjectScript`, `CommandScript`, …). Two registration styles coexist:
### Scripting system
- **Spell / aura scripts**: use the `RegisterSpellScript(ClassName)` (or `RegisterSpellAndAuraScriptPair(...)`) macro inside `AddSC_<name>()`.
- **Creature scripts**: prefer `RegisterCreatureAI(ClassName)` for new code; legacy zones still use `new ClassName();`. Match the surrounding pattern.
Scripts follow a registration pattern:
1. Define a class inheriting from `SpellScript`, `CreatureScript`, etc.
2. Implement an `AddSC_*()` function that calls `RegisterSpellScript(ClassName)` (or similar)
3. The `AddSC_*()` is declared and called from the regional `*_script_loader.cpp`
4. Script loaders per region: `spells_script_loader.cpp`, `eastern_kingdoms_script_loader.cpp`, `northrend_script_loader.cpp`, etc.
5. Spell script files are organized by class: `spell_dk.cpp`, `spell_mage.cpp`, `spell_generic.cpp`, etc.
Then declare and call `AddSC_<name>()` from the regional loader: `Spells/spells_script_loader.cpp`, `EasternKingdoms/eastern_kingdoms_script_loader.cpp`, etc.
### Three databases
- **acore_auth** - Accounts, realm list, bans (`data/sql/base/db_auth/`)
- **acore_characters** - Character data, inventories, progress (`data/sql/base/db_characters/`)
- **acore_world** - Game content: creatures, items, quests, spells, loot (`data/sql/base/db_world/`)
**SmartAI** (data-driven creature behaviour) lives in the world DB's `smart_scripts` table — not in C++. Engine: `src/server/game/AI/SmartScripts/`. For new creature behaviour prefer SmartAI (added via the SQL update workflow); reach for `CreatureScript` only when SmartAI's event/action vocabulary isn't enough.
- SQL updates go in `data/sql/updates/pending_*` with separate subdirectories per database until pull request is merged. Pending SQL files are assigned random names.
- SQL updates go in `data/sql/updates/` with separate subdirectories per database after their pull request is merged.
- SQL files outside the `data/sql/updates/pending_*` folders should never be updated.
**Module hooks** (e.g. `OnPlayerLogin`, `OnWorldUpdate`, `OnSpellCast`) are declared in `src/server/game/Scripting/ScriptDefines/*.h`. Implement by inheriting the matching base (`PlayerScript`, `WorldScript`, …) and registering with `new MyClass();` (or its `RegisterXxxScript` macro where one exists) inside `AddSC_<name>()`. Full hook list: https://www.azerothcore.org/wiki/hooks-script.
### Module system
External modules are loaded from the `modules/` directory. Each module is a subdirectory with its own `CMakeLists.txt`. Disable specific modules with `-DDISABLED_AC_MODULES="mod1;mod2"`. Module skeleton: https://github.com/azerothcore/skeleton-module/
### Dependencies
Bundled in `deps/`: boost, MySQL client, OpenSSL, zlib, recastnavigation (pathfinding), g3dlite (geometry), fmt, argon2, jemalloc, and others.
## Commit Message Format
Uses Conventional Commits:
```
Type(Scope/Subscope): Short description (max 50 chars)
```
- **Types**: feat, fix, refactor, style, docs, test, chore
- **Scopes**: Core (C++ changes), DB (SQL changes)
- **Examples**: `fix(Core/Spells): Fix damage calculation for Fireball`, `fix(DB/SAI): Missing spell to NPC Hogger`
## Code Style
- 4-space indentation for C++ (no tabs)
- 2-space indentation for JSON, YAML, shell scripts
- UTF-8 encoding, LF line endings
- Max 80 character line length
- No braces around single-line statements
- Use {} to parse variables into output instead of %u etc.
- CI enforces code style checks and compiles with `-Werror`
## PR Requirements
- AI tool usage must be disclosed in PRs
- In-game testing expected
- Changes to generic code require regression testing of related systems
Custom (non-upstream) scripts go in `src/server/scripts/Custom/` (gitignored).
+15 -11
View File
@@ -1,4 +1,4 @@
ARG UBUNTU_VERSION=22.04 # lts
ARG UBUNTU_VERSION=24.04 # lts
# This target lays out the general directory skeleton for AzerothCore,
# This target isn't intended to be directly used
@@ -67,7 +67,7 @@ RUN apt-get update \
build-essential ccache libtool cmake-data make cmake clang \
git lsb-base curl unzip default-mysql-client openssl \
default-libmysqlclient-dev libboost-all-dev libssl-dev libmysql++-dev \
libreadline-dev zlib1g-dev libbz2-dev libncurses5-dev \
libreadline-dev zlib1g-dev libbz2-dev libncurses5-dev liblzma-dev \
&& rm -rf /var/lib/apt/lists/*
COPY CMakeLists.txt /azerothcore/CMakeLists.txt
@@ -117,11 +117,12 @@ ARG DOCKER_USER=acore
ENV ACORE_COMPONENT=undefined
# Install base dependencies for azerothcore
RUN apt-get update && \
apt-get install -y --no-install-recommends \
libmysqlclient21 libreadline8 \
gettext-base default-mysql-client && \
rm -rf /var/lib/apt/lists/*
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
libmysqlclient21 libreadline8 libicu74 libncurses5-dev \
gettext-base default-mysql-client \
adduser \
&& rm -rf /var/lib/apt/lists/*
COPY --from=build /azerothcore/env/dist/etc/ /azerothcore/env/ref/etc
@@ -129,10 +130,13 @@ VOLUME /azerothcore/env/dist/etc
ENV PATH="/azerothcore/env/dist/bin:$PATH"
RUN groupadd --gid "$GROUP_ID" "$DOCKER_USER" && \
useradd -d /azerothcore --uid "$USER_ID" --gid "$GROUP_ID" "$DOCKER_USER" && \
passwd -d "$DOCKER_USER" && \
chown -R "$DOCKER_USER:$DOCKER_USER" /azerothcore
# To use GID/UID 1000 in ubuntu > 23.04 the existing user must be deleted
# See https://bugs.launchpad.net/cloud-images/+bug/2005129
RUN userdel --remove ubuntu \
&& addgroup --gid "$GROUP_ID" "$DOCKER_USER" \
&& adduser --disabled-password --gecos '' --uid "$USER_ID" --gid "$GROUP_ID" "$DOCKER_USER" \
&& passwd -d "$DOCKER_USER" \
&& chown -R "$DOCKER_USER:$DOCKER_USER" /azerothcore
COPY --chown=$USER_ID:$GROUP_ID \
--chmod=755 \
@@ -0,0 +1,18 @@
-- DB update 2026_05_09_00 -> 2026_05_14_00
--
-- RBAC permissions for `respawn creature guid`, `respawn gameobject guid`,
-- `respawn creature entry`, and `respawn gameobject entry` commands (Console::Yes/No, security level 3 - GM)
--
DELETE FROM `rbac_permissions` WHERE `id` IN (916, 917, 918, 919);
INSERT INTO `rbac_permissions` (`id`, `name`) VALUES
(916, 'Command: respawn creature guid'),
(917, 'Command: respawn gameobject guid'),
(918, 'Command: respawn creature entry'),
(919, 'Command: respawn gameobject entry');
DELETE FROM `rbac_linked_permissions` WHERE `linkedId` IN (916, 917, 918, 919);
INSERT INTO `rbac_linked_permissions` (`id`, `linkedId`) VALUES
(197, 916),
(197, 917),
(197, 918),
(197, 919);
@@ -0,0 +1,35 @@
-- DB update 2026_05_14_00 -> 2026_05_17_00
-- Split RBAC_PERM_COMMAND_DEBUG (300) into three permission tiers:
--
-- 300 (Command: debug) -- state-modifying commands (unchanged)
-- 920 (Command: debug info) -- read-only / informational commands
-- 921 (Command: debug cosmetic) -- client-side / cosmetic commands
--
-- Backward compatibility: perm 300 links to both 920 and 921, so any account
-- or role that already held perm 300 automatically receives the new sub-perms
-- via RBAC expansion. No existing setups are affected.
--
-- Informational (920): threat, threatinfo, combat, hostile, getvalue,
-- getitemvalue, getitemstate, lootrecipient, los, loot, visibilitydata,
-- objectcount, mapdata, factionchange, zonestats
--
-- Cosmetic (921): play *, send (all except opcode/setphaseshift), anim,
-- areatriggers, boundary, wpgps
--
-- State-modifying (300, unchanged): setbit, Mod32Value, setaurastate,
-- setitemvalue, setvalue, spawnvehicle, setvid, entervehicle, uws, update,
-- itemexpire, arena, bg, lfg, cooldown, moveflags, unitstate, dummy,
-- send opcode, send setphaseshift
DELETE FROM `rbac_permissions` WHERE `id` IN (920, 921);
INSERT INTO `rbac_permissions` (`id`, `name`) VALUES
(920, 'Command: debug info'),
(921, 'Command: debug cosmetic');
-- Existing holders of perm 300 automatically receive both new sub-perms.
-- Role 197 (GM Commands) already includes perm 300, so it reaches 920 and 921
-- transitively — no direct links to role 197 are needed or added.
DELETE FROM `rbac_linked_permissions` WHERE `id` = 300 AND `linkedId` IN (920, 921);
INSERT INTO `rbac_linked_permissions` (`id`, `linkedId`) VALUES
(300, 920),
(300, 921);
@@ -0,0 +1,9 @@
-- DB update 2026_05_17_00 -> 2026_05_24_00
-- RBAC permission for .pet rename (sec 3+, Admin role 196).
DELETE FROM `rbac_permissions` WHERE `id` = 922;
INSERT INTO `rbac_permissions` (`id`, `name`) VALUES
(922, 'Command: pet rename');
DELETE FROM `rbac_linked_permissions` WHERE `linkedId` = 922;
INSERT INTO `rbac_linked_permissions` (`id`, `linkedId`) VALUES
(196, 922);
@@ -0,0 +1,37 @@
-- DB update 2026_05_10_01 -> 2026_05_14_00
--
-- Strings for `respawn creature guid` / `respawn gameobject guid` /
-- `respawn creature entry` / `respawn gameobject entry` commands and updated `list respawns` command
--
DELETE FROM `acore_string` WHERE `entry` IN (35441, 35442, 35443, 35444, 35445, 35446, 35447, 35448, 35449, 35450, 35451, 35452);
INSERT INTO `acore_string` (`entry`, `content_default`, `locale_koKR`, `locale_frFR`, `locale_deDE`, `locale_zhCN`, `locale_zhTW`, `locale_esES`, `locale_esMX`, `locale_ruRU`) VALUES
(35441, 'No creature with spawn GUID {} found.', '스폰 GUID {}를 가진 생물을 찾을 수 없습니다.', 'Aucune créature avec le GUID d''apparition {} trouvée.', 'Keine Kreatur mit Spawn-GUID {} gefunden.', '未找到生成 GUID 为 {} 的生物。', '未找到生成 GUID 為 {} 的生物。', 'No se encontró ninguna criatura con el GUID de generación {}.', 'No se encontró ninguna criatura con el GUID de generación {}.', 'Существо с GUID спавна {} не найдено.'),
(35442, 'Map {} is not currently loaded.', '맵 {}이(가) 현재 로드되어 있지 않습니다.', 'La carte {} n''est pas actuellement chargée.', 'Karte {} ist derzeit nicht geladen.', '地图 {} 当前未加载。', '地圖 {} 目前未載入。', 'El mapa {} no está cargado actualmente.', 'El mapa {} no está cargado actualmente.', 'Карта {} в данный момент не загружена.'),
(35443, 'Creature (spawn GUID {}, entry {}) is already alive.', '생물 (스폰 GUID {}, 항목 {})이(가) 이미 살아 있습니다.', 'La créature (GUID d''apparition {}, entrée {}) est déjà en vie.', 'Kreatur (Spawn-GUID {}, Eintrag {}) ist bereits am Leben.', '生物(生成 GUID {},条目 {})已经存活。', '生物(生成 GUID {},條目 {})已經存活。', 'La criatura (GUID de generación {}, entrada {}) ya está viva.', 'La criatura (GUID de generación {}, entrada {}) ya está viva.', 'Существо (GUID спавна {}, запись {}) уже живо.'),
(35444, 'Creature (spawn GUID {}, entry {}) queued for respawn.', '생물 (스폰 GUID {}, 항목 {})이(가) 리스폰 대기열에 추가되었습니다.', 'La créature (GUID d''apparition {}, entrée {}) est mise en file d''attente pour réapparition.', 'Kreatur (Spawn-GUID {}, Eintrag {}) für Respawn in Warteschlange.', '生物(生成 GUID {},条目 {})已加入重生队列。', '生物(生成 GUID {},條目 {})已加入重生佇列。', 'La criatura (GUID de generación {}, entrada {}) está en cola para reaparecer.', 'La criatura (GUID de generación {}, entrada {}) está en cola para reaparecer.', 'Существо (GUID спавна {}, запись {}) добавлено в очередь на респаун.'),
(35445, 'Gameobject (spawn GUID {}, entry {}) is already active.', '게임오브젝트 (스폰 GUID {}, 항목 {})이(가) 이미 활성화되어 있습니다.', 'L''objet de jeu (GUID d''apparition {}, entrée {}) est déjà actif.', 'Spielobjekt (Spawn-GUID {}, Eintrag {}) ist bereits aktiv.', '游戏对象(生成 GUID {},条目 {})已经激活。', '遊戲物件(生成 GUID {},條目 {})已經激活。', 'El objeto de juego (GUID de generación {}, entrada {}) ya está activo.', 'El objeto de juego (GUID de generación {}, entrada {}) ya está activo.', 'Игровой объект (GUID спавна {}, запись {}) уже активен.'),
(35446, 'Gameobject (spawn GUID {}, entry {}) queued for respawn.', '게임오브젝트 (스폰 GUID {}, 항목 {})이(가) 리스폰 대기열에 추가되었습니다.', 'L''objet de jeu (GUID d''apparition {}, entrée {}) est mis en file d''attente pour réapparition.', 'Spielobjekt (Spawn-GUID {}, Eintrag {}) für Respawn in Warteschlange.', '游戏对象(生成 GUID {},条目 {})已加入重生队列。', '遊戲物件(生成 GUID {},條目 {})已加入重生佇列。', 'El objeto de juego (GUID de generación {}, entrada {}) está en cola para reaparecer.', 'El objeto de juego (GUID de generación {}, entrada {}) está en cola para reaparecer.', 'Игровой объект (GUID спавна {}, запись {}) добавлен в очередь на респаун.'),
(35447, 'A map ID is required when using this command from the console.', '콘솔에서 이 명령을 사용하려면 맵 ID가 필요합니다.', 'Un ID de carte est requis lors de l''utilisation de cette commande depuis la console.', 'Eine Karten-ID ist erforderlich, wenn dieser Befehl über die Konsole verwendet wird.', '从控制台使用此命令时需要提供地图 ID。', '從控制台使用此命令時需要提供地圖 ID。', 'Se requiere un ID de mapa al usar este comando desde la consola.', 'Se requiere un ID de mapa al usar este comando desde la consola.', 'При использовании этой команды из консоли требуется ID карты.'),
(35448, 'No gameobject with spawn GUID {} found.', '스폰 GUID {}를 가진 게임오브젝트를 찾을 수 없습니다.', 'Aucun objet de jeu avec le GUID d''apparition {} trouvé.', 'Kein Spielobjekt mit Spawn-GUID {} gefunden.', '未找到生成 GUID 为 {} 的游戏对象。', '未找到生成 GUID 為 {} 的遊戲物件。', 'No se encontró ningún objeto de juego con el GUID de generación {}.', 'No se encontró ningún objeto de juego con el GUID de generación {}.', 'Игровой объект с GUID спавна {} не найден.'),
(35449, 'No creature template with entry {} found.', '항목 {}을(를) 가진 생물 템플릿을 찾을 수 없습니다.', 'Aucun modèle de créature avec l''entrée {} trouvé.', 'Kein Kreaturvorlage mit Eintrag {} gefunden.', '未找到条目为 {} 的生物模板。', '未找到條目為 {} 的生物模板。', 'No se encontró ninguna plantilla de criatura con la entrada {}.', 'No se encontró ninguna plantilla de criatura con la entrada {}.', 'Шаблон существа с записью {} не найден.'),
(35450, 'No gameobject template with entry {} found.', '항목 {}을(를) 가진 게임오브젝트 템플릿을 찾을 수 없습니다.', 'Aucun modèle d''objet de jeu avec l''entrée {} trouvé.', 'Kein Spielobjektvorlage mit Eintrag {} gefunden.', '未找到条目为 {} 的游戏对象模板。', '未找到條目為 {} 的遊戲物件模板。', 'No se encontró ninguna plantilla de objeto de juego con la entrada {}.', 'No se encontró ninguna plantilla de objeto de juego con la entrada {}.', 'Шаблон игрового объекта с записью {} не найден.'),
(35451, 'Queued {} creature spawn(s) with entry {} for respawn on this map.', '이 맵에서 항목 {}을(를) 가진 생물 스폰 {}개가 리스폰 대기열에 추가되었습니다.', '{} apparition(s) de créature avec l''entrée {} mise(s) en file d''attente pour réapparition sur cette carte.', '{} Kreaturspawn(s) mit Eintrag {} für Respawn auf dieser Karte in Warteschlange.', '在此地图上,已将 {} 个条目为 {} 的生物生成加入重生队列。', '在此地圖上,已將 {} 個條目為 {} 的生物生成加入重生佇列。', 'Se pusieron en cola {} aparición(es) de criatura con entrada {} para reaparecer en este mapa.', 'Se pusieron en cola {} aparición(es) de criatura con entrada {} para reaparecer en este mapa.', 'В очередь на респаун на этой карте добавлено {} спавн(ов) существа с записью {}.'),
(35452, 'Queued {} gameobject spawn(s) with entry {} for respawn on this map.', '이 맵에서 항목 {}을(를) 가진 게임오브젝트 스폰 {}개가 리스폰 대기열에 추가되었습니다.', '{} apparition(s) d''objet de jeu avec l''entrée {} mise(s) en file d''attente pour réapparition sur cette carte.', '{} Spielobjektspawn(s) mit Eintrag {} für Respawn auf dieser Karte in Warteschlange.', '在此地图上,已将 {} 个条目为 {} 的游戏对象生成加入重生队列。', '在此地圖上,已將 {} 個條目為 {} 的遊戲物件生成加入重生佇列。', 'Se pusieron en cola {} aparición(es) de objeto de juego con entrada {} para reaparecer en este mapa.', 'Se pusieron en cola {} aparición(es) de objeto de juego con entrada {} para reaparecer en este mapa.', 'В очередь на респаун на этой карте добавлено {} спавн(ов) игрового объекта с записью {}.');
--
-- Update `list respawns` command help text
--
DELETE FROM `command` WHERE `name` = 'list respawns';
INSERT INTO `command` (`name`, `security`, `help`) VALUES
('list respawns', 2, 'Syntax: .list respawns [entryId]\r\nIn-game: shows all pending creature and gameobject respawns on the current map, filtered by entryId if provided.\r\nConsole: .list respawns #mapId [#instanceId [#entryId]] - specify map and optional instance ID and entry filter.');
--
-- Register `respawn creature guid`, `respawn gameobject guid`,
-- `respawn creature entry`, and `respawn gameobject entry` commands
--
DELETE FROM `command` WHERE `name` IN ('respawn id', 'respawn guid', 'respawn creature guid', 'respawn gameobject guid', 'respawn creature entry', 'respawn gameobject entry');
INSERT INTO `command` (`name`, `security`, `help`) VALUES
('respawn creature guid', 3, 'Syntax: .respawn creature guid #spawnGuid\r\nForces the creature with the given spawn GUID (database GUID) to respawn. Usable from console.'),
('respawn gameobject guid', 3, 'Syntax: .respawn gameobject guid #spawnGuid\r\nForces the gameobject with the given spawn GUID (database GUID) to respawn. Usable from console.'),
('respawn creature entry', 3, 'Syntax: .respawn creature entry #entry [#mapId [#instanceId]]\r\nIn-game: forces all creatures with the given #entry to respawn on the current map.\r\nConsole: specify #mapId (required) and optionally #instanceId. Pooled creatures are skipped in the queue phase to prevent duplicate spawns.'),
('respawn gameobject entry', 3, 'Syntax: .respawn gameobject entry #entry [#mapId [#instanceId]]\r\nIn-game: forces all gameobjects with the given #entry to respawn on the current map.\r\nConsole: specify #mapId (required) and optionally #instanceId. Pooled gameobjects are skipped in the queue phase to prevent duplicate spawns.');
@@ -0,0 +1,70 @@
-- DB update 2026_05_14_00 -> 2026_05_15_00
-- Remove trigger bunny SAI scripts that interfere with the chain mechanic
DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` IN (-113478, -113479, -113550, -113551));
-- === CHAIN BUNNIES: add On Spawn event (id=0) so chains arm immediately on spawn ===
-- Phase 1 = chain intact and ready to be broken; Phase 0 = chain broken
-- id=0: SPAWN -> CAST chain spell, link=1
-- id=1: LINK -> SET PHASE 1
-- id=2: ACTION(10) -> CAST chain spell, link=1 (Akali reset: re-arm)
-- id=3: SPELLHIT(52816), phase=1, flags=512 -> REMOVE_AURA from trigger bunny, link=4
-- id=4: LINK, phase=1 -> DO_ACTION(11) on Akali, link=5
-- id=5: LINK -> SET PHASE 0
DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` IN (-113549, -113548, -61994, -61995));
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `event_param6`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
-- Right Front Paw GUID -113549 / chain spell 52834 / trigger bunny 113551
(-113549, 0, 0, 1, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 11, 52834, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny (scale x0.01) Large - On Spawn: Cast \'Rampage: Akali`s Chains - Right Front Paw\''),
(-113549, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 22, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny (scale x0.01) Large - On Spawn/Reset: Set Event Phase 1'),
(-113549, 0, 2, 1, 72, 0, 100, 0, 10, 0, 0, 0, 0, 0, 11, 52834, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny (scale x0.01) Large - On Action 10 (Reset): Cast \'Rampage: Akali`s Chains - Right Front Paw\''),
(-113549, 0, 3, 4, 8, 1, 100, 512, 52816, 0, 0, 0, 0, 0, 28, 52834, 0, 0, 0, 0, 0, 10, 113551, 26298, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny (scale x0.01) Large - On Spellhit \'Rampage: Akali Chain Anchor On Disturb\': Remove Aura \'Rampage: Akali`s Chains - Right Front Paw\''),
(-113549, 0, 4, 5, 61, 1, 100, 0, 0, 0, 0, 0, 0, 0, 223, 11, 0, 0, 0, 0, 0, 10, 98159, 28952, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny (scale x0.01) Large - On Spellhit \'Rampage: Akali Chain Anchor On Disturb\': Do Action 11 On Akali - Right Front Paw Freed'),
(-113549, 0, 5, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny (scale x0.01) Large - On Spellhit \'Rampage: Akali Chain Anchor On Disturb\': Set Event Phase 0'),
-- Left Front Paw GUID -113548 / chain spell 52833 / trigger bunny 113550
(-113548, 0, 0, 1, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 11, 52833, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny (scale x0.01) Large - On Spawn: Cast \'Rampage: Akali`s Chains - Left Front Paw\''),
(-113548, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 22, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny (scale x0.01) Large - On Spawn/Reset: Set Event Phase 1'),
(-113548, 0, 2, 1, 72, 0, 100, 0, 10, 0, 0, 0, 0, 0, 11, 52833, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny (scale x0.01) Large - On Action 10 (Reset): Cast \'Rampage: Akali`s Chains - Left Front Paw\''),
(-113548, 0, 3, 4, 8, 1, 100, 512, 52816, 0, 0, 0, 0, 0, 28, 52833, 0, 0, 0, 0, 0, 10, 113550, 26298, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny (scale x0.01) Large - On Spellhit \'Rampage: Akali Chain Anchor On Disturb\': Remove Aura \'Rampage: Akali`s Chains - Left Front Paw\''),
(-113548, 0, 4, 5, 61, 1, 100, 0, 0, 0, 0, 0, 0, 0, 223, 11, 0, 0, 0, 0, 0, 10, 98159, 28952, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny (scale x0.01) Large - On Spellhit \'Rampage: Akali Chain Anchor On Disturb\': Do Action 11 On Akali - Left Front Paw Freed'),
(-113548, 0, 5, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny (scale x0.01) Large - On Spellhit \'Rampage: Akali Chain Anchor On Disturb\': Set Event Phase 0'),
-- Right Rear Paw GUID -61994 / chain spell 52837 / trigger bunny 113478
(-61994, 0, 0, 1, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 11, 52837, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny (scale x0.01) Large - On Spawn: Cast \'Rampage: Akali`s Chains - Right Rear Paw\''),
(-61994, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 22, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny (scale x0.01) Large - On Spawn/Reset: Set Event Phase 1'),
(-61994, 0, 2, 1, 72, 0, 100, 0, 10, 0, 0, 0, 0, 0, 11, 52837, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny (scale x0.01) Large - On Action 10 (Reset): Cast \'Rampage: Akali`s Chains - Right Rear Paw\''),
(-61994, 0, 3, 4, 8, 1, 100, 512, 52816, 0, 0, 0, 0, 0, 28, 52837, 0, 0, 0, 0, 0, 10, 113478, 26298, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny (scale x0.01) Large - On Spellhit \'Rampage: Akali Chain Anchor On Disturb\': Remove Aura \'Rampage: Akali`s Chains - Right Rear Paw\''),
(-61994, 0, 4, 5, 61, 1, 100, 0, 0, 0, 0, 0, 0, 0, 223, 11, 0, 0, 0, 0, 0, 10, 98159, 28952, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny (scale x0.01) Large - On Spellhit \'Rampage: Akali Chain Anchor On Disturb\': Do Action 11 On Akali - Right Rear Paw Freed'),
(-61994, 0, 5, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny (scale x0.01) Large - On Spellhit \'Rampage: Akali Chain Anchor On Disturb\': Set Event Phase 0'),
-- Left Rear Paw GUID -61995 / chain spell 52838 / trigger bunny 113479
(-61995, 0, 0, 1, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 11, 52838, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny (scale x0.01) Large - On Spawn: Cast \'Rampage: Akali`s Chains - Left Rear Paw\''),
(-61995, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 22, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny (scale x0.01) Large - On Spawn/Reset: Set Event Phase 1'),
(-61995, 0, 2, 1, 72, 0, 100, 0, 10, 0, 0, 0, 0, 0, 11, 52838, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny (scale x0.01) Large - On Action 10 (Reset): Cast \'Rampage: Akali`s Chains - Left Rear Paw\''),
(-61995, 0, 3, 4, 8, 1, 100, 512, 52816, 0, 0, 0, 0, 0, 28, 52838, 0, 0, 0, 0, 0, 10, 113479, 26298, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny (scale x0.01) Large - On Spellhit \'Rampage: Akali Chain Anchor On Disturb\': Remove Aura \'Rampage: Akali`s Chains - Left Rear Paw\''),
(-61995, 0, 4, 5, 61, 1, 100, 0, 0, 0, 0, 0, 0, 0, 223, 11, 0, 0, 0, 0, 0, 10, 98159, 28952, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny (scale x0.01) Large - On Spellhit \'Rampage: Akali Chain Anchor On Disturb\': Do Action 11 On Akali - Left Rear Paw Freed'),
(-61995, 0, 5, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny (scale x0.01) Large - On Spellhit \'Rampage: Akali Chain Anchor On Disturb\': Set Event Phase 0');
-- === FIRE BUNNIES: add On Spawn cast so fire visual appears immediately on spawn ===
-- id=0: SPAWN -> CAST fire aura on self
-- id=1: ACTION(10) -> CAST fire aura on self (Akali reset relay)
-- id=2: SPELLHIT(52816), flags=512 -> REMOVE_AURA fire aura from self
DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` IN (-100336, -100333, -100335, -100334));
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `event_param6`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
-- Right Front Fire GUID -100336
(-100336, 0, 0, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 11, 52855, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spawn: Cast \'Cosmetic - Low Poly Fire (with Sound)\''),
(-100336, 0, 1, 0, 72, 0, 100, 0, 10, 0, 0, 0, 0, 0, 11, 52855, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Action 10 (Reset): Cast \'Cosmetic - Low Poly Fire (with Sound)\''),
(-100336, 0, 2, 0, 8, 0, 100, 512, 52816, 0, 0, 0, 0, 0, 28, 52855, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Rampage: Akali Chain Anchor On Disturb\': Remove Aura \'Cosmetic - Low Poly Fire (with Sound)\''),
-- Left Front Fire GUID -100333
(-100333, 0, 0, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 11, 52855, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spawn: Cast \'Cosmetic - Low Poly Fire (with Sound)\''),
(-100333, 0, 1, 0, 72, 0, 100, 0, 10, 0, 0, 0, 0, 0, 11, 52855, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Action 10 (Reset): Cast \'Cosmetic - Low Poly Fire (with Sound)\''),
(-100333, 0, 2, 0, 8, 0, 100, 512, 52816, 0, 0, 0, 0, 0, 28, 52855, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Rampage: Akali Chain Anchor On Disturb\': Remove Aura \'Cosmetic - Low Poly Fire (with Sound)\''),
-- Right Rear Fire GUID -100335
(-100335, 0, 0, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 11, 52855, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spawn: Cast \'Cosmetic - Low Poly Fire (with Sound)\''),
(-100335, 0, 1, 0, 72, 0, 100, 0, 10, 0, 0, 0, 0, 0, 11, 52855, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Action 10 (Reset): Cast \'Cosmetic - Low Poly Fire (with Sound)\''),
(-100335, 0, 2, 0, 8, 0, 100, 512, 52816, 0, 0, 0, 0, 0, 28, 52855, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Rampage: Akali Chain Anchor On Disturb\': Remove Aura \'Cosmetic - Low Poly Fire (with Sound)\''),
-- Left Rear Fire GUID -100334
(-100334, 0, 0, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 11, 52855, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spawn: Cast \'Cosmetic - Low Poly Fire (with Sound)\''),
(-100334, 0, 1, 0, 72, 0, 100, 0, 10, 0, 0, 0, 0, 0, 11, 52855, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Action 10 (Reset): Cast \'Cosmetic - Low Poly Fire (with Sound)\''),
(-100334, 0, 2, 0, 8, 0, 100, 512, 52816, 0, 0, 0, 0, 0, 28, 52855, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Rampage: Akali Chain Anchor On Disturb\': Remove Aura \'Cosmetic - Low Poly Fire (with Sound)\'');
-- Fix comment on Akali Reset Script relay action
UPDATE `smart_scripts` SET `comment` = 'Akali - Reset Script - Do Action ID 10: Relay Reset to All Creatures in 100yd' WHERE (`source_type` = 9 AND `entryorguid` = 2895202 AND `id` = 2);
+239
View File
@@ -0,0 +1,239 @@
-- DB update 2026_05_15_00 -> 2026_05_16_00
-- Remove Trok Creature Addon & set movement type to 0
UPDATE `creature` SET `MovementType` = 0 WHERE (`id1` = 14872) AND (`guid` = 13178);
DELETE FROM `creature_addon` WHERE (`guid` IN (13178));
-- Update Trok Creature Text
DELETE FROM `creature_text` WHERE (`CreatureID` = 14872);
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
(14872, 0, 0, 'Help! I\'m being chased by a swarm of bees!', 12, 1, 100, 0, 0, 0, 10259, 0, 'Trok'),
(14872, 1, 0, 'I\'m so tired of running, but these bees won\'t leave me alone!', 12, 1, 100, 0, 0, 0, 10260, 0, 'Trok'),
(14872, 2, 0, 'I didn\'t know bees didn\'t like fire!', 12, 1, 100, 0, 0, 0, 10261, 0, 'Trok'),
(14872, 3, 0, 'Karu will you please help get these bees off of me? They sting!', 12, 1, 100, 0, 0, 0, 10262, 0, 'Trok');
-- Remove Trok old waypoint & set a new one (sniffed)
DELETE FROM `waypoint_data` WHERE (`id` IN (1487200, 131780));
INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES
(1487200, 1, 189.78833, -2879.407, 92.37207, NULL, 0, 1, 0, 100, 0),
(1487200, 2, 196.40193, -2887.9465, 92.602974, NULL, 0, 1, 0, 100, 0),
(1487200, 3, 199.38814, -2897.0017, 92.52111, NULL, 0, 1, 0, 100, 0),
(1487200, 4, 190.36217, -2902.3767, 92.970795, NULL, 0, 1, 0, 100, 0),
(1487200, 5, 178.31169, -2894.8164, 92.2478, NULL, 0, 1, 0, 100, 0),
(1487200, 6, 176.065, -2881.6494, 92.193565, NULL, 0, 1, 0, 100, 0),
(1487200, 7, 184.97385, -2874.0618, 92.503174, NULL, 0, 1, 0, 100, 0),
(1487200, 8, 188.64171, -2863.1707, 92.492485, NULL, 0, 1, 0, 100, 0),
(1487200, 9, 185.13179, -2849.029, 93.031105, NULL, 0, 1, 0, 100, 0),
(1487200, 10, 168.12883, -2860.272, 94.1003, NULL, 0, 1, 0, 100, 0),
(1487200, 11, 176.99593, -2874.4072, 92.65014, NULL, 0, 1, 0, 100, 0),
(1487200, 12, 186.21628, -2881.846, 92.24808, NULL, 0, 1, 0, 100, 0),
(1487200, 13, 187.90642, -2896.509, 92.76375, NULL, 0, 1, 0, 100, 0),
(1487200, 14, 197.18289, -2898.233, 92.55867, NULL, 0, 1, 0, 100, 0),
(1487200, 15, 207.84627, -2905.636, 94.00287, NULL, 0, 1, 0, 100, 0),
(1487200, 16, 203.60707, -2922.1226, 92.3786, NULL, 0, 1, 0, 100, 0),
(1487200, 17, 193.30553, -2911.048, 93.0428, NULL, 0, 1, 0, 100, 0),
(1487200, 18, 191.15102, -2890.8577, 92.592575, NULL, 0, 1, 0, 100, 0),
(1487200, 19, 194.50716, -2876.6003, 92.41312, NULL, 0, 1, 0, 100, 0),
(1487200, 20, 194.12733, -2841.4548, 91.69264, NULL, 0, 1, 0, 100, 0),
(1487200, 21, 202.89024, -2831.5098, 91.73559, NULL, 0, 1, 0, 100, 0),
(1487200, 22, 213.87476, -2826.201, 91.92801, NULL, 0, 1, 0, 100, 0),
(1487200, 23, 216.59177, -2814.8127, 93.33152, NULL, 0, 1, 0, 100, 0),
(1487200, 24, 204.67686, -2814.8518, 94.10266, NULL, 0, 1, 0, 100, 0),
(1487200, 25, 195.65343, -2824.597, 93.45117, NULL, 0, 1, 0, 100, 0),
(1487200, 26, 186.61716, -2841.0603, 92.83624, NULL, 0, 1, 0, 100, 0),
(1487200, 27, 184.85129, -2857.1006, 93.068634, NULL, 0, 1, 0, 100, 0),
(1487200, 28, 182.88713, -2868.4695, 92.82301, NULL, 0, 1, 0, 100, 0),
(1487200, 29, 181.64453, -2880.3984, 92.19401, NULL, 0, 1, 0, 100, 0),
(1487200, 30, 181.71254, -2891.7336, 92.16029, NULL, 0, 1, 0, 100, 0),
(1487200, 31, 189.57338, -2906.6575, 93.126816, NULL, 0, 1, 0, 100, 0),
(1487200, 32, 197.61906, -2899.2085, 92.558975, NULL, 0, 1, 0, 100, 0),
(1487200, 33, 191.73611, -2888.19, 92.52359, NULL, 0, 1, 0, 100, 0),
(1487200, 34, 181.22736, -2883.558, 92.098076, NULL, 0, 1, 0, 100, 0),
(1487200, 35, 175.08127, -2877.4844, 92.491455, NULL, 0, 1, 0, 100, 0),
(1487200, 36, 175.89215, -2853.4841, 94.02501, NULL, 0, 1, 0, 100, 0),
(1487200, 37, 185.5698, -2853.3835, 92.97653, NULL, 0, 1, 0, 100, 0),
(1487200, 38, 194.3255, -2843.596, 91.66923, NULL, 0, 1, 0, 100, 0),
(1487200, 39, 196.79987, -2833.0298, 91.9368, NULL, 0, 1, 0, 100, 0),
(1487200, 40, 208.51218, -2826.5408, 92.3302, NULL, 0, 1, 0, 100, 0),
(1487200, 41, 193.60387, -2826.3994, 93.32707, NULL, 0, 1, 0, 100, 0),
(1487200, 42, 186.73663, -2838.3733, 92.952095, NULL, 0, 1, 0, 100, 0),
(1487200, 43, 182.54248, -2851.9463, 93.49391, NULL, 0, 1, 0, 100, 0),
(1487200, 44, 178.72981, -2869.5015, 92.94418, NULL, 0, 1, 0, 100, 0),
(1487200, 45, 184.02534, -2878.3716, 92.30419, NULL, 0, 1, 0, 100, 0),
(1487200, 46, 186.78435, -2894.731, 92.61203, NULL, 0, 1, 0, 100, 0),
(1487200, 47, 193.1604, -2904.673, 92.885086, NULL, 0, 1, 0, 100, 0),
(1487200, 48, 200.64632, -2925.725, 92.656525, NULL, 0, 1, 0, 100, 0),
(1487200, 49, 189.18666, -2922.2874, 93.340836, NULL, 0, 1, 0, 100, 0),
(1487200, 50, 179.52534, -2911.1165, 93.13945, NULL, 0, 1, 0, 100, 0),
(1487200, 51, 180.78668, -2890.9255, 92.09399, NULL, 0, 1, 0, 100, 0),
(1487200, 52, 190.62971, -2884.829, 92.397835, NULL, 0, 1, 0, 100, 0),
(1487200, 53, 200.87985, -2882.1377, 92.45194, NULL, 0, 1, 0, 100, 0);
-- Set Trok SAI
UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry` = 14872;
DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` = 14872);
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `event_param6`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(14872, 0, 0, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, 1487200, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Trok - On Reset - Start Path 1487200'),
(14872, 0, 1, 0, 108, 0, 10, 0, 10, 1487200, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Trok - On Point 10 of Path 1487200 Reached - Say Line 0'),
(14872, 0, 2, 0, 108, 0, 100, 0, 20, 1487200, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Trok - On Point 20 of Path 1487200 Reached - Say Line 1'),
(14872, 0, 3, 4, 108, 0, 100, 0, 36, 1487200, 0, 0, 0, 0, 235, 1000, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Trok - On Point 36 of Path 1487200 Reached - Pause Movement'),
(14872, 0, 4, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 80, 1487201, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Trok - On Point 36 of Path 1487200 Reached - Run Script'),
(14872, 0, 5, 0, 109, 0, 100, 0, 0, 1487200, 0, 0, 0, 0, 80, 1487200, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Trok - On Path 1487200 Finished - Run Script');
-- Set Trok Action Lists
DELETE FROM `smart_scripts` WHERE (`source_type` = 9) AND (`entryorguid` IN (1487200, 1487201));
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `event_param6`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(1487200, 9, 0, 0, 0, 0, 100, 0, 1000, 1000, 0, 0, 0, 0, 1, 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Trok - Actionlist - Say Line 3'),
(1487200, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 209.689, -2881.05, 92.1386, 0, 'Trok - Actionlist - Move To Position'),
(1487200, 9, 2, 0, 0, 0, 100, 0, 5000, 5000, 0, 0, 0, 0, 232, 1487200, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Trok - Actionlist - Start Path 1487200'),
(1487201, 9, 0, 0, 0, 0, 100, 0, 1000, 1000, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Trok - Actionlist - Say Line 2');
-- Set Movement Type 0 to all Swarm of bees & remove waypoints
UPDATE `creature` SET `MovementType` = 0 WHERE (`id1` = 14894) AND (`guid` IN (13586, 13587, 13588, 13589));
DELETE FROM `creature_addon` WHERE (`guid` IN (13586, 13587, 13588, 13589));
-- Set Creature Formation (Trok & Swarm of bees)
DELETE FROM `creature_formations` WHERE (`LeaderGUID` IN (13178));
INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES
(13178, 13178, 0, 0, 512, 0, 0),
(13178, 13586, 4, 170, 512, 0, 0),
(13178, 13587, 4, 190, 512, 0, 0),
(13178, 13588, 3, 150, 512, 0, 0),
(13178, 13589, 3, 210, 512, 0, 0);
-- Set Karu Waypoints (sniffed)
DELETE FROM `waypoint_data` WHERE (`id` IN (1487400, 1487401, 1487402, 1487403, 1487404, 1487405));
INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES
(1487400, 1, 236.83551, -2901.6663, 98.27072, NULL, 0, 0, 0, 100, 0),
(1487400, 2, 231.1377, -2900.656, 98.36378, NULL, 0, 0, 0, 100, 0),
(1487401, 1, 219.67693, -2892.0176, 95.375305, NULL, 0, 0, 0, 100, 0),
(1487401, 2, 215.81598, -2885.1648, 93.01749, NULL, 0, 0, 0, 100, 0),
(1487401, 3, 213.4375, -2878.5742, 91.89915, NULL, 0, 0, 0, 100, 0),
(1487401, 4, 214.15646, -2874.6372, 92.180084, NULL, 0, 0, 0, 100, 0),
(1487402, 1, 207.91458, -2874.2258, 92.25248, NULL, 0, 0, 0, 100, 0),
(1487402, 2, 205.98448, -2870.8022, 91.66923, NULL, 0, 0, 0, 100, 0),
(1487402, 3, 207.36649, -2869.3914, 92.06761, NULL, 0, 0, 0, 100, 0),
(1487403, 1, 210.06313, -2874.726, 92.30663, NULL, 0, 0, 0, 100, 0),
(1487403, 2, 214.50314, -2872.4348, 92.15973, NULL, 0, 0, 0, 100, 0),
(1487403, 3, 217.36098, -2865.298, 91.65433, NULL, 0, 0, 0, 100, 0),
(1487403, 4, 217.41162, -2850.4937, 90.641594, NULL, 0, 0, 0, 100, 0),
(1487404, 1, 213.4119, -2880.7893, 92.02311, NULL, 0, 0, 0, 100, 0),
(1487404, 2, 219.35861, -2891.507, 95.20309, NULL, 0, 0, 0, 100, 0),
(1487404, 3, 226.4482, -2900.4465, 97.3964, NULL, 0, 0, 0, 100, 0),
(1487404, 4, 232.52274, -2901.0789, 98.35955, NULL, 0, 0, 0, 100, 0),
(1487404, 5, 239.77821, -2901.221, 98.15523, NULL, 0, 0, 0, 100, 0),
(1487404, 6, 240.79094, -2901.4275, 98.10327, NULL, 0, 0, 0, 100, 0),
(1487405, 1, 216.49214, -2861.2983, 91.58173, NULL, 0, 0, 0, 100, 0),
(1487405, 2, 213.4119, -2880.7893, 92.02311, NULL, 0, 0, 0, 100, 0),
(1487405, 3, 219.35861, -2891.507, 95.20309, NULL, 0, 0, 0, 100, 0),
(1487405, 4, 226.4482, -2900.4465, 97.3964, NULL, 0, 0, 0, 100, 0),
(1487405, 5, 232.52274, -2901.0789, 98.35955, NULL, 0, 0, 0, 100, 0),
(1487405, 6, 239.77821, -2901.221, 98.15523, NULL, 0, 0, 0, 100, 0),
(1487405, 7, 240.79094, -2901.4275, 98.10327, NULL, 0, 0, 0, 100, 0);
-- Set Karu SAI
UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry` = 14874;
DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` = 14874);
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `event_param6`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(14874, 0, 0, 1, 1, 1, 100, 0, 120000, 180000, 120000, 180000, 0, 0, 89, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Karu - Out of Combat - Stop Random Movement (Phase 1)'),
(14874, 0, 1, 2, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 22, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Karu - Out of Combat - Set Event Phase 2 (Phase 1)'),
(14874, 0, 2, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 69, 14, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 241.109, -2908.19, 98.1005, 0, 'Karu - Out of Combat - Move To Position (Phase 1)'),
(14874, 0, 3, 0, 34, 2, 100, 0, 8, 14, 0, 0, 0, 0, 80, 1487400, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Karu - On Reached Point 14 - Run Script (Phase 2)'),
(14874, 0, 4, 0, 109, 2, 100, 0, 0, 1487400, 0, 0, 0, 0, 80, 1487401, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Karu - On Path 1487400 Finished - Run Script (Phase 2)'),
(14874, 0, 5, 0, 109, 2, 100, 0, 0, 1487401, 0, 0, 0, 0, 80, 1487402, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Karu - On Path 1487401 Finished - Run Script (Phase 2)'),
(14874, 0, 6, 0, 109, 2, 100, 0, 0, 1487401, 0, 0, 0, 0, 80, 1487406, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Karu - On Path 1487401 Finished - Run Script (Phase 2)'),
(14874, 0, 7, 0, 109, 2, 100, 0, 0, 1487402, 0, 0, 0, 0, 80, 1487403, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Karu - On Path 1487402 Finished - Run Script (Phase 2)'),
(14874, 0, 8, 0, 109, 2, 100, 0, 0, 1487403, 0, 0, 0, 0, 80, 1487404, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Karu - On Path 1487403 Finished - Run Script (Phase 2)'),
(14874, 0, 9, 0, 34, 2, 100, 0, 8, 15, 0, 0, 0, 0, 80, 1487405, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Karu - On Reached Point 15 - Run Script (Phase 2)'),
(14874, 0, 10, 12, 109, 2, 100, 0, 0, 1487404, 0, 0, 0, 0, 22, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Karu - On Path 1487404 Finished - Set Event Phase 1 (Phase 2)'),
(14874, 0, 11, 12, 109, 2, 100, 0, 0, 1487405, 0, 0, 0, 0, 22, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Karu - On Path 1487405 Finished - Set Event Phase 1 (Phase 2)'),
(14874, 0, 12, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 89, 5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Karu - On Path 1487405 Finished - Start Random Movement (Phase 2)'),
(14874, 0, 13, 14, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 22, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Karu - On Respawn - Set Event Phase 1'),
(14874, 0, 14, 15, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Karu - On Respawn - Set Run Off'),
(14874, 0, 15, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 89, 5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Karu - On Respawn - Start Random Movement');
-- Set Action Lists (Karu)
DELETE FROM `smart_scripts` WHERE (`source_type` = 9) AND (`entryorguid` IN (1487400, 1487401, 1487402, 1487403, 1487404, 1487405, 1487406));
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `event_param6`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(1487400, 9, 0, 0, 0, 0, 100, 0, 500, 500, 0, 0, 0, 0, 66, 1, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 5.89921, 'Karu - Actionlist - Set Orientation 5.89921'),
(1487400, 9, 1, 0, 0, 0, 100, 0, 10000, 10000, 0, 0, 0, 0, 71, 0, 0, 2196, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Karu - Actionlist - Change Equipment'),
(1487400, 9, 2, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Karu - Actionlist - Say Line 0'),
(1487400, 9, 3, 0, 0, 0, 100, 0, 10000, 10000, 0, 0, 0, 0, 232, 1487400, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Karu - Actionlist - Start Path 1487400'),
(1487401, 9, 0, 0, 0, 0, 100, 0, 4000, 4000, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Karu - Actionlist - Say Line 1'),
(1487401, 9, 1, 0, 0, 0, 100, 0, 5500, 5500, 0, 0, 0, 0, 5, 7, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Karu - Actionlist - Play Emote 7'),
(1487401, 9, 2, 0, 0, 0, 100, 0, 500, 500, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Karu - Actionlist - Say Line 2'),
(1487401, 9, 3, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 0, 0, 71, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Karu - Actionlist - Remove Equipment'),
(1487401, 9, 4, 0, 0, 0, 100, 0, 3000, 3000, 0, 0, 0, 0, 1, 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Karu - Actionlist - Say Line 3'),
(1487401, 9, 5, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, 1487401, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Karu - Actionlist - Start Path 1487401'),
(1487402, 9, 0, 0, 0, 0, 100, 0, 5000, 5000, 0, 0, 0, 0, 1, 4, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Karu - Actionlist - Say Line 4'),
(1487402, 9, 1, 0, 0, 0, 100, 0, 3000, 3000, 0, 0, 0, 0, 232, 1487402, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Karu - Actionlist - Start Path 1487402'),
(1487403, 9, 0, 0, 0, 0, 100, 0, 6000, 6000, 0, 0, 0, 0, 71, 0, 0, 12744, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Karu - Actionlist - Change Equipment'),
(1487403, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, 1487403, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Karu - Actionlist - Start Path 1487403'),
(1487404, 9, 0, 0, 0, 0, 100, 0, 2000, 2000, 0, 0, 0, 0, 1, 5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Karu - Actionlist - Say Line 5'),
(1487404, 9, 1, 0, 0, 0, 100, 0, 4000, 4000, 0, 0, 0, 0, 223, 67, 0, 0, 0, 0, 0, 9, 10685, 0, 50, 0, 0, 0, 0, 0, 'Karu - Actionlist - Do Action ID 67'),
(1487404, 9, 2, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 89, 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Karu - Actionlist - Start Random Movement'),
(1487404, 9, 3, 0, 0, 0, 100, 0, 12000, 12000, 0, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Karu - Actionlist - Stop Random Movement'),
(1487404, 9, 4, 0, 0, 0, 100, 0, 2000, 2000, 0, 0, 0, 0, 223, 68, 0, 0, 0, 0, 0, 9, 10685, 0, 50, 0, 0, 0, 0, 0, 'Karu - Actionlist - Do Action ID 68'),
(1487404, 9, 5, 0, 0, 0, 100, 0, 5000, 5000, 0, 0, 0, 0, 69, 15, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 214.149, -2854.87, 91.2582, 0, 'Karu - Actionlist - Move To Position'),
(1487405, 9, 0, 0, 0, 0, 100, 0, 500, 500, 0, 0, 0, 0, 71, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Karu - Actionlist - Remove Equipment'),
(1487405, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 1, 6, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Karu - Actionlist - Say Line 6'),
(1487405, 9, 2, 0, 0, 0, 100, 0, 2000, 2000, 0, 0, 0, 0, 232, 1487405, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Karu - Actionlist - Start Path 1487405'),
(1487406, 9, 0, 0, 0, 0, 100, 0, 1000, 1000, 0, 0, 0, 0, 1, 7, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Karu - Actionlist - Say Line 7'),
(1487406, 9, 1, 0, 0, 0, 100, 0, 2000, 2000, 0, 0, 0, 0, 232, 1487404, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Karu - Actionlist - Start Path 1487404');
-- Set Conditions
DELETE FROM `conditions` WHERE (`SourceTypeOrReferenceId` = 22) AND (`SourceGroup` IN (6, 7)) AND (`SourceEntry` = 14874) AND (`SourceId` = 0) AND (`ElseGroup` = 0) AND (`ConditionTypeOrReference` = 29) AND (`ConditionTarget` = 1) AND (`ConditionValue1` = 10685) AND (`ConditionValue2` = 100) AND (`ConditionValue3` = 0);
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
(22, 6, 14874, 0, 0, 29, 1, 10685, 100, 0, 0, 0, 0, '', 'Karu will start this event only if there is at least one Swine alive.'),
(22, 7, 14874, 0, 0, 29, 1, 10685, 100, 0, 1, 0, 0, '', 'Karu will start this event only if Swine are not present.');
-- Edit two Swine spawn points & add 3 new ones
DELETE FROM `creature` WHERE (`id1` = 10685) AND (`guid` IN (20181, 20186, 24323, 25789, 25790));
INSERT INTO `creature` (`guid`, `id1`, `id2`, `id3`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `wander_distance`, `currentwaypoint`, `curhealth`, `curmana`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`, `ScriptName`, `VerifiedBuild`, `CreateObject`, `Comment`) VALUES
(20181, 10685, 0, 0, 1, 0, 0, 1, 1, 0, 207.93942, -2842.1497, 91.52266, 5.53006, 200, 5, 0, 14, 0, 1, 0, 0, 0, '', 0, 0, NULL),
(20186, 10685, 0, 0, 1, 0, 0, 1, 1, 0, 221.12567, -2841.0894, 91.34413, 2.15169, 200, 5, 0, 14, 0, 1, 0, 0, 0, '', 0, 0, NULL),
(24323, 10685, 0, 0, 1, 0, 0, 1, 1, 0, 225.25417, -2858.4543, 91.61024, 5.24779, 200, 5, 0, 14, 0, 1, 0, 0, 0, '', 0, 0, NULL),
(25789, 10685, 0, 0, 1, 0, 0, 1, 1, 0, 208.33398, -2863.0215, 91.66205, 2.89705, 200, 5, 0, 14, 0, 1, 0, 0, 0, '', 0, 0, NULL),
(25790, 10685, 0, 0, 1, 0, 0, 1, 1, 0, 208.70555, -2847.2627, 91.358574, 6.05528, 200, 5, 0, 14, 0, 1, 0, 0, 0, '', 0, 0, NULL);
-- Set Swines Personal SAIs
UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE (`entry` = 10685);
DELETE FROM `smart_scripts` WHERE (`source_type` = 0) AND (`entryorguid` IN (-20181, -20186, -24323, -25789, -25790));
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `event_param6`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(-20181, 0, 0, 1, 72, 0, 100, 0, 67, 0, 0, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Swine - On Action 67 Done - Start Random Movement'),
(-20181, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 29, 2, 180, 0, 0, 0, 0, 10, 13180, 14874, 0, 0, 0, 0, 0, 0, 'Swine - On Action 67 Done - Start Follow Closest Creature \'Karu\''),
(-20181, 0, 2, 3, 72, 0, 100, 0, 68, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Swine - On Action 68 Done - Set Run Off'),
(-20181, 0, 3, 4, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Swine - On Action 68 Done - Set Run Off'),
(-20181, 0, 4, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 69, 20, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 207.939, -2842.15, 91.5227, 0, 'Swine - On Action 68 Done - Move To Position'),
(-20181, 0, 5, 6, 34, 0, 100, 0, 8, 20, 0, 0, 0, 0, 89, 5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Swine - On Reached Point 20 - Start Random Movement'),
(-20181, 0, 6, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Swine - On Reached Point 20 - Set Run On'),
(-20186, 0, 0, 1, 72, 0, 100, 0, 67, 0, 0, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Swine - On Action 67 Done - Start Random Movement'),
(-20186, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 29, 2, 150, 0, 0, 0, 0, 10, 13180, 14874, 0, 0, 0, 0, 0, 0, 'Swine - On Action 67 Done - Start Follow Closest Creature \'Karu\''),
(-20186, 0, 2, 3, 72, 0, 100, 0, 68, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Swine - On Action 68 Done - Set Run Off'),
(-20186, 0, 3, 4, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Swine - On Action 68 Done - Set Run Off'),
(-20186, 0, 4, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 69, 20, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 221.12567, -2841.0894, 91.34413, 0, 'Swine - On Action 68 Done - Move To Position'),
(-20186, 0, 5, 6, 34, 0, 100, 0, 8, 20, 0, 0, 0, 0, 89, 5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Swine - On Reached Point 20 - Start Random Movement'),
(-20186, 0, 6, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Swine - On Reached Point 20 - Set Run On'),
(-24323, 0, 0, 1, 72, 0, 100, 0, 67, 0, 0, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Swine - On Action 67 Done - Start Random Movement'),
(-24323, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 29, 2, 130, 0, 0, 0, 0, 10, 13180, 14874, 0, 0, 0, 0, 0, 0, 'Swine - On Action 67 Done - Start Follow Closest Creature \'Karu\''),
(-24323, 0, 2, 3, 72, 0, 100, 0, 68, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Swine - On Action 68 Done - Set Run Off'),
(-24323, 0, 3, 4, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Swine - On Action 68 Done - Set Run Off'),
(-24323, 0, 4, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 69, 20, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 225.25417, -2858.4543, 91.61024, 0, 'Swine - On Action 68 Done - Move To Position'),
(-24323, 0, 5, 6, 34, 0, 100, 0, 8, 20, 0, 0, 0, 0, 89, 5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Swine - On Reached Point 20 - Start Random Movement'),
(-24323, 0, 6, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Swine - On Reached Point 20 - Set Run On'),
(-25789, 0, 0, 1, 72, 0, 100, 0, 67, 0, 0, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Swine - On Action 67 Done - Start Random Movement'),
(-25789, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 29, 2, 210, 0, 0, 0, 0, 10, 13180, 14874, 0, 0, 0, 0, 0, 0, 'Swine - On Action 67 Done - Start Follow Closest Creature \'Karu\''),
(-25789, 0, 2, 3, 72, 0, 100, 0, 68, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Swine - On Action 68 Done - Set Run Off'),
(-25789, 0, 3, 4, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Swine - On Action 68 Done - Set Run Off'),
(-25789, 0, 4, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 69, 20, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 208.33398, -2863.0215, 91.66205, 0, 'Swine - On Action 68 Done - Move To Position'),
(-25789, 0, 5, 6, 34, 0, 100, 0, 8, 20, 0, 0, 0, 0, 89, 5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Swine - On Reached Point 20 - Start Random Movement'),
(-25789, 0, 6, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Swine - On Reached Point 20 - Set Run On'),
(-25790, 0, 0, 1, 72, 0, 100, 0, 67, 0, 0, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Swine - On Action 67 Done - Start Random Movement'),
(-25790, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 29, 2, 230, 0, 0, 0, 0, 10, 13180, 14874, 0, 0, 0, 0, 0, 0, 'Swine - On Action 67 Done - Start Follow Closest Creature \'Karu\''),
(-25790, 0, 2, 3, 72, 0, 100, 0, 68, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Swine - On Action 68 Done - Set Run Off'),
(-25790, 0, 3, 4, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Swine - On Action 68 Done - Set Run Off'),
(-25790, 0, 4, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 69, 20, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 208.70555, -2847.2627, 91.358574, 0, 'Swine - On Action 68 Done - Move To Position'),
(-25790, 0, 5, 6, 34, 0, 100, 0, 8, 20, 0, 0, 0, 0, 89, 5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Swine - On Reached Point 20 - Start Random Movement'),
(-25790, 0, 6, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Swine - On Reached Point 20 - Set Run On');
@@ -0,0 +1,5 @@
-- DB update 2026_05_16_00 -> 2026_05_16_01
--
DELETE FROM `creature_text` WHERE (`CreatureID` = 24322) AND (`GroupID` IN (0));
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
(24322, 0, 0, 'Silence!', 14, 0, 100, 1, 0, 0, 32240, 0, 'Ancient Citizen of Nifflevar yell');
@@ -0,0 +1,20 @@
-- DB update 2026_05_16_01 -> 2026_05_16_02
-- Update Night Elf shapeshift forms
DELETE FROM `player_shapeshift_model` WHERE (`RaceID` = 4 AND `CustomizationID` IN (3, 5) AND `ShapeshiftID` IN (5, 8)) OR (`RaceID` = 4 AND `CustomizationID` = 5 AND `ShapeshiftID` = 1) OR (`RaceID` = 4 AND `CustomizationID` = 7 AND `ShapeshiftID` IN (5, 8)) OR (`RaceID` = 4 AND `CustomizationID` = 6 AND `ShapeshiftID` = 1);
INSERT INTO `player_shapeshift_model` (`ShapeshiftID`, `RaceID`, `CustomizationID`, `GenderID`, `ModelID`) VALUES
-- light blue hair, bear
(5, 4, 3, 2, 29415),
(8, 4, 3, 2, 29415),
-- blue hair, bear
(5, 4, 5, 2, 29415),
(8, 4, 5, 2, 29415),
-- blue hair, cat
(1, 4, 5, 2, 29406),
-- purple hair, red bear
(5, 4, 7, 2, 29417),
(8, 4, 7, 2, 29417),
-- darkblue hair, black cat
(1, 4, 6, 2, 892);
-- remove customization id 8
DELETE FROM `player_shapeshift_model` WHERE `ShapeshiftID`=1 AND `RaceID`=4 AND `CustomizationID`=8 AND `GenderID`=2 AND `ModelID` = 29405;
@@ -0,0 +1,4 @@
-- DB update 2026_05_16_02 -> 2026_05_17_00
DELETE FROM `spell_proc` WHERE `SpellId` = 20178;
INSERT INTO `spell_proc` (`SpellId`, `SchoolMask`, `SpellFamilyName`, `SpellFamilyMask0`, `SpellFamilyMask1`, `SpellFamilyMask2`, `ProcFlags`, `SpellTypeMask`, `SpellPhaseMask`, `HitMask`, `AttributesMask`, `DisableEffectsMask`, `ProcsPerMinute`, `Chance`, `Cooldown`, `Charges`) VALUES
(20178, 0, 0, 0, 0, 0, 0x4, 0, 0, 0x2477, 0, 0, 0, 100, 0, 4);
@@ -0,0 +1,10 @@
-- DB update 2026_05_17_00 -> 2026_05_17_01
DELETE FROM `command` WHERE `name` IN ('debug combat','debug threatinfo','pdump copy','pet delete','pet list','rbac list','reload rbac');
INSERT INTO `command` (`name`,`security`,`help`) VALUES
('debug combat',3,'Syntax: .debug combat\nLists PvP and PvE combat references of the selected unit (or self).'),
('debug threatinfo',3,'Syntax: .debug threatinfo\nDisplays various debug information about the target''s threat state, modifiers, redirects and similar.'),
('pdump copy',3,'Syntax: .pdump copy $playerNameOrGUID $account [$newname] [$newguid]\nCopy character with name/guid $playerNameOrGUID into character list of $account with $newname, with first free or $newguid guid.'),
('pet delete',3,'Syntax: .pet delete $playerNameOrGUID #petNumber\nDeletes the pet with the given pet number belonging to the specified player.'),
('pet list',1,'Syntax: .pet list $playerNameOrGUID\nLists all pets owned by the specified player (id, entry, level, slot, name, type).'),
('rbac list',3,'Syntax: .rbac list [#id]\nView list of all permissions. If #id is given will show only info for that permission.'),
('reload rbac',3,'Syntax: .reload rbac\nReload rbac system.');
@@ -0,0 +1,2 @@
-- DB update 2026_05_17_01 -> 2026_05_17_02
UPDATE `smart_scripts` SET `action_param6` = 2 WHERE `entryorguid` IN (17809, 17810, 17811, 17812) AND `source_type` = 0 AND `action_type` = 53;
@@ -0,0 +1,9 @@
-- DB update 2026_05_17_02 -> 2026_05_17_03
DELETE FROM `item_loot_template` WHERE (`Entry` = 41888) AND (`Item` IN (41450, 41452, 41466, 41468, 41492, 41497));
INSERT INTO `item_loot_template` (`Entry`, `Item`, `Reference`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES
(41888, 41450, 0, 16.9, 0, 1, 1, 1, 1, 'Small Velvet Bag - Perfect Balanced Shadow Crystal'),
(41888, 41452, 0, 16.9, 0, 1, 1, 1, 1, 'Small Velvet Bag - Perfect Glowing Shadow Crystal'),
(41888, 41466, 0, 17.7, 0, 1, 1, 1, 1, 'Small Velvet Bag - Perfect Forceful Dark Jade'),
(41888, 41468, 0, 16.3, 0, 1, 1, 1, 1, 'Small Velvet Bag - Perfect Jagged Dark Jade'),
(41888, 41492, 0, 13, 0, 1, 1, 1, 1, 'Small Velvet Bag - Perfect Inscribed Huge Citrine'),
(41888, 41497, 0, 19.3, 0, 1, 1, 1, 1, 'Small Velvet Bag - Perfect Reckless Huge Citrine');
@@ -0,0 +1,51 @@
-- DB update 2026_05_17_03 -> 2026_05_17_04
--
-- Griselda Hunderland → Talker: 26043
DELETE FROM `creature_text` WHERE (`CreatureID` = 26043);
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
(26043, 0, 0, 'Greetings, $c.', 12, 0, 100, 3, 0, 0, 32808, 0, 'Griselda Hunderland'),
(26043, 0, 1, 'Let me know if you need help finding anything, $c.', 12, 0, 100, 3, 0, 0, 32810, 0, 'Griselda Hunderland'),
(26043, 0, 2, 'Greetings.', 12, 0, 100, 3, 0, 0, 32935, 0, 'Griselda Hunderland'),
(26043, 0, 3, 'Welcome!', 12, 0, 100, 3, 0, 0, 32807, 0, 'Griselda Hunderland'),
(26043, 0, 4, 'Greetings! Please have a look around.', 12, 0, 100, 0, 0, 0, 32809, 0, 'Griselda Hunderland - Player In Range'),
(26043, 0, 5, 'Welcome. May I help you find something?', 12, 0, 100, 0, 0, 0, 32811, 0, 'Griselda Hunderland - Player In Range'),
(26043, 0, 6, 'Welcome.', 12, 0, 100, 0, 0, 0, 32936, 0, 'Griselda Hunderland - Player In Range');
-- Endora Moorehead → Talker: 29636
DELETE FROM `creature_text` WHERE (`CreatureID` = 29636);
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
(29636, 0, 0, 'Greetings! Please have a look around.', 12, 0, 100, 3, 0, 0, 32809, 0, 'Endora Moorehead'),
(29636, 0, 1, 'Greetings, $c.', 12, 0, 100, 3, 0, 0, 32808, 0, 'Endora Moorehead'),
(29636, 0, 2, 'Welcome!', 12, 0, 100, 3, 0, 0, 32807, 0, 'Endora Moorehead'),
(29636, 0, 3, 'Let me know if you need help finding anything, $c.', 12, 0, 100, 0, 0, 0, 32810, 0, 'Endora Moorehead - Player In Range'),
(29636, 0, 4, 'Welcome. May I help you find something?', 12, 0, 100, 0, 0, 0, 32811, 0, 'Endora Moorehead - Player In Range'),
(29636, 0, 5, 'Greetings.', 12, 0, 100, 0, 0, 0, 32935, 0, 'Endora Moorehead - Player In Range'),
(29636, 0, 6, 'Welcome.', 12, 0, 100, 0, 0, 0, 32936, 0, 'Endora Moorehead - Player In Range');
-- Karandonna → Talker: 28995
DELETE FROM `creature_text` WHERE (`CreatureID` = 28995);
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
(28995, 0, 0, 'Welcome. May I help you find something?', 12, 0, 100, 3, 0, 0, 32811, 0, 'Karandonna'),
(28995, 0, 1, 'Welcome.', 12, 0, 100, 3, 0, 0, 32936, 0, 'Karandonna'),
(28995, 0, 2, 'Welcome!', 12, 0, 100, 0, 0, 0, 32807, 0, 'Karandonna - Player In Range'),
(28995, 0, 3, 'Greetings, $c.', 12, 0, 100, 0, 0, 0, 32808, 0, 'Karandonna - Player In Range'),
(28995, 0, 4, 'Greetings! Please have a look around.', 12, 0, 100, 0, 0, 0, 32809, 0, 'Karandonna - Player In Range'),
(28995, 0, 5, 'Let me know if you need help finding anything, $c.', 12, 0, 100, 0, 0, 0, 32810, 0, 'Karandonna - Player In Range'),
(28995, 0, 6, 'Greetings.', 12, 0, 100, 0, 0, 0, 32935, 0, 'Karandonna - Player In Range');
-- Miles Sidney → Talker: 28355
DELETE FROM `creature_text` WHERE (`CreatureID` = 28355);
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
-- GroupID 0 → Script 2834700 id=1 e Script 2834701 id=0
(28355, 0, 0, 'I\'m working on it, I just don\'t want to sell it until I\'m happy with it. It shouldn\'t be long.', 12, 0, 100, 0, 0, 0, 27808, 0, 'Wright Williams'),
-- GroupID 1 → Script 2834702 id=0
(28355, 1, 0, 'Sir, our customers are complaining that there\'s not enough Maiden\'s Anguish in our Deadly Poisons.', 12, 0, 100, 0, 0, 0, 27803, 0, 'Wright Williams'),
-- GroupID 2 → Script 2834700 id=1 e Script 2834702 id=0
(28355, 2, 0, 'Sir, I think we were close with the Lethargy Root in that last poison recipe.', 12, 0, 100, 0, 0, 0, 27802, 0, 'Wright Williams'),
-- GroupID 3 → Script 2834703 id=0
(28355, 3, 0, 'Sir, our customers are complaining that there\'s too much Deathweed in our Anesthetics.', 12, 0, 100, 0, 0, 0, 27809, 0, 'Wright Williams'),
(28355, 5, 0, 'Greetings.', 12, 7, 100, 3, 0, 0, 43337, 0, 'Miles Sidney'),
(28355, 5, 1, 'Greetings, $c.', 12, 7, 100, 3, 0, 0, 43330, 0, 'Miles Sidney'),
(28355, 5, 2, 'Greetings! Please have a look around.', 12, 7, 100, 3, 0, 0, 43333, 0, 'Miles Sidney'),
(28355, 5, 3, 'Let me know if you need help finding anything, $c.', 12, 7, 100, 3, 0, 0, 43335, 0, 'Miles Sidney'),
(28355, 5, 4, 'Welcome. May I help you find something?', 12, 7, 100, 3, 0, 0, 43336, 0, 'Miles Sidney');
@@ -0,0 +1,8 @@
-- DB update 2026_05_17_04 -> 2026_05_17_05
--
-- Scourgebane Infusion (item 22778 -> spell 28488) and Scourgebane Draught
-- (item 22779 -> spell 28486) are not battle elixirs. Remove them from the
-- Battle Elixir spell group(1) so they stack with each other and other
-- flasks/elixirs.
--
DELETE FROM `spell_group` WHERE `id` = 1 AND `spell_id` IN (28486, 28488);
@@ -0,0 +1,3 @@
-- DB update 2026_05_17_05 -> 2026_05_17_06
--
UPDATE `item_loot_template` SET `Chance` = 0 WHERE `Entry` = 41888 AND `GroupId` = 1;
@@ -0,0 +1,5 @@
-- DB update 2026_05_17_06 -> 2026_05_17_07
-- Remove Dead Alliance Soldier spawn point and creature addon
DELETE FROM `creature` WHERE `id1` = 31281 AND `guid` = 121653;
DELETE FROM `creature_addon` WHERE (`guid` IN (121653));
@@ -0,0 +1,37 @@
-- DB update 2026_05_17_07 -> 2026_05_18_00
-- Set idle for Burning Blade Fanatics and Apprentices.
UPDATE `creature` SET `wander_distance` = 0, `MovementType` = 0 WHERE (`id1` = 3198) AND (`guid` IN (6430, 6431));
UPDATE `creature` SET `wander_distance` = 0, `MovementType` = 0 WHERE (`id1` = 3197) AND (`guid` IN (6427, 6429));
-- Remove Old Waypoint from Creature Addon and set Movement Type to 0.
UPDATE `creature` SET `MovementType` = 0 WHERE (`id1` = 3203) AND (`guid` IN (6455));
UPDATE `creature_addon` SET `path_id` = 0 WHERE (`guid` IN (6455));
-- Delete old Fizzle Darkstorm waypoint and add a sniffed new one.
DELETE FROM `waypoint_data` WHERE (`id` IN (645500));
INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES
(645500, 1, 869.7513, -4202.463, -14.066155, NULL, 0, 0, 0, 100, 0),
(645500, 2, 871.55255, -4210.9136, -12.093292, NULL, 0, 0, 0, 100, 0),
(645500, 3, 876.02, -4217.9136, -11.525927, NULL, 25000, 0, 0, 100, 0),
(645500, 4, 870.5361, -4208.033, -13.908268, NULL, 0, 0, 0, 100, 0),
(645500, 5, 867.7095, -4194.5493, -14.389078, NULL, 0, 0, 0, 100, 0),
(645500, 6, 868.6138, -4189.563, -14.07393, NULL, 45000, 0, 0, 100, 0);
-- Set Fizzle Darkstorm SmartAI and update old comments.
UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry` = 3203;
DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` = 3203);
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `event_param6`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(3203, 0, 0, 0, 1, 0, 100, 1, 1000, 1000, 0, 0, 0, 0, 11, 11939, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Fizzle Darkstorm - Out of Combat - Cast \'Summon Imp\' (No Repeat)'),
(3203, 0, 1, 0, 0, 0, 100, 0, 0, 0, 2400, 3800, 0, 0, 11, 20791, 64, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Fizzle Darkstorm - In Combat - Cast \'Shadow Bolt\''),
(3203, 0, 2, 0, 2, 0, 100, 0, 0, 50, 20000, 30000, 0, 0, 11, 7290, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Fizzle Darkstorm - Between 0-50% Health - Cast \'Soul Siphon\''),
(3203, 0, 3, 0, 2, 0, 100, 1, 0, 15, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 'Fizzle Darkstorm - Between 0-15% Health - Flee For Assist (No Repeat)'),
(3203, 0, 4, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, 645500, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Fizzle Darkstorm - On Reset - Start Path 645500'),
(3203, 0, 5, 0, 108, 0, 100, 0, 3, 645500, 0, 0, 0, 0, 80, 320300, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Fizzle Darkstorm - On Point 3 of Path 645500 Reached - Run Script');
-- Add Action List.
DELETE FROM `smart_scripts` WHERE (`source_type` = 9 AND `entryorguid` = 320300);
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `event_param6`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(320300, 9, 0, 0, 0, 0, 100, 0, 1000, 1000, 0, 0, 0, 0, 11, 21157, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Fizzle Darkstorm - Actionlist - Cast \'Dark Channeling\''),
(320300, 9, 1, 0, 0, 0, 100, 0, 25000, 25000, 0, 0, 0, 0, 28, 21157, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Fizzle Darkstorm - Actionlist - Remove Aura \'Dark Channeling\'');
@@ -0,0 +1,28 @@
-- DB update 2026_05_18_00 -> 2026_05_18_01
-- Update 15066 spawntime (it must be instant), add two new spawn points and set random in radius.
DELETE FROM `creature` WHERE (`id1` = 3467);
INSERT INTO `creature` (`guid`, `id1`, `id2`, `id3`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `wander_distance`, `currentwaypoint`, `curhealth`, `curmana`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`, `ScriptName`, `VerifiedBuild`, `CreateObject`, `Comment`) VALUES
(15066, 3467, 0, 0, 1, 0, 0, 1, 1, 1, -1571.79, -3884.28, 16.2173, 3.83286, 1, 5, 0, 356, 0, 1, 0, 0, 0, '67511', 0, 0, NULL),
(15215, 3467, 0, 0, 1, 0, 0, 1, 1, 1, -1748.25, -3721.78, 16.2173, 14.1181, 1, 5, 0, 356, 0, 1, 0, 0, 0, '67511', 0, 0, NULL),
(15217, 3467, 0, 0, 1, 0, 0, 1, 1, 1, -1706.97, -3818.9, 13.1778, 4.88414, 1, 5, 0, 356, 0, 1, 0, 0, 0, '67511', 0, 0, NULL);
-- Delete Baron Longshore Creature Addon
DELETE FROM `creature_addon` WHERE (`guid` IN (15066));
-- Set Baron Longshore template addon.
DELETE FROM `creature_template_addon` WHERE (`entry` = 3467);
INSERT INTO `creature_template_addon` (`entry`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `visibilityDistanceType`, `auras`) VALUES
(3467, 0, 0, 0, 1, 0, 0, '');
-- Set Baron Longshore Pool Template
DELETE FROM `pool_template` WHERE (`entry` IN (144));
INSERT INTO `pool_template` (`entry`, `max_limit`, `description`) VALUES
(144, 1, 'Baron Longshore');
-- Link Baron Longshore Spawn Points to Pool Entry.
DELETE FROM `pool_creature` WHERE (`guid` IN (15066, 15215, 15217));
INSERT INTO `pool_creature` (`guid`, `pool_entry`, `chance`, `description`) VALUES
(15066, 144, 0, 'Baron Longshore 1'),
(15215, 144, 0, 'Baron Longshore 2'),
(15217, 144, 0, 'Baron Longshore 3');
+104
View File
@@ -0,0 +1,104 @@
-- DB update 2026_05_18_01 -> 2026_05_18_02
-- Add Waypoints.
DELETE FROM `waypoint_data` WHERE (`id` IN (4507400, 4507401, 4507402, 4507600, 4507601, 4507602));
INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES
(4507400, 1, 2608.3418, 899.7364, 107.58177, NULL, 0, 0, 0, 100, 0),
(4507400, 2, 2624.7976, 947.18243, 110.12946, NULL, 0, 0, 0, 100, 0),
(4507400, 3, 2618.49, 966.5148, 109.42407, NULL, 0, 0, 0, 100, 0),
(4507400, 4, 2619.804, 989.7631, 106.12151, NULL, 0, 0, 0, 100, 0),
(4507400, 5, 2617.1274, 1017.7855, 101.755936, NULL, 0, 0, 0, 100, 0),
(4507401, 1, 2600.6504, 1048.624, 93.496185, NULL, 0, 0, 0, 100, 0),
(4507401, 2, 2589.536, 1059.0297, 89.56834, NULL, 0, 0, 0, 100, 0),
(4507401, 3, 2569.1755, 1054.2401, 87.35494, NULL, 0, 0, 0, 100, 0),
(4507401, 4, 2558.293, 1038.8096, 89.36693, NULL, 0, 0, 0, 100, 0),
(4507401, 5, 2550.0022, 1004.9842, 87.71258, NULL, 0, 0, 0, 100, 0),
(4507401, 6, 2545.9758, 980.9874, 89.43088, NULL, 0, 0, 0, 100, 0),
(4507401, 7, 2549.259, 960.1463, 92.66641, NULL, 0, 0, 0, 100, 0),
(4507401, 8, 2551.3828, 938.38605, 94.25331, NULL, 0, 0, 0, 100, 0),
(4507401, 9, 2555.0618, 909.3912, 92.80936, NULL, 0, 0, 0, 100, 0),
(4507401, 10, 2565.865, 900.8129, 97.85348, NULL, 0, 0, 0, 100, 0),
(4507401, 11, 2577.343, 895.7319, 102.08586, NULL, 0, 0, 0, 100, 0),
(4507401, 12, 2598.8699, 891.75824, 105.841194, NULL, 0, 0, 0, 100, 0),
(4507401, 13, 2614.4822, 901.33856, 108.39671, NULL, 0, 0, 0, 100, 0),
(4507401, 14, 2622.1265, 909.65356, 108.724594, NULL, 0, 0, 0, 100, 0),
(4507401, 15, 2633.543, 917.7471, 109.40559, NULL, 0, 0, 0, 100, 0),
(4507401, 16, 2648.4504, 921.5999, 110.50832, NULL, 0, 0, 0, 100, 0),
(4507401, 17, 2669.6716, 924.7839, 110.8462, NULL, 0, 0, 0, 100, 0),
(4507401, 18, 2687.3997, 942.2614, 110.87393, NULL, 0, 0, 0, 100, 0),
(4507401, 19, 2698.3833, 959.3796, 111.991165, NULL, 0, 0, 0, 100, 0),
(4507401, 20, 2705.1965, 978.1737, 111.370476, NULL, 0, 0, 0, 100, 0),
(4507401, 21, 2712.3142, 997.7814, 110.820724, NULL, 0, 0, 0, 100, 0),
(4507401, 22, 2717.2004, 1014.1006, 110.820496, NULL, 0, 0, 0, 100, 0),
(4507402, 1, 2706.9329, 977.25806, 111.23275, NULL, 0, 0, 0, 100, 0),
(4507402, 2, 2696.8916, 944.3594, 110.88748, NULL, 0, 0, 0, 100, 0),
(4507402, 3, 2679.1008, 927.04517, 111.034805, NULL, 0, 0, 0, 100, 0),
(4507402, 4, 2648.8196, 917.92676, 110.56027, NULL, 0, 0, 0, 100, 0),
(4507402, 5, 2631.4575, 916.3612, 109.18283, NULL, 0, 0, 0, 100, 0),
(4507600, 1, 2844.3105, 829.37134, 112.57675, NULL, 0, 0, 0, 100, 0),
(4507600, 2, 2861.2617, 805.0632, 116.396515, NULL, 0, 0, 0, 100, 0),
(4507600, 3, 2852.5176, 784.60895, 117.27478, NULL, 0, 0, 0, 100, 0),
(4507600, 4, 2844.9448, 765.1437, 119.3994, NULL, 0, 0, 0, 100, 0),
(4507600, 5, 2830.7195, 763.0901, 119.19966, NULL, 0, 0, 0, 100, 0),
(4507600, 6, 2809.9922, 773.8125, 116.56846, NULL, 0, 0, 0, 100, 0),
(4507600, 7, 2795.9836, 789.4371, 115.29823, NULL, 0, 0, 0, 100, 0),
(4507600, 8, 2781.8372, 817.4358, 112.59648, NULL, 0, 0, 0, 100, 0),
(4507600, 9, 2760.0073, 830.5569, 111.73909, NULL, 0, 0, 0, 100, 0),
(4507600, 10, 2740.4302, 826.26196, 111.78604, NULL, 0, 0, 0, 100, 0),
(4507600, 11, 2719.261, 812.56165, 111.116455, NULL, 0, 0, 0, 100, 0),
(4507600, 12, 2699.4387, 806.42993, 109.6118, NULL, 0, 0, 0, 100, 0),
(4507600, 13, 2674.912, 816.07574, 108.37607, NULL, 0, 0, 0, 100, 0),
(4507600, 14, 2662.5635, 843.7483, 108.82987, NULL, 0, 0, 0, 100, 0),
(4507600, 15, 2652.8994, 873.9334, 110.85059, NULL, 0, 0, 0, 100, 0),
(4507601, 1, 2611.389, 918.8913, 107.5012, NULL, 0, 0, 0, 100, 0),
(4507601, 2, 2651.7568, 941.5128, 112.666985, NULL, 0, 0, 0, 100, 0),
(4507601, 3, 2683.6868, 929.8602, 110.953384, NULL, 0, 0, 0, 100, 0),
(4507601, 4, 2703.5422, 895.4319, 110.38937, NULL, 0, 0, 0, 100, 0),
(4507601, 5, 2708.535, 870.12305, 111.949066, NULL, 0, 0, 0, 100, 0),
(4507601, 6, 2750.9553, 884.45825, 113.50687, NULL, 0, 0, 0, 100, 0),
(4507601, 7, 2757.431, 861.4463, 113.363815, NULL, 0, 0, 0, 100, 0),
(4507602, 1, 2787.389, 849.2288, 111.83943, NULL, 0, 0, 0, 100, 0),
(4507602, 2, 2817.4443, 843.9208, 111.845505, NULL, 0, 0, 0, 100, 0);
-- Set Move Type Random in Radius e Wander Distance to 25 for the two old Last Souls.
UPDATE `creature` SET `wander_distance` = 25, `MovementType` = 1 WHERE (`id1` = 1531) AND (`guid` IN (44863, 44864));
-- Set Extra Flag Don't Override SAI Entry.
UPDATE `creature_template` SET `flags_extra` = `flags_extra` |134217728 WHERE (`entry` = 1531);
-- Add two new Spawn Points.
DELETE FROM `creature` WHERE (`id1` = 1531) AND (`guid` IN (45074, 45076));
INSERT INTO `creature` (`guid`, `id1`, `id2`, `id3`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `wander_distance`, `currentwaypoint`, `curhealth`, `curmana`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`, `ScriptName`, `Comment`, `VerifiedBuild`) VALUES
(45074, 1531, 0, 0, 0, 0, 0, 1, 1, 0, 2631.46, 916.361, 109.183, 4.7822, 300, 0, 0, 120, 0, 0, 0, 0, 0, '', 'Has Personal Guid Sai', 0),
(45076, 1531, 0, 0, 0, 0, 0, 1, 1, 0, 2817.44, 843.921, 111.846, 5.7721, 300, 0, 0, 120, 0, 0, 0, 0, 0, '', 'Has Personal Guid Sai', 0);
-- Set Guid for the two new Lost Souls.
DELETE FROM `smart_scripts` WHERE (`source_type` = 0) AND (`entryorguid` IN (-45074, -45076));
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `event_param6`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(-45074, 0, 1, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, 4507400, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Lost Soul - On Respawn - Start Path 4507400'),
(-45074, 0, 2, 0, 109, 0, 100, 0, 0, 4507400, 0, 0, 0, 0, 80, 153100, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Lost Soul - On Path 4507400 Finished - Run Script'),
(-45074, 0, 3, 0, 109, 0, 100, 0, 0, 4507401, 0, 0, 0, 0, 80, 153101, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Lost Soul - On Path 4507401 Finished - Run Script'),
(-45074, 0, 4, 0, 109, 0, 100, 0, 0, 4507402, 0, 0, 0, 0, 80, 153102, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Lost Soul - On Path 4507402 Finished - Run Script'),
(-45076, 0, 1, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, 4507600, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Lost Soul - On Respawn - Start Path 4507600'),
(-45076, 0, 2, 0, 109, 0, 100, 0, 0, 4507600, 0, 0, 0, 0, 80, 153103, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Lost Soul - On Path 4507600 Finished - Run Script'),
(-45076, 0, 3, 0, 109, 0, 100, 0, 0, 4507601, 0, 0, 0, 0, 80, 153104, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Lost Soul - On Path 4507601 Finished - Run Script'),
(-45076, 0, 4, 0, 109, 0, 100, 0, 0, 4507602, 0, 0, 0, 0, 232, 4507600, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Lost Soul - On Path 4507602 Finished - Start Path 4507600');
-- Set Action Lists.
DELETE FROM `smart_scripts` WHERE (`source_type` = 9) AND (`entryorguid` IN (153100, 153101, 153102, 153103, 153104));
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `event_param6`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(153100, 9, 0, 0, 0, 0, 100, 0, 2000, 2000, 0, 0, 0, 0, 89, 25, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Lost Soul - Actionlist - Start Random Movement'),
(153100, 9, 1, 0, 0, 0, 100, 0, 60000, 60000, 0, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Lost Soul - Actionlist - Stop Random Movement'),
(153100, 9, 2, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, 4507401, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Lost Soul - Actionlist - Start Path 4507401'),
(153101, 9, 0, 0, 0, 0, 100, 0, 2000, 2000, 0, 0, 0, 0, 89, 25, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Lost Soul - Actionlist - Start Random Movement'),
(153101, 9, 1, 0, 0, 0, 100, 0, 60000, 60000, 0, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Lost Soul - Actionlist - Stop Random Movement'),
(153101, 9, 2, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, 4507402, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Lost Soul - Actionlist - Start Path 4507402'),
(153102, 9, 0, 0, 0, 0, 100, 0, 2000, 2000, 0, 0, 0, 0, 89, 25, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Lost Soul - Actionlist - Start Random Movement'),
(153102, 9, 1, 0, 0, 0, 100, 0, 60000, 60000, 0, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Lost Soul - Actionlist - Stop Random Movement'),
(153102, 9, 2, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, 4507400, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Lost Soul - Actionlist - Start Path 4507400'),
(153103, 9, 0, 0, 0, 0, 100, 0, 2000, 2000, 0, 0, 0, 0, 89, 25, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Lost Soul - Actionlist - Start Random Movement'),
(153103, 9, 1, 0, 0, 0, 100, 0, 60000, 60000, 0, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Lost Soul - Actionlist - Stop Random Movement'),
(153103, 9, 2, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, 4507601, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Lost Soul - Actionlist - Start Path 4507601'),
(153104, 9, 0, 0, 0, 0, 100, 0, 2000, 2000, 0, 0, 0, 0, 89, 25, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Lost Soul - Actionlist - Start Random Movement'),
(153104, 9, 1, 0, 0, 0, 100, 0, 60000, 60000, 0, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Lost Soul - Actionlist - Stop Random Movement'),
(153104, 9, 2, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, 4507602, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Lost Soul - Actionlist - Start Path 4507602');
@@ -0,0 +1,6 @@
-- DB update 2026_05_18_02 -> 2026_05_19_00
-- Update creature 'Ludin Farrow' with sniffed values
-- new spawns
DELETE FROM `creature` WHERE (`id1` IN (26546)) AND (`guid` IN (1550));
INSERT INTO `creature` (`guid`, `id1`, `map`, `spawnMask`, `phaseMask`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `wander_distance`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`, `ScriptName`, `VerifiedBuild`, `CreateObject`, `Comment`) VALUES
(1550, 26546, 0, 1, 1, 0, -3726.6103515625, -576.7655029296875, 4.643310546875, 4.171336650848388671, 120, 0, 0, 0, 0, 0, "", 45772, 1, NULL);
+702
View File
@@ -0,0 +1,702 @@
-- DB update 2026_05_19_00 -> 2026_05_19_01
-- Remove Wrong Spawn Points and Old Waypoints.
DELETE FROM `creature` WHERE (`id1` = 2974) AND (`guid` IN (26214, 26231, 26232, 26233));
DELETE FROM `creature` WHERE (`id1` = 2972) AND (`guid` IN (26192, 26193, 26194, 26195));
DELETE FROM `waypoint_data` WHERE (`id` IN (262130, 262330));
DELETE FROM `creature_addon` WHERE (`guid` IN (262130, 262330, 26233));
DELETE FROM `creature_formations` WHERE (`leaderGUID` IN (26213, 26233));
-- Set sniffed waypoints.
DELETE FROM `waypoint_data` WHERE (`id` IN (2619600, 2620700, 2620900, 2657800));
INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES
(2619600, 1, -1007.6246, 421.90808, 15.130656, NULL, 0, 0, 0, 100, 0),
(2619600, 2, -1037.2, 424.55112, 15.33276, NULL, 0, 0, 0, 100, 0),
(2619600, 3, -1066.6489, 422.65872, 14.733124, NULL, 0, 0, 0, 100, 0),
(2619600, 4, -1112.9124, 422.62155, 8.367777, NULL, 0, 0, 0, 100, 0),
(2619600, 5, -1143.1012, 417.0893, 6.579456, NULL, 0, 0, 0, 100, 0),
(2619600, 6, -1176.1271, 395.78214, 2.8264346, NULL, 0, 0, 0, 100, 0),
(2619600, 7, -1216.4647, 370.34033, -1.9081411, NULL, 0, 0, 0, 100, 0),
(2619600, 8, -1255.0748, 360.65146, -0.25116718, NULL, 0, 0, 0, 100, 0),
(2619600, 9, -1281.0723, 326.60596, -0.9783207, NULL, 0, 0, 0, 100, 0),
(2619600, 10, -1322.0363, 315.6229, 2.2535977, NULL, 0, 0, 0, 100, 0),
(2619600, 11, -1353.4476, 289.53302, 0.24801914, NULL, 0, 0, 0, 100, 0),
(2619600, 12, -1376.9994, 259.64877, -2.9643166, NULL, 0, 0, 0, 100, 0),
(2619600, 13, -1409.0953, 246.43031, -6.984593, NULL, 0, 0, 0, 100, 0),
(2619600, 14, -1433.7985, 215.66963, -7.1423674, NULL, 0, 0, 0, 100, 0),
(2619600, 15, -1467.7026, 191.00508, -7.792779, NULL, 0, 0, 0, 100, 0),
(2619600, 16, -1493.5348, 193.18796, -7.7928057, NULL, 0, 0, 0, 100, 0),
(2619600, 17, -1518.2887, 184.90755, -7.661153, NULL, 0, 0, 0, 100, 0),
(2619600, 18, -1540.6425, 160.9339, -7.7928085, NULL, 0, 0, 0, 100, 0),
(2619600, 19, -1575.1715, 156.2049, -7.7921677, NULL, 0, 0, 0, 100, 0),
(2619600, 20, -1581.508, 115.91542, -9.78833, NULL, 0, 0, 0, 100, 0),
(2619600, 21, -1601.3304, 75.78207, -14.307471, NULL, 0, 0, 0, 100, 0),
(2619600, 22, -1630.3042, 59.34912, -15.971921, NULL, 0, 0, 0, 100, 0),
(2619600, 23, -1656.0516, 52.974445, -11.12988, NULL, 0, 0, 0, 100, 0),
(2619600, 24, -1677.066, 18.634277, -8.527944, NULL, 0, 0, 0, 100, 0),
(2619600, 25, -1677.6133, -16.365234, -9.082037, NULL, 0, 0, 0, 100, 0),
(2619600, 26, -1684.7356, -53.50304, -8.355266, NULL, 0, 0, 0, 100, 0),
(2619600, 27, -1684.5641, -84.28765, -8.774794, NULL, 0, 0, 0, 100, 0),
(2619600, 28, -1683.2655, -115.27621, -5.189456, NULL, 0, 0, 0, 100, 0),
(2619600, 29, -1682.8145, -148.27539, -5.78589, NULL, 0, 0, 0, 100, 0),
(2619600, 30, -1680.8757, -182.97652, -9.895113, NULL, 0, 0, 0, 100, 0),
(2619600, 31, -1684.3063, -217.85265, -10.11387, NULL, 0, 0, 0, 100, 0),
(2619600, 32, -1653.3103, -245.30176, -18.934204, NULL, 0, 0, 0, 100, 0),
(2619600, 33, -1648.981, -285.4873, -25.765287, NULL, 0, 0, 0, 100, 0),
(2619600, 34, -1646.9777, -318.71164, -26.7061, NULL, 0, 0, 0, 100, 0),
(2619600, 35, -1616.91, -350.21332, -33.85203, NULL, 0, 0, 0, 100, 0),
(2619600, 36, -1614.3971, -387.42035, -34.000595, NULL, 0, 0, 0, 100, 0),
(2619600, 37, -1586.4641, -414.5879, -40.240524, NULL, 0, 0, 0, 100, 0),
(2619600, 38, -1555.3278, -449.68716, -42.6689, NULL, 0, 0, 0, 100, 0),
(2619600, 39, -1515.3612, -421.72916, -45.316895, NULL, 0, 0, 0, 100, 0),
(2619600, 40, -1484.709, -422.12393, -45.239704, NULL, 0, 0, 0, 100, 0),
(2619600, 41, -1452.7852, -419.1264, -47.54042, NULL, 0, 0, 0, 100, 0),
(2619600, 42, -1425.5243, -445.79535, -49.664673, NULL, 0, 0, 0, 100, 0),
(2619600, 43, -1420.3281, -480.38477, -59.781067, NULL, 0, 0, 0, 100, 0),
(2619600, 44, -1420.3055, -520.6966, -60.32009, NULL, 0, 0, 0, 100, 0),
(2619600, 45, -1414.226, -549.5558, -55.41117, NULL, 0, 0, 0, 100, 0),
(2619600, 46, -1389.8867, -580.47906, -56.723152, NULL, 0, 0, 0, 100, 0),
(2619600, 47, -1346.8826, -591.08203, -58.936775, NULL, 0, 0, 0, 100, 0),
(2619600, 48, -1316.2262, -612.4351, -57.896786, NULL, 0, 0, 0, 100, 0),
(2619600, 49, -1284.4495, -642.3338, -58.524612, NULL, 0, 0, 0, 100, 0),
(2619600, 50, -1277.4095, -681.1772, -59.273384, NULL, 0, 0, 0, 100, 0),
(2619600, 51, -1257.6677, -715.3433, -52.34805, NULL, 0, 0, 0, 100, 0),
(2619600, 52, -1236.7126, -742.9661, -54.46659, NULL, 0, 0, 0, 100, 0),
(2619600, 53, -1218.4545, -750.3242, -52.974735, NULL, 0, 0, 0, 100, 0),
(2619600, 54, -1210.0302, -780.29004, -45.112183, NULL, 0, 0, 0, 100, 0),
(2619600, 55, -1210.8108, -815.36914, -29.422226, NULL, 0, 0, 0, 100, 0),
(2619600, 56, -1182.2468, -825.0025, -23.671701, NULL, 0, 0, 0, 100, 0),
(2619600, 57, -1179.19, -849.2996, -13.99216, NULL, 0, 0, 0, 100, 0),
(2619600, 58, -1182.7673, -883.3319, -8.181561, NULL, 0, 0, 0, 100, 0),
(2619600, 59, -1147.8387, -918.49396, -2.7694292, NULL, 0, 0, 0, 100, 0),
(2619600, 60, -1147.5463, -947.7137, 1.0697556, NULL, 0, 0, 0, 100, 0),
(2619600, 61, -1115.4119, -975.1578, 2.8828933, NULL, 0, 0, 0, 100, 0),
(2619600, 62, -1085.1603, -976.84375, 6.633048, NULL, 0, 0, 0, 100, 0),
(2619600, 63, -1041.9868, -957.16766, 4.8196793, NULL, 0, 0, 0, 100, 0),
(2619600, 64, -1018.4729, -946.41003, 5.119849, NULL, 0, 0, 0, 100, 0),
(2619600, 65, -996.38043, -908.8725, 5.629443, NULL, 0, 0, 0, 100, 0),
(2619600, 66, -990.1932, -867.7385, 5.2438564, NULL, 0, 0, 0, 100, 0),
(2619600, 67, -1008.2734, -845.2093, -0.13104606, NULL, 0, 0, 0, 100, 0),
(2619600, 68, -993.90845, -747.204, -24.904272, NULL, 0, 0, 0, 100, 0),
(2619600, 69, -1011.5555, -720.69824, -38.289173, NULL, 0, 0, 0, 100, 0),
(2619600, 70, -1015.8663, -684.1327, -49.678394, NULL, 0, 0, 0, 100, 0),
(2619600, 71, -1016.8171, -650.1505, -56.921635, NULL, 0, 0, 0, 100, 0),
(2619600, 72, -1007.8587, -619.35126, -59.159958, NULL, 0, 0, 0, 100, 0),
(2619600, 73, -984.3987, -608.9958, -59.079597, NULL, 0, 0, 0, 100, 0),
(2619600, 74, -950.66907, -618.2923, -58.66162, NULL, 0, 0, 0, 100, 0),
(2619600, 75, -923.65247, -646.2394, -51.541134, NULL, 0, 0, 0, 100, 0),
(2619600, 76, -882.03754, -651.03345, -41.85031, NULL, 0, 0, 0, 100, 0),
(2619600, 77, -854.3465, -650.802, -34.01486, NULL, 0, 0, 0, 100, 0),
(2619600, 78, -811.3727, -658.369, -27.00071, NULL, 0, 0, 0, 100, 0),
(2619600, 79, -782.8351, -626.977, -28.018692, NULL, 0, 0, 0, 100, 0),
(2619600, 80, -759.23846, -610.9407, -26.781532, NULL, 0, 0, 0, 100, 0),
(2619600, 81, -720.8262, -592.5751, -20.51601, NULL, 0, 0, 0, 100, 0),
(2619600, 82, -684.2662, -600.00714, -12.882502, NULL, 0, 0, 0, 100, 0),
(2619600, 83, -720.8262, -592.5751, -20.51601, NULL, 0, 0, 0, 100, 0),
(2619600, 84, -759.23846, -610.9407, -26.781532, NULL, 0, 0, 0, 100, 0),
(2619600, 85, -782.8351, -626.977, -28.018692, NULL, 0, 0, 0, 100, 0),
(2619600, 86, -811.3727, -658.369, -27.00071, NULL, 0, 0, 0, 100, 0),
(2619600, 87, -854.3465, -650.802, -34.01486, NULL, 0, 0, 0, 100, 0),
(2619600, 88, -882.03754, -651.03345, -41.85031, NULL, 0, 0, 0, 100, 0),
(2619600, 89, -923.65247, -646.2394, -51.541134, NULL, 0, 0, 0, 100, 0),
(2619600, 90, -950.66907, -618.2923, -58.66162, NULL, 0, 0, 0, 100, 0),
(2619600, 91, -984.3987, -608.9958, -59.079597, NULL, 0, 0, 0, 100, 0),
(2619600, 92, -1007.8587, -619.35126, -59.159958, NULL, 0, 0, 0, 100, 0),
(2619600, 93, -1016.8171, -650.1505, -56.921635, NULL, 0, 0, 0, 100, 0),
(2619600, 94, -1015.8663, -684.1327, -49.678394, NULL, 0, 0, 0, 100, 0),
(2619600, 95, -1011.5555, -720.69824, -38.289173, NULL, 0, 0, 0, 100, 0),
(2619600, 96, -993.90845, -747.204, -24.904272, NULL, 0, 0, 0, 100, 0),
(2619600, 97, -1008.2734, -845.2093, -0.13104606, NULL, 0, 0, 0, 100, 0),
(2619600, 98, -990.1932, -867.7385, 5.2438564, NULL, 0, 0, 0, 100, 0),
(2619600, 99, -996.38043, -908.8725, 5.629443, NULL, 0, 0, 0, 100, 0),
(2619600, 100, -1018.4729, -946.41003, 5.119849, NULL, 0, 0, 0, 100, 0),
(2619600, 101, -1041.9868, -957.16766, 4.8196793, NULL, 0, 0, 0, 100, 0),
(2619600, 102, -1085.1603, -976.84375, 6.633048, NULL, 0, 0, 0, 100, 0),
(2619600, 103, -1115.4119, -975.1578, 2.8828933, NULL, 0, 0, 0, 100, 0),
(2619600, 104, -1147.5463, -947.7137, 1.0697556, NULL, 0, 0, 0, 100, 0),
(2619600, 105, -1147.8387, -918.49396, -2.7694292, NULL, 0, 0, 0, 100, 0),
(2619600, 106, -1182.7673, -883.3319, -8.181561, NULL, 0, 0, 0, 100, 0),
(2619600, 107, -1179.19, -849.2996, -13.99216, NULL, 0, 0, 0, 100, 0),
(2619600, 108, -1182.2468, -825.0025, -23.671701, NULL, 0, 0, 0, 100, 0),
(2619600, 109, -1210.8108, -815.36914, -29.422226, NULL, 0, 0, 0, 100, 0),
(2619600, 110, -1210.0302, -780.29004, -45.112183, NULL, 0, 0, 0, 100, 0),
(2619600, 111, -1218.4545, -750.3242, -52.974735, NULL, 0, 0, 0, 100, 0),
(2619600, 112, -1236.7126, -742.9661, -54.46659, NULL, 0, 0, 0, 100, 0),
(2619600, 113, -1257.6677, -715.3433, -52.34805, NULL, 0, 0, 0, 100, 0),
(2619600, 114, -1277.4095, -681.1772, -59.273384, NULL, 0, 0, 0, 100, 0),
(2619600, 115, -1284.4495, -642.3338, -58.524612, NULL, 0, 0, 0, 100, 0),
(2619600, 116, -1316.2262, -612.4351, -57.896786, NULL, 0, 0, 0, 100, 0),
(2619600, 117, -1346.8826, -591.08203, -58.936775, NULL, 0, 0, 0, 100, 0),
(2619600, 118, -1389.8867, -580.47906, -56.723152, NULL, 0, 0, 0, 100, 0),
(2619600, 119, -1414.226, -549.5558, -55.41117, NULL, 0, 0, 0, 100, 0),
(2619600, 120, -1420.3055, -520.6966, -60.32009, NULL, 0, 0, 0, 100, 0),
(2619600, 121, -1420.3281, -480.38477, -59.781067, NULL, 0, 0, 0, 100, 0),
(2619600, 122, -1425.5243, -445.79535, -49.664673, NULL, 0, 0, 0, 100, 0),
(2619600, 123, -1452.7852, -419.1264, -47.54042, NULL, 0, 0, 0, 100, 0),
(2619600, 124, -1484.709, -422.12393, -45.239704, NULL, 0, 0, 0, 100, 0),
(2619600, 125, -1515.3612, -421.72916, -45.316895, NULL, 0, 0, 0, 100, 0),
(2619600, 126, -1555.3278, -449.68716, -42.6689, NULL, 0, 0, 0, 100, 0),
(2619600, 127, -1586.4641, -414.5879, -40.240524, NULL, 0, 0, 0, 100, 0),
(2619600, 128, -1614.3971, -387.42035, -34.000595, NULL, 0, 0, 0, 100, 0),
(2619600, 129, -1616.91, -350.21332, -33.85203, NULL, 0, 0, 0, 100, 0),
(2619600, 130, -1646.9777, -318.71164, -26.7061, NULL, 0, 0, 0, 100, 0),
(2619600, 131, -1648.981, -285.4873, -25.765287, NULL, 0, 0, 0, 100, 0),
(2619600, 132, -1653.3103, -245.30176, -18.934204, NULL, 0, 0, 0, 100, 0),
(2619600, 133, -1684.3063, -217.85265, -10.11387, NULL, 0, 0, 0, 100, 0),
(2619600, 134, -1680.8757, -182.97652, -9.895113, NULL, 0, 0, 0, 100, 0),
(2619600, 135, -1682.8145, -148.27539, -5.78589, NULL, 0, 0, 0, 100, 0),
(2619600, 136, -1683.2655, -115.27621, -5.189456, NULL, 0, 0, 0, 100, 0),
(2619600, 137, -1684.5641, -84.28765, -8.774794, NULL, 0, 0, 0, 100, 0),
(2619600, 138, -1684.7356, -53.50304, -8.355266, NULL, 0, 0, 0, 100, 0),
(2619600, 139, -1677.6133, -16.365234, -9.082037, NULL, 0, 0, 0, 100, 0),
(2619600, 140, -1677.066, 18.634277, -8.527944, NULL, 0, 0, 0, 100, 0),
(2619600, 141, -1656.0516, 52.974445, -11.12988, NULL, 0, 0, 0, 100, 0),
(2619600, 142, -1630.3042, 59.34912, -15.971921, NULL, 0, 0, 0, 100, 0),
(2619600, 143, -1601.3304, 75.78207, -14.307471, NULL, 0, 0, 0, 100, 0),
(2619600, 144, -1581.508, 115.91542, -9.78833, NULL, 0, 0, 0, 100, 0),
(2619600, 145, -1575.1715, 156.2049, -7.7921677, NULL, 0, 0, 0, 100, 0),
(2619600, 146, -1540.6425, 160.9339, -7.7928085, NULL, 0, 0, 0, 100, 0),
(2619600, 147, -1518.2887, 184.90755, -7.661153, NULL, 0, 0, 0, 100, 0),
(2619600, 148, -1493.5348, 193.18796, -7.7928057, NULL, 0, 0, 0, 100, 0),
(2619600, 149, -1467.7026, 191.00508, -7.792779, NULL, 0, 0, 0, 100, 0),
(2619600, 150, -1433.7985, 215.66963, -7.1423674, NULL, 0, 0, 0, 100, 0),
(2619600, 151, -1409.0953, 246.43031, -6.984593, NULL, 0, 0, 0, 100, 0),
(2619600, 152, -1376.9994, 259.64877, -2.9643166, NULL, 0, 0, 0, 100, 0),
(2619600, 153, -1353.4476, 289.53302, 0.24801914, NULL, 0, 0, 0, 100, 0),
(2619600, 154, -1322.0363, 315.6229, 2.2535977, NULL, 0, 0, 0, 100, 0),
(2619600, 155, -1281.0723, 326.60596, -0.9783207, NULL, 0, 0, 0, 100, 0),
(2619600, 156, -1255.0748, 360.65146, -0.25116718, NULL, 0, 0, 0, 100, 0),
(2619600, 157, -1216.4647, 370.34033, -1.9081411, NULL, 0, 0, 0, 100, 0),
(2619600, 158, -1176.1271, 395.78214, 2.8264346, NULL, 0, 0, 0, 100, 0),
(2619600, 159, -1143.1012, 417.0893, 6.579456, NULL, 0, 0, 0, 100, 0),
(2619600, 160, -1112.9124, 422.62155, 8.367777, NULL, 0, 0, 0, 100, 0),
(2619600, 161, -1066.6489, 422.65872, 14.733124, NULL, 0, 0, 0, 100, 0),
(2619600, 162, -1037.2, 424.55112, 15.33276, NULL, 0, 0, 0, 100, 0),
(2619600, 163, -1007.6246, 421.90808, 15.130656, NULL, 0, 0, 0, 100, 0),
(2619600, 164, -974.2193, 417.11154, 15.5879545, NULL, 0, 0, 0, 100, 0),
(2620700, 1, -2710.6592, 163.31958, 63.226166, NULL, 0, 0, 0, 100, 0),
(2620700, 2, -2673.6243, 159.4376, 51.764732, NULL, 0, 0, 0, 100, 0),
(2620700, 3, -2666.4324, 130.52155, 46.667397, NULL, 0, 0, 0, 100, 0),
(2620700, 4, -2652.186, 106.53426, 41.890396, NULL, 0, 0, 0, 100, 0),
(2620700, 5, -2644.0598, 80.47784, 31.887161, NULL, 0, 0, 0, 100, 0),
(2620700, 6, -2647.6116, 47.942493, 23.471582, NULL, 0, 0, 0, 100, 0),
(2620700, 7, -2674.728, 19.094673, 13.6595745, NULL, 0, 0, 0, 100, 0),
(2620700, 8, -2654.1157, -13.759549, 3.1332266, NULL, 0, 0, 0, 100, 0),
(2620700, 9, -2623.795, -50.004665, -3.3034098, NULL, 0, 0, 0, 100, 0),
(2620700, 10, -2624.9705, -82.19271, -5.3842874, NULL, 0, 0, 0, 100, 0),
(2620700, 11, -2640.0618, -114.77073, -3.215204, NULL, 0, 0, 0, 100, 0),
(2620700, 12, -2630.893, -155.90099, -8.995703, NULL, 0, 0, 0, 100, 0),
(2620700, 13, -2648.4133, -189.70459, -6.6332498, NULL, 0, 0, 0, 100, 0),
(2620700, 14, -2653.144, -216.50998, -6.9328265, NULL, 0, 0, 0, 100, 0),
(2620700, 15, -2653.2568, -253.75694, -0.9902834, NULL, 0, 0, 0, 100, 0),
(2620700, 16, -2653.6948, -284.7191, -3.0489802, NULL, 0, 0, 0, 100, 0),
(2620700, 17, -2678.138, -318.07367, -5.8373413, NULL, 0, 0, 0, 100, 0),
(2620700, 18, -2678.6648, -356.3597, -8.053354, NULL, 0, 0, 0, 100, 0),
(2620700, 19, -2682.1672, -385.46646, -10.711467, NULL, 0, 0, 0, 100, 0),
(2620700, 20, -2675.5393, -418.8748, -8.330051, NULL, 0, 0, 0, 100, 0),
(2620700, 21, -2651.6365, -446.1798, -9.349476, NULL, 0, 0, 0, 100, 0),
(2620700, 22, -2649.9795, -485.89075, -6.3365417, NULL, 0, 0, 0, 100, 0),
(2620700, 23, -2654.0325, -523.72516, -7.4569664, NULL, 0, 0, 0, 100, 0),
(2620700, 24, -2648.3452, -550.0735, -3.8777122, NULL, 0, 0, 0, 100, 0),
(2620700, 25, -2643.802, -583.0283, -3.838374, NULL, 0, 0, 0, 100, 0),
(2620700, 26, -2651.5278, -615.3167, -3.0365124, NULL, 0, 0, 0, 100, 0),
(2620700, 27, -2656.2092, -662.2092, -1.8650179, NULL, 0, 0, 0, 100, 0),
(2620700, 28, -2646.3386, -674.0851, -0.14567393, NULL, 0, 0, 0, 100, 0),
(2620700, 29, -2626.5215, -706.51953, 0.52910066, NULL, 0, 0, 0, 100, 0),
(2620700, 30, -2623.6917, -749.2665, -5.150375, NULL, 0, 0, 0, 100, 0),
(2620700, 31, -2640.3572, -780.52484, -5.784524, NULL, 0, 0, 0, 100, 0),
(2620700, 32, -2653.998, -813.8535, -6.1829424, NULL, 0, 0, 0, 100, 0),
(2620700, 33, -2657.9783, -849.33356, -6.424155, NULL, 0, 0, 0, 100, 0),
(2620700, 34, -2643.6028, -886.54266, -7.7689266, NULL, 0, 0, 0, 100, 0),
(2620700, 35, -2620.5098, -916.69086, -6.844866, NULL, 0, 0, 0, 100, 0),
(2620700, 36, -2584.2139, -916.3599, -5.7289476, NULL, 0, 0, 0, 100, 0),
(2620700, 37, -2552.383, -923.7454, -8.431046, NULL, 0, 0, 0, 100, 0),
(2620700, 38, -2547.4167, -952.7232, -5.765007, NULL, 0, 0, 0, 100, 0),
(2620700, 39, -2552.737, -980.1186, -1.5728039, NULL, 0, 0, 0, 100, 0),
(2620700, 40, -2584.2122, -994.65656, -2.8916035, NULL, 0, 0, 0, 100, 0),
(2620700, 41, -2619.2803, -1011.5713, -8.028606, NULL, 0, 0, 0, 100, 0),
(2620700, 42, -2649.2556, -1026.3375, -8.474744, NULL, 0, 0, 0, 100, 0),
(2620700, 43, -2656.4373, -1053.2314, -4.678368, NULL, 0, 0, 0, 100, 0),
(2620700, 44, -2650.1755, -1084.9543, -7.634605, NULL, 0, 0, 0, 100, 0),
(2620700, 45, -2645.7498, -1113.3473, -4.9176726, NULL, 0, 0, 0, 100, 0),
(2620700, 46, -2622.2976, -1140.3937, -4.6027, NULL, 0, 0, 0, 100, 0),
(2620700, 47, -2583.1157, -1156.3484, -8.350552, NULL, 0, 0, 0, 100, 0),
(2620700, 48, -2545.0376, -1182.2266, -2.9859233, NULL, 0, 0, 0, 100, 0),
(2620700, 49, -2518.601, -1219.8278, -6.0565963, NULL, 0, 0, 0, 100, 0),
(2620700, 50, -2521.652, -1246.869, -6.977758, NULL, 0, 0, 0, 100, 0),
(2620700, 51, -2521.6074, -1246.6699, -6.973242, NULL, 0, 0, 0, 100, 0),
(2620700, 52, -2521.652, -1246.869, -6.977758, NULL, 0, 0, 0, 100, 0),
(2620700, 53, -2523.9766, -1251.293, -6.7638702, NULL, 0, 0, 0, 100, 0),
(2620700, 54, -2525.836, -1254.832, -6.5580316, NULL, 0, 0, 0, 100, 0),
(2620700, 55, -2526.7656, -1256.6016, -6.3840976, NULL, 0, 0, 0, 100, 0),
(2620700, 56, -2527.6953, -1258.3711, -6.197733, NULL, 0, 0, 0, 100, 0),
(2620700, 57, -2529.0898, -1261.0254, -6.0167475, NULL, 0, 0, 0, 100, 0),
(2620700, 58, -2530.0195, -1262.7949, -5.8368526, NULL, 0, 0, 0, 100, 0),
(2620700, 59, -2531.414, -1265.4492, -5.582439, NULL, 0, 0, 0, 100, 0),
(2620700, 60, -2533.7383, -1269.873, -5.3540955, NULL, 0, 0, 0, 100, 0),
(2620700, 61, -2543.5525, -1288.5497, -5.4981, NULL, 0, 0, 0, 100, 0),
(2620700, 62, -2552.3254, -1316.4017, -2.6343126, NULL, 0, 0, 0, 100, 0),
(2620700, 63, -2543.5525, -1288.5497, -5.4981, NULL, 0, 0, 0, 100, 0),
(2620700, 64, -2533.7383, -1269.873, -5.3540955, NULL, 0, 0, 0, 100, 0),
(2620700, 65, -2531.414, -1265.4492, -5.582439, NULL, 0, 0, 0, 100, 0),
(2620700, 66, -2530.0195, -1262.7949, -5.8368526, NULL, 0, 0, 0, 100, 0),
(2620700, 67, -2529.0898, -1261.0254, -6.0167475, NULL, 0, 0, 0, 100, 0),
(2620700, 68, -2527.6953, -1258.3711, -6.197733, NULL, 0, 0, 0, 100, 0),
(2620700, 69, -2526.7656, -1256.6016, -6.3840976, NULL, 0, 0, 0, 100, 0),
(2620700, 70, -2525.836, -1254.832, -6.5580316, NULL, 0, 0, 0, 100, 0),
(2620700, 71, -2523.9766, -1251.293, -6.7638702, NULL, 0, 0, 0, 100, 0),
(2620700, 72, -2521.652, -1246.869, -6.977758, NULL, 0, 0, 0, 100, 0),
(2620700, 73, -2521.6074, -1246.6699, -6.973242, NULL, 0, 0, 0, 100, 0),
(2620700, 74, -2521.652, -1246.869, -6.977758, NULL, 0, 0, 0, 100, 0),
(2620700, 75, -2518.601, -1219.8278, -6.0565963, NULL, 0, 0, 0, 100, 0),
(2620700, 76, -2545.0376, -1182.2266, -2.9859233, NULL, 0, 0, 0, 100, 0),
(2620700, 77, -2583.1157, -1156.3484, -8.350552, NULL, 0, 0, 0, 100, 0),
(2620700, 78, -2622.2976, -1140.3937, -4.6027, NULL, 0, 0, 0, 100, 0),
(2620700, 79, -2645.7498, -1113.3473, -4.9176726, NULL, 0, 0, 0, 100, 0),
(2620700, 80, -2650.1755, -1084.9543, -7.634605, NULL, 0, 0, 0, 100, 0),
(2620700, 81, -2656.4373, -1053.2314, -4.678368, NULL, 0, 0, 0, 100, 0),
(2620700, 82, -2649.2556, -1026.3375, -8.474744, NULL, 0, 0, 0, 100, 0),
(2620700, 83, -2619.2803, -1011.5713, -8.028606, NULL, 0, 0, 0, 100, 0),
(2620700, 84, -2584.2122, -994.65656, -2.8916035, NULL, 0, 0, 0, 100, 0),
(2620700, 85, -2552.737, -980.1186, -1.5728039, NULL, 0, 0, 0, 100, 0),
(2620700, 86, -2547.4167, -952.7232, -5.765007, NULL, 0, 0, 0, 100, 0),
(2620700, 87, -2552.383, -923.7454, -8.431046, NULL, 0, 0, 0, 100, 0),
(2620700, 88, -2584.2139, -916.3599, -5.7289476, NULL, 0, 0, 0, 100, 0),
(2620700, 89, -2620.5098, -916.69086, -6.844866, NULL, 0, 0, 0, 100, 0),
(2620700, 90, -2643.6028, -886.54266, -7.7689266, NULL, 0, 0, 0, 100, 0),
(2620700, 91, -2657.9783, -849.33356, -6.424155, NULL, 0, 0, 0, 100, 0),
(2620700, 92, -2653.998, -813.8535, -6.1829424, NULL, 0, 0, 0, 100, 0),
(2620700, 93, -2640.3572, -780.52484, -5.784524, NULL, 0, 0, 0, 100, 0),
(2620700, 94, -2623.6917, -749.2665, -5.150375, NULL, 0, 0, 0, 100, 0),
(2620700, 95, -2626.5215, -706.51953, 0.52910066, NULL, 0, 0, 0, 100, 0),
(2620700, 96, -2646.3386, -674.0851, -0.14567393, NULL, 0, 0, 0, 100, 0),
(2620700, 97, -2656.2092, -662.2092, -1.8650179, NULL, 0, 0, 0, 100, 0),
(2620700, 98, -2651.5278, -615.3167, -3.0365124, NULL, 0, 0, 0, 100, 0),
(2620700, 99, -2643.802, -583.0283, -3.838374, NULL, 0, 0, 0, 100, 0),
(2620700, 100, -2648.3452, -550.0735, -3.8777122, NULL, 0, 0, 0, 100, 0),
(2620700, 101, -2654.0325, -523.72516, -7.4569664, NULL, 0, 0, 0, 100, 0),
(2620700, 102, -2649.9795, -485.89075, -6.3365417, NULL, 0, 0, 0, 100, 0),
(2620700, 103, -2651.6365, -446.1798, -9.349476, NULL, 0, 0, 0, 100, 0),
(2620700, 104, -2675.5393, -418.8748, -8.330051, NULL, 0, 0, 0, 100, 0),
(2620700, 105, -2682.1672, -385.46646, -10.711467, NULL, 0, 0, 0, 100, 0),
(2620700, 106, -2678.6648, -356.3597, -8.053354, NULL, 0, 0, 0, 100, 0),
(2620700, 107, -2678.138, -318.07367, -5.8373413, NULL, 0, 0, 0, 100, 0),
(2620700, 108, -2653.6948, -284.7191, -3.0489802, NULL, 0, 0, 0, 100, 0),
(2620700, 109, -2653.2568, -253.75694, -0.9902834, NULL, 0, 0, 0, 100, 0),
(2620700, 110, -2653.144, -216.50998, -6.9328265, NULL, 0, 0, 0, 100, 0),
(2620700, 111, -2648.4133, -189.70459, -6.6332498, NULL, 0, 0, 0, 100, 0),
(2620700, 112, -2630.893, -155.90099, -8.995703, NULL, 0, 0, 0, 100, 0),
(2620700, 113, -2640.0618, -114.77073, -3.215204, NULL, 0, 0, 0, 100, 0),
(2620700, 114, -2624.9705, -82.19271, -5.3842874, NULL, 0, 0, 0, 100, 0),
(2620700, 115, -2623.795, -50.004665, -3.3034098, NULL, 0, 0, 0, 100, 0),
(2620700, 116, -2654.1157, -13.759549, 3.1332266, NULL, 0, 0, 0, 100, 0),
(2620700, 117, -2674.728, 19.094673, 13.6595745, NULL, 0, 0, 0, 100, 0),
(2620700, 118, -2647.6116, 47.942493, 23.471582, NULL, 0, 0, 0, 100, 0),
(2620700, 119, -2644.0598, 80.47784, 31.887161, NULL, 0, 0, 0, 100, 0),
(2620700, 120, -2652.186, 106.53426, 41.890396, NULL, 0, 0, 0, 100, 0),
(2620700, 121, -2666.4324, 130.52155, 46.667397, NULL, 0, 0, 0, 100, 0),
(2620700, 122, -2673.6243, 159.4376, 51.764732, NULL, 0, 0, 0, 100, 0),
(2620700, 123, -2710.6592, 163.31958, 63.226166, NULL, 0, 0, 0, 100, 0),
(2620700, 124, -2729.8914, 197.9978, 76.868744, NULL, 0, 0, 0, 100, 0),
(2620900, 1, -1020.2051, -980.88086, 7.1683216, NULL, 0, 0, 0, 100, 0),
(2620900, 2, -1053.2329, -975.79126, 6.623329, NULL, 0, 0, 0, 100, 0),
(2620900, 3, -1084.5875, -977.6635, 6.817415, NULL, 0, 0, 0, 100, 0),
(2620900, 4, -1116.7161, -978.35114, 3.4320922, NULL, 0, 0, 0, 100, 0),
(2620900, 5, -1138.5924, -962.28125, 1.474831, NULL, 0, 0, 0, 100, 0),
(2620900, 6, -1148.5856, -919.54126, -2.596854, NULL, 0, 0, 0, 100, 0),
(2620900, 7, -1138.5454, -892.65125, -7.208537, NULL, 0, 0, 0, 100, 0),
(2620900, 8, -1150.0491, -851.04224, -16.409548, NULL, 0, 0, 0, 100, 0),
(2620900, 9, -1150.8984, -817.8583, -27.014313, NULL, 0, 0, 0, 100, 0),
(2620900, 10, -1147.5518, -776.8227, -44.30559, NULL, 0, 0, 0, 100, 0),
(2620900, 11, -1147.0758, -744.05914, -53.639885, NULL, 0, 0, 0, 100, 0),
(2620900, 12, -1147.7943, -718.74664, -58.091347, NULL, 0, 0, 0, 100, 0),
(2620900, 13, -1146.8345, -686.5961, -61.089966, NULL, 0, 0, 0, 100, 0),
(2620900, 14, -1146.251, -645.767, -57.616802, NULL, 0, 0, 0, 100, 0),
(2620900, 15, -1146.3079, -617.2496, -56.594704, NULL, 0, 0, 0, 100, 0),
(2620900, 16, -1152.5471, -582.02844, -57.719322, NULL, 0, 0, 0, 100, 0),
(2620900, 17, -1182.1832, -547.8252, -59.111668, NULL, 0, 0, 0, 100, 0),
(2620900, 18, -1187.4406, -514.64386, -55.33011, NULL, 0, 0, 0, 100, 0),
(2620900, 19, -1185.5323, -474.7066, -44.741253, NULL, 0, 0, 0, 100, 0),
(2620900, 20, -1206.8162, -445.11026, -44.441757, NULL, 0, 0, 0, 100, 0),
(2620900, 21, -1220.2743, -405.9527, -37.069504, NULL, 0, 0, 0, 100, 0),
(2620900, 22, -1230.3921, -363.70865, -26.883204, NULL, 0, 0, 0, 100, 0),
(2620900, 23, -1255.6671, -345.25363, -30.52438, NULL, 0, 0, 0, 100, 0),
(2620900, 24, -1286.9879, -315.80774, -32.31261, NULL, 0, 0, 0, 100, 0),
(2620900, 25, -1318.4122, -284.01877, -24.305344, NULL, 0, 0, 0, 100, 0),
(2620900, 26, -1355.5906, -280.10587, -15.520838, NULL, 0, 0, 0, 100, 0),
(2620900, 27, -1386.877, -287.93073, -17.552814, NULL, 0, 0, 0, 100, 0),
(2620900, 28, -1417.005, -286.57834, -13.878449, NULL, 0, 0, 0, 100, 0),
(2620900, 29, -1449.1166, -291.51437, -19.961262, NULL, 0, 0, 0, 100, 0),
(2620900, 30, -1475.7887, -319.79575, -34.36045, NULL, 0, 0, 0, 100, 0),
(2620900, 31, -1509.4084, -345.9926, -40.824417, NULL, 0, 0, 0, 100, 0),
(2620900, 32, -1525.5438, -382.69748, -42.79975, NULL, 0, 0, 0, 100, 0),
(2620900, 33, -1553.9834, -412.6861, -42.164524, NULL, 0, 0, 0, 100, 0),
(2620900, 34, -1590.6992, -412.87088, -39.847183, NULL, 0, 0, 0, 100, 0),
(2620900, 35, -1617.6337, -390.4591, -32.760555, NULL, 0, 0, 0, 100, 0),
(2620900, 36, -1648.6624, -355.2722, -27.633928, NULL, 0, 0, 0, 100, 0),
(2620900, 37, -1685.4014, -350.49475, -18.68922, NULL, 0, 0, 0, 100, 0),
(2620900, 38, -1721.133, -348.4744, -11.851406, NULL, 0, 0, 0, 100, 0),
(2620900, 39, -1755.0455, -344.01053, -9.548318, NULL, 0, 0, 0, 100, 0),
(2620900, 40, -1782.8278, -322.65842, -9.424843, NULL, 0, 0, 0, 100, 0),
(2620900, 41, -1819.2301, -318.81494, -8.874444, NULL, 0, 0, 0, 100, 0),
(2620900, 42, -1851.8077, -323.0484, -7.2307463, NULL, 0, 0, 0, 100, 0),
(2620900, 43, -1877.3624, -346.32922, -9.093119, NULL, 0, 0, 0, 100, 0),
(2620900, 44, -1854.1841, -381.51065, -7.991462, NULL, 0, 0, 0, 100, 0),
(2620900, 45, -1830.9149, -410.4619, -8.048546, NULL, 0, 0, 0, 100, 0),
(2620900, 46, -1827.4146, -441.5103, -7.292081, NULL, 0, 0, 0, 100, 0),
(2620900, 47, -1839.0156, -472.3828, -4.388832, NULL, 0, 0, 0, 100, 0),
(2620900, 48, -1844.6571, -521.93195, 0.857855, NULL, 0, 0, 0, 100, 0),
(2620900, 49, -1840.5328, -549.9421, -1.5416535, NULL, 0, 0, 0, 100, 0),
(2620900, 50, -1843.9037, -588.4754, -1.2690234, NULL, 0, 0, 0, 100, 0),
(2620900, 51, -1820.9545, -620.83606, -9.77841, NULL, 0, 0, 0, 100, 0),
(2620900, 52, -1809.1964, -660.40656, -10.850664, NULL, 0, 0, 0, 100, 0),
(2620900, 53, -1811.9022, -689.7712, -9.4739685, NULL, 0, 0, 0, 100, 0),
(2620900, 54, -1818.152, -715.43555, -9.424848, NULL, 0, 0, 0, 100, 0),
(2620900, 55, -1827.0248, -752.0289, -8.905457, NULL, 0, 0, 0, 100, 0),
(2620900, 56, -1845.9939, -776.34735, -5.783878, NULL, 0, 0, 0, 100, 0),
(2620900, 57, -1882.477, -791.6018, -7.7184834, NULL, 0, 0, 0, 100, 0),
(2620900, 58, -1912.0764, -811.54114, -0.89575887, NULL, 0, 0, 0, 100, 0),
(2620900, 59, -1923.2053, -849.5344, 3.833979, NULL, 0, 0, 0, 100, 0),
(2620900, 60, -1950.4001, -884.6272, 0.7706809, NULL, 0, 0, 0, 100, 0),
(2620900, 61, -1979.5773, -915.40845, 8.118938, NULL, 0, 0, 0, 100, 0),
(2620900, 62, -2024.5035, -924.3658, 2.138451, NULL, 0, 0, 0, 100, 0),
(2620900, 63, -2047.3091, -920.10114, 0.87201357, NULL, 0, 0, 0, 100, 0),
(2620900, 64, -2091.5933, -922.33997, 8.777015, NULL, 0, 0, 0, 100, 0),
(2620900, 65, -2119.8962, -922.5559, 10.534827, NULL, 0, 0, 0, 100, 0),
(2620900, 66, -2153.0735, -929.1006, 9.6171465, NULL, 0, 0, 0, 100, 0),
(2620900, 67, -2183.8567, -946.16095, 6.301245, NULL, 0, 0, 0, 100, 0),
(2620900, 68, -2217.3403, -948.37195, 0.41538173, NULL, 0, 0, 0, 100, 0),
(2620900, 69, -2255.0247, -925.83386, -7.886299, NULL, 0, 0, 0, 100, 0),
(2620900, 70, -2279.3665, -888.14996, -4.49362, NULL, 0, 0, 0, 100, 0),
(2620900, 71, -2285.2222, -846.1835, -7.1040916, NULL, 0, 0, 0, 100, 0),
(2620900, 72, -2291.1272, -816.87134, -5.591943, NULL, 0, 0, 0, 100, 0),
(2620900, 73, -2319.851, -789.5738, -8.415098, NULL, 0, 0, 0, 100, 0),
(2620900, 74, -2363.6467, -777.8217, -7.7410345, NULL, 0, 0, 0, 100, 0),
(2620900, 75, -2386.841, -777.74915, -1.931078, NULL, 0, 0, 0, 100, 0),
(2620900, 76, -2420.0496, -759.81696, -2.805012, NULL, 0, 0, 0, 100, 0),
(2620900, 77, -2433.9304, -784.26886, -1.9161642, NULL, 0, 0, 0, 100, 0),
(2620900, 78, -2453.8037, -811.69653, -5.838523, NULL, 0, 0, 0, 100, 0),
(2620900, 79, -2457.6191, -839.9908, -4.2054973, NULL, 0, 0, 0, 100, 0),
(2620900, 80, -2465.2732, -881.242, -4.847744, NULL, 0, 0, 0, 100, 0),
(2620900, 81, -2490.7522, -889.43164, -6.9935, NULL, 0, 0, 0, 100, 0),
(2620900, 82, -2513.5232, -886.17896, -7.119336, NULL, 0, 0, 0, 100, 0),
(2620900, 83, -2541.5662, -891.89105, -8.848616, NULL, 0, 0, 0, 100, 0),
(2620900, 84, -2550.9543, -913.97235, -9.117775, NULL, 0, 0, 0, 100, 0),
(2620900, 85, -2585.972, -921.22516, -4.9074683, NULL, 0, 0, 0, 100, 0),
(2620900, 86, -2616.3623, -890.53973, -4.647091, NULL, 0, 0, 0, 100, 0),
(2620900, 87, -2585.972, -921.22516, -4.9074683, NULL, 0, 0, 0, 100, 0),
(2620900, 88, -2550.9543, -913.97235, -9.117775, NULL, 0, 0, 0, 100, 0),
(2620900, 89, -2541.5662, -891.89105, -8.848616, NULL, 0, 0, 0, 100, 0),
(2620900, 90, -2513.5232, -886.17896, -7.119336, NULL, 0, 0, 0, 100, 0),
(2620900, 91, -2490.7522, -889.43164, -6.9935, NULL, 0, 0, 0, 100, 0),
(2620900, 92, -2465.2732, -881.242, -4.847744, NULL, 0, 0, 0, 100, 0),
(2620900, 93, -2457.6191, -839.9908, -4.2054973, NULL, 0, 0, 0, 100, 0),
(2620900, 94, -2453.8037, -811.69653, -5.838523, NULL, 0, 0, 0, 100, 0),
(2620900, 95, -2433.9304, -784.26886, -1.9161642, NULL, 0, 0, 0, 100, 0),
(2620900, 96, -2420.0496, -759.81696, -2.805012, NULL, 0, 0, 0, 100, 0),
(2620900, 97, -2386.841, -777.74915, -1.931078, NULL, 0, 0, 0, 100, 0),
(2620900, 98, -2363.6467, -777.8217, -7.7410345, NULL, 0, 0, 0, 100, 0),
(2620900, 99, -2319.851, -789.5738, -8.415098, NULL, 0, 0, 0, 100, 0),
(2620900, 100, -2291.1272, -816.87134, -5.591943, NULL, 0, 0, 0, 100, 0),
(2620900, 101, -2285.2222, -846.1835, -7.1040916, NULL, 0, 0, 0, 100, 0),
(2620900, 102, -2279.3665, -888.14996, -4.49362, NULL, 0, 0, 0, 100, 0),
(2620900, 103, -2255.0247, -925.83386, -7.886299, NULL, 0, 0, 0, 100, 0),
(2620900, 104, -2217.3403, -948.37195, 0.41538173, NULL, 0, 0, 0, 100, 0),
(2620900, 105, -2183.8567, -946.16095, 6.301245, NULL, 0, 0, 0, 100, 0),
(2620900, 106, -2153.0735, -929.1006, 9.6171465, NULL, 0, 0, 0, 100, 0),
(2620900, 107, -2119.8962, -922.5559, 10.534827, NULL, 0, 0, 0, 100, 0),
(2620900, 108, -2091.5933, -922.33997, 8.777015, NULL, 0, 0, 0, 100, 0),
(2620900, 109, -2047.3091, -920.10114, 0.87201357, NULL, 0, 0, 0, 100, 0),
(2620900, 110, -2024.5035, -924.3658, 2.138451, NULL, 0, 0, 0, 100, 0),
(2620900, 111, -1979.5773, -915.40845, 8.118938, NULL, 0, 0, 0, 100, 0),
(2620900, 112, -1950.4001, -884.6272, 0.7706809, NULL, 0, 0, 0, 100, 0),
(2620900, 113, -1923.2053, -849.5344, 3.833979, NULL, 0, 0, 0, 100, 0),
(2620900, 114, -1912.0764, -811.54114, -0.89575887, NULL, 0, 0, 0, 100, 0),
(2620900, 115, -1882.477, -791.6018, -7.7184834, NULL, 0, 0, 0, 100, 0),
(2620900, 116, -1845.9939, -776.34735, -5.783878, NULL, 0, 0, 0, 100, 0),
(2620900, 117, -1827.0248, -752.0289, -8.905457, NULL, 0, 0, 0, 100, 0),
(2620900, 118, -1818.152, -715.43555, -9.424848, NULL, 0, 0, 0, 100, 0),
(2620900, 119, -1811.9022, -689.7712, -9.4739685, NULL, 0, 0, 0, 100, 0),
(2620900, 120, -1809.1964, -660.40656, -10.850664, NULL, 0, 0, 0, 100, 0),
(2620900, 121, -1820.9545, -620.83606, -9.77841, NULL, 0, 0, 0, 100, 0),
(2620900, 122, -1843.9037, -588.4754, -1.2690234, NULL, 0, 0, 0, 100, 0),
(2620900, 123, -1840.5328, -549.9421, -1.5416535, NULL, 0, 0, 0, 100, 0),
(2620900, 124, -1844.6571, -521.93195, 0.857855, NULL, 0, 0, 0, 100, 0),
(2620900, 125, -1839.0156, -472.3828, -4.388832, NULL, 0, 0, 0, 100, 0),
(2620900, 126, -1827.4146, -441.5103, -7.292081, NULL, 0, 0, 0, 100, 0),
(2620900, 127, -1830.9149, -410.4619, -8.048546, NULL, 0, 0, 0, 100, 0),
(2620900, 128, -1854.1841, -381.51065, -7.991462, NULL, 0, 0, 0, 100, 0),
(2620900, 129, -1877.3624, -346.32922, -9.093119, NULL, 0, 0, 0, 100, 0),
(2620900, 130, -1851.8077, -323.0484, -7.2307463, NULL, 0, 0, 0, 100, 0),
(2620900, 131, -1819.2301, -318.81494, -8.874444, NULL, 0, 0, 0, 100, 0),
(2620900, 132, -1782.8278, -322.65842, -9.424843, NULL, 0, 0, 0, 100, 0),
(2620900, 133, -1755.0455, -344.01053, -9.548318, NULL, 0, 0, 0, 100, 0),
(2620900, 134, -1721.133, -348.4744, -11.851406, NULL, 0, 0, 0, 100, 0),
(2620900, 135, -1685.4014, -350.49475, -18.68922, NULL, 0, 0, 0, 100, 0),
(2620900, 136, -1648.6624, -355.2722, -27.633928, NULL, 0, 0, 0, 100, 0),
(2620900, 137, -1617.6337, -390.4591, -32.760555, NULL, 0, 0, 0, 100, 0),
(2620900, 138, -1590.6992, -412.87088, -39.847183, NULL, 0, 0, 0, 100, 0),
(2620900, 139, -1553.9834, -412.6861, -42.164524, NULL, 0, 0, 0, 100, 0),
(2620900, 140, -1525.5438, -382.69748, -42.79975, NULL, 0, 0, 0, 100, 0),
(2620900, 141, -1509.4084, -345.9926, -40.824417, NULL, 0, 0, 0, 100, 0),
(2620900, 142, -1475.7887, -319.79575, -34.36045, NULL, 0, 0, 0, 100, 0),
(2620900, 143, -1449.1166, -291.51437, -19.961262, NULL, 0, 0, 0, 100, 0),
(2620900, 144, -1417.005, -286.57834, -13.878449, NULL, 0, 0, 0, 100, 0),
(2620900, 145, -1386.877, -287.93073, -17.552814, NULL, 0, 0, 0, 100, 0),
(2620900, 146, -1355.5906, -280.10587, -15.520838, NULL, 0, 0, 0, 100, 0),
(2620900, 147, -1318.4122, -284.01877, -24.305344, NULL, 0, 0, 0, 100, 0),
(2620900, 148, -1286.9879, -315.80774, -32.31261, NULL, 0, 0, 0, 100, 0),
(2620900, 149, -1255.6671, -345.25363, -30.52438, NULL, 0, 0, 0, 100, 0),
(2620900, 150, -1230.3921, -363.70865, -26.883204, NULL, 0, 0, 0, 100, 0),
(2620900, 151, -1220.2743, -405.9527, -37.069504, NULL, 0, 0, 0, 100, 0),
(2620900, 152, -1206.8162, -445.11026, -44.441757, NULL, 0, 0, 0, 100, 0),
(2620900, 153, -1185.5323, -474.7066, -44.741253, NULL, 0, 0, 0, 100, 0),
(2620900, 154, -1187.4406, -514.64386, -55.33011, NULL, 0, 0, 0, 100, 0),
(2620900, 155, -1182.1832, -547.8252, -59.111668, NULL, 0, 0, 0, 100, 0),
(2620900, 156, -1152.5471, -582.02844, -57.719322, NULL, 0, 0, 0, 100, 0),
(2620900, 157, -1146.3079, -617.2496, -56.594704, NULL, 0, 0, 0, 100, 0),
(2620900, 158, -1146.251, -645.767, -57.616802, NULL, 0, 0, 0, 100, 0),
(2620900, 159, -1146.8345, -686.5961, -61.089966, NULL, 0, 0, 0, 100, 0),
(2620900, 160, -1147.7943, -718.74664, -58.091347, NULL, 0, 0, 0, 100, 0),
(2620900, 161, -1147.0758, -744.05914, -53.639885, NULL, 0, 0, 0, 100, 0),
(2620900, 162, -1147.5518, -776.8227, -44.30559, NULL, 0, 0, 0, 100, 0),
(2620900, 163, -1150.8984, -817.8583, -27.014313, NULL, 0, 0, 0, 100, 0),
(2620900, 164, -1150.0491, -851.04224, -16.409548, NULL, 0, 0, 0, 100, 0),
(2620900, 165, -1138.5454, -892.65125, -7.208537, NULL, 0, 0, 0, 100, 0),
(2620900, 166, -1148.5856, -919.54126, -2.596854, NULL, 0, 0, 0, 100, 0),
(2620900, 167, -1138.5924, -962.28125, 1.474831, NULL, 0, 0, 0, 100, 0),
(2620900, 168, -1116.7161, -978.35114, 3.4320922, NULL, 0, 0, 0, 100, 0),
(2620900, 169, -1084.5875, -977.6635, 6.817415, NULL, 0, 0, 0, 100, 0),
(2620900, 170, -1053.2329, -975.79126, 6.623329, NULL, 0, 0, 0, 100, 0),
(2620900, 171, -1020.2051, -980.88086, 7.1683216, NULL, 0, 0, 0, 100, 0),
(2620900, 172, -990.1825, -1000.7083, 11.565266, NULL, 0, 0, 0, 100, 0),
(2657800, 1, -1142.8879, -1120.528, 27.3758, NULL, 0, 0, 0, 100, 0),
(2657800, 2, -1150.968, -1115.959, 24.5076, NULL, 0, 0, 0, 100, 0),
(2657800, 3, -1158.046, -1106.704, 20.3599, NULL, 0, 0, 0, 100, 0),
(2657800, 4, -1165.9821, -1101.266, 17.5439, NULL, 0, 0, 0, 100, 0),
(2657800, 5, -1170.084, -1095.677, 15.3294, NULL, 0, 0, 0, 100, 0),
(2657800, 6, -1173.754, -1081.303, 11.0727, NULL, 0, 0, 0, 100, 0),
(2657800, 7, -1179.774, -1047.3831, 3.5325, NULL, 0, 0, 0, 100, 0),
(2657800, 8, -1185.896, -1030.351, 0.1813, NULL, 0, 0, 0, 100, 0),
(2657800, 9, -1200.679, -1007.499, -1.913, NULL, 0, 0, 0, 100, 0),
(2657800, 10, -1221.334, -983.8833, -4.1149, NULL, 0, 0, 0, 100, 0),
(2657800, 11, -1238.451, -967.6768, -6.8332, NULL, 0, 0, 0, 100, 0),
(2657800, 12, -1248.23, -961.4964, -7.2026, NULL, 0, 0, 0, 100, 0),
(2657800, 13, -1270.1639, -952.7275, -4.2838, NULL, 0, 0, 0, 100, 0),
(2657800, 14, -1294.37, -940.5132, 1.7639, NULL, 0, 0, 0, 100, 0),
(2657800, 15, -1318.322, -927.8248, 2.7704, NULL, 0, 0, 0, 100, 0),
(2657800, 16, -1334.959, -917.764, 1.6299, NULL, 0, 0, 0, 100, 0),
(2657800, 17, -1350.093, -901.2927, -1.8786, NULL, 0, 0, 0, 100, 0),
(2657800, 18, -1356.792, -884.5527, -6.5991, NULL, 0, 0, 0, 100, 0),
(2657800, 19, -1359.635, -869.5883, -8.6639, NULL, 0, 0, 0, 100, 0),
(2657800, 20, -1360.873, -850.4725, -6.8834, NULL, 0, 0, 0, 100, 0),
(2657800, 21, -1358.259, -820.6336, -12.6024, NULL, 0, 0, 0, 100, 0),
(2657800, 22, -1353.615, -799.7418, -19.2468, NULL, 0, 0, 0, 100, 0),
(2657800, 23, -1330.298, -762.4741, -32.1011, NULL, 0, 0, 0, 100, 0),
(2657800, 24, -1325.793, -737.2004, -38.4164, NULL, 0, 0, 0, 100, 0),
(2657800, 25, -1328.448, -739.9135, -37.8191, NULL, 0, 0, 0, 100, 0),
(2657800, 26, -1336.6479, -727.98, -40.7091, NULL, 0, 0, 0, 100, 0),
(2657800, 27, -1352.392, -713.3746, -46.4379, NULL, 0, 0, 0, 100, 0),
(2657800, 28, -1381.1169, -692.936, -52.8673, NULL, 0, 0, 0, 100, 0),
(2657800, 29, -1395.8929, -679.4994, -55.0795, NULL, 0, 0, 0, 100, 0),
(2657800, 30, -1406.655, -667.7491, -55.7912, NULL, 0, 0, 0, 100, 0),
(2657800, 31, -1423.808, -645.707, -52.7877, NULL, 0, 0, 0, 100, 0),
(2657800, 32, -1444.541, -616.1832, -56.1242, NULL, 0, 0, 0, 100, 0),
(2657800, 33, -1459.9301, -603.6383, -57.1929, NULL, 0, 0, 0, 100, 0),
(2657800, 34, -1470.057, -597.0546, -56.169, NULL, 0, 0, 0, 100, 0),
(2657800, 35, -1480.7469, -578.5486, -56.5383, NULL, 0, 0, 0, 100, 0),
(2657800, 36, -1487.157, -563.9292, -56.2795, NULL, 0, 0, 0, 100, 0),
(2657800, 37, -1489.577, -544.7419, -53.4087, NULL, 0, 0, 0, 100, 0),
(2657800, 38, -1489.574, -528.8965, -52.8374, NULL, 0, 0, 0, 100, 0),
(2657800, 39, -1489.62, -501.6599, -56.2315, NULL, 0, 0, 0, 100, 0),
(2657800, 40, -1492.634, -462.393, -50.279, NULL, 0, 0, 0, 100, 0),
(2657800, 41, -1505.76, -429.489, -45.7027, NULL, 0, 0, 0, 100, 0),
(2657800, 42, -1517.928, -391.2411, -42.8314, NULL, 0, 0, 0, 100, 0),
(2657800, 43, -1530.9821, -366.4191, -42.0044, NULL, 0, 0, 0, 100, 0),
(2657800, 44, -1541.627, -349.674, -38.6939, NULL, 0, 0, 0, 100, 0),
(2657800, 45, -1545.7271, -327.7592, -36.2629, NULL, 0, 0, 0, 100, 0),
(2657800, 46, -1553.165, -305.085, -32.1405, NULL, 0, 0, 0, 100, 0),
(2657800, 47, -1560.412, -287.1764, -27.0584, NULL, 0, 0, 0, 100, 0),
(2657800, 48, -1574.387, -260.7307, -15.7614, NULL, 0, 0, 0, 100, 0),
(2657800, 49, -1580.829, -247.3122, -12.0043, NULL, 0, 0, 0, 100, 0),
(2657800, 50, -1588.9611, -224.9691, -9.4461, NULL, 0, 0, 0, 100, 0),
(2657800, 51, -1606.261, -193.2352, -9.4434, NULL, 0, 0, 0, 100, 0),
(2657800, 52, -1620.4771, -164.6241, -5.5898, NULL, 0, 0, 0, 100, 0),
(2657800, 53, -1625.116, -130.617, -0.8691, NULL, 0, 0, 0, 100, 0),
(2657800, 54, -1623.778, -118.7694, -0.7166, NULL, 0, 0, 0, 100, 0),
(2657800, 55, -1618.616, -99.6451, -2.0879, NULL, 0, 0, 0, 100, 0),
(2657800, 56, -1609, -78.8948, 2.2697, NULL, 0, 0, 0, 100, 0),
(2657800, 57, -1598.49, -62.4247, 5.6697, NULL, 0, 0, 0, 100, 0),
(2657800, 58, -1590.646, -44.399, 5.9124, NULL, 0, 0, 0, 100, 0),
(2657800, 59, -1584.077, -25.5933, 3.9493, NULL, 0, 0, 0, 100, 0),
(2657800, 60, -1574.15, -8.5372, 2.3977, NULL, 0, 0, 0, 100, 0),
(2657800, 61, -1567.4871, 1.2559, 3.2112, NULL, 0, 0, 0, 100, 0),
(2657800, 62, -1558.6689, 13.8431, 7.8111, NULL, 0, 0, 0, 100, 0),
(2657800, 63, -1546.21, 28.2542, 11.6561, NULL, 0, 0, 0, 100, 0),
(2657800, 64, -1540.385, 33.92, 11.4862, NULL, 0, 0, 0, 100, 0),
(2657800, 65, -1524.016, 50.8436, 7.0849, NULL, 0, 0, 0, 100, 0),
(2657800, 66, -1494.799, 88.4423, 5.8093, NULL, 0, 0, 0, 100, 0),
(2657800, 67, -1487.8311, 87.5801, 7.3979, NULL, 0, 0, 0, 100, 0),
(2657800, 68, -1484.606, 90.7981, 7.1212, NULL, 0, 0, 0, 100, 0),
(2657800, 69, -1482.177, 118.8498, 0.2327, NULL, 0, 0, 0, 100, 0),
(2657800, 70, -1481.145, 161.8865, -7.5023, NULL, 0, 0, 0, 100, 0),
(2657800, 71, -1476.234, 226.3871, -7.535, NULL, 0, 0, 0, 100, 0),
(2657800, 72, -1465.848, 244.7017, -3.9568, NULL, 0, 0, 0, 100, 0),
(2657800, 73, -1454.155, 259.6542, 2.3833, NULL, 0, 0, 0, 100, 0),
(2657800, 74, -1449.089, 265.0599, 5.1455, NULL, 0, 0, 0, 100, 0),
(2657800, 75, -1441.824, 269.9399, 6.9387, NULL, 0, 0, 0, 100, 0),
(2657800, 76, -1428.3149, 276.9652, 7.5371, NULL, 0, 0, 0, 100, 0),
(2657800, 77, -1410.17, 284.0968, 6.4244, NULL, 0, 0, 0, 100, 0),
(2657800, 78, -1394.998, 286.2836, 5.8466, NULL, 0, 0, 0, 100, 0),
(2657800, 79, -1367.895, 286.6947, 1.3263, NULL, 0, 0, 0, 100, 0),
(2657800, 80, -1352.324, 288.1959, 0.0568, NULL, 0, 0, 0, 100, 0),
(2657800, 81, -1320.894, 291.7737, 2.1251, NULL, 0, 0, 0, 100, 0),
(2657800, 82, -1311.193, 297.3018, 1.6912, NULL, 0, 0, 0, 100, 0),
(2657800, 83, -1298.239, 308.9933, 0.0275, NULL, 0, 0, 0, 100, 0),
(2657800, 84, -1272.351, 316.5668, 0.4111, NULL, 0, 0, 0, 100, 0),
(2657800, 85, -1253.1021, 320.9234, 3.232, NULL, 0, 0, 0, 100, 0),
(2657800, 86, -1233.017, 334.9345, 4.4056, NULL, 0, 0, 0, 100, 0),
(2657800, 87, -1211.292, 358.0211, 1.1399, NULL, 0, 0, 0, 100, 0),
(2657800, 88, -1211.292, 358.0211, 1.1399, NULL, 0, 0, 0, 100, 0),
(2657800, 89, -1233.017, 334.9345, 4.4056, NULL, 0, 0, 0, 100, 0),
(2657800, 90, -1253.1021, 320.9234, 3.232, NULL, 0, 0, 0, 100, 0),
(2657800, 91, -1272.351, 316.5668, 0.4111, NULL, 0, 0, 0, 100, 0),
(2657800, 92, -1298.239, 308.9933, 0.0275, NULL, 0, 0, 0, 100, 0),
(2657800, 93, -1311.193, 297.3018, 1.6912, NULL, 0, 0, 0, 100, 0),
(2657800, 94, -1320.894, 291.7737, 2.1251, NULL, 0, 0, 0, 100, 0),
(2657800, 95, -1352.324, 288.1959, 0.0568, NULL, 0, 0, 0, 100, 0),
(2657800, 96, -1367.895, 286.6947, 1.3263, NULL, 0, 0, 0, 100, 0),
(2657800, 97, -1394.998, 286.2836, 5.8466, NULL, 0, 0, 0, 100, 0),
(2657800, 98, -1410.17, 284.0968, 6.4244, NULL, 0, 0, 0, 100, 0),
(2657800, 99, -1428.3149, 276.9652, 7.5371, NULL, 0, 0, 0, 100, 0),
(2657800, 100, -1441.824, 269.9399, 6.9387, NULL, 0, 0, 0, 100, 0),
(2657800, 101, -1449.089, 265.0599, 5.1455, NULL, 0, 0, 0, 100, 0),
(2657800, 102, -1454.155, 259.6542, 2.3833, NULL, 0, 0, 0, 100, 0),
(2657800, 103, -1465.848, 244.7017, -3.9568, NULL, 0, 0, 0, 100, 0),
(2657800, 104, -1476.234, 226.3871, -7.535, NULL, 0, 0, 0, 100, 0),
(2657800, 105, -1481.145, 161.8865, -7.5023, NULL, 0, 0, 0, 100, 0),
(2657800, 106, -1482.177, 118.8498, 0.2327, NULL, 0, 0, 0, 100, 0),
(2657800, 107, -1484.606, 90.7981, 7.1212, NULL, 0, 0, 0, 100, 0),
(2657800, 108, -1487.8311, 87.5801, 7.3979, NULL, 0, 0, 0, 100, 0),
(2657800, 109, -1494.799, 88.4423, 5.8093, NULL, 0, 0, 0, 100, 0),
(2657800, 110, -1524.016, 50.8436, 7.0849, NULL, 0, 0, 0, 100, 0),
(2657800, 111, -1540.385, 33.92, 11.4862, NULL, 0, 0, 0, 100, 0),
(2657800, 112, -1546.21, 28.2542, 11.6561, NULL, 0, 0, 0, 100, 0),
(2657800, 113, -1558.6689, 13.8431, 7.8111, NULL, 0, 0, 0, 100, 0),
(2657800, 114, -1567.4871, 1.2559, 3.2112, NULL, 0, 0, 0, 100, 0),
(2657800, 115, -1574.15, -8.5372, 2.3977, NULL, 0, 0, 0, 100, 0),
(2657800, 116, -1584.077, -25.5933, 3.9493, NULL, 0, 0, 0, 100, 0),
(2657800, 117, -1590.646, -44.399, 5.9124, NULL, 0, 0, 0, 100, 0),
(2657800, 118, -1598.49, -62.4247, 5.6697, NULL, 0, 0, 0, 100, 0),
(2657800, 119, -1609, -78.8948, 2.2697, NULL, 0, 0, 0, 100, 0),
(2657800, 120, -1618.616, -99.6451, -2.0879, NULL, 0, 0, 0, 100, 0),
(2657800, 121, -1623.778, -118.7694, -0.7166, NULL, 0, 0, 0, 100, 0),
(2657800, 122, -1625.116, -130.617, -0.8691, NULL, 0, 0, 0, 100, 0),
(2657800, 123, -1620.4771, -164.6241, -5.5898, NULL, 0, 0, 0, 100, 0),
(2657800, 124, -1606.261, -193.2352, -9.4434, NULL, 0, 0, 0, 100, 0),
(2657800, 125, -1588.9611, -224.9691, -9.4461, NULL, 0, 0, 0, 100, 0),
(2657800, 126, -1580.829, -247.3122, -12.0043, NULL, 0, 0, 0, 100, 0),
(2657800, 127, -1574.387, -260.7307, -15.7614, NULL, 0, 0, 0, 100, 0),
(2657800, 128, -1560.412, -287.1764, -27.0584, NULL, 0, 0, 0, 100, 0),
(2657800, 129, -1553.165, -305.085, -32.1405, NULL, 0, 0, 0, 100, 0),
(2657800, 130, -1545.7271, -327.7592, -36.2629, NULL, 0, 0, 0, 100, 0),
(2657800, 131, -1541.627, -349.674, -38.6939, NULL, 0, 0, 0, 100, 0),
(2657800, 132, -1530.9821, -366.4191, -42.0044, NULL, 0, 0, 0, 100, 0),
(2657800, 133, -1517.928, -391.2411, -42.8314, NULL, 0, 0, 0, 100, 0),
(2657800, 134, -1505.76, -429.489, -45.7027, NULL, 0, 0, 0, 100, 0),
(2657800, 135, -1492.634, -462.393, -50.279, NULL, 0, 0, 0, 100, 0),
(2657800, 136, -1489.62, -501.6599, -56.2315, NULL, 0, 0, 0, 100, 0),
(2657800, 137, -1489.574, -528.8965, -52.8374, NULL, 0, 0, 0, 100, 0),
(2657800, 138, -1489.577, -544.7419, -53.4087, NULL, 0, 0, 0, 100, 0),
(2657800, 139, -1487.157, -563.9292, -56.2795, NULL, 0, 0, 0, 100, 0),
(2657800, 140, -1480.7469, -578.5486, -56.5383, NULL, 0, 0, 0, 100, 0),
(2657800, 141, -1470.057, -597.0546, -56.169, NULL, 0, 0, 0, 100, 0),
(2657800, 142, -1459.9301, -603.6383, -57.1929, NULL, 0, 0, 0, 100, 0),
(2657800, 143, -1444.541, -616.1832, -56.1242, NULL, 0, 0, 0, 100, 0),
(2657800, 144, -1423.808, -645.707, -52.7877, NULL, 0, 0, 0, 100, 0),
(2657800, 145, -1406.655, -667.7491, -55.7912, NULL, 0, 0, 0, 100, 0),
(2657800, 146, -1395.8929, -679.4994, -55.0795, NULL, 0, 0, 0, 100, 0),
(2657800, 147, -1381.1169, -692.936, -52.8673, NULL, 0, 0, 0, 100, 0),
(2657800, 148, -1352.392, -713.3746, -46.4379, NULL, 0, 0, 0, 100, 0),
(2657800, 149, -1336.6479, -727.98, -40.7091, NULL, 0, 0, 0, 100, 0),
(2657800, 150, -1328.448, -739.9135, -37.8191, NULL, 0, 0, 0, 100, 0),
(2657800, 151, -1325.793, -737.2004, -38.4164, NULL, 0, 0, 0, 100, 0),
(2657800, 152, -1330.298, -762.4741, -32.1011, NULL, 0, 0, 0, 100, 0),
(2657800, 153, -1353.615, -799.7418, -19.2468, NULL, 0, 0, 0, 100, 0),
(2657800, 154, -1358.259, -820.6336, -12.6024, NULL, 0, 0, 0, 100, 0),
(2657800, 155, -1360.873, -850.4725, -6.8834, NULL, 0, 0, 0, 100, 0),
(2657800, 156, -1359.635, -869.5883, -8.6639, NULL, 0, 0, 0, 100, 0),
(2657800, 157, -1356.792, -884.5527, -6.5991, NULL, 0, 0, 0, 100, 0),
(2657800, 158, -1350.093, -901.2927, -1.8786, NULL, 0, 0, 0, 100, 0),
(2657800, 159, -1334.959, -917.764, 1.6299, NULL, 0, 0, 0, 100, 0),
(2657800, 160, -1318.322, -927.8248, 2.7704, NULL, 0, 0, 0, 100, 0),
(2657800, 161, -1294.37, -940.5132, 1.7639, NULL, 0, 0, 0, 100, 0),
(2657800, 162, -1270.1639, -952.7275, -4.2838, NULL, 0, 0, 0, 100, 0),
(2657800, 163, -1248.23, -961.4964, -7.2026, NULL, 0, 0, 0, 100, 0),
(2657800, 164, -1238.451, -967.6768, -6.8332, NULL, 0, 0, 0, 100, 0),
(2657800, 165, -1221.334, -983.8833, -4.1149, NULL, 0, 0, 0, 100, 0),
(2657800, 166, -1200.679, -1007.499, -1.913, NULL, 0, 0, 0, 100, 0),
(2657800, 167, -1185.896, -1030.351, 0.1813, NULL, 0, 0, 0, 100, 0),
(2657800, 168, -1179.774, -1047.3831, 3.5325, NULL, 0, 0, 0, 100, 0),
(2657800, 169, -1173.754, -1081.303, 11.0727, NULL, 0, 0, 0, 100, 0),
(2657800, 170, -1170.084, -1095.677, 15.3294, NULL, 0, 0, 0, 100, 0),
(2657800, 171, -1165.9821, -1101.266, 17.5439, NULL, 0, 0, 0, 100, 0),
(2657800, 172, -1158.046, -1106.704, 20.3599, NULL, 0, 0, 0, 100, 0),
(2657800, 173, -1150.968, -1115.959, 24.5076, NULL, 0, 0, 0, 100, 0),
(2657800, 174, -1142.8879, -1120.528, 27.3758, NULL, 0, 0, 0, 100, 0),
(2657800, 175, -1139, -1120.123, 28.01516, NULL, 0, 0, 0, 100, 0);
-- Set Idle to followers.
UPDATE `creature` SET `wander_distance` = 0, `MovementType` = 0 WHERE (`id1` IN (2972, 2974));
-- Update Kodo Bull spawn points & add a new one.
UPDATE `creature` SET `position_x` = -974.2193, `position_y` = 417.11154, `position_z` = 15.5879545, `orientation` = 3.073724, `wander_distance` = 0, `MovementType` = 2 WHERE (`id1` = 2973) AND (`guid` = 26196);
UPDATE `creature` SET `position_x` = -2729.8914, `position_y` = 197.9978, `position_z` = 76.868744, `orientation` = 5.064711, `wander_distance` = 0, `MovementType` = 2 WHERE (`id1` = 2973) AND (`guid` = 26207);
UPDATE `creature` SET `position_x` = -990.1825, `position_y` = -1000.7083, `position_z` = 11.565266, `orientation` = 2.755629, `wander_distance` = 0, `MovementType` = 2 WHERE (`id1` = 2973) AND (`guid` = 26209);
DELETE FROM `creature` WHERE (`id1` = 2973) AND (`guid` IN (26578));
INSERT INTO `creature` (`guid`, `id1`, `id2`, `id3`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `wander_distance`, `currentwaypoint`, `curhealth`, `curmana`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`, `ScriptName`, `Comment`, `VerifiedBuild`) VALUES
(26578, 2973, 0, 0, 1, 0, 0, 1, 1, 0, -1139, -1120.123, 28.01516, 3.02302, 250, 0, 0, 222, 0, 2, 0, 0, 0, '', NULL, 0);
-- Update Kodo Matriarch spawn points.
UPDATE `creature` SET `position_x` = -957.4887, `position_y` = 405.5724, `position_z` = 14.7732, `orientation` = 2.6232 WHERE (`id1` = 2974) AND (`guid` = 26210);
UPDATE `creature` SET `position_x` = -2737.903, `position_y` = 214.0841, `position_z` = 78.0185, `orientation` = 4.9165 WHERE (`id1` = 2974) AND (`guid` = 26211);
UPDATE `creature` SET `position_x` = -969.828, `position_y` = -1009.202, `position_z` = 13.8013, `orientation` = 2.7488 WHERE (`id1` = 2974) AND (`guid` = 26212);
UPDATE `creature` SET `position_x` = -1115.81, `position_y` = -1128.848, `position_z` = 37.0506, `orientation` = 2.8038 WHERE (`id1` = 2974) AND (`guid` = 26213);
-- Update Kodo Calf spawn points.
UPDATE `creature` SET `position_x` = -962.6667, `position_y` = 419.3729, `position_z` = 15.43035, `orientation` = 2.8149 WHERE (`id1` = 2972) AND (`guid` = 26184);
UPDATE `creature` SET `position_x` = -968.2633, `position_y` = 406.777, `position_z` = 15.4245, `orientation` = 2.6224 WHERE (`id1` = 2972) AND (`guid` = 26185);
UPDATE `creature` SET `position_x` = -2741.7703, `position_y` = 203.1685, `position_z` = 76.2887, `orientation` = 5.14828 WHERE (`id1` = 2972) AND (`guid` = 26186);
UPDATE `creature` SET `position_x` = -2727.2537, `position_y` = 209.523, `position_z` = 78.6638, `orientation` = 5.00692 WHERE (`id1` = 2972) AND (`guid` = 26187);
UPDATE `creature` SET `position_x` = -981.24414, `position_y` = -996.193, `position_z` = 10.4870, `orientation` = 2.6978 WHERE (`id1` = 2972) AND (`guid` = 26188);
UPDATE `creature` SET `position_x` = -986.4947, `position_y` = -1008.282, `position_z` = 13.3611, `orientation` = 2.7253 WHERE (`id1` = 2972) AND (`guid` = 26189);
UPDATE `creature` SET `position_x` = -1127.913, `position_y` = -1115.951, `position_z` = 29.7654, `orientation` = 2.8745 WHERE (`id1` = 2972) AND (`guid` = 26190);
UPDATE `creature` SET `position_x` = -1132.868, `position_y` = -1129.695, `position_z` = 32.5567, `orientation` = 2.7331 WHERE (`id1` = 2972) AND (`guid` = 26191);
-- Set Kodo Bull creature addons.
DELETE FROM `creature_addon` WHERE (`guid` IN (26196, 26207, 26209, 26578));
INSERT INTO `creature_addon` (`guid`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `visibilityDistanceType`, `auras`) VALUES
(26196, 2619600, 0, 0, 0, 0, 0, NULL),
(26207, 2620700, 0, 0, 0, 0, 0, NULL),
(26209, 2620900, 0, 0, 0, 0, 0, NULL),
(26578, 2657800, 0, 0, 0, 0, 0, NULL);
-- Set Kodo's Packs.
DELETE FROM `creature_formations` WHERE (`LeaderGUID` IN (26196, 26207, 26209, 26578));
INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES
(26196, 26196, 0, 0, 512, 0, 0),
(26196, 26184, 14, 155, 512, 0, 0),
(26196, 26185, 24, 205, 512, 0, 0),
(26196, 26210, 32, 180, 512, 0, 0),
(26207, 26207, 0, 0, 512, 0, 0),
(26207, 26186, 14, 155, 512, 0, 0),
(26207, 26187, 24, 205, 512, 0, 0),
(26207, 26211, 32, 180, 512, 0, 0),
(26209, 26209, 0, 0, 512, 0, 0),
(26209, 26188, 14, 155, 512, 0, 0),
(26209, 26189, 24, 205, 512, 0, 0),
(26209, 26212, 32, 180, 512, 0, 0),
(26578, 26578, 0, 0, 512, 0, 0),
(26578, 26190, 14, 155, 512, 0, 0),
(26578, 26191, 24, 205, 512, 0, 0),
(26578, 26213, 32, 180, 512, 0, 0);
@@ -0,0 +1,3 @@
-- DB update 2026_05_19_01 -> 2026_05_20_00
-- from "$R" to "troll" according to the sniff 67156
UPDATE `quest_request_items` SET `CompletionText` = 'Have you been to Vejrek\'s hut, $N? Is that troll stink I smell on you?' WHERE (`ID` = 1678);
@@ -0,0 +1,11 @@
-- DB update 2026_05_20_00 -> 2026_05_22_00
--
-- Quest 'The Deadliest Trap Ever Laid' (11097/11101): kill counter survives evade
--
UPDATE `smart_scripts` SET `event_type` = 38, `event_param1` = 1, `event_param2` = 20, `comment` = 'Commander Hobb - On Data Set field=1 value=20 - Run Script (Complete Quest)' WHERE `entryorguid` = 23434 AND `source_type` = 0 AND `id` = 11;
UPDATE `smart_scripts` SET `event_type` = 38, `event_param1` = 1, `event_param2` = 20, `comment` = 'Commander Arcus - On Data Set field=1 value=20 - Run Script (Complete Quest)' WHERE `entryorguid` = 23452 AND `source_type` = 0 AND `id` = 11;
UPDATE `smart_scripts` SET `action_type` = 242, `action_param1` = 1, `action_param2` = 1, `action_param3` = 0, `comment` = 'Dragonmaw Skybreaker - On Just Died - Inc Data field=1 +1 on Commander Hobb' WHERE `entryorguid` = 23440 AND `source_type` = 0 AND `id` = 3;
UPDATE `smart_scripts` SET `action_type` = 242, `action_param1` = 1, `action_param2` = 1, `action_param3` = 0, `comment` = 'Dragonmaw Skybreaker - On Just Died - Inc Data field=1 +1 on Commander Arcus' WHERE `entryorguid` = 23441 AND `source_type` = 0 AND `id` = 3;
UPDATE `smart_scripts` SET `action_type` = 45, `action_param1` = 1, `action_param2` = 0, `action_param3` = 0, `comment` = 'Commander Hobb - Actionlist - Seed Data field=1 value=0' WHERE `entryorguid` = 2343400 AND `source_type` = 9 AND `id` = 1;
UPDATE `smart_scripts` SET `action_type` = 45, `action_param1` = 1, `action_param2` = 0, `action_param3` = 0, `comment` = 'Commander Arcus - Actionlist - Seed Data field=1 value=0' WHERE `entryorguid` = 2345200 AND `source_type` = 9 AND `id` = 1;
@@ -0,0 +1,3 @@
-- DB update 2026_05_22_00 -> 2026_05_23_00
--
UPDATE `creature_template_addon` SET `auras` = '' WHERE (`entry` IN (31841, 31842));
@@ -0,0 +1,7 @@
-- DB update 2026_05_23_00 -> 2026_05_24_00
--
DELETE FROM `conditions` WHERE (`SourceTypeOrReferenceId` = 22) AND (`SourceGroup` = 4) AND (`SourceEntry` = 30886);
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
(22, 4, 30886, 0, 0, 23, 1, 4526, 0, 0, 1, 0, 0, '', 'Despawn Subjugated Iskalder when outside quest areas'),
(22, 4, 30886, 0, 0, 23, 1, 4498, 0, 0, 1, 0, 0, '', 'Despawn Subjugated Iskalder when outside quest areas'),
(22, 4, 30886, 0, 0, 23, 1, 4496, 0, 0, 1, 0, 0, '', 'Despawn Subjugated Iskalder when outside quest areas');
@@ -0,0 +1,3 @@
-- DB update 2026_05_24_00 -> 2026_05_24_01
--
UPDATE `creature_template` SET `CreatureImmunitiesId` = -375 WHERE `entry` IN (30183, 16486);
@@ -0,0 +1,6 @@
-- DB update 2026_05_24_01 -> 2026_05_24_02
-- acore_string entries for .pet rename command.
DELETE FROM `acore_string` WHERE `entry` IN (35453, 35454);
INSERT INTO `acore_string` (`entry`, `content_default`, `locale_koKR`, `locale_frFR`, `locale_deDE`, `locale_zhCN`, `locale_zhTW`, `locale_esES`, `locale_esMX`, `locale_ruRU`) VALUES
(35453, 'Invalid pet name: {}.', '잘못된 펫 이름입니다: {}.', 'Nom de familier invalide : {}.', 'Ungültiger Begleitername: {}.', '无效的宠物名称: {}。', '無效的寵物名稱:{}。', 'Nombre de mascota no válido: {}.', 'Nombre de mascota no válido: {}.', 'Недопустимое имя питомца: {}.'),
(35454, 'Renamed pet {0} ({1} -> {2}) for player {3} ({4}).', '플레이어 {3} ({4})의 펫 {0}의 이름을 {1}에서 {2}(으)로 변경했습니다.', 'Familier {0} renommé ({1} -> {2}) pour le joueur {3} ({4}).', 'Begleiter {0} umbenannt ({1} -> {2}) für Spieler {3} ({4}).', '已将玩家 {3} ({4}) 的宠物 {0} 重命名 ({1} -> {2})。', '已將玩家 {3} ({4}) 的寵物 {0} 重新命名({1} -> {2})。', 'Mascota {0} renombrada ({1} -> {2}) para el jugador {3} ({4}).', 'Mascota {0} renombrada ({1} -> {2}) para el jugador {3} ({4}).', 'Питомец {0} переименован ({1} -> {2}) у игрока {3} ({4}).');
@@ -0,0 +1,8 @@
-- DB update 2026_05_24_02 -> 2026_05_25_00
-- Hide Whispering Wind (30848) during Wintergrasp battle.
-- Aura 52107 phases the creature out while war is active; the other five
-- small WG elementals (30842, 30845, 30846, 30847, 30849) already have it
-- in creature_template_addon — 30848 was missed.
DELETE FROM `creature_template_addon` WHERE `entry` = 30848;
INSERT INTO `creature_template_addon` (`entry`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `visibilityDistanceType`, `auras`) VALUES
(30848, 0, 0, 0, 1, 0, 0, '52107');
@@ -0,0 +1,7 @@
-- DB update 2026_05_25_00 -> 2026_05_26_00
--
-- Change Target CREATURE_DISTANCE to CLOSEST_FRIENDLY
DELETE FROM `smart_scripts` WHERE (`entryorguid` = 23960) AND (`source_type` = 0) AND (`id` IN (1, 2));
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `event_param6`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(23960, 0, 1, 0, 0, 0, 100, 2, 5000, 7000, 14000, 17000, 0, 0, 11, 42740, 0, 0, 0, 0, 0, 26, 30, 0, 0, 0, 0, 0, 0, 0, 'Dragonflayer Runecaster - In Combat - Cast \'Njord`s Rune of Protection\' (Normal Dungeon)'),
(23960, 0, 2, 0, 0, 0, 100, 4, 5000, 7000, 14000, 17000, 0, 0, 11, 59616, 0, 0, 0, 0, 0, 26, 30, 0, 0, 0, 0, 0, 0, 0, 'Dragonflayer Runecaster - In Combat - Cast \'Njord`s Rune of Protection\' (Heroic Dungeon)');
@@ -0,0 +1,8 @@
-- DB update 2026_05_26_00 -> 2026_05_28_00
--
DELETE FROM `spawn_group` WHERE `spawnId` IN (153154, 153155, 153156, 153157);
INSERT INTO `spawn_group` (`groupId`, `spawnType`, `spawnId`) VALUES
(1, 0, 153154),
(1, 0, 153155),
(1, 0, 153156),
(1, 0, 153157);
@@ -0,0 +1,14 @@
-- DB update 2026_05_28_00 -> 2026_05_30_00
-- Hellfire Channelers formation: groupAI = 3 (MEMBER_ASSIST_LEADER | LEADER_ASSIST_MEMBER), pack-aggro only. Wipe handling lives in the instance script's hard reset.
DELETE FROM `creature_formations` WHERE `leaderGUID`=90978;
INSERT INTO `creature_formations`
(`leaderGUID`,`memberGUID`,`dist`,`angle`,`groupAI`,`point_1`,`point_2`)
VALUES
(90978, 90978, 0, 0, 3, 0, 0),
(90978, 90979, 0, 0, 3, 0, 0),
(90978, 90980, 0, 0, 3, 0, 0),
(90978, 90981, 0, 0, 3, 0, 0),
(90978, 90982, 0, 0, 3, 0, 0);
-- Hellfire Channeler SAI: drop id=6. Death tracking moved to the instance script (OnUnitDeath).
DELETE FROM `smart_scripts` WHERE `entryorguid`=17256 AND `source_type`=0 AND `id`=6;
@@ -0,0 +1,8 @@
-- DB update 2026_05_30_00 -> 2026_05_30_01
--
DROP TABLE IF EXISTS `spell_cone`;
CREATE TABLE `spell_cone` (
`ID` INT UNSIGNED NOT NULL COMMENT 'Spell ID',
`ConeDegrees` SMALLINT NOT NULL DEFAULT '60' COMMENT 'Cone angle in degrees',
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+107
View File
@@ -0,0 +1,107 @@
-- DB update 2026_05_30_01 -> 2026_05_30_02
--
DELETE FROM `spell_cone` WHERE `ID` > 0;
INSERT INTO `spell_cone` VALUES
(5708, 90),
(8374, 90),
-- (9457, 90), -- Tharnariun's Heal
(11019, 90),
(12882, 90),
(12887, 90),
-- (15529, 359), -- Gout of Flame
(15847, -120),
(16094, 90),
(16099, 90),
(16169, 90),
(16340, 90),
(16350, 90),
(16359, 90),
(16390, 90),
(16396, 120),
(18144, 90),
(18435, 120),
(18500, 120),
(19630, 120),
(19641, 120),
(19813, 180),
(20667, 90),
(20712, 120),
(20716, 90),
(20717, 90),
(21071, 120),
(21099, 120),
(21189, 90),
(21333, 180),
(22479, 90),
(22539, 120),
(22558, 90),
(22559, 90),
(22560, 90),
(22561, 90),
-- (22600, 120), -- Force Reactive Disk
(22642, 90),
-- (22682, 120), -- Shadow Flame
(22833, 120),
(22945, 120),
-- (22993, 120), -- Shadow Flame
-- (23187, 120), -- Frost Burn
-- (23189, 120), -- Frost Burn
-- (23308, 120), -- Incinerate
-- (23309, 120), -- Incinerate
-- (23310, 120), -- Time Lapse
-- (23311, 120), -- Time Lapse
-- (23312, 120), -- Time Lapse
-- (23313, 120), -- Corrosive Acid
-- (23314, 120), -- Corrosive Acid
-- (23315, 120), -- Ignite Flesh
-- (23316, 120), -- Ignite Flesh
(23339, 120),
(23364, -120),
(23461, 120),
(23618, 90),
(23919, 120),
(24192, 120),
(24682, 120),
(24818, 120),
(24821, 45),
(24822, 135),
(24823, 90),
(24835, 180),
(24836, 225),
(24837, 270),
(24838, 315),
(24839, 120),
(24933, 7),
-- (25024, 45), -- Drop Mine
-- (25026, 45), Activate MG Turret
-- (25027, 30), -- Flamethrower
(25029, 30), -- Flamethrower
(25030, 90), -- Shoot Rocket
-- (25031, 45), -- Shoot Missile
-- (25032, 10), -- Machine Gun
-- (25060, 90), -- Updraft
(25145, 90),
(25149, 90),
(25150, 90),
(25322, 90),
(25653, -120),
(25993, 120),
(26025, 180), -- Impale used by 15233 Vekniss Guardian; Knockback AoE, Bleed Cone
-- (26027, 180), -- Knockback
(26029, 5), -- Dark Glare
-- (27766, 90), -- Cannon
(27807, 90),
(28127, 90),
(28157, 45),
(28168, 120),
(28405, 180),
(28438, 180),
(28459, 90),
-- (28460, 90), -- Wail of Souls
-- (28469, 360), -- Ghost Vision
(28741, 120),
(28783, 30),
-- (29998, 180), -- Decrepit Fever
(30043, 90),
(30056, 180),
(30732, 180);
@@ -0,0 +1,8 @@
-- DB update 2026_05_30_02 -> 2026_05_30_03
--
-- 25029 Flamethrower TARGET_UNIT_CONE_ENTRY
-- 25030 Shoot Rocket TARGET_UNIT_CONE_ENTRY
DELETE FROM `conditions` WHERE (`SourceTypeOrReferenceId` = 13) AND (`SourceEntry` IN (25029, 25030)) AND (`SourceId` = 0) AND (`ElseGroup` = 0) AND (`ConditionTypeOrReference` = 31) AND (`ConditionTarget` = 0) AND (`ConditionValue1` = 3) AND (`ConditionValue2` = 15328) AND (`ConditionValue3` = 0);
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
(13, 5, 25029, 0, 0, 31, 0, 3, 15328, 0, 0, 0, 0, '', 'target must be \'Steam Stonk\''),
(13, 1, 25030, 0, 0, 31, 0, 3, 15328, 0, 0, 0, 0, '', 'target must be \'Steam Stonk\'');
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,13 @@
-- DB update 2026_05_31_00 -> 2026_05_31_01
--
-- Update `command` help text for .bf subcommands: #battleid is now optional
-- and defaults to 1 (Wintergrasp) when omitted.
DELETE FROM `command` WHERE `name` IN ('bf start', 'bf stop', 'bf switch', 'bf enable', 'bf timer', 'bf queue');
INSERT INTO `command` (`name`, `security`, `help`) VALUES
('bf start', 3, 'Syntax: .bf start [#battleid]\r\n#battleid is optional and defaults to 1 (Wintergrasp).'),
('bf stop', 3, 'Syntax: .bf stop [#battleid]\r\n#battleid is optional and defaults to 1 (Wintergrasp).'),
('bf switch', 3, 'Syntax: .bf switch [#battleid]\r\n#battleid is optional and defaults to 1 (Wintergrasp).'),
('bf enable', 3, 'Syntax: .bf enable [#battleid]\r\n#battleid is optional and defaults to 1 (Wintergrasp).'),
('bf timer', 3, 'Syntax: .bf timer [#battleid] #timer\r\n#battleid is optional and defaults to 1 (Wintergrasp).\r\n#timer: use a timestring like "1h15m30s".'),
('bf queue', 2, 'Syntax: .bf queue [#battleid]\r\nDisplays all players currently in queue, invited, or actively in war for the specified battlefield.\r\n#battleid is optional and defaults to 1 (Wintergrasp).');
+4
View File
@@ -17,6 +17,10 @@ if( UNIX )
# READLINE_LIBRARY - full path to the READLINE library
find_path(READLINE_INCLUDE_DIR readline/readline.h)
find_library(READLINE_LIBRARY NAMES readline)
# macOS: Homebrew readline is keg-only, so this finds the SDK's libedit stub
# and worldserver fails to link. After `brew install readline`, configure with
# -DREADLINE_LIBRARY=/opt/homebrew/opt/readline/lib/libreadline.dylib and
# -DREADLINE_INCLUDE_DIR=/opt/homebrew/opt/readline/include
message(STATUS "Found Readline library: ${READLINE_LIBRARY}")
message(STATUS "Include dir is: ${READLINE_INCLUDE_DIR}")
+5
View File
@@ -36,6 +36,11 @@ target_compile_options(acore-compile-option-interface
INTERFACE
/utf-8)
target_compile_options(acore-compile-option-interface
INTERFACE
/Zc:preprocessor)
message(STATUS "MSVC: Enabled standard conforming preprocessor")
if(PLATFORM EQUAL 64)
# This definition is necessary to work around a bug with Intellisense described
# here: http://tinyurl.com/2cb428. Syntax highlighting is important for proper
@@ -3386,6 +3386,16 @@ DungeonAccessRequirements.OptionalStringID = 0
JoinBGAndLFG.Enable = 0
#
# LFG.MailItemOnFullInventory
# Description: When a player wins a group roll but their inventory is full, mail
# the item to them instead of leaving it on the corpse.
# Default: 0 - Disabled
# 1 - Only in LFG/RDF groups
# 2 - In all group types
LFG.MailItemOnFullInventory = 0
#
# DungeonFinder.OptionsMask
# Description: Dungeon and raid finder system.
@@ -3665,6 +3675,31 @@ Wintergrasp.CrashRestartTimer = 10
Wintergrasp.SkipBattleSessionCount = 3500
#
# Wintergrasp.KickVoAPlayers
# Description: Kick players from Vault of Archavon and freeze its bosses
# in the minutes leading up to a Wintergrasp battle, and
# block new entries during wartime / the 10-minute warmup.
# Requires a server restart to take effect (not reloadable).
# Default: 1 - (Enabled, players are warned then teleported to their
# homebind before the battle starts)
# 0 - (Disabled, players stay inside and bosses behave
# normally during Wintergrasp)
Wintergrasp.KickVoAPlayers = 1
#
# Wintergrasp.EssenceBothFactions
# Description: Grant the "Essence of Wintergrasp" buff to both factions
# during peacetime, regardless of who controls the keep.
# The wartime suppression still applies; this only affects
# who receives the buff once the battle is over.
# Default: 0 - (Disabled, only the defending faction gets the buff)
# 1 - (Enabled, attackers and defenders both get the buff,
# so both factions can access Vault of Archavon)
Wintergrasp.EssenceBothFactions = 0
#
###################################################################################################
@@ -1369,6 +1369,7 @@ void SmartGameObjectAI::UpdateAI(uint32 diff)
void SmartGameObjectAI::InitializeAI()
{
GetScript()->OnInitialize(me);
aiDataSet.clear();
// Xinef: do not call respawn event if go is not spawned
if (me->isSpawned())
@@ -1437,9 +1438,19 @@ void SmartGameObjectAI::SetData(uint32 id, uint32 value, WorldObject* invoker)
gob = invoker->ToGameObject();
}
aiDataSet[id] = value;
GetScript()->ProcessEventsFor(SMART_EVENT_DATA_SET, unit, id, value, false, nullptr, gob);
}
uint32 SmartGameObjectAI::GetData(uint32 id) const
{
std::unordered_map<uint32, uint32>::const_iterator itr = aiDataSet.find(id);
if (itr != aiDataSet.end())
return itr->second;
return 0;
}
void SmartGameObjectAI::SetScript9(SmartScriptHolder& e, uint32 entry, WorldObject* invoker)
{
if (invoker)
@@ -304,6 +304,7 @@ public:
void Destroyed(Player* player, uint32 eventId) override;
void SetData(uint32 id, uint32 value) override { SetData(id, value, nullptr); }
void SetData(uint32 id, uint32 value, WorldObject* invoker);
uint32 GetData(uint32 id) const override;
void SetScript9(SmartScriptHolder& e, uint32 entry, WorldObject* invoker);
void OnGameEvent(bool start, uint16 eventId) override;
void OnStateChanged(uint32 state, Unit* unit) override;
@@ -324,6 +325,7 @@ public:
protected:
SmartScript mScript;
std::unordered_map<uint32, uint32> aiDataSet;
};
/// Registers scripts required by the SAI scripting system
@@ -1463,6 +1463,35 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
}
break;
}
case SMART_ACTION_INC_DATA:
{
WorldObject* invoker = me ? static_cast<WorldObject*>(me) : static_cast<WorldObject*>(go);
for (WorldObject* target : targets)
{
if (Creature* cTarget = target->ToCreature())
{
if (SmartAI* smartAI = CAST_AI(SmartAI, cTarget->AI()))
{
uint32 const newValue = smartAI->GetData(e.action.setData.field) + e.action.setData.data;
smartAI->SetData(e.action.setData.field, newValue, invoker);
}
else
LOG_ERROR("sql.sql", "SmartScript: Action target for SMART_ACTION_INC_DATA is not using SmartAI, skipping");
}
else if (GameObject* oTarget = target->ToGameObject())
{
if (SmartGameObjectAI* smartGOAI = CAST_AI(SmartGameObjectAI, oTarget->AI()))
{
uint32 const newValue = smartGOAI->GetData(e.action.setData.field) + e.action.setData.data;
smartGOAI->SetData(e.action.setData.field, newValue, invoker);
}
else
LOG_ERROR("sql.sql", "SmartScript: Action target for SMART_ACTION_INC_DATA is not using SmartGameObjectAI, skipping");
}
}
break;
}
case SMART_ACTION_MOVE_FORWARD:
{
if (!me)
@@ -759,6 +759,7 @@ bool SmartAIMgr::CheckUnusedActionParams(SmartScriptHolder const& e)
case SMART_ACTION_MOUNT_TO_ENTRY_OR_MODEL: return sizeof(SmartAction::morphOrMount);
case SMART_ACTION_SET_INGAME_PHASE_MASK: return sizeof(SmartAction::ingamePhaseMask);
case SMART_ACTION_SET_DATA: return sizeof(SmartAction::setData);
case SMART_ACTION_INC_DATA: return sizeof(SmartAction::setData);
case SMART_ACTION_MOVE_FORWARD: return sizeof(SmartAction::moveRandom);
case SMART_ACTION_ATTACK_STOP: return NO_PARAMS;
case SMART_ACTION_SET_VISIBILITY: return sizeof(SmartAction::visibility);
@@ -1975,6 +1976,7 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
case SMART_ACTION_THREAT_SINGLE_PCT:
case SMART_ACTION_SET_INST_DATA64:
case SMART_ACTION_SET_DATA:
case SMART_ACTION_INC_DATA:
case SMART_ACTION_MOVE_FORWARD:
case SMART_ACTION_ESCORT_PAUSE:
case SMART_ACTION_SET_FLY:
@@ -726,8 +726,9 @@ enum SMART_ACTION
SMART_ACTION_SET_ANIM_TIER = 239, // animtier
SMART_ACTION_SET_GOSSIP_MENU = 240, // gossipMenuId
SMART_ACTION_SUMMON_GAMEOBJECT_GROUP = 241, // group
SMART_ACTION_INC_DATA = 242, // field, increment (uses aiDataSet, wipe-safe across evade)
SMART_ACTION_AC_END = 242, // placeholder
SMART_ACTION_AC_END = 243, // placeholder
};
enum class SmartActionSummonCreatureFlags
+7
View File
@@ -677,6 +677,13 @@ enum RBACPermissions
RBAC_PERM_COMMAND_BF_QUEUE = 913,
RBAC_PERM_COMMAND_PET_LIST = 914,
RBAC_PERM_COMMAND_PET_DELETE = 915,
RBAC_PERM_COMMAND_RESPAWN_CREATURE_GUID = 916,
RBAC_PERM_COMMAND_RESPAWN_GAMEOBJECT_GUID = 917,
RBAC_PERM_COMMAND_RESPAWN_CREATURE_ENTRY = 918,
RBAC_PERM_COMMAND_RESPAWN_GAMEOBJECT_ENTRY = 919,
RBAC_PERM_COMMAND_DEBUG_INFO = 920,
RBAC_PERM_COMMAND_DEBUG_COSMETIC = 921,
RBAC_PERM_COMMAND_PET_RENAME = 922,
// custom permissions 1000+
RBAC_PERM_MAX
};
+164 -146
View File
@@ -74,12 +74,27 @@ Battlefield::~Battlefield()
CapturePoints.clear();
}
void Battlefield::RemovePlayerFromTracking(ObjectGuid playerGuid)
{
for (uint8 i = 0; i < PVP_TEAMS_COUNT; ++i)
{
InvitedPlayers[i].erase(playerGuid);
PlayersInQueue[i].erase(playerGuid);
PlayersWillBeKick[i].erase(playerGuid);
Players[i].erase(playerGuid);
}
}
void Battlefield::HandlePlayerEnterZone(Player* player, uint32 /*zone*/)
{
RemovePlayerFromTracking(player->GetGUID());
// Allow scripts to adjust the player's effective team or appearance before
// any team-based battlefield containers (such as player lists or queues) are updated.
sScriptMgr->OnBattlefieldPlayerEnterZone(this, player);
TryRejoinAfterLogout(player); // relog: auto-rejoin, skip invite below
// Xinef: do not invite players on taxi
if (!player->IsInFlight())
{
@@ -111,12 +126,20 @@ void Battlefield::HandlePlayerEnterZone(Player* player, uint32 /*zone*/)
void Battlefield::HandlePlayerLeaveZone(Player* player, uint32 /*zone*/)
{
// Logout still runs full leave-war cleanup, but marks the player for grace-window auto-rejoin.
bool const isLogout = player->GetSession() && player->GetSession()->PlayerLogout();
if (IsWarTime())
{
// If the player is participating to the battle
if (PlayersInWar[player->GetTeamId()].erase(player->GetGUID()))
{
player->GetSession()->SendBfLeaveMessage(BattleId);
if (isLogout)
LogoutGracePlayers[player->GetTeamId()][player->GetGUID()] =
GameTime::GetGameTime().count() + LOGOUT_GRACE_SECONDS;
else
player->GetSession()->SendBfLeaveMessage(BattleId);
if (Group* group = player->GetGroup()) // Remove the player from the raid group
if (group->isBFGroup())
group->RemoveMember(player->GetGUID());
@@ -129,17 +152,10 @@ void Battlefield::HandlePlayerLeaveZone(Player* player, uint32 /*zone*/)
for (BfCapturePoint* cp : CapturePoints)
cp->HandlePlayerLeave(player);
InvitedPlayers[player->GetTeamId()].erase(player->GetGUID());
PlayersInQueue[player->GetTeamId()].erase(player->GetGUID());
PlayersWillBeKick[player->GetTeamId()].erase(player->GetGUID());
Players[player->GetTeamId()].erase(player->GetGUID());
RemovePlayerFromTracking(player->GetGUID());
SendRemoveWorldStates(player);
RemovePlayerFromResurrectQueue(player->GetGUID());
OnPlayerLeaveZone(player);
// Scripts must restore player->GetTeamId() here (e.g. ClearFakePlayer).
// All Battlefield data-structure cleanup above has already completed using
// the assigned team, so it is safe to restore the real team now.
sScriptMgr->OnBattlefieldPlayerLeaveZone(this, player);
}
bool Battlefield::Update(uint32 diff)
@@ -236,6 +252,9 @@ void Battlefield::InvitePlayerToWar(Player* player)
if (!player)
return;
if (player->IsGameMaster())
return;
/// @todo : needed ?
if (player->IsInFlight())
return;
@@ -293,7 +312,14 @@ void Battlefield::KickPlayerFromBattlefield(ObjectGuid guid)
if (Player* player = ObjectAccessor::FindPlayer(guid))
if (player->GetZoneId() == GetZoneId() && !player->IsGameMaster()
&& !PlayersInWar[player->GetTeamId()].count(guid))
{
player->TeleportTo(KickPosition);
// Eagerly drop zone tracking: the teleport's zone change does not
// propagate until the next Player::Update, so callers iterating
// Players[team] in the same tick would otherwise still see them.
for (uint8 i = 0; i < PVP_TEAMS_COUNT; ++i)
Players[i].erase(guid);
}
}
void Battlefield::StartBattle()
@@ -305,6 +331,7 @@ void Battlefield::StartBattle()
{
PlayersInWar[team].clear();
Groups[team].clear();
LogoutGracePlayers[team].clear();
}
Timer = BattleTime;
@@ -319,11 +346,25 @@ void Battlefield::StartBattle()
_scheduler.Schedule(1s, BATTLEFIELD_TIMER_GROUP_WAR, [this](TaskContext context)
{
time_t now = GameTime::GetGameTime().count();
time_t const now = GameTime::GetGameTime().count();
// Send eject so the 3.3.5 client closes its popup (it does not on its
// own when the timer hits zero), then drop the entry and teleport.
for (uint8 team = 0; team < PVP_TEAMS_COUNT; ++team)
for (PlayerTimerMap::value_type const& pair : InvitedPlayers[team])
if (pair.second <= now)
KickPlayerFromBattlefield(pair.first);
{
std::vector<ObjectGuid> expired;
for (auto const& [guid, expireAt] : InvitedPlayers[team])
if (expireAt <= now)
expired.push_back(guid);
for (ObjectGuid const& guid : expired)
{
if (Player* player = ObjectAccessor::FindPlayer(guid))
player->GetSession()->SendBfLeaveMessage(BattleId, BF_LEAVE_REASON_EXITED);
InvitedPlayers[team].erase(guid);
KickPlayerFromBattlefield(guid);
}
}
InvitePlayersInZoneToWar();
for (uint8 team = 0; team < PVP_TEAMS_COUNT; ++team)
@@ -363,8 +404,19 @@ void Battlefield::EndBattle(bool endByTimer)
else
DoPlaySoundToAll(BF_HORDE_WINS);
OnBattleEnd(endByTimer);
// Hook runs BEFORE OnBattleEnd so subscribers can read PlayersInWar
// while it is still populated (OnBattleEnd hands out rewards and then
// clears the set).
sScriptMgr->OnBattlefieldWarEnd(this, endByTimer);
OnBattleEnd(endByTimer);
for (uint8 team = 0; team < PVP_TEAMS_COUNT; ++team)
{
for (ObjectGuid const& guid : Groups[team])
if (Group* group = sGroupMgr->GetGroupByGUID(guid.GetCounter()))
group->Disband();
Groups[team].clear();
}
// Reset battlefield timer
Timer = NoWarBattleTime;
@@ -379,7 +431,10 @@ void Battlefield::DoPlaySoundToAll(uint32 soundId)
bool Battlefield::HasPlayer(Player* player) const
{
return Players[player->GetTeamId()].find(player->GetGUID()) != Players[player->GetTeamId()].end();
for (uint8 i = 0; i < PVP_TEAMS_COUNT; ++i)
if (Players[i].count(player->GetGUID()))
return true;
return false;
}
// Called in WorldSession::HandleBfQueueInviteResponse
@@ -413,13 +468,21 @@ void Battlefield::PlayerAcceptInviteToWar(Player* player)
if (!IsWarTime())
return;
// Reject unknown / expired invites; the kick task only sweeps every 5s.
TeamId const invitedTeam = player->GetTeamId();
auto itr = InvitedPlayers[invitedTeam].find(player->GetGUID());
if (itr == InvitedPlayers[invitedTeam].end()
|| itr->second <= GameTime::GetGameTime().count())
return;
sScriptMgr->OnBattlefieldPlayerJoinWar(this, player);
if (AddOrSetPlayerToCorrectBfGroup(player))
{
player->GetSession()->SendBfEntered(BattleId);
PlayersInWar[player->GetTeamId()].insert(player->GetGUID());
InvitedPlayers[player->GetTeamId()].erase(player->GetGUID());
// Use pre-hook team: JoinWar may have just reassigned GetTeamId().
InvitedPlayers[invitedTeam].erase(player->GetGUID());
if (player->isAFK())
player->ToggleAFK();
@@ -547,6 +610,41 @@ bool Battlefield::AddOrSetPlayerToCorrectBfGroup(Player* player)
return true;
}
void Battlefield::TryRejoinAfterLogout(Player* player)
{
ObjectGuid const guid = player->GetGUID();
time_t const now = GameTime::GetGameTime().count();
// Consume the marker and honor its grace window (check both teams; team may have changed).
bool pending = false;
for (uint8 team = 0; team < PVP_TEAMS_COUNT; ++team)
if (auto itr = LogoutGracePlayers[team].find(guid); itr != LogoutGracePlayers[team].end())
{
pending = itr->second > now;
LogoutGracePlayers[team].erase(itr);
}
// Vacancy gate mirrors HandlePlayerEnterZone (full team -> queue path). Pre-hook:
// we can't abort after JoinWar, which may already have mutated module state.
if (!pending || !IsWarTime() || !HasWarVacancy(player->GetTeamId()))
return;
if (Group* current = player->GetGroup())
if (current->isBGGroup() || current->isBFGroup())
return;
// Rejoin via the normal join path: firing JoinWar lets modules rebuild
// per-session (Player*-keyed) state and pick the team before the raid bind.
sScriptMgr->OnBattlefieldPlayerJoinWar(this, player);
if (AddOrSetPlayerToCorrectBfGroup(player))
{
player->GetSession()->SendBfEntered(BattleId);
PlayersInWar[player->GetTeamId()].insert(guid);
OnPlayerJoinWar(player);
}
}
BfGraveyard* Battlefield::GetGraveyardById(uint32 id) const
{
if (id < GraveyardList.size())
@@ -588,34 +686,22 @@ GraveyardStruct const* Battlefield::GetClosestGraveyard(Player* player)
return nullptr;
}
void Battlefield::AddPlayerToResurrectQueue(ObjectGuid npcGuid, ObjectGuid playerGuid)
void Battlefield::AddPlayerToResurrectQueue(ObjectGuid /*npcGuid*/, ObjectGuid playerGuid)
{
for (BfGraveyard* gy : GraveyardList)
{
if (!gy)
continue;
Player* player = ObjectAccessor::FindPlayer(playerGuid);
if (!player)
return;
if (gy->HasNpc(npcGuid))
{
gy->AddPlayer(playerGuid);
break;
}
}
player->CastSpell(player, SPELL_WAITING_FOR_RESURRECT, true);
}
void Battlefield::RemovePlayerFromResurrectQueue(ObjectGuid playerGuid)
{
for (BfGraveyard* gy : GraveyardList)
{
if (!gy)
continue;
Player* player = ObjectAccessor::FindPlayer(playerGuid);
if (!player)
return;
if (gy->HasPlayer(playerGuid))
{
gy->RemovePlayer(playerGuid);
break;
}
}
player->RemoveAurasDueToSpell(SPELL_WAITING_FOR_RESURRECT);
}
void Battlefield::SendAreaSpiritHealerQueryOpcode(Player* player, ObjectGuid const& guid)
@@ -661,80 +747,9 @@ float BfGraveyard::GetDistance(Player* player)
return player->GetDistance2d(safeLoc->x, safeLoc->y);
}
void BfGraveyard::AddPlayer(ObjectGuid playerGuid)
{
if (!ResurrectQueue.count(playerGuid))
{
ResurrectQueue.insert(playerGuid);
if (Player* player = ObjectAccessor::FindPlayer(playerGuid))
player->CastSpell(player, SPELL_WAITING_FOR_RESURRECT, true);
}
}
void BfGraveyard::RemovePlayer(ObjectGuid playerGuid)
{
ResurrectQueue.erase(ResurrectQueue.find(playerGuid));
if (Player* player = ObjectAccessor::FindPlayer(playerGuid))
player->RemoveAurasDueToSpell(SPELL_WAITING_FOR_RESURRECT);
}
void BfGraveyard::Resurrect()
{
if (ResurrectQueue.empty())
return;
for (ObjectGuid const& guid : ResurrectQueue)
{
// Get player object from his guid
Player* player = ObjectAccessor::FindPlayer(guid);
if (!player)
continue;
// Check if the player is in world and on the good graveyard
if (player->IsInWorld())
if (Unit* spirit = ObjectAccessor::GetCreature(*player, SpiritGuide[ControlTeam]))
spirit->CastSpell(spirit, SPELL_SPIRIT_HEAL, true);
// Resurrect player
player->CastSpell(player, SPELL_RESURRECTION_VISUAL, true);
player->ResurrectPlayer(1.0f);
player->CastSpell(player, 6962, true);
player->CastSpell(player, SPELL_SPIRIT_HEAL_MANA, true);
player->SpawnCorpseBones(false);
}
ResurrectQueue.clear();
}
// For changing graveyard control
void BfGraveyard::GiveControlTo(TeamId team)
{
ControlTeam = team;
// Teleport to other graveyard, players which were on this graveyard
RelocateDeadPlayers();
}
void BfGraveyard::RelocateDeadPlayers()
{
GraveyardStruct const* closestGrave = nullptr;
for (ObjectGuid const& guid : ResurrectQueue)
{
Player* player = ObjectAccessor::FindPlayer(guid);
if (!player)
continue;
if (closestGrave)
player->TeleportTo(player->GetMapId(), closestGrave->x, closestGrave->y, closestGrave->z, player->GetOrientation());
else
{
closestGrave = Bf->GetClosestGraveyard(player);
if (closestGrave)
player->TeleportTo(player->GetMapId(), closestGrave->x, closestGrave->y, closestGrave->z, player->GetOrientation());
}
}
}
Creature* Battlefield::SpawnCreature(uint32 entry, Position pos, TeamId teamId)
@@ -842,7 +857,7 @@ bool BfCapturePoint::HandlePlayerEnter(Player* player)
player->SendUpdateWorldState(go->GetGOInfo()->capturePoint.worldstate2, uint32(std::ceil((Value + MaxValue) / (2 * MaxValue) * 100.0f)));
player->SendUpdateWorldState(go->GetGOInfo()->capturePoint.worldstate3, NeutralValuePct);
}
return ActivePlayers[player->GetTeamId()].insert(player->GetGUID()).second;
return ActivePlayers.insert(player->GetGUID()).second;
}
GuidUnorderedSet::iterator BfCapturePoint::HandlePlayerLeave(Player* player)
@@ -850,13 +865,12 @@ GuidUnorderedSet::iterator BfCapturePoint::HandlePlayerLeave(Player* player)
if (GameObject* go = GetCapturePointGo(player))
player->SendUpdateWorldState(go->GetGOInfo()->capturePoint.worldState1, 0);
GuidUnorderedSet::iterator current = ActivePlayers[player->GetTeamId()].find(player->GetGUID());
GuidUnorderedSet::iterator current = ActivePlayers.find(player->GetGUID());
if (current == ActivePlayers[player->GetTeamId()].end())
if (current == ActivePlayers.end())
return current; // return end()
current = ActivePlayers[player->GetTeamId()].erase(current);
return current;
return ActivePlayers.erase(current);
}
void BfCapturePoint::SendChangePhase()
@@ -865,17 +879,16 @@ void BfCapturePoint::SendChangePhase()
if (!capturePoint)
return;
for (uint8 team = 0; team < 2; ++team)
for (ObjectGuid const& guid : ActivePlayers[team]) // send to all players present in the area
if (Player* player = ObjectAccessor::FindPlayer(guid))
{
// send this too, sometimes the slider disappears, dunno why :(
player->SendUpdateWorldState(capturePoint->GetGOInfo()->capturePoint.worldState1, 1);
// send these updates to only the ones in this objective
player->SendUpdateWorldState(capturePoint->GetGOInfo()->capturePoint.worldstate2, (uint32) std::ceil((Value + MaxValue) / (2 * MaxValue) * 100.0f));
// send this too, sometimes it resets :S
player->SendUpdateWorldState(capturePoint->GetGOInfo()->capturePoint.worldstate3, NeutralValuePct);
}
for (ObjectGuid const& guid : ActivePlayers) // send to all players present in the area
if (Player* player = ObjectAccessor::FindPlayer(guid))
{
// send this too, sometimes the slider disappears, dunno why :(
player->SendUpdateWorldState(capturePoint->GetGOInfo()->capturePoint.worldState1, 1);
// send these updates to only the ones in this objective
player->SendUpdateWorldState(capturePoint->GetGOInfo()->capturePoint.worldstate2, (uint32) std::ceil((Value + MaxValue) / (2 * MaxValue) * 100.0f));
// send this too, sometimes it resets :S
player->SendUpdateWorldState(capturePoint->GetGOInfo()->capturePoint.worldstate3, NeutralValuePct);
}
}
bool BfCapturePoint::SetCapturePointData(GameObject* capturePoint, TeamId team)
@@ -947,19 +960,19 @@ bool BfCapturePoint::Update(uint32 diff)
float radius = capturePoint->GetGOInfo()->capturePoint.radius;
for (uint8 team = 0; team < 2; ++team)
// Single pass over the existing set: drop leavers, count survivors per team.
uint32 counts[PVP_TEAMS_COUNT] = { 0, 0 };
for (auto itr = ActivePlayers.begin(); itr != ActivePlayers.end();)
{
for (auto itr = ActivePlayers[team].begin(); itr != ActivePlayers[team].end();)
Player* player = ObjectAccessor::FindPlayer(*itr);
if (player && capturePoint->IsWithinDistInMap(player, radius) && player->IsOutdoorPvPActive())
{
if (Player* player = ObjectAccessor::FindPlayer(*itr))
if (!capturePoint->IsWithinDistInMap(player, radius) || !player->IsOutdoorPvPActive())
{
itr = HandlePlayerLeave(player);
continue;
}
++counts[player->GetTeamId()];
++itr;
continue;
}
itr = (player ? HandlePlayerLeave(player) : ActivePlayers.erase(itr));
}
std::list<Player*> players;
@@ -969,11 +982,14 @@ bool BfCapturePoint::Update(uint32 diff)
for (Player* player : players)
if (player->IsOutdoorPvPActive())
if (ActivePlayers[player->GetTeamId()].insert(player->GetGUID()).second)
if (ActivePlayers.insert(player->GetGUID()).second)
{
HandlePlayerEnter(player);
++counts[player->GetTeamId()];
}
// get the difference of numbers
float factDiff = ((float) ActivePlayers[0].size() - (float) ActivePlayers[1].size()) * diff / BATTLEFIELD_OBJECTIVE_UPDATE_INTERVAL;
float factDiff = ((float)counts[TEAM_ALLIANCE] - (float)counts[TEAM_HORDE]) * diff / BATTLEFIELD_OBJECTIVE_UPDATE_INTERVAL;
if (G3D::fuzzyEq(factDiff, 0.0f))
return false;
@@ -1059,34 +1075,36 @@ bool BfCapturePoint::Update(uint32 diff)
void BfCapturePoint::SendUpdateWorldState(uint32 field, uint32 value)
{
for (uint8 team = 0; team < 2; ++team)
for (ObjectGuid const& guid : ActivePlayers[team]) // send to all players present in the area
if (Player* player = ObjectAccessor::FindPlayer(guid))
player->SendUpdateWorldState(field, value);
for (ObjectGuid const& guid : ActivePlayers) // send to all players present in the area
if (Player* player = ObjectAccessor::FindPlayer(guid))
player->SendUpdateWorldState(field, value);
}
void BfCapturePoint::SendObjectiveComplete(uint32 id, ObjectGuid guid)
{
uint8 team;
TeamId winner;
switch (State)
{
case BF_CAPTUREPOINT_OBJECTIVESTATE_ALLIANCE:
team = 0;
winner = TEAM_ALLIANCE;
break;
case BF_CAPTUREPOINT_OBJECTIVESTATE_HORDE:
team = 1;
winner = TEAM_HORDE;
break;
default:
return;
}
// send to all players present in the area
for (ObjectGuid const& playerGuid : ActivePlayers[team])
// Credit only players on the controlling team. Team is read from the
// player at iteration time, not at insert time, so players whose
// GetTeamId() changed mid-stay get credit on their current side.
for (ObjectGuid const& playerGuid : ActivePlayers)
if (Player* player = ObjectAccessor::FindPlayer(playerGuid))
player->KilledMonsterCredit(id, guid);
if (player->GetTeamId() == winner)
player->KilledMonsterCredit(id, guid);
}
bool BfCapturePoint::IsInsideObjective(Player* player) const
{
return ActivePlayers[player->GetTeamId()].find(player->GetGUID()) != ActivePlayers[player->GetTeamId()].end();
return ActivePlayers.find(player->GetGUID()) != ActivePlayers.end();
}
+16 -17
View File
@@ -119,8 +119,10 @@ public:
protected:
bool DelCapturePoint();
// Active players in the area of the objective, 0 - alliance, 1 - horde
GuidUnorderedSet ActivePlayers[2];
// Active players in the area of the objective. Single set keyed by GUID:
// team is computed from Player::GetTeamId() at the point it is needed.
// Splitting by team here would desync if GetTeamId() changes mid-stay.
GuidUnorderedSet ActivePlayers;
// Total shift needed to capture the objective
float MaxValue;
@@ -169,18 +171,6 @@ public:
// Set spirit service for the graveyard
void SetSpirit(Creature* spirit, TeamId team);
// Add a player to the graveyard
void AddPlayer(ObjectGuid playerGuid);
// Remove a player from the graveyard
void RemovePlayer(ObjectGuid playerGuid);
// Resurrect players
void Resurrect();
// Move players waiting to that graveyard on the nearest one
void RelocateDeadPlayers();
// Check if this graveyard has a spirit guide
bool HasNpc(ObjectGuid guid)
{
@@ -190,8 +180,7 @@ public:
return (SpiritGuide[0] == guid || SpiritGuide[1] == guid);
}
// Check if a player is in this graveyard's resurrect queue
bool HasPlayer(ObjectGuid guid) const { return ResurrectQueue.find(guid) != ResurrectQueue.end(); }
ObjectGuid GetSpiritGuide(TeamId team) const { return SpiritGuide[team]; }
// Get the graveyard's ID.
uint32 GetGraveyardId() const { return GraveyardId; }
@@ -200,7 +189,6 @@ protected:
TeamId ControlTeam;
uint32 GraveyardId;
ObjectGuid SpiritGuide[2];
GuidUnorderedSet ResurrectQueue;
Battlefield* Bf;
};
@@ -292,6 +280,11 @@ public:
/// Force player to join a battlefield group
bool AddOrSetPlayerToCorrectBfGroup(Player* player);
/// Auto-rejoin a player who relogged within the grace window after a mid-war
/// logout, via the normal join hooks. No-op without a pending logout marker.
/// Called from HandlePlayerEnterZone (which fires on the post-login zone set).
void TryRejoinAfterLogout(Player* player);
// Graveyard methods
// Find which graveyard the player must be teleported to to be resurrected by spiritguide
GraveyardStruct const* GetClosestGraveyard(Player* player);
@@ -395,6 +388,10 @@ protected:
GuidUnorderedSet PlayersInWar[PVP_TEAMS_COUNT]; // Players in WG combat
PlayerTimerMap InvitedPlayers[PVP_TEAMS_COUNT];
PlayerTimerMap PlayersWillBeKick[PVP_TEAMS_COUNT];
// Mid-war logouts: GUID -> timestamp until which a relog auto-rejoins the war.
PlayerTimerMap LogoutGracePlayers[PVP_TEAMS_COUNT];
static constexpr uint32 LOGOUT_GRACE_SECONDS = 120; // relog auto-rejoin window
// Variables that must exist for each battlefield
uint32 TypeId; // See enum BattlefieldTypes
@@ -444,6 +441,8 @@ protected:
/// Returns true if the player is already tracked as actively in the war or invited to join it.
bool IsPlayerInWarOrInvited(Player* player) const;
void RemovePlayerFromTracking(ObjectGuid playerGuid);
// Player-iteration helpers: resolve each GUID to a live Player* and call fn(player).
// Using templates avoids std::function overhead and works naturally with lambdas.
template<typename Func>
@@ -17,6 +17,7 @@
#include "BattlefieldMgr.h"
#include "Player.h"
#include "ScriptMgr.h"
#include "Zones/BattlefieldWG.h"
BattlefieldMgr::BattlefieldMgr() : _updateTimer(0)
@@ -86,6 +87,7 @@ void BattlefieldMgr::HandlePlayerLeaveZone(Player* player, uint32 zoneId)
// teleport: remove once in removefromworld, once in updatezone
if (!itr->second->HasPlayer(player))
return;
sScriptMgr->OnBattlefieldPlayerLeaveZone(itr->second, player);
itr->second->HandlePlayerLeaveZone(player, zoneId);
LOG_DEBUG("bg.battlefield", "Player {} left outdoorpvp id {}", player->GetGUID().ToString(), itr->second->GetTypeId());
}
@@ -110,6 +112,13 @@ Battlefield* BattlefieldMgr::GetBattlefieldByBattleId(uint32 battleId)
return nullptr;
}
bool BattlefieldMgr::IsWintergraspAttackerVictory()
{
if (Battlefield* bf = GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG))
return static_cast<BattlefieldWG*>(bf)->IsLastBattleAttackerVictory();
return false;
}
void BattlefieldMgr::Update(uint32 diff)
{
_updateTimer += diff;
@@ -47,6 +47,9 @@ public:
Battlefield* GetBattlefieldToZoneId(uint32 zoneId);
Battlefield* GetBattlefieldByBattleId(uint32 battleId);
// True iff the most recent Wintergrasp battle ended with the keep captured.
[[nodiscard]] bool IsWintergraspAttackerVictory();
ZoneScript* GetZoneScript(uint32 zoneId);
void AddZone(uint32 zoneId, Battlefield* handle);
@@ -21,6 +21,7 @@
#include "AreaDefines.h"
#include "BattlefieldWG.h"
#include "ScriptMgr.h"
#include "Chat.h"
#include "GameTime.h"
#include "MapMgr.h"
@@ -192,9 +193,39 @@ bool BattlefieldWG::SetupBattlefield()
_scheduler.Schedule(Milliseconds(RESURRECTION_INTERVAL),
BATTLEFIELD_TIMER_GROUP_RESURRECT, [this](TaskContext context)
{
for (BfGraveyard* gy : GraveyardList)
if (gy)
gy->Resurrect();
ForEachPlayerInZone([this](Player* player)
{
if (!player->HasAura(SPELL_WAITING_FOR_RESURRECT))
return;
TeamId team = player->GetTeamId();
Unit* closestSpirit = nullptr;
float closestDist = -1.0f;
for (BfGraveyard* gy : GraveyardList)
{
if (!gy)
continue;
Unit* spirit = ObjectAccessor::GetCreature(*player, gy->GetSpiritGuide(team));
if (!spirit)
continue;
float dist = player->GetDistance(spirit);
if (closestDist < 0.0f || dist < closestDist)
{
closestDist = dist;
closestSpirit = spirit;
}
}
if (closestSpirit)
closestSpirit->CastSpell(closestSpirit, SPELL_SPIRIT_HEAL, true);
player->CastSpell(player, SPELL_RESURRECTION_VISUAL, true);
player->ResurrectPlayer(1.0f);
player->CastSpell(player, 6962, true);
player->CastSpell(player, SPELL_SPIRIT_HEAL_MANA, true);
player->SpawnCorpseBones(false);
player->RemoveAurasDueToSpell(SPELL_WAITING_FOR_RESURRECT);
});
context.Repeat();
});
@@ -265,19 +296,7 @@ void BattlefieldWG::OnBattleStart()
capturePoint->SetCapturePointData(capturePoint->GetCapturePointGo(),
capturePoint->GetCapturePointGo()->GetEntry() == GO_WINTERGRASP_FACTORY_BANNER_SE || capturePoint->GetCapturePointGo()->GetEntry() == GO_WINTERGRASP_FACTORY_BANNER_SW ? GetAttackerTeam() : GetDefenderTeam());
for (uint8 team = 0; team < 2; ++team)
for (ObjectGuid const& guid : Players[team])
{
// Kick player in orb room, TODO: offline player ?
if (Player* player = ObjectAccessor::FindPlayer(guid))
{
float x, y, z;
player->GetPosition(x, y, z);
if (5500 > x && x > 5392 && y < 2880 && y > 2800 && z < 480)
player->TeleportTo(MAP_NORTHREND, 5349.8686f, 2838.481f, 409.240f, 0.046328f);
SendInitWorldStatesTo(player);
}
}
SendInitWorldStatesToAll();
// Initialize vehicle counter
UpdateCounterVehicle(true);
// Send start warning to all players
@@ -347,6 +366,9 @@ void BattlefieldWG::CapturePointTaken(uint32 areaId)
void BattlefieldWG::OnBattleEnd(bool endByTimer)
{
// Must be set before SPELL_VICTORY_REWARD so the 1755 criterion can gate on it.
LastBattleAttackerVictory = !endByTimer;
// Remove relic
if (GameObject* go = GetRelic())
go->RemoveFromWorld();
@@ -457,12 +479,17 @@ void BattlefieldWG::OnBattleEnd(bool endByTimer)
}
}
bool const grantEssenceToAttackers = sWorld->getBoolConfig(CONFIG_WINTERGRASP_ESSENCE_BOTH_FACTIONS);
for (ObjectGuid const& guid : PlayersInWar[GetAttackerTeam()])
if (Player* player = ObjectAccessor::FindPlayer(guid))
{
player->CastSpell(player, SPELL_DEFEAT_REWARD, true);
RemoveAurasFromPlayer(player);
if (grantEssenceToAttackers)
player->CastSpell(player, SPELL_ESSENCE_OF_WINTERGRASP, true);
for (uint8 i = 0; i < damagedTowersAtt; ++i)
player->CastSpell(player, spellDamagedAtt, true);
for (uint8 i = 0; i < brokenTowersAtt; ++i)
@@ -722,16 +749,19 @@ void BattlefieldWG::HandleKill(Player* killer, Unit* victim)
// xinef: tower cannons also grant rank
if (victim->IsPlayer() || IsKeepNpc(victim->GetEntry()) || victim->GetEntry() == NPC_WINTERGRASP_TOWER_CANNON)
{
if (victim->IsPlayer() && victim->HasAura(SPELL_LIEUTENANT))
if (Player* victimPlayer = victim->ToPlayer())
{
// Quest - Wintergrasp - PvP Kill - Horde/Alliance
for (ObjectGuid const& playerGuid : PlayersInWar[killerTeam])
sScriptMgr->OnBattlefieldPlayerKill(this, killer, victimPlayer);
if (victimPlayer->HasAura(SPELL_LIEUTENANT))
{
if (Player* player = ObjectAccessor::FindPlayer(playerGuid))
// Quest - Wintergrasp - PvP Kill - Horde/Alliance
for (ObjectGuid const& playerGuid : PlayersInWar[killerTeam])
{
if (player->GetDistance2d(killer) < 40)
if (Player* player = ObjectAccessor::FindPlayer(playerGuid))
{
player->KilledMonsterCredit(killerTeam == TEAM_HORDE ? NPC_QUEST_PVP_KILL_ALLIANCE : NPC_QUEST_PVP_KILL_HORDE);
if (player->GetDistance2d(killer) < 40)
player->KilledMonsterCredit(killerTeam == TEAM_HORDE ? NPC_QUEST_PVP_KILL_ALLIANCE : NPC_QUEST_PVP_KILL_HORDE);
}
}
}
@@ -904,8 +934,8 @@ void BattlefieldWG::OnPlayerEnterZone(Player* player)
// Send worldstate to player
SendInitWorldStatesTo(player);
// xinef: Attacker, if hidden in relic room kick him out
if (player->GetTeamId() == GetAttackerTeam())
// xinef: Attacker, if hidden in relic room kick him out (only during wartime)
if (IsWarTime() && player->GetTeamId() == GetAttackerTeam())
if (player->GetPositionX() > 5400.0f && player->GetPositionX() < 5490.0f && player->GetPositionY() > 2803.0f && player->GetPositionY() < 2878.0f)
KickPlayerFromBattlefield(player->GetGUID());
}
@@ -403,6 +403,9 @@ public:
uint32 GetData(uint32 data) const override;
// True iff the most recent battle ended with the keep captured (attacker win).
[[nodiscard]] bool IsLastBattleAttackerVictory() const { return LastBattleAttackerVictory; }
bool IsKeepNpc(uint32 entry)
{
switch (entry)
@@ -451,6 +454,8 @@ protected:
int32 TenacityStack;
ObjectGuid TitansRelic;
bool LastBattleAttackerVictory{false};
};
uint8 const WG_MAX_OBJ = 32;
@@ -675,7 +675,7 @@ inline void Battleground::_ProcessJoin(uint32 diff)
// Announce BG starting
if (sWorld->getBoolConfig(CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_ENABLE))
ChatHandler(nullptr).SendWorldText(LANG_BG_STARTED_ANNOUNCE_WORLD, GetName(), std::min(GetMinLevel(), (uint32)80), std::min(GetMaxLevel(), (uint32)80));
ChatHandler(nullptr).SendWorldTextOptional(LANG_BG_STARTED_ANNOUNCE_WORLD, ANNOUNCER_FLAG_DISABLE_PVP_START, GetName(), std::min(GetMinLevel(), (uint32)80), std::min(GetMaxLevel(), (uint32)80));
sScriptMgr->OnBattlegroundStart(this);
}
@@ -1583,7 +1583,10 @@ uint8 BattlegroundAV::GetAttackString(BG_AV_Nodes node, TeamId teamId)
strId = AV_TEXT_H_HERALD_SNOWFALL_GRAVEYARD_ATTACK;
break;
case BG_AV_NODES_ICEBLOOD_TOWER:
strId = AV_TEXT_A_HERALD_ICEBLOOD_TOWER_ATTACK;
if (teamId == TEAM_ALLIANCE)
strId = AV_TEXT_A_HERALD_ICEBLOOD_TOWER_ATTACK;
else
strId = AV_TEXT_H_HERALD_ICEBLOOD_TOWER_ATTACK;
break;
case BG_AV_NODES_ICEBLOOD_GRAVE:
if (teamId == TEAM_ALLIANCE)
@@ -1682,7 +1685,10 @@ uint8 BattlegroundAV::GetDefendString(BG_AV_Nodes node, TeamId teamId)
strId = AV_TEXT_H_HERALD_SNOWFALL_GRAVEYARD_TAKEN;
break;
case BG_AV_NODES_ICEBLOOD_TOWER:
strId = AV_TEXT_A_HERALD_ICEBLOOD_TOWER_TAKEN;
if (teamId == TEAM_ALLIANCE)
strId = AV_TEXT_A_HERALD_ICEBLOOD_TOWER_TAKEN;
else
strId = AV_TEXT_H_HERALD_ICEBLOOD_TOWER_TAKEN;
break;
case BG_AV_NODES_ICEBLOOD_GRAVE:
if (teamId == TEAM_ALLIANCE)
@@ -1622,50 +1622,50 @@ enum BG_AV_Objectives
enum BG_AV_HERALD
{
AV_TEXT_A_HERALD_STORMPIKE_GRAVEYARD_TAKEN = 1,
AV_TEXT_A_HERALD_STORMPIKE_GRAVEYARD_ATTACK = 2,
AV_TEXT_H_HERALD_STORMPIKE_GRAVEYARD_TAKEN = 3,
AV_TEXT_H_HERALD_STORMPIKE_GRAVEYARD_ATTACK = 4,
AV_TEXT_A_HERALD_SNOWFALL_GRAVEYARD_TAKEN = 5,
AV_TEXT_A_HERALD_SNOWFALL_GRAVEYARD_ATTACK = 6,
AV_TEXT_H_HERALD_SNOWFALL_GRAVEYARD_TAKEN = 7,
AV_TEXT_H_HERALD_SNOWFALL_GRAVEYARD_ATTACK = 8,
AV_TEXT_A_HERALD_FROSTWOLF_GRAVEYARD_TAKEN = 9,
AV_TEXT_A_HERALD_FROSTWOLF_GRAVEYARD_ATTACK = 10,
AV_TEXT_H_HERALD_FROSTWOLF_GRAVEYARD_TAKEN = 11,
AV_TEXT_H_HERALD_FROSTWOLF_GRAVEYARD_ATTACK = 12,
AV_TEXT_H_HERALD_DUN_BALDAR_SOUTH_ATTACK = 13,
AV_TEXT_H_HERALD_DUN_BALDAR_SOUTH_TAKEN = 14,
AV_TEXT_A_HERALD_DUN_BALDAR_SOUTH_ATTACK = 15,
AV_TEXT_A_HERALD_DUN_BALDAR_SOUTH_TAKEN = 16,
AV_TEXT_H_HERALD_DUN_BALDAR_NORTH_ATTACK = 17,
AV_TEXT_H_HERALD_DUN_BALDAR_NORTH_TAKEN = 18,
AV_TEXT_A_HERALD_DUN_BALDAR_NORTH_ATTACK = 19,
AV_TEXT_A_HERALD_DUN_BALDAR_NORTH_TAKEN = 20,
AV_TEXT_H_HERALD_ICEWING_BUNKER_ATTACK = 21,
AV_TEXT_H_HERALD_ICEWING_BUNKER_TAKEN = 22,
AV_TEXT_A_HERALD_ICEWING_BUNKER_ATTACK = 23,
AV_TEXT_A_HERALD_ICEWING_BUNKER_TAKEN = 24,
AV_TEXT_H_HERALD_STONEHEARTH_BUNKER_ATTACK = 25,
AV_TEXT_H_HERALD_STONEHEARTH_BUNKER_TAKEN = 26,
AV_TEXT_A_HERALD_STONEHEARTH_BUNKER_ATTACK = 27,
AV_TEXT_A_HERALD_STONEHEARTH_BUNKER_TAKEN = 28,
AV_TEXT_H_HERALD_WEST_FROSTWOLF_TOWER_ATTACK = 29,
AV_TEXT_H_HERALD_WEST_FROSTWOLF_TOWER_TAKEN = 30,
AV_TEXT_A_HERALD_WEST_FROSTWOLF_TOWER_ATTACK = 31,
AV_TEXT_A_HERALD_WEST_FROSTWOLF_TOWER_TAKEN = 32,
AV_TEXT_H_HERALD_EAST_FROSTWOLF_TOWER_ATTACK = 33,
AV_TEXT_H_HERALD_EAST_FROSTWOLF_TOWER_TAKEN = 34,
AV_TEXT_A_HERALD_EAST_FROSTWOLF_TOWER_ATTACK = 35,
AV_TEXT_A_HERALD_EAST_FROSTWOLF_TOWER_TAKEN = 36,
AV_TEXT_H_HERALD_TOWER_POINT_ATTACK = 37,
AV_TEXT_H_HERALD_TOWER_POINT_TAKEN = 38,
AV_TEXT_A_HERALD_TOWER_POINT_ATTACK = 39,
AV_TEXT_A_HERALD_TOWER_POINT_TAKEN = 40,
AV_TEXT_H_HERALD_ICEBLOOD_BUNKER_ATTACK = 41,
AV_TEXT_H_HERALD_ICEBLOOD_BUNKER_TAKEN = 42,
AV_TEXT_A_HERALD_ICEBLOOD_TOWER_ATTACK = 43,
AV_TEXT_A_HERALD_ICEBLOOD_TOWER_TAKEN = 44,
AV_TEXT_A_HERALD_STORMPIKE_GRAVEYARD_TAKEN = 1,
AV_TEXT_A_HERALD_STORMPIKE_GRAVEYARD_ATTACK = 2,
AV_TEXT_H_HERALD_STORMPIKE_GRAVEYARD_TAKEN = 3,
AV_TEXT_H_HERALD_STORMPIKE_GRAVEYARD_ATTACK = 4,
AV_TEXT_A_HERALD_SNOWFALL_GRAVEYARD_TAKEN = 5,
AV_TEXT_A_HERALD_SNOWFALL_GRAVEYARD_ATTACK = 6,
AV_TEXT_H_HERALD_SNOWFALL_GRAVEYARD_TAKEN = 7,
AV_TEXT_H_HERALD_SNOWFALL_GRAVEYARD_ATTACK = 8,
AV_TEXT_A_HERALD_FROSTWOLF_GRAVEYARD_TAKEN = 9,
AV_TEXT_A_HERALD_FROSTWOLF_GRAVEYARD_ATTACK = 10,
AV_TEXT_H_HERALD_FROSTWOLF_GRAVEYARD_TAKEN = 11,
AV_TEXT_H_HERALD_FROSTWOLF_GRAVEYARD_ATTACK = 12,
AV_TEXT_H_HERALD_DUN_BALDAR_SOUTH_ATTACK = 13,
AV_TEXT_H_HERALD_DUN_BALDAR_SOUTH_TAKEN = 14,
AV_TEXT_A_HERALD_DUN_BALDAR_SOUTH_ATTACK = 15,
AV_TEXT_A_HERALD_DUN_BALDAR_SOUTH_TAKEN = 16,
AV_TEXT_H_HERALD_DUN_BALDAR_NORTH_ATTACK = 17,
AV_TEXT_H_HERALD_DUN_BALDAR_NORTH_TAKEN = 18,
AV_TEXT_A_HERALD_DUN_BALDAR_NORTH_ATTACK = 19,
AV_TEXT_A_HERALD_DUN_BALDAR_NORTH_TAKEN = 20,
AV_TEXT_H_HERALD_ICEWING_BUNKER_ATTACK = 21,
AV_TEXT_H_HERALD_ICEWING_BUNKER_TAKEN = 22,
AV_TEXT_A_HERALD_ICEWING_BUNKER_ATTACK = 23,
AV_TEXT_A_HERALD_ICEWING_BUNKER_TAKEN = 24,
AV_TEXT_H_HERALD_STONEHEARTH_BUNKER_ATTACK = 25,
AV_TEXT_H_HERALD_STONEHEARTH_BUNKER_TAKEN = 26,
AV_TEXT_A_HERALD_STONEHEARTH_BUNKER_ATTACK = 27,
AV_TEXT_A_HERALD_STONEHEARTH_BUNKER_TAKEN = 28,
AV_TEXT_H_HERALD_WEST_FROSTWOLF_TOWER_ATTACK = 29,
AV_TEXT_H_HERALD_WEST_FROSTWOLF_TOWER_TAKEN = 30,
AV_TEXT_A_HERALD_WEST_FROSTWOLF_TOWER_ATTACK = 31,
AV_TEXT_A_HERALD_WEST_FROSTWOLF_TOWER_TAKEN = 32,
AV_TEXT_H_HERALD_EAST_FROSTWOLF_TOWER_ATTACK = 33,
AV_TEXT_H_HERALD_EAST_FROSTWOLF_TOWER_TAKEN = 34,
AV_TEXT_A_HERALD_EAST_FROSTWOLF_TOWER_ATTACK = 35,
AV_TEXT_A_HERALD_EAST_FROSTWOLF_TOWER_TAKEN = 36,
AV_TEXT_H_HERALD_TOWER_POINT_ATTACK = 37,
AV_TEXT_H_HERALD_TOWER_POINT_TAKEN = 38,
AV_TEXT_A_HERALD_TOWER_POINT_ATTACK = 39,
AV_TEXT_A_HERALD_TOWER_POINT_TAKEN = 40,
AV_TEXT_H_HERALD_ICEBLOOD_TOWER_ATTACK = 41,
AV_TEXT_H_HERALD_ICEBLOOD_TOWER_TAKEN = 42,
AV_TEXT_A_HERALD_ICEBLOOD_TOWER_ATTACK = 43,
AV_TEXT_A_HERALD_ICEBLOOD_TOWER_TAKEN = 44,
AV_TEXT_H_HERALD_STORMPIKE_AID_STATION_TAKEN = 45,
AV_TEXT_H_HERALD_STORMPIKE_AID_STATION_ATTACK = 46,
AV_TEXT_A_HERALD_STORMPIKE_AID_STATION_TAKEN = 47,
@@ -703,13 +703,21 @@ void BattlegroundSA::OverrideGunFaction()
for (uint8 i = BG_SA_GUN_1; i <= BG_SA_GUN_10; i++)
{
if (Creature* gun = GetBGCreature(i))
{
gun->SetFaction(BG_SA_Factions[Attackers ? TEAM_ALLIANCE : TEAM_HORDE]);
// NullCreatureAI never evades and PvE combat refs have no timer,
// so attackers would stay in combat until death after damaging it.
gun->SetIsCombatDisallowed(true);
}
}
for (uint8 i = BG_SA_DEMOLISHER_1; i <= BG_SA_DEMOLISHER_4; i++)
{
if (Creature* dem = GetBGCreature(i))
{
dem->SetFaction(BG_SA_Factions[Attackers]);
dem->SetIsCombatDisallowed(true);
}
}
}
@@ -968,7 +976,10 @@ void BattlegroundSA::CaptureGraveyard(BG_SA_Graveyards i, Player* Source)
BG_SA_NpcSpawnlocs[j][2], BG_SA_NpcSpawnlocs[j][3], 600);
if (Creature* dem = GetBGCreature(j))
{
dem->SetFaction(BG_SA_Factions[Attackers]);
dem->SetIsCombatDisallowed(true);
}
}
UpdateWorldState(WORLD_STATE_BATTLEGROUND_SA_LEFT_GY_ALLIANCE, (GraveyardStatus[i] == TEAM_ALLIANCE ? 1 : 0));
@@ -999,7 +1010,10 @@ void BattlegroundSA::CaptureGraveyard(BG_SA_Graveyards i, Player* Source)
BG_SA_NpcSpawnlocs[j][2], BG_SA_NpcSpawnlocs[j][3], 600);
if (Creature* dem = GetBGCreature(j))
{
dem->SetFaction(BG_SA_Factions[Attackers]);
dem->SetIsCombatDisallowed(true);
}
}
UpdateWorldState(WORLD_STATE_BATTLEGROUND_SA_RIGHT_GY_ALLIANCE, (GraveyardStatus[i] == TEAM_ALLIANCE ? 1 : 0));
+5
View File
@@ -895,6 +895,11 @@ std::string CliHandler::GetAcoreString(uint32 entry) const
return sObjectMgr->GetAcoreStringForDBCLocale(entry);
}
std::string const* CliHandler::GetModuleString(std::string module, uint32 id) const
{
return sObjectMgr->GetModuleString(module, id, LocaleConstant(sObjectMgr->GetDBCLocaleIndex()));
}
void CliHandler::SendSysMessage(std::string_view str, bool /*escapeCharacters*/)
{
m_print(m_callbackArg, str);
+2 -1
View File
@@ -156,7 +156,7 @@ public:
return Acore::StringFormat(GetAcoreString(entry), std::forward<Args>(args)...);
}
std::string const* GetModuleString(std::string module, uint32 id) const;
virtual std::string const* GetModuleString(std::string module, uint32 id) const;
template<typename... Args>
void PSendModuleSysMessage(std::string module, uint32 id, Args&&... args)
@@ -260,6 +260,7 @@ public:
// overwrite functions
std::string GetAcoreString(uint32 entry) const override;
std::string const* GetModuleString(std::string module, uint32 id) const override;
void SendSysMessage(std::string_view, bool escapeCharacters) override;
bool ParseCommands(std::string_view str) override;
std::string GetNameLink() const override;
+21 -7
View File
@@ -1692,18 +1692,32 @@ namespace lfg
LfgGuidList players;
GuidUnorderedSet playersToTeleport;
for (LfgProposalPlayerContainer::const_iterator it = proposal.players.begin(); it != proposal.players.end(); ++it)
{
ObjectGuid guid = it->first;
if (guid == proposal.leader)
players.push_front(guid);
else
players.push_back(guid);
// Sort players by role, leader first, then tank, healer and dps
std::vector<ObjectGuid> tanks, healers, dps;
if (proposal.leader && proposal.players.contains(proposal.leader))
players.push_back(proposal.leader);
for (auto const& [guid, player] : proposal.players)
{
if (proposal.isNew || GetGroup(guid) != proposal.group)
playersToTeleport.insert(guid);
if (guid == proposal.leader)
continue;
if (player.role & lfg::PLAYER_ROLE_TANK)
tanks.push_back(guid);
else if (player.role & lfg::PLAYER_ROLE_HEALER)
healers.push_back(guid);
else
dps.push_back(guid);
}
players.insert(players.end(), tanks.begin(), tanks.end());
players.insert(players.end(), healers.begin(), healers.end());
players.insert(players.end(), dps.begin(), dps.end());
// Set the dungeon difficulty
LFGDungeonData const* dungeon = GetLFGDungeon(proposal.dungeonId);
ASSERT(dungeon);
@@ -5375,6 +5375,7 @@ void Player::SetSkill(uint16 id, uint16 step, uint16 newVal, uint16 maxVal)
RemoveAurasDueToSpell(pAbility->Spell);
}
}
sScriptMgr->OnPlayerSetSkill(this, id, currVal, maxVal, step, newVal);
}
else if (newVal) //add
{
@@ -5421,6 +5422,7 @@ void Player::SetSkill(uint16 id, uint16 step, uint16 newVal, uint16 maxVal)
learnSkillRewardedSpells(id, newVal);
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL, id);
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL, id);
sScriptMgr->OnPlayerSetSkill(this, id, currVal, maxVal, step, newVal);
return;
}
}
@@ -13106,6 +13108,11 @@ PartyResult Player::CanUninviteFromGroup(ObjectGuid targetPlayerGUID) const
if (InBattleground())
return ERR_INVITE_RESTRICTED;
// BF raids are owned by the Battlefield system; leaders/assistants must not
// be able to kick members (would drop their team assignment mid-battle).
if (grp->isBFGroup())
return ERR_NOT_LEADER;
}
return ERR_PARTY_RESULT_OK;
+1
View File
@@ -1668,6 +1668,7 @@ public:
[[nodiscard]] PlayerMails const& GetMails() const { return m_mail; }
void SendItemRetrievalMail(uint32 itemEntry, uint32 count); // Item retrieval mails sent by The Postmaster (34337)
void SendItemRetrievalMail(std::vector<std::pair<uint32, uint32>> mailItems); // Item retrieval mails sent by The Postmaster (34337)
void SendItemRetrievalMail(Item* item); // As above, but for a pre-created item (preserves randomPropertyId)
/*********************************************************/
/*** MAILED ITEMS SYSTEM ***/
@@ -508,3 +508,16 @@ void Player::SendItemRetrievalMail(std::vector<std::pair<uint32, uint32>> mailIt
CharacterDatabase.CommitTransaction(trans);
}
void Player::SendItemRetrievalMail(Item* item)
{
if (!item)
return;
CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
item->SaveToDB(trans);
MailDraft("Recovered Item", "We recovered a lost item in the twisting nether and noted that it was yours.$B$BPlease find said object enclosed.")
.AddItem(item)
.SendMailTo(trans, MailReceiver(this, GetGUID().GetCounter()), MailSender(MAIL_CREATURE, 34337 /* The Postmaster */));
CharacterDatabase.CommitTransaction(trans);
}
@@ -422,6 +422,7 @@ bool Player::CanRewardQuest(Quest const* quest, bool msg)
void Player::AddQuestAndCheckCompletion(Quest const* quest, Object* questGiver)
{
AddQuest(quest, questGiver);
sScriptMgr->OnPlayerQuestAccept(this, quest);
if (CanCompleteQuest(quest->GetQuestId()))
CompleteQuest(quest->GetQuestId());
@@ -33,7 +33,11 @@ enum AnnouncerFlags : uint8
{
ANNOUNCER_FLAG_DISABLE_BG_QUEUE = 1,
ANNOUNCER_FLAG_DISABLE_ARENA_QUEUE = 2,
ANNOUNCER_FLAG_DISABLE_AUTOBROADCAST = 4
ANNOUNCER_FLAG_DISABLE_AUTOBROADCAST = 4,
ANNOUNCER_FLAG_DISABLE_PVP_START = 8,
ANNOUNCER_FLAG_DISABLE_PVP_ALL = ANNOUNCER_FLAG_DISABLE_BG_QUEUE
| ANNOUNCER_FLAG_DISABLE_ARENA_QUEUE
| ANNOUNCER_FLAG_DISABLE_PVP_START
};
struct PlayerSetting
@@ -5400,6 +5400,11 @@ bool Player::LoadFromDB(ObjectGuid playerGuid, CharacterDatabaseQueryHolder cons
uint32 extraflags = fields[36].Get<uint16>();
// Mirror before the gate below so saved bits survive when the gate
// skips effect application; otherwise the next SaveToDB writes 0
// over them.
m_ExtraFlags = extraflags;
_LoadPetStable(fields[37].Get<uint8>(), holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_PET_SLOTS));
m_atLoginFlags = fields[38].Get<uint16>();
@@ -6204,6 +6209,32 @@ Item* Player::_LoadMailedItem(ObjectGuid const& playerGuid, Player* player, uint
return nullptr;
}
// Rehydrate looters for BoP-tradeable mail items; only the LFG mail path writes this flag, gated on the same config.
if (item->IsBOPTradable() && sWorld->getBoolConfig(CONFIG_SET_BOP_ITEM_TRADEABLE))
{
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_ITEM_BOP_TRADE);
stmt->SetData(0, item->GetGUID().GetCounter());
if (PreparedQueryResult result = CharacterDatabase.Query(stmt))
{
AllowedLooterSet looters;
for (std::string_view guidStr : Acore::Tokenize((*result)[0].Get<std::string_view>(), ' ', false))
{
if (Optional<ObjectGuid::LowType> guid = Acore::StringTo<ObjectGuid::LowType>(guidStr))
looters.insert(ObjectGuid::Create<HighGuid::Player>(*guid));
else
LOG_WARN("entities.player.loading", "Player::_LoadMailedItem: invalid item_soulbound_trade_data GUID '{}' for item {}. Skipped.", guidStr, item->GetGUID().ToString());
}
if (looters.size() > 1 && proto->GetMaxStackSize() == 1 && item->IsSoulBound())
item->SetSoulboundTradeable(looters);
else
item->RemoveFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_BOP_TRADEABLE);
}
else
item->RemoveFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_BOP_TRADEABLE);
}
if (mail)
{
mail->AddItem(itemGuid, itemEntry);
+8 -20
View File
@@ -954,6 +954,9 @@ bool Unit::IsImmunedToSpell(SpellInfo const* spellInfo, uint32 effectMask, Unit
for (auto const& [immunitySchoolMask, immunityAuraId] : schoolList)
{
SpellInfo const* immuneSpellInfo = sSpellMgr->GetSpellInfo(immunityAuraId);
if (immunityAuraId == spellInfo->Id)
continue;
if ((immunitySchoolMask & schoolMask) != schoolMask)
continue;
@@ -10087,6 +10090,9 @@ bool Unit::IsImmunedToSpell(SpellInfo const* spellInfo, Spell const* spell)
SpellImmuneContainer const& schoolList = m_spellImmune[IMMUNITY_SCHOOL];
for (auto itr = schoolList.begin(); itr != schoolList.end(); ++itr)
{
if (itr->second == spellInfo->Id)
continue;
SpellInfo const* immuneSpellInfo = sSpellMgr->GetSpellInfo(itr->second);
if (!(itr->first & spellSchoolMask))
continue;
@@ -10618,6 +10624,8 @@ void Unit::Dismount()
if (charm->IsCreature() && !charm->HasUnitState(UNIT_STATE_STUNNED))
charm->RemoveUnitFlag(UNIT_FLAG_STUNNED);
}
UpdateSpeed(MOVE_RUN, true);
}
void Unit::SetImmuneToPC(bool apply, bool keepCombat)
@@ -15313,30 +15321,10 @@ void Unit::SetPhaseMask(uint32 newPhaseMask, bool update)
if (!sScriptMgr->CanSetPhaseMask(this, newPhaseMask, update))
return;
// Phase-related threat updates are done AFTER the phase change below
}
WorldObject::SetPhaseMask(newPhaseMask, false);
// Now update threat online states with the new phase mask applied
if (IsCreature() || (IsPlayer() && !ToPlayer()->IsGameMaster() && !ToPlayer()->GetSession()->PlayerLogout()))
{
// Update online state for units that have me on their threat list
for (auto const& pair : GetThreatMgr().GetThreatenedByMeList())
{
if (ThreatReference* ref = pair.second)
ref->UpdateOffline();
}
// Update online state for units on my threat list
if (!IsPlayer())
{
for (ThreatReference* ref : GetThreatMgr().GetModifiableThreatList())
ref->UpdateOffline();
}
}
if (!IsInWorld())
{
return;
+4 -1
View File
@@ -506,6 +506,9 @@ void Vehicle::RemovePassenger(Unit* unit)
seat->second.Passenger.Reset();
// RemoveCharmedBy() clears MOVEMENTFLAG_FLYING, so cache this before uncharm.
bool wasFlying = _me->IsFlying();
if (_me->IsCreature() && unit->IsPlayer() && seat->second.SeatInfo->m_flags & VEHICLE_SEAT_FLAG_CAN_CONTROL)
_me->RemoveCharmedBy(unit);
@@ -521,7 +524,7 @@ void Vehicle::RemovePassenger(Unit* unit)
}
// only for flyable vehicles
if (_me->IsFlying() && !_me->GetInstanceId() && unit->IsPlayer() && !(unit->ToPlayer()->GetDelayedOperations() & DELAYED_VEHICLE_TELEPORT) && _me->GetEntry() != 30275 /*NPC_WILD_WYRM*/)
if (wasFlying && !_me->GetInstanceId() && unit->IsPlayer() && !(unit->ToPlayer()->GetDelayedOperations() & DELAYED_VEHICLE_TELEPORT) && _me->GetEntry() != 30275 /*NPC_WILD_WYRM*/)
_me->CastSpell(unit, VEHICLE_SPELL_PARACHUTE, true);
if (_me->IsCreature())
+64 -6
View File
@@ -63,6 +63,40 @@ Loot* Roll::getLoot()
return getTarget();
}
static void SendRollWonItemViaMail(Player* player, LootItem const* lootItem, uint32 itemId)
{
Item* mailItem = Item::CreateItem(itemId, lootItem->count, player, false, lootItem->randomPropertyId);
if (!mailItem)
return;
AllowedLooterSet looters = lootItem->GetAllowedLooters();
ItemTemplate const* proto = mailItem->GetTemplate();
// Preserve the 2-hour group trade window the item would have had if stored directly.
if (looters.size() > 1 && proto->GetMaxStackSize() == 1 &&
(proto->Bonding == BIND_WHEN_PICKED_UP || proto->Bonding == BIND_QUEST_ITEM) &&
sWorld->getBoolConfig(CONFIG_SET_BOP_ITEM_TRADEABLE))
{
mailItem->SetBinding(true);
mailItem->SetSoulboundTradeable(looters);
mailItem->SetUInt32Value(ITEM_FIELD_CREATE_PLAYED_TIME, player->GetTotalPlayedTime());
std::string lootersStr;
for (ObjectGuid const& guid : looters)
{
if (!lootersStr.empty())
lootersStr += ' ';
lootersStr += std::to_string(guid.GetCounter());
}
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_ITEM_BOP_TRADE);
stmt->SetData(0, mailItem->GetGUID().GetCounter());
stmt->SetData(1, lootersStr);
CharacterDatabase.Execute(stmt);
}
player->SendItemRetrievalMail(mailItem);
}
Group::Group() : m_leaderName(""), m_groupType(GROUPTYPE_NORMAL),
m_dungeonDifficulty(DUNGEON_DIFFICULTY_NORMAL), m_raidDifficulty(RAID_DIFFICULTY_10MAN_NORMAL),
m_bfGroup(nullptr), m_bgGroup(nullptr), m_lootMethod(FREE_FOR_ALL), m_lootThreshold(ITEM_QUALITY_UNCOMMON),
@@ -1490,9 +1524,21 @@ void Group::CountTheRoll(Rolls::iterator rollI, Map* allowedMap)
}
else
{
item->is_blocked = false;
item->rollWinnerGUID = player->GetGUID();
player->SendEquipError(msg, nullptr, nullptr, roll->itemid);
uint32 mailOnFull = sWorld->getIntConfig(CONFIG_LFG_MAIL_ITEM_ON_FULL_INVENTORY);
if (mailOnFull == MAIL_ITEM_ON_FULL_INVENTORY_EVERYWHERE || (mailOnFull == MAIL_ITEM_ON_FULL_INVENTORY_LFG_ONLY && isLFGGroup()))
{
item->is_looted = true;
roll->getLoot()->NotifyItemRemoved(roll->itemSlot);
roll->getLoot()->unlootedCount--;
player->SendEquipError(msg, nullptr, nullptr, roll->itemid);
SendRollWonItemViaMail(player, item, roll->itemid);
}
else
{
item->is_blocked = false;
item->rollWinnerGUID = player->GetGUID();
player->SendEquipError(msg, nullptr, nullptr, roll->itemid);
}
}
}
}
@@ -1560,9 +1606,21 @@ void Group::CountTheRoll(Rolls::iterator rollI, Map* allowedMap)
}
else
{
item->is_blocked = false;
item->rollWinnerGUID = player->GetGUID();
player->SendEquipError(msg, nullptr, nullptr, roll->itemid);
uint32 mailOnFull = sWorld->getIntConfig(CONFIG_LFG_MAIL_ITEM_ON_FULL_INVENTORY);
if (mailOnFull == MAIL_ITEM_ON_FULL_INVENTORY_EVERYWHERE || (mailOnFull == MAIL_ITEM_ON_FULL_INVENTORY_LFG_ONLY && isLFGGroup()))
{
item->is_looted = true;
roll->getLoot()->NotifyItemRemoved(roll->itemSlot);
roll->getLoot()->unlootedCount--;
player->SendEquipError(msg, nullptr, nullptr, roll->itemid);
SendRollWonItemViaMail(player, item, roll->itemid);
}
else
{
item->is_blocked = false;
item->rollWinnerGUID = player->GetGUID();
player->SendEquipError(msg, nullptr, nullptr, roll->itemid);
}
}
}
else if (rollvote == DISENCHANT)
+7
View File
@@ -128,6 +128,13 @@ enum lfgGroupFlags
GROUP_LFG_FLAG_IS_HEROIC = 0x004
};
enum MailItemOnFullInventory
{
MAIL_ITEM_ON_FULL_INVENTORY_DISABLED = 0,
MAIL_ITEM_ON_FULL_INVENTORY_LFG_ONLY = 1,
MAIL_ITEM_ON_FULL_INVENTORY_EVERYWHERE = 2,
};
enum DifficultyPreventionChangeType
{
DIFFICULTY_PREVENTION_CHANGE_NONE = 0,
+10
View File
@@ -126,6 +126,16 @@ void WorldSession::HandleGroupInviteOpcode(WorldPacket& recvData)
return;
}
// Battlefield raids (e.g. Wintergrasp) have their composition managed by the BF
// system based on queue and team balance. Letting raid members recruit outsiders
// bypasses Battlefield::AddOrSetPlayerToCorrectBfGroup, which on WG entry then
// refuses to add the invitee because they are already in a BF group.
if (Group* invitingGroup = invitingPlayer->GetGroup(); invitingGroup && invitingGroup->isBFGroup())
{
SendPartyResult(PARTY_OP_INVITE, membername, ERR_NOT_LEADER);
return;
}
Group* group = invitingPlayer->GetGroup();
if (group && group->isBGGroup())
group = invitingPlayer->GetOriginalGroup();
+24 -4
View File
@@ -569,12 +569,32 @@ void WorldSession::SendLfgUpdateProposal(lfg::LfgProposal const& proposal)
data << uint8(silent); // Show proposal window
data << uint8(proposal.players.size()); // Group size
for (lfg::LfgProposalPlayerContainer::const_iterator it = proposal.players.begin(); it != proposal.players.end(); ++it)
// Sort by roles: tank, healer, dps
std::vector<ObjectGuid> ordered;
ordered.reserve(proposal.players.size());
std::vector<ObjectGuid> tanks, healers, dps;
for (auto const& [pguid, player] : proposal.players)
{
lfg::LfgProposalPlayer const& player = it->second;
if (player.role & lfg::PLAYER_ROLE_TANK)
tanks.push_back(pguid);
else if (player.role & lfg::PLAYER_ROLE_HEALER)
healers.push_back(pguid);
else
dps.push_back(pguid);
}
ordered.insert(ordered.end(), tanks.begin(), tanks.end());
ordered.insert(ordered.end(), healers.begin(), healers.end());
ordered.insert(ordered.end(), dps.begin(), dps.end());
for (auto const& pguid : ordered)
{
lfg::LfgProposalPlayer const& player = proposal.players.find(pguid)->second;
data << uint32(player.role); // Role
data << uint8(it->first == guid); // Self player
if (!player.group) // Player not it a group
data << uint8(pguid == guid); // Self player
if (!player.group) // Player not in a group
{
data << uint8(0); // Not in dungeon
data << uint8(0); // Not same group
+20 -10
View File
@@ -2717,12 +2717,18 @@ void Map::ProcessRespawns()
void Map::ProcessCreatureRespawn(ObjectGuid::LowType spawnId)
{
// Pool members are handled entirely by PoolMgr
if (uint32 poolId = sPoolMgr->IsPartOfAPool<Creature>(spawnId))
// Pool members in non-instanced maps are handled entirely by PoolMgr.
// In instanced maps the pool system operates globally and Spawn1Object is
// a no-op for instanceable maps, so fall through to the normal per-instance
// respawn logic instead.
if (!Instanceable())
{
sPoolMgr->UpdatePool<Creature>(poolId, spawnId);
RemoveCreatureRespawnTime(spawnId);
return;
if (uint32 poolId = sPoolMgr->IsPartOfAPool<Creature>(spawnId))
{
sPoolMgr->UpdatePool<Creature>(poolId, spawnId);
RemoveCreatureRespawnTime(spawnId);
return;
}
}
CreatureData const* data = sObjectMgr->GetCreatureData(spawnId);
@@ -2778,12 +2784,16 @@ void Map::ProcessCreatureRespawn(ObjectGuid::LowType spawnId)
void Map::ProcessGameObjectRespawn(ObjectGuid::LowType spawnId)
{
// Pool members are handled entirely by PoolMgr
if (uint32 poolId = sPoolMgr->IsPartOfAPool<GameObject>(spawnId))
// Same rationale as ProcessCreatureRespawn: pool management via PoolMgr is
// only meaningful for non-instanced maps where Spawn1Object actually spawns.
if (!Instanceable())
{
sPoolMgr->UpdatePool<GameObject>(poolId, spawnId);
RemoveGORespawnTime(spawnId);
return;
if (uint32 poolId = sPoolMgr->IsPartOfAPool<GameObject>(spawnId))
{
sPoolMgr->UpdatePool<GameObject>(poolId, spawnId);
RemoveGORespawnTime(spawnId);
return;
}
}
GameObjectData const* data = sObjectMgr->GetGameObjectData(spawnId);
+24 -1
View File
@@ -1489,6 +1489,29 @@ enum AcoreStrings
LANG_PET_DELETE_NOT_FOUND = 35438,
LANG_PET_DELETE_SUCCESS = 35439,
LANG_CHARACTER_DELETED_LIST_LIMIT = 35440
LANG_CHARACTER_DELETED_LIST_LIMIT = 35440,
// Respawn creature/gameobject by spawn GUID commands
LANG_RESPAWN_GUID_CREATURE_NOT_FOUND = 35441,
LANG_RESPAWN_GUID_MAP_NOT_LOADED = 35442,
LANG_RESPAWN_GUID_CREATURE_ALIVE = 35443,
LANG_RESPAWN_GUID_CREATURE_QUEUED = 35444,
LANG_RESPAWN_GUID_GAMEOBJECT_ACTIVE = 35445,
LANG_RESPAWN_GUID_GAMEOBJECT_QUEUED = 35446,
// 35447 is reserved for LANG_LIST_RESPAWNS_NO_MAP (list respawns command, defined at the end of this enum)
LANG_RESPAWN_GUID_GAMEOBJECT_NOT_FOUND = 35448,
// Respawn creature/gameobject by entry commands
LANG_RESPAWN_ENTRY_CREATURE_NOT_FOUND = 35449,
LANG_RESPAWN_ENTRY_GAMEOBJECT_NOT_FOUND = 35450,
LANG_RESPAWN_ENTRY_CREATURE_QUEUED = 35451,
LANG_RESPAWN_ENTRY_GAMEOBJECT_QUEUED = 35452,
// List respawns console support
LANG_LIST_RESPAWNS_NO_MAP = 35447,
// Pet rename command
LANG_PET_RENAME_INVALID = 35453,
LANG_PET_RENAME_SUCCESS = 35454
};
#endif
@@ -49,6 +49,11 @@ void ScriptMgr::OnBattlefieldWarEnd(Battlefield* bf, bool endByTimer)
CALL_ENABLED_HOOKS(BattlefieldScript, BATTLEFIELDHOOK_ON_WAR_END, script->OnBattlefieldWarEnd(bf, endByTimer));
}
void ScriptMgr::OnBattlefieldPlayerKill(Battlefield* bf, Player* killer, Player* victim)
{
CALL_ENABLED_HOOKS(BattlefieldScript, BATTLEFIELDHOOK_ON_PLAYER_KILL, script->OnBattlefieldPlayerKill(bf, killer, victim));
}
BattlefieldScript::BattlefieldScript(char const* name, std::vector<uint16> enabledHooks) :
ScriptObject(name, BATTLEFIELDHOOK_END)
{
@@ -28,7 +28,8 @@ enum BattlefieldHook
BATTLEFIELDHOOK_ON_PLAYER_JOIN_WAR, // 2 - fires after player is added to the active war
BATTLEFIELDHOOK_ON_PLAYER_LEAVE_WAR, // 3 - fires after player is removed from the active war
BATTLEFIELDHOOK_BEFORE_INVITE_PLAYER_TO_WAR, // 4 - fires in InvitePlayerToWar before InvitedPlayers insert
BATTLEFIELDHOOK_ON_WAR_END, // 5 - fires in EndBattle after OnBattleEnd(), before timer reset
BATTLEFIELDHOOK_ON_WAR_END, // 5 - fires in EndBattle before OnBattleEnd(), while PlayersInWar is still populated
BATTLEFIELDHOOK_ON_PLAYER_KILL, // 6 - fires in HandleKill for every player-kills-player event
BATTLEFIELDHOOK_END
};
@@ -99,6 +100,17 @@ public:
* @param endByTimer True if the war ended by the countdown timer expiring
*/
virtual void OnBattlefieldWarEnd(Battlefield* /*bf*/, bool /*endByTimer*/) { }
/**
* @brief Called inside BattlefieldWG::HandleKill for every player-kills-player event,
* regardless of the victim's WG rank. Fired before the core's own lieutenant-gated
* quest-credit loop so modules may grant credit for non-lieutenant kills.
*
* @param bf The Battlefield instance
* @param killer The player who landed the killing blow
* @param victim The player who was killed
*/
virtual void OnBattlefieldPlayerKill(Battlefield* /*bf*/, Player* /*killer*/, Player* /*victim*/) { }
};
#endif // SCRIPT_OBJECT_BATTLEFIELD_SCRIPT_H_
@@ -852,6 +852,11 @@ void ScriptMgr::OnPlayerQuestAbandon(Player* player, uint32 questId)
CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_QUEST_ABANDON, script->OnPlayerQuestAbandon(player, questId));
}
void ScriptMgr::OnPlayerQuestAccept(Player* player, Quest const* quest)
{
CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_PLAYER_QUEST_ACCEPT, script->OnPlayerQuestAccept(player, quest));
}
// Player anti cheat
void ScriptMgr::AnticheatSetCanFlybyServer(Player* player, bool apply)
{
@@ -903,6 +908,11 @@ void ScriptMgr::OnPlayerUpdateSkill(Player* player, uint32 skillId, uint32 value
CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_UPDATE_SKILL, script->OnPlayerUpdateSkill(player, skillId, value, max, step, newValue));
}
void ScriptMgr::OnPlayerSetSkill(Player* player, uint32 skillId, uint32 value, uint32 max, uint32 step, uint32 newValue)
{
CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_SET_SKILL, script->OnPlayerSetSkill(player, skillId, value, max, step, newValue));
}
bool ScriptMgr::OnPlayerCanResurrect(Player* player)
{
CALL_ENABLED_BOOLEAN_HOOKS(PlayerScript, PLAYERHOOK_CAN_RESURRECT, !script->OnPlayerCanResurrect(player));
@@ -190,6 +190,7 @@ enum PlayerHook
PLAYERHOOK_ON_PLAYER_ENTER_COMBAT,
PLAYERHOOK_ON_PLAYER_LEAVE_COMBAT,
PLAYERHOOK_ON_QUEST_ABANDON,
PLAYERHOOK_ON_PLAYER_QUEST_ACCEPT,
PLAYERHOOK_ON_GET_QUEST_RATE,
PLAYERHOOK_ON_CAN_PLAYER_FLY_IN_ZONE,
PLAYERHOOK_ANTICHEAT_SET_CAN_FLY_BY_SERVER,
@@ -205,6 +206,7 @@ enum PlayerHook
PLAYERHOOK_ON_CAN_UPDATE_SKILL,
PLAYERHOOK_ON_BEFORE_UPDATE_SKILL,
PLAYERHOOK_ON_UPDATE_SKILL,
PLAYERHOOK_ON_SET_SKILL,
PLAYERHOOK_CAN_RESURRECT,
PLAYERHOOK_ON_CAN_GIVE_LEVEL,
PLAYERHOOK_ON_SEND_LIST_INVENTORY,
@@ -730,6 +732,14 @@ public:
*/
virtual void OnPlayerQuestAbandon(Player* /*player*/, uint32 /*questId*/) { }
/**
* @brief This hook called after a player accepts a quest, regardless of quest giver type
*
* @param player Contains information about the Player
* @param quest Contains information about the Quest
*/
virtual void OnPlayerQuestAccept(Player* /*player*/, Quest const* /*quest*/) { }
/**
* @brief This hook called before other CanFlyChecks are applied
*
@@ -776,6 +786,7 @@ public:
virtual bool OnPlayerCanUpdateSkill(Player* /*player*/, uint32 /*skillId*/) { return true; }
virtual void OnPlayerBeforeUpdateSkill(Player* /*player*/, uint32 /*skillId*/, uint32& /*value*/, uint32 /*max*/, uint32 /*step*/) { }
virtual void OnPlayerUpdateSkill(Player* /*player*/, uint32 /*skillId*/, uint32 /*value*/, uint32 /*max*/, uint32 /*step*/, uint32 /*newValue*/) { }
virtual void OnPlayerSetSkill(Player* /*player*/, uint32 /*skillId*/, uint32 /*value*/, uint32 /*max*/, uint32 /*step*/, uint32 /*newValue*/) { }
/**
* @brief This hook is called, to avoid player resurrect
+3
View File
@@ -454,6 +454,7 @@ public: /* PlayerScript */
void OnPlayerEnterCombat(Player* player, Unit* enemy);
void OnPlayerLeaveCombat(Player* player);
void OnPlayerQuestAbandon(Player* player, uint32 questId);
void OnPlayerQuestAccept(Player* player, Quest const* quest);
bool OnPlayerCanSendErrorAlreadyLooted(Player* player);
void OnPlayerAfterCreatureLoot(Player* player);
void OnPlayerAfterCreatureLootMoney(Player* player);
@@ -461,6 +462,7 @@ public: /* PlayerScript */
bool OnPlayerCanUpdateSkill(Player* player, uint32 skillId);
void OnPlayerBeforeUpdateSkill(Player* player, uint32 skill_id, uint32& value, uint32 max, uint32 step);
void OnPlayerUpdateSkill(Player* player, uint32 skillId, uint32 value, uint32 max, uint32 step, uint32 newValue);
void OnPlayerSetSkill(Player* player, uint32 skillId, uint32 value, uint32 max, uint32 step, uint32 newValue);
bool OnPlayerCanResurrect(Player* player);
bool OnPlayerCanGiveLevel(Player* player, uint8 newLevel);
void OnPlayerSendListInventory(Player* player, ObjectGuid vendorGuid, uint32& vendorEntry);
@@ -588,6 +590,7 @@ public: /* BattlefieldScript */
void OnBattlefieldPlayerLeaveWar(Battlefield* bf, Player* player);
void OnBattlefieldBeforeInvitePlayerToWar(Battlefield* bf, Player* player);
void OnBattlefieldWarEnd(Battlefield* bf, bool endByTimer);
void OnBattlefieldPlayerKill(Battlefield* bf, Player* killer, Player* victim);
public: /* BGScript */
void OnBattlegroundStart(Battleground* bg);
@@ -5344,13 +5344,10 @@ void AuraEffect::HandleAuraDummy(AuraApplication const* aurApp, uint8 mode, bool
{
case 2584: // Waiting to Resurrect
// Waiting to resurrect spell cancel, we must remove player from resurrect queue
// bf branch omitted: it would cascade back into this handler.
if (target->IsPlayer())
{
if (Battleground* bg = target->ToPlayer()->GetBattleground())
bg->RemovePlayerFromResurrectQueue(target->ToPlayer());
if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(target->GetZoneId()))
bf->RemovePlayerFromResurrectQueue(target->GetGUID());
}
break;
case 43681: // Inactive
{
+24 -4
View File
@@ -52,6 +52,7 @@
#include "World.h"
#include "WorldPacket.h"
#include <cmath>
#include <G3D/g3dmath.h>
/// @todo: this import is not necessary for compilation and marked as unused by the IDE
// however, for some reasons removing it would cause a damn linking issue
@@ -1225,9 +1226,28 @@ void Spell::SelectImplicitConeTargets(SpellEffIndex effIndex, SpellImplicitTarge
SpellTargetObjectTypes objectType = targetType.GetObjectType();
SpellTargetCheckTypes selectionType = targetType.GetCheckType();
ConditionList* condList = m_spellInfo->Effects[effIndex].ImplicitTargetConditions;
float coneAngle = M_PI / 2;
float radius = m_spellInfo->Effects[effIndex].CalcRadius(m_caster) * m_spellValue->RadiusMod;
float coneAngle = G3D::toRadians(60.0f);
if (SpellCone const* sc = sSpellMgr->GetSpellCone(m_spellInfo->Id))
coneAngle = G3D::toRadians(static_cast<float>(sc->cone_degrees));
else
{
switch (targetType.GetTarget())
{
case TARGET_UNIT_CONE_ENEMY_24:
coneAngle = G3D::toRadians(24.0f);
break;
case TARGET_UNIT_CONE_ENEMY_54:
coneAngle = G3D::toRadians(54.0f);
break;
case TARGET_UNIT_CONE_ENEMY_104:
coneAngle = G3D::toRadians(104.0f);
break;
default:
break;
}
}
float radius = m_spellInfo->Effects[effIndex].CalcRadius(m_caster) * m_spellValue->RadiusMod;
if (uint32 containerTypeMask = GetSearcherTypeMask(objectType, condList))
{
Acore::WorldObjectSpellConeTargetCheck check(coneAngle, radius, m_caster, m_spellInfo, selectionType, condList);
@@ -2111,8 +2131,8 @@ void Spell::SearchChainTargets(std::list<WorldObject*>& targets, uint32 chainTar
jumpRadius = 7.5f;
break;
case SPELL_DAMAGE_CLASS_MELEE:
// 5y for swipe, cleave and similar
jumpRadius = 5.0f;
// 10y for swipe, cleave and similar
jumpRadius = 10.0f;
break;
case SPELL_DAMAGE_CLASS_NONE:
case SPELL_DAMAGE_CLASS_MAGIC:
@@ -562,11 +562,15 @@ void SpellMgr::LoadSpellInfoCorrections()
20184, // Judgement of Justice
20185, // Judgement of Light
20186, // Judgement of Wisdom
20267, // Judgement of Light (triggered heal on attacker)
20268, // Judgement of Wisdom (triggered mana on attacker)
68055 // Judgements of the Just
}, [](SpellInfo* spellInfo)
{
// hack for seal of light and few spells, judgement consists of few single casts and each of them can proc
// some spell, base one has disabled proc flag but those dont have this flag
// 20267/20268 are passive proc effects from the judgement debuff; they must not cause the paladin's
// on-heal/on-cast procs (e.g. Soul Preserver, which has CAN_PROC_FROM_PROCS) to fire
spellInfo->AttributesEx3 |= SPELL_ATTR3_SUPPRESS_CASTER_PROCS;
});
@@ -1523,7 +1527,7 @@ void SpellMgr::LoadSpellInfoCorrections()
spellInfo->Speed = 8.0f;
});
// Spell Absorption
// Shadowmoon Reaver - Spell Absorption
ApplySpellFix({ 41034 }, [](SpellInfo* spellInfo)
{
spellInfo->Effects[EFFECT_2].Effect = SPELL_EFFECT_APPLY_AURA;
@@ -1532,12 +1536,13 @@ void SpellMgr::LoadSpellInfoCorrections()
spellInfo->Effects[EFFECT_2].MiscValue = SPELL_SCHOOL_MASK_MAGIC;
});
// Shared Bonds
// Priestess of Delight and Priestess of Torment - Shared Bonds
ApplySpellFix({ 41363 }, [](SpellInfo* spellInfo)
{
spellInfo->AttributesEx &= ~SPELL_ATTR1_IS_CHANNELED;
});
// Illidari Council - Veras Darkshadow
ApplySpellFix({
41485, // Deadly Poison
41487 // Envenom
@@ -1566,13 +1571,13 @@ void SpellMgr::LoadSpellInfoCorrections()
spellInfo->RangeEntry = sSpellRangeStore.LookupEntry(13); // 0-50000yd
});
// Watery Grave Explosion
// Morogrim Tidewalker - Watery Grave Explosion
ApplySpellFix({ 37852 }, [](SpellInfo* spellInfo)
{
spellInfo->AttributesEx5 |= SPELL_ATTR5_ALLOW_WHILE_STUNNED;
});
// Amplify Damage
// Prince Malchezaar - Amplify Damage
ApplySpellFix({ 39095 }, [](SpellInfo* spellInfo)
{
spellInfo->MaxAffectedTargets = 1;
@@ -1585,6 +1590,7 @@ void SpellMgr::LoadSpellInfoCorrections()
spellInfo->AttributesCu |= SPELL_ATTR0_CU_SINGLE_AURA_STACK;
});
// Archimonde
ApplySpellFix({
31984, // Finger of Death
35354 // Hand of Death
@@ -1594,12 +1600,18 @@ void SpellMgr::LoadSpellInfoCorrections()
spellInfo->Attributes = SPELL_ATTR0_IS_ABILITY;
});
// Finger of Death
// Archimonde - Finger of Death
ApplySpellFix({ 32111 }, [](SpellInfo* spellInfo)
{
spellInfo->CastTimeEntry = sSpellCastTimesStore.LookupEntry(0); // We only need the animation, no damage
});
// Archimonde - Doomfire
ApplySpellFix({ 31944, 31969 }, [](SpellInfo* spellInfo)
{
spellInfo->AttributesEx4 |= SPELL_ATTR4_NO_CAST_LOG;
});
// Flame Breath, catapult spell
ApplySpellFix({ 50989 }, [](SpellInfo* spellInfo)
{
@@ -5195,6 +5207,13 @@ void SpellMgr::LoadSpellInfoCorrections()
spellInfo->Effects[EFFECT_0].BasePoints = 1;
});
// 26025 Impale
ApplySpellFix({ 26025 }, [](SpellInfo* spellInfo)
{
spellInfo->Effects[EFFECT_1].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_CONE_ENEMY_54);
spellInfo->Effects[EFFECT_1].TargetB = SpellImplicitTargetInfo(0);
});
for (uint32 i = 0; i < GetSpellInfoStoreSize(); ++i)
{
SpellInfo* spellInfo = mSpellInfoMap[i];
+100 -1
View File
@@ -695,6 +695,16 @@ SpellTargetPosition const* SpellMgr::GetSpellTargetPosition(uint32 spell_id, Spe
return nullptr;
}
SpellCone const* SpellMgr::GetSpellCone(uint32 spell_id) const
{
spell_id = GetFirstSpellInChain(spell_id);
auto itr = mSpellCones.find(spell_id);
if (itr != mSpellCones.end())
return &itr->second;
return nullptr;
}
SpellSpellGroupMapBounds SpellMgr::GetSpellSpellGroupMapBounds(uint32 spell_id) const
{
spell_id = GetFirstSpellInChain(spell_id);
@@ -1101,7 +1111,9 @@ bool SpellArea::IsFitToRequirements(Player const* player, uint32 newZone, uint32
return false;
Battlefield* Bf = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG);
if (!Bf || player->GetTeamId() != Bf->GetDefenderTeam() || Bf->IsWarTime())
if (!Bf || Bf->IsWarTime())
return false;
if (!sWorld->getBoolConfig(CONFIG_WINTERGRASP_ESSENCE_BOTH_FACTIONS) && player->GetTeamId() != Bf->GetDefenderTeam())
return false;
break;
}
@@ -1578,6 +1590,93 @@ void SpellMgr::LoadSpellTargetPositions()
LOG_INFO("server.loading", " ");
}
void SpellMgr::LoadSpellCones()
{
uint32 oldMSTime = getMSTime();
mSpellCones.clear(); // need for reload case
// 0 1
QueryResult result = WorldDatabase.Query("SELECT ID, ConeDegrees FROM spell_cone");
if (!result)
{
LOG_WARN("server.loading", ">> Loaded 0 spell cone definitions. DB table `spell_cone` is empty.");
LOG_INFO("server.loading", " ");
return;
}
uint32 count = 0;
do
{
Field* fields = result->Fetch();
uint32 spellId = fields[0].Get<uint32>();
int16 coneDeg = fields[1].Get<int16>();
SpellInfo const* spellInfo = GetSpellInfo(spellId);
if (!spellInfo)
{
LOG_ERROR("sql.sql", "Spell (ID:{}) listed in `spell_cone` does not exist.", spellId);
continue;
}
if (coneDeg < -360 || coneDeg > 360)
{
LOG_ERROR("sql.sql", "Spell (Id: {}) cone degrees {} out of range (-360..360).", spellId, coneDeg);
continue;
}
uint32 firstRankId = GetFirstSpellInChain(spellId);
SpellInfo const* firstSpellInfo = GetSpellInfo(firstRankId);
SpellInfo const* checkInfo = firstSpellInfo ? firstSpellInfo : spellInfo;
bool hasCone = false;
for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
{
if (checkInfo->Effects[i].TargetA.GetSelectionCategory() == TARGET_SELECT_CATEGORY_CONE ||
checkInfo->Effects[i].TargetB.GetSelectionCategory() == TARGET_SELECT_CATEGORY_CONE)
{
hasCone = true;
break;
}
}
if (!hasCone)
{
LOG_ERROR("sql.sql", "Spell (ID:{}) listed in `spell_cone` does not have a cone implicit target.", spellId);
continue;
}
if (firstRankId != spellId)
LOG_INFO("server.loading", "Spell (ID:{}) listed in `spell_cone` is not first rank; mapping to first rank {}.", spellId, firstRankId);
SpellCone sc{};
sc.cone_degrees = coneDeg;
// Avoid overwriting an existing first-rank entry with conflicting values
auto itr = mSpellCones.find(firstRankId);
if (itr != mSpellCones.end())
{
if (itr->second.cone_degrees != sc.cone_degrees)
LOG_ERROR("sql.sql",
"Conflicting `spell_cone` entries for first-rank spell ID {}: {} vs {}. Keeping first value.",
firstRankId,
itr->second.cone_degrees,
sc.cone_degrees);
}
else
{
mSpellCones[firstRankId] = sc;
++count;
}
} while (result->NextRow());
LOG_INFO("server.loading", ">> Loaded {} Spell Cone definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
LOG_INFO("server.loading", " ");
}
void SpellMgr::LoadSpellGroups()
{
uint32 oldMSTime = getMSTime();
+10
View File
@@ -393,6 +393,13 @@ struct SpellTargetPosition
typedef std::map<std::pair<uint32 /*spell_id*/, SpellEffIndex /*effIndex*/>, SpellTargetPosition> SpellTargetPositionMap;
struct SpellCone
{
int16_t cone_degrees;
};
typedef std::map<uint32 /*spell_id*/, SpellCone> SpellConeMap;
// Enum with EffectRadiusIndex and their actual radius
enum EffectRadiusIndex
{
@@ -683,6 +690,7 @@ public:
// Spell target coordinates
[[nodiscard]] SpellTargetPosition const* GetSpellTargetPosition(uint32 spell_id, SpellEffIndex effIndex) const;
[[nodiscard]] SpellCone const* GetSpellCone(uint32 spell_id) const;
// Spell Groups table
SpellSpellGroupMapBounds GetSpellSpellGroupMapBounds(uint32 spell_id) const;
@@ -775,6 +783,7 @@ public:
void LoadSpellRequired();
void LoadSpellLearnSkills();
void LoadSpellTargetPositions();
void LoadSpellCones();
void LoadSpellGroups();
void LoadSpellGroupStackRules();
void LoadSpellProcs();
@@ -807,6 +816,7 @@ private:
SpellRequiredMap mSpellReq;
SpellLearnSkillMap mSpellLearnSkills;
SpellTargetPositionMap mSpellTargetPositions;
SpellConeMap mSpellCones;
SpellSpellGroupMap mSpellSpellGroup;
SpellGroupSpellMap mSpellGroupSpell;
SpellGroupStackMap mSpellGroupStack;
+3
View File
@@ -682,6 +682,9 @@ void World::SetInitialWorldSettings()
LOG_INFO("server.loading", "Loading Spell Target Coordinates...");
sSpellMgr->LoadSpellTargetPositions();
LOG_INFO("server.loading", "Loading Spell Cone definitions...");
sSpellMgr->LoadSpellCones();
LOG_INFO("server.loading", "Loading Enchant Custom Attributes...");
sSpellMgr->LoadEnchantCustomAttr();
+4
View File
@@ -494,6 +494,8 @@ void WorldConfig::BuildConfigCache()
SetConfigValue<bool>(CONFIG_ALLOW_JOIN_BG_AND_LFG, "JoinBGAndLFG.Enable", false);
SetConfigValue<uint32>(CONFIG_LFG_MAIL_ITEM_ON_FULL_INVENTORY, "LFG.MailItemOnFullInventory", 0);
SetConfigValue<bool>(CONFIG_LEAVE_GROUP_ON_LOGOUT, "LeaveGroupOnLogout.Enabled", false);
SetConfigValue<uint32>(CONFIG_RANDOM_ROLL_MAXIMUM, "Group.RandomRollMaximum", 1000000);
@@ -593,6 +595,8 @@ void WorldConfig::BuildConfigCache()
SetConfigValue<uint32>(CONFIG_WINTERGRASP_RESTART_AFTER_CRASH, "Wintergrasp.CrashRestartTimer", 10);
SetConfigValue<uint32>(CONFIG_WINTERGRASP_SKIP_BATTLE_SESSION_COUNT, "Wintergrasp.SkipBattleSessionCount", 3500);
SetConfigValue<bool>(CONFIG_WINTERGRASP_KICK_VOA_PLAYERS, "Wintergrasp.KickVoAPlayers", true, ConfigValueCache::Reloadable::No);
SetConfigValue<bool>(CONFIG_WINTERGRASP_ESSENCE_BOTH_FACTIONS, "Wintergrasp.EssenceBothFactions", false);
SetConfigValue<uint32>(CONFIG_BIRTHDAY_TIME, "BirthdayTime", 1222964635);
SetConfigValue<bool>(CONFIG_MINIGOB_MANABONK, "Minigob.Manabonk.Enable", true);
+3
View File
@@ -326,6 +326,8 @@ enum ServerConfigs
CONFIG_WINTERGRASP_NOBATTLETIME,
CONFIG_WINTERGRASP_RESTART_AFTER_CRASH,
CONFIG_WINTERGRASP_SKIP_BATTLE_SESSION_COUNT,
CONFIG_WINTERGRASP_KICK_VOA_PLAYERS,
CONFIG_WINTERGRASP_ESSENCE_BOTH_FACTIONS,
CONFIG_PACKET_SPOOF_BANMODE,
CONFIG_PACKET_SPOOF_BANDURATION,
CONFIG_WARDEN_CLIENT_RESPONSE_DELAY,
@@ -375,6 +377,7 @@ enum ServerConfigs
CONFIG_LOOT_NEED_BEFORE_GREED_ILVL_RESTRICTION,
CONFIG_LFG_MAX_KICK_COUNT,
CONFIG_LFG_KICK_PREVENTION_TIMER,
CONFIG_LFG_MAIL_ITEM_ON_FULL_INVENTORY,
CONFIG_CHANGE_FACTION_MAX_MONEY,
CONFIG_WATER_BREATH_TIMER,
CONFIG_DAILY_RBG_MIN_LEVEL_AP_REWARD,
+13 -6
View File
@@ -49,8 +49,9 @@ public:
return commandTable;
}
static bool HandleBattlefieldStart(ChatHandler* handler, uint32 battleId)
static bool HandleBattlefieldStart(ChatHandler* handler, Optional<uint32> battleIdArg)
{
uint32 const battleId = battleIdArg.value_or(BATTLEFIELD_BATTLEID_WG);
Battlefield* bf = sBattlefieldMgr->GetBattlefieldByBattleId(battleId);
if (!bf)
@@ -67,8 +68,9 @@ public:
return true;
}
static bool HandleBattlefieldEnd(ChatHandler* handler, uint32 battleId)
static bool HandleBattlefieldEnd(ChatHandler* handler, Optional<uint32> battleIdArg)
{
uint32 const battleId = battleIdArg.value_or(BATTLEFIELD_BATTLEID_WG);
Battlefield* bf = sBattlefieldMgr->GetBattlefieldByBattleId(battleId);
if (!bf)
@@ -85,8 +87,9 @@ public:
return true;
}
static bool HandleBattlefieldEnable(ChatHandler* handler, uint32 battleId)
static bool HandleBattlefieldEnable(ChatHandler* handler, Optional<uint32> battleIdArg)
{
uint32 const battleId = battleIdArg.value_or(BATTLEFIELD_BATTLEID_WG);
Battlefield* bf = sBattlefieldMgr->GetBattlefieldByBattleId(battleId);
if (!bf)
@@ -113,8 +116,9 @@ public:
return true;
}
static bool HandleBattlefieldSwitch(ChatHandler* handler, uint32 battleId)
static bool HandleBattlefieldSwitch(ChatHandler* handler, Optional<uint32> battleIdArg)
{
uint32 const battleId = battleIdArg.value_or(BATTLEFIELD_BATTLEID_WG);
Battlefield* bf = sBattlefieldMgr->GetBattlefieldByBattleId(battleId);
if (!bf)
@@ -131,13 +135,15 @@ public:
return true;
}
static bool HandleBattlefieldTimer(ChatHandler* handler, uint32 battleId, std::string timeStr)
static bool HandleBattlefieldTimer(ChatHandler* handler, Optional<uint32> battleIdArg, std::string timeStr)
{
if (timeStr.empty())
{
return false;
}
uint32 const battleId = battleIdArg.value_or(BATTLEFIELD_BATTLEID_WG);
if (Acore::StringTo<int32>(timeStr).value_or(0) < 0)
{
handler->SendErrorMessage(LANG_BAD_VALUE);
@@ -173,8 +179,9 @@ public:
return true;
}
static bool HandleBattlefieldQueue(ChatHandler* handler, uint32 battleId)
static bool HandleBattlefieldQueue(ChatHandler* handler, Optional<uint32> battleIdArg)
{
uint32 const battleId = battleIdArg.value_or(BATTLEFIELD_BATTLEID_WG);
Battlefield* bf = sBattlefieldMgr->GetBattlefieldByBattleId(battleId);
if (!bf)
+53 -53
View File
@@ -58,71 +58,71 @@ public:
{
static ChatCommandTable debugPlayCommandTable =
{
{ "cinematic", HandleDebugPlayCinematicCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::No },
{ "movie", HandleDebugPlayMovieCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::No },
{ "sound", HandleDebugPlaySoundCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::No },
{ "music", HandleDebugPlayMusicCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::No },
{ "visual", HandleDebugVisualCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::No }
{ "cinematic", HandleDebugPlayCinematicCommand, rbac::RBAC_PERM_COMMAND_DEBUG_COSMETIC, Console::No },
{ "movie", HandleDebugPlayMovieCommand, rbac::RBAC_PERM_COMMAND_DEBUG_COSMETIC, Console::No },
{ "sound", HandleDebugPlaySoundCommand, rbac::RBAC_PERM_COMMAND_DEBUG_COSMETIC, Console::No },
{ "music", HandleDebugPlayMusicCommand, rbac::RBAC_PERM_COMMAND_DEBUG_COSMETIC, Console::No },
{ "visual", HandleDebugVisualCommand, rbac::RBAC_PERM_COMMAND_DEBUG_COSMETIC, Console::No }
};
static ChatCommandTable debugSendCommandTable =
{
{ "buyerror", HandleDebugSendBuyErrorCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::No },
{ "channelnotify", HandleDebugSendChannelNotifyCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::No },
{ "chatmessage", HandleDebugSendChatMsgCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::No },
{ "equiperror", HandleDebugSendEquipErrorCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::No },
{ "largepacket", HandleDebugSendLargePacketCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::No },
{ "opcode", HandleDebugSendOpcodeCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::No },
{ "qpartymsg", HandleDebugSendQuestPartyMsgCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::No },
{ "qinvalidmsg", HandleDebugSendQuestInvalidMsgCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::No },
{ "sellerror", HandleDebugSendSellErrorCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::No },
{ "setphaseshift", HandleDebugSendSetPhaseShiftCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::No },
{ "spellfail", HandleDebugSendSpellFailCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::No }
{ "buyerror", HandleDebugSendBuyErrorCommand, rbac::RBAC_PERM_COMMAND_DEBUG_COSMETIC, Console::No },
{ "channelnotify", HandleDebugSendChannelNotifyCommand, rbac::RBAC_PERM_COMMAND_DEBUG_COSMETIC, Console::No },
{ "chatmessage", HandleDebugSendChatMsgCommand, rbac::RBAC_PERM_COMMAND_DEBUG_COSMETIC, Console::No },
{ "equiperror", HandleDebugSendEquipErrorCommand, rbac::RBAC_PERM_COMMAND_DEBUG_COSMETIC, Console::No },
{ "largepacket", HandleDebugSendLargePacketCommand, rbac::RBAC_PERM_COMMAND_DEBUG_COSMETIC, Console::No },
{ "opcode", HandleDebugSendOpcodeCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::No },
{ "qpartymsg", HandleDebugSendQuestPartyMsgCommand, rbac::RBAC_PERM_COMMAND_DEBUG_COSMETIC, Console::No },
{ "qinvalidmsg", HandleDebugSendQuestInvalidMsgCommand, rbac::RBAC_PERM_COMMAND_DEBUG_COSMETIC, Console::No },
{ "sellerror", HandleDebugSendSellErrorCommand, rbac::RBAC_PERM_COMMAND_DEBUG_COSMETIC, Console::No },
{ "setphaseshift", HandleDebugSendSetPhaseShiftCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::No },
{ "spellfail", HandleDebugSendSpellFailCommand, rbac::RBAC_PERM_COMMAND_DEBUG_COSMETIC, Console::No }
};
static ChatCommandTable debugCommandTable =
{
{ "setbit", HandleDebugSet32BitCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::No },
{ "threat", HandleDebugThreatListCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::No },
{ "threatinfo", HandleDebugThreatInfoCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::No },
{ "combat", HandleDebugCombatListCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::No },
{ "hostile", HandleDebugHostileRefListCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::No },
{ "anim", HandleDebugAnimCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::No },
{ "arena", HandleDebugArenaCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::No },
{ "bg", HandleDebugBattlegroundCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::Yes},
{ "cooldown", HandleDebugCooldownCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::No },
{ "getitemstate", HandleDebugGetItemStateCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::No },
{ "lootrecipient", HandleDebugGetLootRecipientCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::No },
{ "getvalue", HandleDebugGetValueCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::No },
{ "getitemvalue", HandleDebugGetItemValueCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::No },
{ "Mod32Value", HandleDebugMod32ValueCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::No },
{ "setbit", HandleDebugSet32BitCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::No },
{ "threat", HandleDebugThreatListCommand, rbac::RBAC_PERM_COMMAND_DEBUG_INFO, Console::No },
{ "threatinfo", HandleDebugThreatInfoCommand, rbac::RBAC_PERM_COMMAND_DEBUG_INFO, Console::No },
{ "combat", HandleDebugCombatListCommand, rbac::RBAC_PERM_COMMAND_DEBUG_INFO, Console::No },
{ "hostile", HandleDebugHostileRefListCommand, rbac::RBAC_PERM_COMMAND_DEBUG_INFO, Console::No },
{ "anim", HandleDebugAnimCommand, rbac::RBAC_PERM_COMMAND_DEBUG_COSMETIC, Console::No },
{ "arena", HandleDebugArenaCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::No },
{ "bg", HandleDebugBattlegroundCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::Yes},
{ "cooldown", HandleDebugCooldownCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::No },
{ "getitemstate", HandleDebugGetItemStateCommand, rbac::RBAC_PERM_COMMAND_DEBUG_INFO, Console::No },
{ "lootrecipient", HandleDebugGetLootRecipientCommand, rbac::RBAC_PERM_COMMAND_DEBUG_INFO, Console::No },
{ "getvalue", HandleDebugGetValueCommand, rbac::RBAC_PERM_COMMAND_DEBUG_INFO, Console::No },
{ "getitemvalue", HandleDebugGetItemValueCommand, rbac::RBAC_PERM_COMMAND_DEBUG_INFO, Console::No },
{ "Mod32Value", HandleDebugMod32ValueCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::No },
{ "play", debugPlayCommandTable },
{ "send", debugSendCommandTable },
{ "setaurastate", HandleDebugSetAuraStateCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::No },
{ "setitemvalue", HandleDebugSetItemValueCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::No },
{ "setvalue", HandleDebugSetValueCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::No },
{ "spawnvehicle", HandleDebugSpawnVehicleCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::No },
{ "setvid", HandleDebugSetVehicleIdCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::No },
{ "entervehicle", HandleDebugEnterVehicleCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::No },
{ "uws", HandleDebugUpdateWorldStateCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::No },
{ "update", HandleDebugUpdateCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::No },
{ "itemexpire", HandleDebugItemExpireCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::No },
{ "areatriggers", HandleDebugAreaTriggersCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::No },
{ "lfg", HandleDebugDungeonFinderCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::Yes},
{ "loot", HandleDebugLootCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::Yes},
{ "los", HandleDebugLoSCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::No },
{ "moveflags", HandleDebugMoveflagsCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::No },
{ "unitstate", HandleDebugUnitStateCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::No },
{ "objectcount", HandleDebugObjectCountCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::Yes},
{ "dummy", HandleDebugDummyCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::No },
{ "mapdata", HandleDebugMapDataCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::No },
{ "boundary", HandleDebugBoundaryCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::No },
{ "visibilitydata", HandleDebugVisibilityDataCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::No },
{ "factionchange", HandleDebugFactionChangeCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::Yes},
{ "zonestats", HandleDebugZoneStatsCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::Yes}
{ "setaurastate", HandleDebugSetAuraStateCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::No },
{ "setitemvalue", HandleDebugSetItemValueCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::No },
{ "setvalue", HandleDebugSetValueCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::No },
{ "spawnvehicle", HandleDebugSpawnVehicleCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::No },
{ "setvid", HandleDebugSetVehicleIdCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::No },
{ "entervehicle", HandleDebugEnterVehicleCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::No },
{ "uws", HandleDebugUpdateWorldStateCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::No },
{ "update", HandleDebugUpdateCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::No },
{ "itemexpire", HandleDebugItemExpireCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::No },
{ "areatriggers", HandleDebugAreaTriggersCommand, rbac::RBAC_PERM_COMMAND_DEBUG_INFO, Console::No },
{ "lfg", HandleDebugDungeonFinderCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::Yes},
{ "loot", HandleDebugLootCommand, rbac::RBAC_PERM_COMMAND_DEBUG_INFO, Console::Yes},
{ "los", HandleDebugLoSCommand, rbac::RBAC_PERM_COMMAND_DEBUG_INFO, Console::No },
{ "moveflags", HandleDebugMoveflagsCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::No },
{ "unitstate", HandleDebugUnitStateCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::No },
{ "objectcount", HandleDebugObjectCountCommand, rbac::RBAC_PERM_COMMAND_DEBUG_INFO, Console::Yes},
{ "dummy", HandleDebugDummyCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::No },
{ "mapdata", HandleDebugMapDataCommand, rbac::RBAC_PERM_COMMAND_DEBUG_INFO, Console::No },
{ "boundary", HandleDebugBoundaryCommand, rbac::RBAC_PERM_COMMAND_DEBUG_COSMETIC, Console::No },
{ "visibilitydata", HandleDebugVisibilityDataCommand, rbac::RBAC_PERM_COMMAND_DEBUG_INFO, Console::No },
{ "factionchange", HandleDebugFactionChangeCommand, rbac::RBAC_PERM_COMMAND_DEBUG_INFO, Console::Yes},
{ "zonestats", HandleDebugZoneStatsCommand, rbac::RBAC_PERM_COMMAND_DEBUG_INFO, Console::Yes}
};
static ChatCommandTable commandTable =
{
{ "debug", debugCommandTable },
{ "wpgps", HandleWPGPSCommand, rbac::RBAC_PERM_COMMAND_DEBUG, Console::No }
{ "wpgps", HandleWPGPSCommand, rbac::RBAC_PERM_COMMAND_DEBUG_COSMETIC, Console::No }
};
return commandTable;
}
+30 -8
View File
@@ -51,7 +51,7 @@ public:
{ "item", HandleListItemCommand, rbac::RBAC_PERM_COMMAND_LIST_ITEM, Console::Yes },
{ "object", HandleListObjectCommand, rbac::RBAC_PERM_COMMAND_LIST_OBJECT, Console::Yes },
{ "auras", listAurasCommandTable },
{ "respawns", HandleListRespawnsCommand, rbac::RBAC_PERM_COMMAND_LIST_CREATURE, Console::No },
{ "respawns", HandleListRespawnsCommand, rbac::RBAC_PERM_COMMAND_LIST_RESPAWNS, Console::Yes },
};
static ChatCommandTable commandTable =
{
@@ -521,13 +521,35 @@ public:
return true;
}
static bool HandleListRespawnsCommand(ChatHandler* handler)
static bool HandleListRespawnsCommand(ChatHandler* handler, Optional<uint32> firstArg, Optional<uint32> secondArg, Optional<uint32> thirdArg)
{
Player* player = handler->GetSession()->GetPlayer();
if (!player)
return false;
Map* map = nullptr;
Optional<uint32> entryFilter;
if (handler->GetSession())
{
// In-game: first arg = entryId (optional), use player's current map
map = handler->GetSession()->GetPlayer()->GetMap();
entryFilter = firstArg;
}
else
{
// Console: first arg = mapId (required), second = instanceId, third = entryId
if (!firstArg)
{
handler->SendSysMessage(LANG_LIST_RESPAWNS_NO_MAP);
return false;
}
map = sMapMgr->FindMap(*firstArg, secondArg.value_or(0));
entryFilter = thirdArg;
}
if (!map)
{
handler->PSendSysMessage(LANG_RESPAWN_GUID_MAP_NOT_LOADED, firstArg.value_or(0));
return false;
}
Map* map = player->GetMap();
uint32 count = 0;
time_t now = GameTime::GetGameTime().count();
@@ -535,7 +557,7 @@ public:
for (auto const& pair : map->GetCreatureRespawnTimes())
{
CreatureData const* data = sObjectMgr->GetCreatureData(pair.first);
if (!data)
if (!data || (entryFilter && data->id1 != *entryFilter))
continue;
CreatureTemplate const* cTemplate = sObjectMgr->GetCreatureTemplate(data->id1);
@@ -555,7 +577,7 @@ public:
for (auto const& pair : map->GetGORespawnTimes())
{
GameObjectData const* data = sObjectMgr->GetGameObjectData(pair.first);
if (!data)
if (!data || (entryFilter && data->id != *entryFilter))
continue;
GameObjectTemplate const* goTemplate = sObjectMgr->GetGameObjectTemplate(data->id);
+264
View File
@@ -24,6 +24,7 @@
#include "CommandScript.h"
#include "Common.h"
#include "GameGraveyard.h"
#include "GameObject.h"
#include "GameTime.h"
#include "GridNotifiers.h"
#include "GridTerrainLoader.h"
@@ -177,6 +178,10 @@ public:
{ "pinfo", HandlePInfoCommand, rbac::RBAC_PERM_COMMAND_PINFO, Console::Yes },
{ "respawn", HandleRespawnCommand, rbac::RBAC_PERM_COMMAND_RESPAWN, Console::No },
{ "respawn all", HandleRespawnAllCommand, rbac::RBAC_PERM_COMMAND_RESPAWN_ALL, Console::No },
{ "respawn creature guid", HandleRespawnCreatureByGuidCommand, rbac::RBAC_PERM_COMMAND_RESPAWN_CREATURE_GUID, Console::Yes },
{ "respawn gameobject guid", HandleRespawnGameObjectByGuidCommand, rbac::RBAC_PERM_COMMAND_RESPAWN_GAMEOBJECT_GUID, Console::Yes },
{ "respawn creature entry", HandleRespawnCreatureByEntryCommand, rbac::RBAC_PERM_COMMAND_RESPAWN_CREATURE_ENTRY, Console::Yes },
{ "respawn gameobject entry", HandleRespawnGameObjectByEntryCommand, rbac::RBAC_PERM_COMMAND_RESPAWN_GAMEOBJECT_ENTRY, Console::Yes },
{ "mute", HandleMuteCommand, rbac::RBAC_PERM_COMMAND_MUTE, Console::Yes },
{ "mutehistory", HandleMuteInfoCommand, rbac::RBAC_PERM_COMMAND_MUTEHISTORY, Console::Yes },
{ "unmute", HandleUnmuteCommand, rbac::RBAC_PERM_COMMAND_UNMUTE, Console::Yes },
@@ -2448,6 +2453,265 @@ public:
return true;
}
static bool HandleRespawnCreatureByGuidCommand(ChatHandler* handler, ObjectGuid::LowType spawnId)
{
CreatureData const* creData = sObjectMgr->GetCreatureData(spawnId);
if (!creData)
{
handler->SendErrorMessage(LANG_RESPAWN_GUID_CREATURE_NOT_FOUND, spawnId);
return false;
}
Map* map = nullptr;
if (handler->GetSession())
{
Player* player = handler->GetSession()->GetPlayer();
if (player->GetMapId() == creData->mapid)
map = player->GetMap();
}
if (!map)
map = sMapMgr->FindMap(creData->mapid, 0);
if (!map)
{
handler->PSendSysMessage(LANG_RESPAWN_GUID_MAP_NOT_LOADED, creData->mapid);
return true;
}
// First pass: check if any instance is alive
bool isAlive = false;
auto const creBounds = map->GetCreatureBySpawnIdStore().equal_range(spawnId);
for (auto itr = creBounds.first; itr != creBounds.second; ++itr)
{
if (itr->second->IsAlive())
{
isAlive = true;
break;
}
}
if (isAlive)
{
handler->PSendSysMessage(LANG_RESPAWN_GUID_CREATURE_ALIVE, spawnId, creData->id1);
return true;
}
// Second pass: respawn any dead corpses in the world
for (auto itr = creBounds.first; itr != creBounds.second; ++itr)
{
if (itr->second->isDead())
itr->second->Respawn(true);
}
// Also trigger via respawn time queue for fully-removed spawns
if (map->GetCreatureRespawnTime(spawnId) > 0)
{
time_t now = GameTime::GetGameTime().count();
map->SaveCreatureRespawnTime(spawnId, now);
}
handler->PSendSysMessage(LANG_RESPAWN_GUID_CREATURE_QUEUED, spawnId, creData->id1);
return true;
}
static bool HandleRespawnGameObjectByGuidCommand(ChatHandler* handler, ObjectGuid::LowType spawnId)
{
GameObjectData const* goData = sObjectMgr->GetGameObjectData(spawnId);
if (!goData)
{
handler->SendErrorMessage(LANG_RESPAWN_GUID_GAMEOBJECT_NOT_FOUND, spawnId);
return false;
}
Map* map = nullptr;
if (handler->GetSession())
{
Player* player = handler->GetSession()->GetPlayer();
if (player->GetMapId() == goData->mapid)
map = player->GetMap();
}
if (!map)
map = sMapMgr->FindMap(goData->mapid, 0);
if (!map)
{
handler->PSendSysMessage(LANG_RESPAWN_GUID_MAP_NOT_LOADED, goData->mapid);
return true;
}
// First pass: check if any instance is already active
bool isActive = false;
auto const goBounds = map->GetGameObjectBySpawnIdStore().equal_range(spawnId);
for (auto itr = goBounds.first; itr != goBounds.second; ++itr)
{
if (itr->second->isSpawned())
{
isActive = true;
break;
}
}
if (isActive)
{
handler->PSendSysMessage(LANG_RESPAWN_GUID_GAMEOBJECT_ACTIVE, spawnId, goData->id);
return true;
}
// Second pass: respawn inactive objects in the world
for (auto itr = goBounds.first; itr != goBounds.second; ++itr)
itr->second->Respawn();
// Also trigger via respawn time queue for fully-removed spawns
if (map->GetGORespawnTime(spawnId) > 0)
{
time_t now = GameTime::GetGameTime().count();
map->SaveGORespawnTime(spawnId, now);
}
handler->PSendSysMessage(LANG_RESPAWN_GUID_GAMEOBJECT_QUEUED, spawnId, goData->id);
return true;
}
static bool HandleRespawnCreatureByEntryCommand(ChatHandler* handler, uint32 entry, Optional<uint32> mapIdArg, Optional<uint32> instanceIdArg)
{
if (!sObjectMgr->GetCreatureTemplate(entry))
{
handler->SendErrorMessage(LANG_RESPAWN_ENTRY_CREATURE_NOT_FOUND, entry);
return false;
}
Map* map = nullptr;
if (handler->GetSession())
{
// In-game: always use the player's current map
map = handler->GetSession()->GetPlayer()->GetMap();
}
else
{
// Console: mapId required, instanceId optional
if (!mapIdArg)
{
handler->SendSysMessage(LANG_LIST_RESPAWNS_NO_MAP);
return false;
}
map = sMapMgr->FindMap(*mapIdArg, instanceIdArg.value_or(0));
}
if (!map)
{
handler->PSendSysMessage(LANG_RESPAWN_GUID_MAP_NOT_LOADED, mapIdArg.value_or(0));
return false;
}
time_t now = GameTime::GetGameTime().count();
uint32 count = 0;
// Phase 1: respawn dead corpses that are still tracked in the spawn-id store.
// Collect first to avoid iterator invalidation caused by Respawn().
std::vector<Creature*> deadCreatures;
for (auto const& [spawnId, creature] : map->GetCreatureBySpawnIdStore())
{
CreatureData const* data = sObjectMgr->GetCreatureData(spawnId);
if (!data || data->id1 != entry)
continue;
if (creature->isDead())
deadCreatures.push_back(creature);
}
for (Creature* creature : deadCreatures)
{
creature->Respawn(true);
++count;
}
// Phase 2: set respawn time to now for fully-removed spawns, skipping pools
std::vector<ObjectGuid::LowType> toRespawn;
for (auto const& [spawnId, respawnTime] : map->GetCreatureRespawnTimes())
{
CreatureData const* data = sObjectMgr->GetCreatureData(spawnId);
if (!data || data->id1 != entry)
continue;
if (sPoolMgr->IsPartOfAPool<Creature>(spawnId))
continue;
toRespawn.push_back(spawnId);
}
for (ObjectGuid::LowType spawnId : toRespawn)
{
map->SaveCreatureRespawnTime(spawnId, now);
++count;
}
handler->PSendSysMessage(LANG_RESPAWN_ENTRY_CREATURE_QUEUED, count, entry);
return true;
}
static bool HandleRespawnGameObjectByEntryCommand(ChatHandler* handler, uint32 entry, Optional<uint32> mapIdArg, Optional<uint32> instanceIdArg)
{
if (!sObjectMgr->GetGameObjectTemplate(entry))
{
handler->SendErrorMessage(LANG_RESPAWN_ENTRY_GAMEOBJECT_NOT_FOUND, entry);
return false;
}
Map* map = nullptr;
if (handler->GetSession())
{
// In-game: always use the player's current map
map = handler->GetSession()->GetPlayer()->GetMap();
}
else
{
// Console: mapId required, instanceId optional
if (!mapIdArg)
{
handler->SendSysMessage(LANG_LIST_RESPAWNS_NO_MAP);
return false;
}
map = sMapMgr->FindMap(*mapIdArg, instanceIdArg.value_or(0));
}
if (!map)
{
handler->PSendSysMessage(LANG_RESPAWN_GUID_MAP_NOT_LOADED, mapIdArg.value_or(0));
return false;
}
time_t now = GameTime::GetGameTime().count();
uint32 count = 0;
// Phase 1: respawn inactive objects that are still tracked in the spawn-id store.
// Collect first to avoid iterator invalidation caused by Respawn().
std::vector<GameObject*> inactiveGOs;
for (auto const& [spawnId, go] : map->GetGameObjectBySpawnIdStore())
{
GameObjectData const* data = sObjectMgr->GetGameObjectData(spawnId);
if (!data || data->id != entry)
continue;
if (!go->isSpawned())
inactiveGOs.push_back(go);
}
for (GameObject* go : inactiveGOs)
{
go->Respawn();
++count;
}
// Phase 2: set respawn time to now for fully-removed spawns, skipping pools
std::vector<ObjectGuid::LowType> toRespawn;
for (auto const& [spawnId, respawnTime] : map->GetGORespawnTimes())
{
GameObjectData const* data = sObjectMgr->GetGameObjectData(spawnId);
if (!data || data->id != entry)
continue;
if (sPoolMgr->IsPartOfAPool<GameObject>(spawnId))
continue;
toRespawn.push_back(spawnId);
}
for (ObjectGuid::LowType spawnId : toRespawn)
{
map->SaveGORespawnTime(spawnId, now);
++count;
}
handler->PSendSysMessage(LANG_RESPAWN_ENTRY_GAMEOBJECT_QUEUED, count, entry);
return true;
}
static bool HandleRespawnCommand(ChatHandler* handler)
{
Player* player = handler->GetSession()->GetPlayer();

Some files were not shown because too many files have changed in this diff Show More