From 990ef2e4c9955e677a702a7154c044ca114430d1 Mon Sep 17 00:00:00 2001 From: Xepic90 Date: Sat, 18 Jul 2026 10:33:33 -0400 Subject: [PATCH 001/134] fix(DB/Creature): SOTA Battleground Demolisher can't dodge or block attacks (#26656) --- data/sql/updates/pending_db_world/rev_1784233414479962200.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1784233414479962200.sql diff --git a/data/sql/updates/pending_db_world/rev_1784233414479962200.sql b/data/sql/updates/pending_db_world/rev_1784233414479962200.sql new file mode 100644 index 000000000..101e8a488 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1784233414479962200.sql @@ -0,0 +1,2 @@ +-- +UPDATE `creature_template` SET `flags_extra` = `flags_extra`|4|16|8388608 WHERE `entry` IN (28781, 32796); From df1c3ebdffddc4012b06173048e50f4f45a93f54 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 18 Jul 2026 14:34:43 +0000 Subject: [PATCH 002/134] chore(DB): import pending files Referenced commit(s): 990ef2e4c9955e677a702a7154c044ca114430d1 --- .../rev_1784233414479962200.sql => db_world/2026_07_18_00.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1784233414479962200.sql => db_world/2026_07_18_00.sql} (71%) diff --git a/data/sql/updates/pending_db_world/rev_1784233414479962200.sql b/data/sql/updates/db_world/2026_07_18_00.sql similarity index 71% rename from data/sql/updates/pending_db_world/rev_1784233414479962200.sql rename to data/sql/updates/db_world/2026_07_18_00.sql index 101e8a488..e0d5e7e98 100644 --- a/data/sql/updates/pending_db_world/rev_1784233414479962200.sql +++ b/data/sql/updates/db_world/2026_07_18_00.sql @@ -1,2 +1,3 @@ +-- DB update 2026_07_16_01 -> 2026_07_18_00 -- UPDATE `creature_template` SET `flags_extra` = `flags_extra`|4|16|8388608 WHERE `entry` IN (28781, 32796); From 47d6d2a48eecd513f053c95ff727831cd863913a Mon Sep 17 00:00:00 2001 From: Thierry PROST Date: Sat, 18 Jul 2026 17:57:20 +0200 Subject: [PATCH 003/134] fix(Core/Petitions): re-key petition_sign on petition_id and fix type-filtered signature deletes (#26668) --- .../pending_db_characters/rev_1784315136456725704.sql | 10 ++++++++++ .../Database/Implementation/CharacterDatabase.cpp | 5 +++-- 2 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 data/sql/updates/pending_db_characters/rev_1784315136456725704.sql diff --git a/data/sql/updates/pending_db_characters/rev_1784315136456725704.sql b/data/sql/updates/pending_db_characters/rev_1784315136456725704.sql new file mode 100644 index 000000000..18c62ca8d --- /dev/null +++ b/data/sql/updates/pending_db_characters/rev_1784315136456725704.sql @@ -0,0 +1,10 @@ +-- petition_sign kept its (petitionguid, playerguid) primary key when the +-- petition_id schema stopped writing petitionguid: every row inserts with +-- petitionguid = 0, so the key collapses to (0, playerguid) and a character +-- can never hold more than one signature row overall (later signs fail +-- silently with a duplicate key on the async insert). +-- Re-key on (petition_id, playerguid) and drop the signature rows orphaned +-- by the type-filtered deletes that no longer match (`type` is not written +-- by the insert either). +DELETE `ps` FROM `petition_sign` `ps` LEFT JOIN `petition` `p` ON `p`.`petition_id` = `ps`.`petition_id` WHERE `p`.`petition_id` IS NULL; +ALTER TABLE `petition_sign` DROP PRIMARY KEY, ADD PRIMARY KEY (`petition_id`, `playerguid`), DROP INDEX `idx_petition_id_player`; diff --git a/src/server/database/Database/Implementation/CharacterDatabase.cpp b/src/server/database/Database/Implementation/CharacterDatabase.cpp index be215d322..939dd0919 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/database/Database/Implementation/CharacterDatabase.cpp @@ -272,7 +272,8 @@ void CharacterDatabaseConnection::DoPrepareStatements() // Petitions PrepareStatement(CHAR_DEL_ALL_PETITION_SIGNATURES, "DELETE FROM petition_sign WHERE playerguid = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_DEL_PETITION_SIGNATURE, "DELETE FROM petition_sign WHERE playerguid = ? AND type = ?", CONNECTION_ASYNC); + // petition_sign.type is not written by the sign insert (petition_id schema), join petition for the type filter + PrepareStatement(CHAR_DEL_PETITION_SIGNATURE, "DELETE ps FROM petition_sign ps INNER JOIN petition p ON p.petition_id = ps.petition_id WHERE ps.playerguid = ? AND p.type = ?", CONNECTION_ASYNC); // Arena teams PrepareStatement(CHAR_INS_ARENA_TEAM, "INSERT INTO arena_team (arenaTeamId, name, captainGuid, type, rating, backgroundColor, emblemStyle, emblemColor, borderStyle, borderColor) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); @@ -534,7 +535,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_DEL_PETITION_BY_OWNER, "DELETE FROM petition WHERE ownerguid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_PETITION_SIGNATURE_BY_OWNER, "DELETE FROM petition_sign WHERE ownerguid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_PETITION_BY_OWNER_AND_TYPE, "DELETE FROM petition WHERE ownerguid = ? AND type = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_DEL_PETITION_SIGNATURE_BY_OWNER_AND_TYPE, "DELETE FROM petition_sign WHERE ownerguid = ? AND type = ?", CONNECTION_ASYNC); + PrepareStatement(CHAR_DEL_PETITION_SIGNATURE_BY_OWNER_AND_TYPE, "DELETE ps FROM petition_sign ps INNER JOIN petition p ON p.petition_id = ps.petition_id WHERE ps.ownerguid = ? AND p.type = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_INS_CHAR_GLYPHS, "INSERT INTO character_glyphs VALUES(?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_CHAR_TALENT_BY_SPELL, "DELETE FROM character_talent WHERE guid = ? AND spell = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_INS_CHAR_TALENT, "INSERT INTO character_talent (guid, spell, specMask) VALUES (?, ?, ?)", CONNECTION_ASYNC); From 1ee92134dbe77f2bde7b5a4a2fb858ba3c71c448 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 18 Jul 2026 15:58:31 +0000 Subject: [PATCH 004/134] chore(DB): import pending files Referenced commit(s): 47d6d2a48eecd513f053c95ff727831cd863913a --- .../2026_07_18_00.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_characters/rev_1784315136456725704.sql => db_characters/2026_07_18_00.sql} (94%) diff --git a/data/sql/updates/pending_db_characters/rev_1784315136456725704.sql b/data/sql/updates/db_characters/2026_07_18_00.sql similarity index 94% rename from data/sql/updates/pending_db_characters/rev_1784315136456725704.sql rename to data/sql/updates/db_characters/2026_07_18_00.sql index 18c62ca8d..6b068cd33 100644 --- a/data/sql/updates/pending_db_characters/rev_1784315136456725704.sql +++ b/data/sql/updates/db_characters/2026_07_18_00.sql @@ -1,3 +1,4 @@ +-- DB update 2026_06_24_00 -> 2026_07_18_00 -- petition_sign kept its (petitionguid, playerguid) primary key when the -- petition_id schema stopped writing petitionguid: every row inserts with -- petitionguid = 0, so the key collapses to (0, playerguid) and a character From bb5c7c832afacfa9772b7fbf412ece2bff5f37b2 Mon Sep 17 00:00:00 2001 From: zackchadwick <73787423+zackchadwick@users.noreply.github.com> Date: Sat, 18 Jul 2026 11:58:37 -0400 Subject: [PATCH 005/134] fix(DB/loot): Remove 30+ food from Palemane Skinner (#26653) --- data/sql/updates/pending_db_world/rev_1784214582826132307.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1784214582826132307.sql diff --git a/data/sql/updates/pending_db_world/rev_1784214582826132307.sql b/data/sql/updates/pending_db_world/rev_1784214582826132307.sql new file mode 100644 index 000000000..a6e47fb7b --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1784214582826132307.sql @@ -0,0 +1,2 @@ +-- +DELETE FROM `creature_loot_template` WHERE (`Entry` = 2950) AND (`Item` IN (3771, 4599)); From af57d05d1fbce134c016ca7a66b660735bd8633a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 18 Jul 2026 15:59:49 +0000 Subject: [PATCH 006/134] chore(DB): import pending files Referenced commit(s): 1ee92134dbe77f2bde7b5a4a2fb858ba3c71c448 --- .../rev_1784214582826132307.sql => db_world/2026_07_18_01.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1784214582826132307.sql => db_world/2026_07_18_01.sql} (67%) diff --git a/data/sql/updates/pending_db_world/rev_1784214582826132307.sql b/data/sql/updates/db_world/2026_07_18_01.sql similarity index 67% rename from data/sql/updates/pending_db_world/rev_1784214582826132307.sql rename to data/sql/updates/db_world/2026_07_18_01.sql index a6e47fb7b..bed24bbb6 100644 --- a/data/sql/updates/pending_db_world/rev_1784214582826132307.sql +++ b/data/sql/updates/db_world/2026_07_18_01.sql @@ -1,2 +1,3 @@ +-- DB update 2026_07_18_00 -> 2026_07_18_01 -- DELETE FROM `creature_loot_template` WHERE (`Entry` = 2950) AND (`Item` IN (3771, 4599)); From 66e3a94db4d65e8a79684db750790063df87e15c Mon Sep 17 00:00:00 2001 From: Kitzunu <24550914+Kitzunu@users.noreply.github.com> Date: Sat, 18 Jul 2026 18:07:35 +0200 Subject: [PATCH 007/134] fix(Groups/Loot): include bank when checking unique item cap for rolls (#26367) --- src/server/game/Groups/Group.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp index 6f45ac4ab..23470aded 100644 --- a/src/server/game/Groups/Group.cpp +++ b/src/server/game/Groups/Group.cpp @@ -997,7 +997,7 @@ bool CanRollOnItem(LootItem const& item, Player const* player, Loot* loot) if (!proto) return false; - uint32 itemCount = player->GetItemCount(item.itemid); + uint32 itemCount = player->GetItemCount(item.itemid, true); if ((proto->MaxCount > 0 && static_cast(itemCount) >= proto->MaxCount)) return false; From 495f219a5bc7185e04267e328d3295fa5dc59f78 Mon Sep 17 00:00:00 2001 From: Peter Date: Sat, 18 Jul 2026 18:15:46 +0200 Subject: [PATCH 008/134] fix(Core/Creatures): don't spawn if the master creature is still dead (#26531) Co-authored-by: dillyns <49765217+dillyns@users.noreply.github.com> --- src/server/game/Maps/Map.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index 15265050a..13b4e1bfb 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -2786,6 +2786,19 @@ void Map::ProcessCreatureRespawn(ObjectGuid::LowType spawnId) } } + // Check linked_respawn: don't spawn if the master creature is still dead. + // This mirrors the check in Creature::Respawn() for compat-mode creatures. + ObjectGuid dbtableHighGuid = ObjectGuid::Create(data->id, spawnId); + time_t linkedRespawntime = GetLinkedRespawnTime(dbtableHighGuid); + if (linkedRespawntime) + { + // Master is still dead; re-queue at the master's respawn time + a small offset. + time_t now = GameTime::GetGameTime().count(); + time_t newRespawnTime = (now > linkedRespawntime ? now : linkedRespawntime) + urand(5, MINUTE); + SaveCreatureRespawnTime(spawnId, newRespawnTime); + return; + } + // Remove respawn time BEFORE LoadFromDB, otherwise the creature // reads it back and loads as DEAD instead of ALIVE RemoveCreatureRespawnTime(spawnId); From c6dc7f8f23823198c1796e6d20031ab07fc017e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexis=20LOUBI=C3=88RE?= Date: Sat, 18 Jul 2026 19:03:52 +0200 Subject: [PATCH 009/134] fix(Core/Scripts): Prevents Crystalline Frayer from staying in combat (#26561) --- src/server/scripts/Northrend/Nexus/Nexus/instance_nexus.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/server/scripts/Northrend/Nexus/Nexus/instance_nexus.cpp b/src/server/scripts/Northrend/Nexus/Nexus/instance_nexus.cpp index 51ead3e43..b0dbd4ae8 100644 --- a/src/server/scripts/Northrend/Nexus/Nexus/instance_nexus.cpp +++ b/src/server/scripts/Northrend/Nexus/Nexus/instance_nexus.cpp @@ -207,6 +207,7 @@ struct npc_crystalline_frayer : public ScriptedAI { _allowDeath = false; _inSeedPod = false; + me->SetIsCombatDisallowed(false); _scheduler.CancelAll(); me->RemoveAllAuras(); @@ -256,6 +257,7 @@ struct npc_crystalline_frayer : public ScriptedAI void EnterSeedPod() { _inSeedPod = true; + me->SetIsCombatDisallowed(true); _scheduler.CancelGroup(GROUP_COMBAT); me->AttackStop(); @@ -283,6 +285,7 @@ struct npc_crystalline_frayer : public ScriptedAI void LeaveSeedPod() { _inSeedPod = false; + me->SetIsCombatDisallowed(false); Talk(SAY_EMOTE); From 02afbec99d92660c86d37d14d2226a0dabd6ccc5 Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Sat, 18 Jul 2026 14:39:44 -0300 Subject: [PATCH 010/134] feat(Core/Commands): add ".server set security" to set realm security level (#26649) Co-authored-by: Claude Opus 4.8 --- .../rev_1784190761123425500.sql | 8 +++++++ .../rev_1784190992977546300.sql | 10 ++++++++ .../Database/Implementation/LoginDatabase.cpp | 1 + .../Database/Implementation/LoginDatabase.h | 1 + src/server/game/Accounts/RBAC.h | 1 + src/server/game/Miscellaneous/Language.h | 4 ++++ src/server/scripts/Commands/cs_server.cpp | 23 +++++++++++++++++++ 7 files changed, 48 insertions(+) create mode 100644 data/sql/updates/pending_db_auth/rev_1784190761123425500.sql create mode 100644 data/sql/updates/pending_db_world/rev_1784190992977546300.sql diff --git a/data/sql/updates/pending_db_auth/rev_1784190761123425500.sql b/data/sql/updates/pending_db_auth/rev_1784190761123425500.sql new file mode 100644 index 000000000..54224c3c9 --- /dev/null +++ b/data/sql/updates/pending_db_auth/rev_1784190761123425500.sql @@ -0,0 +1,8 @@ +-- +DELETE FROM `rbac_permissions` WHERE `id` = 939; +INSERT INTO `rbac_permissions` (`id`, `name`) VALUES +(939, 'Command: server set security'); + +DELETE FROM `rbac_linked_permissions` WHERE `id` = 196 AND `linkedId` = 939; +INSERT INTO `rbac_linked_permissions` (`id`, `linkedId`) VALUES +(196, 939); diff --git a/data/sql/updates/pending_db_world/rev_1784190992977546300.sql b/data/sql/updates/pending_db_world/rev_1784190992977546300.sql new file mode 100644 index 000000000..8e3364ea6 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1784190992977546300.sql @@ -0,0 +1,10 @@ +-- +DELETE FROM `acore_string` WHERE `entry` IN (11020, 11021, 11022); +INSERT INTO `acore_string` (`entry`, `content_default`, `locale_koKR`, `locale_frFR`, `locale_deDE`, `locale_zhCN`, `locale_zhTW`, `locale_esES`, `locale_esMX`, `locale_ruRU`) VALUES +(11020, 'Realm security level set to {}. Only accounts with this level or higher may log in.', '렐름 보안 등급이 {}(으)로 설정되었습니다. 이 등급 이상의 계정만 로그인할 수 있습니다.', 'Niveau de sécurité du royaume défini sur {}. Seuls les comptes de ce niveau ou supérieur peuvent se connecter.', 'Sicherheitsstufe des Realms auf {} gesetzt. Nur Konten mit dieser Stufe oder höher können sich anmelden.', '服务器安全等级已设置为 {}。只有该等级或更高等级的账号才能登录。', '伺服器安全等級已設定為 {}。只有該等級或更高等級的帳號才能登入。', 'Nivel de seguridad del reino establecido en {}. Solo las cuentas con este nivel o superior pueden iniciar sesión.', 'Nivel de seguridad del reino establecido en {}. Solo las cuentas con este nivel o superior pueden iniciar sesión.', 'Уровень безопасности игрового мира установлен на {}. Войти могут только учётные записи с этим уровнем или выше.'), +(11021, 'Security level must be between {} (player) and {} (administrator).', '보안 등급은 {}(플레이어)에서 {}(관리자) 사이여야 합니다.', 'Le niveau de sécurité doit être compris entre {} (joueur) et {} (administrateur).', 'Die Sicherheitsstufe muss zwischen {} (Spieler) und {} (Administrator) liegen.', '安全等级必须介于 {}(玩家)和 {}(管理员)之间。', '安全等級必須介於 {}(玩家)和 {}(管理員)之間。', 'El nivel de seguridad debe estar entre {} (jugador) y {} (administrador).', 'El nivel de seguridad debe estar entre {} (jugador) y {} (administrador).', 'Уровень безопасности должен быть от {} (игрок) до {} (администратор).'), +(11022, 'Minimum account security level to log in: {}.', '로그인에 필요한 최소 계정 보안 등급: {}.', 'Niveau de sécurité de compte minimum pour se connecter : {}.', 'Mindest-Sicherheitsstufe des Kontos zum Anmelden: {}.', '登录所需的最低账号安全等级:{}。', '登入所需的最低帳號安全等級:{}。', 'Nivel de seguridad de cuenta mínimo para iniciar sesión: {}.', 'Nivel de seguridad de cuenta mínimo para iniciar sesión: {}.', 'Минимальный уровень безопасности учётной записи для входа: {}.'); + +DELETE FROM `command` WHERE `name` = 'server set security'; +INSERT INTO `command` (`name`, `security`, `help`) VALUES +('server set security', 4, 'Syntax: .server set security $level\r\n\r\nSets the minimum account security level (0 = player, 1 = moderator, 2 = gamemaster, 3 = administrator) allowed to log into the current realm. Updates realmlist.allowedSecurityLevel and applies immediately.'); diff --git a/src/server/database/Database/Implementation/LoginDatabase.cpp b/src/server/database/Database/Implementation/LoginDatabase.cpp index 1629b7a69..fa589fa23 100644 --- a/src/server/database/Database/Implementation/LoginDatabase.cpp +++ b/src/server/database/Database/Implementation/LoginDatabase.cpp @@ -116,6 +116,7 @@ void LoginDatabaseConnection::DoPrepareStatements() PrepareStatement(LOGIN_SEL_LAST_ATTEMPT_IP, "SELECT last_attempt_ip FROM account WHERE id = ?", CONNECTION_SYNCH); PrepareStatement(LOGIN_SEL_LAST_IP, "SELECT last_ip FROM account WHERE id = ?", CONNECTION_SYNCH); PrepareStatement(LOGIN_SEL_REALMLIST_SECURITY_LEVEL, "SELECT allowedSecurityLevel from realmlist WHERE id = ?", CONNECTION_SYNCH); + PrepareStatement(LOGIN_UPD_REALMLIST_SECURITY_LEVEL, "UPDATE realmlist SET allowedSecurityLevel = ? WHERE id = ?", CONNECTION_ASYNC); PrepareStatement(LOGIN_DEL_ACCOUNT, "DELETE FROM account WHERE id = ?", CONNECTION_ASYNC); PrepareStatement(LOGIN_SEL_AUTOBROADCAST, "SELECT id, weight, text FROM autobroadcast WHERE realmid = ? OR realmid = -1", CONNECTION_SYNCH); PrepareStatement(LOGIN_SEL_AUTOBROADCAST_LOCALIZED, "SELECT id, locale, text FROM autobroadcast_locale WHERE realmid = ? OR realmid = -1", CONNECTION_SYNCH); diff --git a/src/server/database/Database/Implementation/LoginDatabase.h b/src/server/database/Database/Implementation/LoginDatabase.h index a91f3dbe0..99e057b0c 100644 --- a/src/server/database/Database/Implementation/LoginDatabase.h +++ b/src/server/database/Database/Implementation/LoginDatabase.h @@ -98,6 +98,7 @@ enum LoginDatabaseStatements : uint32 LOGIN_SEL_BANS, LOGIN_SEL_ACCOUNT_WHOIS, LOGIN_SEL_REALMLIST_SECURITY_LEVEL, + LOGIN_UPD_REALMLIST_SECURITY_LEVEL, LOGIN_DEL_ACCOUNT, LOGIN_SEL_AUTOBROADCAST, LOGIN_SEL_AUTOBROADCAST_LOCALIZED, diff --git a/src/server/game/Accounts/RBAC.h b/src/server/game/Accounts/RBAC.h index 8a2a77585..aecb77882 100644 --- a/src/server/game/Accounts/RBAC.h +++ b/src/server/game/Accounts/RBAC.h @@ -700,6 +700,7 @@ enum RBACPermissions RBAC_PERM_COMMAND_SPELLINFO_EFFECTS = 936, RBAC_PERM_COMMAND_SPELLINFO_TARGETS = 937, RBAC_PERM_COMMAND_SPELLINFO_ALL = 938, + RBAC_PERM_COMMAND_SERVER_SET_SECURITY = 939, // custom permissions 1000+ RBAC_PERM_MAX }; diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h index ef158770b..e645954fb 100644 --- a/src/server/game/Miscellaneous/Language.h +++ b/src/server/game/Miscellaneous/Language.h @@ -1400,6 +1400,10 @@ enum AcoreStrings LANG_LFG_COOLDOWN_CLEARED = 11019, + LANG_COMMAND_SERVER_SET_SECURITY = 11020, + LANG_COMMAND_SERVER_SET_SECURITY_ERROR = 11021, + LANG_COMMAND_SERVER_INFO_SECURITY = 11022, + LANG_MUTED_PLAYER = 30000, // Mute for player 2 hour // Instant Flight diff --git a/src/server/scripts/Commands/cs_server.cpp b/src/server/scripts/Commands/cs_server.cpp index fd4c51e72..05370ba02 100644 --- a/src/server/scripts/Commands/cs_server.cpp +++ b/src/server/scripts/Commands/cs_server.cpp @@ -76,6 +76,7 @@ public: { "loglevel", HandleServerSetLogLevelCommand, rbac::RBAC_PERM_COMMAND_SERVER_SET_LOGLEVEL, Console::Yes }, { "motd", HandleServerSetMotdCommand, rbac::RBAC_PERM_COMMAND_SERVER_SET_MOTD, Console::Yes }, { "closed", HandleServerSetClosedCommand, rbac::RBAC_PERM_COMMAND_SERVER_SET_CLOSED, Console::Yes }, + { "security", HandleServerSetSecurityCommand, rbac::RBAC_PERM_COMMAND_SERVER_SET_SECURITY, Console::Yes }, }; static ChatCommandTable serverCommandTable = @@ -270,6 +271,7 @@ public: handler->PSendSysMessage("Connected players: {}. Characters in world: {}. Queue: {}.", activeSessionCount, playerCount, queuedSessionCount); handler->PSendSysMessage("Connection peak: {}.", connPeak); + handler->PSendSysMessage(LANG_COMMAND_SERVER_INFO_SECURITY, uint32(sWorld->GetPlayerSecurityLimit())); handler->PSendSysMessage(LANG_UPTIME, secsToTimeString(GameTime::GetUptime().count())); handler->PSendSysMessage("Update time diff: {}ms. Last {} diffs summary:", sWorldUpdateTime.GetLastUpdateTime(), sWorldUpdateTime.GetDatasetSize()); handler->PSendSysMessage("|- Mean: {}ms", sWorldUpdateTime.GetAverageUpdateTime()); @@ -600,6 +602,27 @@ public: return false; } + // Set the minimum security level allowed to log into this realm (realmlist.allowedSecurityLevel) + static bool HandleServerSetSecurityCommand(ChatHandler* handler, uint8 level) + { + if (level > SEC_ADMINISTRATOR) + { + handler->SendErrorMessage(LANG_COMMAND_SERVER_SET_SECURITY_ERROR, SEC_PLAYER, SEC_ADMINISTRATOR); + return false; + } + + LoginDatabasePreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_REALMLIST_SECURITY_LEVEL); + stmt->SetData(0, level); + stmt->SetData(1, realm.Id.Realm); + LoginDatabase.Execute(stmt); + + // Apply live; raising the limit kicks any now-disallowed sessions. + sWorld->SetPlayerSecurityLimit(AccountTypes(level)); + + handler->PSendSysMessage(LANG_COMMAND_SERVER_SET_SECURITY, level); + return true; + } + // Set the level of logging static bool HandleServerSetLogLevelCommand(ChatHandler* /*handler*/, bool isLogger, std::string const& name, int32 level) { From d5e98542dd1a6349cdc2e56dd8eb524a232dd897 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 18 Jul 2026 17:41:16 +0000 Subject: [PATCH 011/134] chore(DB): import pending files Referenced commit(s): 02afbec99d92660c86d37d14d2226a0dabd6ccc5 --- .../rev_1784190761123425500.sql => db_auth/2026_07_18_00.sql} | 1 + .../rev_1784190992977546300.sql => db_world/2026_07_18_02.sql} | 1 + 2 files changed, 2 insertions(+) rename data/sql/updates/{pending_db_auth/rev_1784190761123425500.sql => db_auth/2026_07_18_00.sql} (87%) rename data/sql/updates/{pending_db_world/rev_1784190992977546300.sql => db_world/2026_07_18_02.sql} (98%) diff --git a/data/sql/updates/pending_db_auth/rev_1784190761123425500.sql b/data/sql/updates/db_auth/2026_07_18_00.sql similarity index 87% rename from data/sql/updates/pending_db_auth/rev_1784190761123425500.sql rename to data/sql/updates/db_auth/2026_07_18_00.sql index 54224c3c9..f7a783c92 100644 --- a/data/sql/updates/pending_db_auth/rev_1784190761123425500.sql +++ b/data/sql/updates/db_auth/2026_07_18_00.sql @@ -1,3 +1,4 @@ +-- DB update 2026_07_15_00 -> 2026_07_18_00 -- DELETE FROM `rbac_permissions` WHERE `id` = 939; INSERT INTO `rbac_permissions` (`id`, `name`) VALUES diff --git a/data/sql/updates/pending_db_world/rev_1784190992977546300.sql b/data/sql/updates/db_world/2026_07_18_02.sql similarity index 98% rename from data/sql/updates/pending_db_world/rev_1784190992977546300.sql rename to data/sql/updates/db_world/2026_07_18_02.sql index 8e3364ea6..41647f77f 100644 --- a/data/sql/updates/pending_db_world/rev_1784190992977546300.sql +++ b/data/sql/updates/db_world/2026_07_18_02.sql @@ -1,3 +1,4 @@ +-- DB update 2026_07_18_01 -> 2026_07_18_02 -- DELETE FROM `acore_string` WHERE `entry` IN (11020, 11021, 11022); INSERT INTO `acore_string` (`entry`, `content_default`, `locale_koKR`, `locale_frFR`, `locale_deDE`, `locale_zhCN`, `locale_zhTW`, `locale_esES`, `locale_esMX`, `locale_ruRU`) VALUES From b0e914ac45252ae75b5c8c244d0f7aa8247b21ef Mon Sep 17 00:00:00 2001 From: Kitzunu <24550914+Kitzunu@users.noreply.github.com> Date: Sat, 18 Jul 2026 20:08:23 +0200 Subject: [PATCH 012/134] =?UTF-8?q?feat(Core/Commands):=20add=20.group=20i?= =?UTF-8?q?nvites=20command=20to=20toggle=20accepting=20g=E2=80=A6=20(#263?= =?UTF-8?q?70)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Skjalf <47818697+Nyeriah@users.noreply.github.com> --- .../rev_1782631139396176100.sql | 7 +++++++ .../rev_1782631139396176100.sql | 10 ++++++++++ src/server/game/Accounts/RBAC.h | 1 + src/server/game/Entities/Player/Player.h | 3 +++ src/server/game/Handlers/GroupHandler.cpp | 7 +++++++ src/server/game/Miscellaneous/Language.h | 7 ++++++- src/server/scripts/Commands/cs_group.cpp | 18 +++++++++++++++++- 7 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 data/sql/updates/pending_db_auth/rev_1782631139396176100.sql create mode 100644 data/sql/updates/pending_db_world/rev_1782631139396176100.sql diff --git a/data/sql/updates/pending_db_auth/rev_1782631139396176100.sql b/data/sql/updates/pending_db_auth/rev_1782631139396176100.sql new file mode 100644 index 000000000..0afd17a40 --- /dev/null +++ b/data/sql/updates/pending_db_auth/rev_1782631139396176100.sql @@ -0,0 +1,7 @@ +DELETE FROM `rbac_permissions` WHERE `id` = 940; +INSERT INTO `rbac_permissions` (`id`, `name`) VALUES +(940, 'Command: group invites'); + +DELETE FROM `rbac_linked_permissions` WHERE `linkedId` = 940; +INSERT INTO `rbac_linked_permissions` (`id`, `linkedId`) VALUES +(197, 940); diff --git a/data/sql/updates/pending_db_world/rev_1782631139396176100.sql b/data/sql/updates/pending_db_world/rev_1782631139396176100.sql new file mode 100644 index 000000000..49bec6f72 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1782631139396176100.sql @@ -0,0 +1,10 @@ +DELETE FROM `command` WHERE `name`='group invites'; +INSERT INTO `command` (`name`, `security`, `help`) VALUES +('group invites', 2, 'Syntax: .group invites on|off\r\nEnable/disable accepting group invites.'); + +-- acore_string entries for .groupinvites command. +DELETE FROM `acore_string` WHERE `entry` IN (35462, 35463, 35464); +INSERT INTO `acore_string` (`entry`, `content_default`) VALUES +(35462, 'Accepting Group Invites: {}'), +(35463, 'Accepting Group Invites: ON'), +(35464, 'Accepting Group Invites: OFF'); diff --git a/src/server/game/Accounts/RBAC.h b/src/server/game/Accounts/RBAC.h index aecb77882..ec4b71654 100644 --- a/src/server/game/Accounts/RBAC.h +++ b/src/server/game/Accounts/RBAC.h @@ -701,6 +701,7 @@ enum RBACPermissions RBAC_PERM_COMMAND_SPELLINFO_TARGETS = 937, RBAC_PERM_COMMAND_SPELLINFO_ALL = 938, RBAC_PERM_COMMAND_SERVER_SET_SECURITY = 939, + RBAC_PERM_COMMAND_GROUP_INVITES = 940, // custom permissions 1000+ RBAC_PERM_MAX }; diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 8e30a419c..bfd7491bb 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -577,6 +577,7 @@ enum PlayerExtraFlags PLAYER_EXTRA_PVP_DEATH = 0x0100, // store PvP death status until corpse creating. PLAYER_EXTRA_SHOW_DK_PET = 0x0400, // Marks if player should see ghoul on login screen PLAYER_EXTRA_GM_SPECTATOR = 0x0800, + PLAYER_EXTRA_DECLINE_GROUP_INVITES = 0x1000, // Set when the player opted out of receiving group invites }; // 2^n values @@ -1171,6 +1172,8 @@ public: void SetBeastMaster(bool on) { if (on) SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE); else RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE); } [[nodiscard]] bool isAcceptWhispers() const { return m_ExtraFlags & PLAYER_EXTRA_ACCEPT_WHISPERS; } void SetAcceptWhispers(bool on) { if (on) m_ExtraFlags |= PLAYER_EXTRA_ACCEPT_WHISPERS; else m_ExtraFlags &= ~PLAYER_EXTRA_ACCEPT_WHISPERS; } + [[nodiscard]] bool IsAcceptGroupInvites() const { return !(m_ExtraFlags & PLAYER_EXTRA_DECLINE_GROUP_INVITES); } + void SetAcceptGroupInvites(bool on) { if (on) m_ExtraFlags &= ~PLAYER_EXTRA_DECLINE_GROUP_INVITES; else m_ExtraFlags |= PLAYER_EXTRA_DECLINE_GROUP_INVITES; } [[nodiscard]] bool IsGameMaster() const { return m_ExtraFlags & PLAYER_EXTRA_GM_ON; } [[nodiscard]] bool CanBeGameMaster() const; void SetGameMaster(bool on); diff --git a/src/server/game/Handlers/GroupHandler.cpp b/src/server/game/Handlers/GroupHandler.cpp index 3f0884ebe..d0bd34262 100644 --- a/src/server/game/Handlers/GroupHandler.cpp +++ b/src/server/game/Handlers/GroupHandler.cpp @@ -108,6 +108,13 @@ void WorldSession::HandleGroupInviteOpcode(WorldPacket& recvData) return; } + // target has opted out of receiving group invites + if (!invitedPlayer->IsAcceptGroupInvites()) + { + SendPartyResult(PARTY_OP_INVITE, membername, ERR_BAD_PLAYER_NAME_S); + return; + } + // can't group with if (!invitingPlayer->IsGameMaster() && !sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP) && invitingPlayer->GetTeamId() != invitedPlayer->GetTeamId()) { diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h index e645954fb..26330f93e 100644 --- a/src/server/game/Miscellaneous/Language.h +++ b/src/server/game/Miscellaneous/Language.h @@ -1532,7 +1532,12 @@ enum AcoreStrings LANG_COMMAND_NPC_SHOWLOOT_MONEY = 35458, LANG_COMMAND_NPC_SHOWLOOT_ITEMS = 35459, LANG_COMMAND_NPC_SHOWLOOT_ENTRY = 35460, - LANG_COMMAND_NPC_SHOWLOOT_QUEST = 35461 + LANG_COMMAND_NPC_SHOWLOOT_QUEST = 35461, + + // Group invites toggle command + LANG_COMMAND_GROUP_INVITES_ACCEPTING = 35462, + LANG_COMMAND_GROUP_INVITES_ON = 35463, + LANG_COMMAND_GROUP_INVITES_OFF = 35464 }; #endif diff --git a/src/server/scripts/Commands/cs_group.cpp b/src/server/scripts/Commands/cs_group.cpp index 83b4e001a..188f16542 100644 --- a/src/server/scripts/Commands/cs_group.cpp +++ b/src/server/scripts/Commands/cs_group.cpp @@ -38,7 +38,8 @@ public: { "remove", HandleGroupRemoveCommand, rbac::RBAC_PERM_COMMAND_GROUP_REMOVE, Console::No }, { "disband", HandleGroupDisbandCommand, rbac::RBAC_PERM_COMMAND_GROUP_DISBAND, Console::No }, { "revive", HandleGroupReviveCommand, rbac::RBAC_PERM_COMMAND_GROUP_REVIVE, Console::No }, - { "leader", HandleGroupLeaderCommand, rbac::RBAC_PERM_COMMAND_GROUP_LEADER, Console::No } + { "leader", HandleGroupLeaderCommand, rbac::RBAC_PERM_COMMAND_GROUP_LEADER, Console::No }, + { "invites", HandleGroupInvitesCommand, rbac::RBAC_PERM_COMMAND_GROUP_INVITES, Console::No } }; static ChatCommandTable commandTable = @@ -292,6 +293,21 @@ public: return true; } + + // Enable/disable accepting group invites + static bool HandleGroupInvitesCommand(ChatHandler* handler, Optional args) + { + Player* player = handler->GetSession()->GetPlayer(); + if (!args) + { + handler->PSendSysMessage(LANG_COMMAND_GROUP_INVITES_ACCEPTING, player->IsAcceptGroupInvites() ? handler->GetAcoreString(LANG_ON) : handler->GetAcoreString(LANG_OFF)); + return true; + } + + player->SetAcceptGroupInvites(*args); + handler->SendSysMessage(*args ? LANG_COMMAND_GROUP_INVITES_ON : LANG_COMMAND_GROUP_INVITES_OFF); + return true; + } }; void AddSC_group_commandscript() From 9f8401cad19820efbd6ba6c0ed624d661bc1f5c7 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 18 Jul 2026 18:11:41 +0000 Subject: [PATCH 013/134] chore(DB): import pending files Referenced commit(s): b0e914ac45252ae75b5c8c244d0f7aa8247b21ef --- .../rev_1782631139396176100.sql => db_auth/2026_07_18_01.sql} | 1 + .../rev_1782631139396176100.sql => db_world/2026_07_18_03.sql} | 1 + 2 files changed, 2 insertions(+) rename data/sql/updates/{pending_db_auth/rev_1782631139396176100.sql => db_auth/2026_07_18_01.sql} (86%) rename data/sql/updates/{pending_db_world/rev_1782631139396176100.sql => db_world/2026_07_18_03.sql} (92%) diff --git a/data/sql/updates/pending_db_auth/rev_1782631139396176100.sql b/data/sql/updates/db_auth/2026_07_18_01.sql similarity index 86% rename from data/sql/updates/pending_db_auth/rev_1782631139396176100.sql rename to data/sql/updates/db_auth/2026_07_18_01.sql index 0afd17a40..7c9e25e55 100644 --- a/data/sql/updates/pending_db_auth/rev_1782631139396176100.sql +++ b/data/sql/updates/db_auth/2026_07_18_01.sql @@ -1,3 +1,4 @@ +-- DB update 2026_07_18_00 -> 2026_07_18_01 DELETE FROM `rbac_permissions` WHERE `id` = 940; INSERT INTO `rbac_permissions` (`id`, `name`) VALUES (940, 'Command: group invites'); diff --git a/data/sql/updates/pending_db_world/rev_1782631139396176100.sql b/data/sql/updates/db_world/2026_07_18_03.sql similarity index 92% rename from data/sql/updates/pending_db_world/rev_1782631139396176100.sql rename to data/sql/updates/db_world/2026_07_18_03.sql index 49bec6f72..b84f4a1d8 100644 --- a/data/sql/updates/pending_db_world/rev_1782631139396176100.sql +++ b/data/sql/updates/db_world/2026_07_18_03.sql @@ -1,3 +1,4 @@ +-- DB update 2026_07_18_02 -> 2026_07_18_03 DELETE FROM `command` WHERE `name`='group invites'; INSERT INTO `command` (`name`, `security`, `help`) VALUES ('group invites', 2, 'Syntax: .group invites on|off\r\nEnable/disable accepting group invites.'); From 4ab4e9edb0886d1321dd38236dac40cff5e56eed Mon Sep 17 00:00:00 2001 From: sogladev Date: Sat, 18 Jul 2026 23:00:33 +0200 Subject: [PATCH 014/134] fix(Core/Spells): General Vezax' Corrupted Rage and Wisdom (#26677) --- .../game/Spells/SpellInfoCorrections.cpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/server/game/Spells/SpellInfoCorrections.cpp b/src/server/game/Spells/SpellInfoCorrections.cpp index e155138f6..416287cda 100644 --- a/src/server/game/Spells/SpellInfoCorrections.cpp +++ b/src/server/game/Spells/SpellInfoCorrections.cpp @@ -5208,6 +5208,24 @@ void SpellMgr::LoadSpellInfoCorrections() spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_DEST_CASTER); }); + // 68415 Corrupted Rage + ApplySpellFix({ 68415 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_1].SpellClassMask = flag96(0, 0x20000, 0); + }); + + // 31930 Judgements of the Wise + ApplySpellFix({ 31930 }, [](SpellInfo* spellInfo) + { + spellInfo->SpellFamilyFlags = flag96(0x200, 0, 0); + }); + + // 64646 Corrupted Wisdom + ApplySpellFix({ 64646 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_1].SpellClassMask = flag96(0x200, 0, 0); + }); + for (uint32 i = 0; i < GetSpellInfoStoreSize(); ++i) { SpellInfo* spellInfo = mSpellInfoMap[i]; From 9820fd9a9da329cd0b636eea4e6ead6c8329ecb1 Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Sat, 18 Jul 2026 18:24:47 -0300 Subject: [PATCH 015/134] fix(DB/Creature): Algalon the Observer melee damage too low (#26675) Co-authored-by: Claude Fable 5 --- data/sql/updates/pending_db_world/rev_1784397705121168200.sql | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1784397705121168200.sql diff --git a/data/sql/updates/pending_db_world/rev_1784397705121168200.sql b/data/sql/updates/pending_db_world/rev_1784397705121168200.sql new file mode 100644 index 000000000..d384034ac --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1784397705121168200.sql @@ -0,0 +1,4 @@ +-- Algalon the Observer: melee damage retuned to match Wrath Classic log data +-- and original-era on-plate values (~27k MH / ~15k OH per second on 25-man) +UPDATE `creature_template` SET `DamageModifier` = 190 WHERE `entry` = 32871; +UPDATE `creature_template` SET `DamageModifier` = 285 WHERE `entry` = 33070; From 8e4b2e937bd1f3164f146628b1d5e1035c319bb7 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 18 Jul 2026 21:26:06 +0000 Subject: [PATCH 016/134] chore(DB): import pending files Referenced commit(s): 9820fd9a9da329cd0b636eea4e6ead6c8329ecb1 --- .../rev_1784397705121168200.sql => db_world/2026_07_18_04.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1784397705121168200.sql => db_world/2026_07_18_04.sql} (87%) diff --git a/data/sql/updates/pending_db_world/rev_1784397705121168200.sql b/data/sql/updates/db_world/2026_07_18_04.sql similarity index 87% rename from data/sql/updates/pending_db_world/rev_1784397705121168200.sql rename to data/sql/updates/db_world/2026_07_18_04.sql index d384034ac..7615077e3 100644 --- a/data/sql/updates/pending_db_world/rev_1784397705121168200.sql +++ b/data/sql/updates/db_world/2026_07_18_04.sql @@ -1,3 +1,4 @@ +-- DB update 2026_07_18_03 -> 2026_07_18_04 -- Algalon the Observer: melee damage retuned to match Wrath Classic log data -- and original-era on-plate values (~27k MH / ~15k OH per second on 25-man) UPDATE `creature_template` SET `DamageModifier` = 190 WHERE `entry` = 32871; From 01b1fb6205a4286857f1834c71d051173e2077f1 Mon Sep 17 00:00:00 2001 From: mpfans Date: Sun, 19 Jul 2026 06:40:41 +0800 Subject: [PATCH 017/134] fix(Scripts/Creature): Tournament Training Dummy (#26521) --- src/server/scripts/Northrend/zone_icecrown.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/server/scripts/Northrend/zone_icecrown.cpp b/src/server/scripts/Northrend/zone_icecrown.cpp index 6b10781cc..00987f8eb 100644 --- a/src/server/scripts/Northrend/zone_icecrown.cpp +++ b/src/server/scripts/Northrend/zone_icecrown.cpp @@ -1532,6 +1532,8 @@ public: void Reset() override { + // EnterEvadeMode override leaves UNIT_STATE_EVADE set; clear it so the dummy stays attackable + me->ClearUnitState(UNIT_STATE_EVADE); me->SetControlled(true, UNIT_STATE_STUNNED); isVulnerable = false; From 37c723895ba5670a2343e92d2f1d0c91ab329844 Mon Sep 17 00:00:00 2001 From: sogladev Date: Sun, 19 Jul 2026 00:57:27 +0200 Subject: [PATCH 018/134] fix(Core/Player): Loot Chest eligibility and re-send loot rolls (#26469) --- src/server/game/Entities/Player/Player.cpp | 16 +++++ src/server/game/Groups/Group.cpp | 70 ++++++++++++++++++++-- src/server/game/Groups/Group.h | 1 + 3 files changed, 83 insertions(+), 4 deletions(-) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 0bd855652..bd68be918 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -7896,6 +7896,15 @@ void Player::SendLoot(ObjectGuid guid, LootType loot_type) // get next RR player (for next loot) if (groupRules && !go->loot.empty()) group->UpdateLooterGuid(go); + + if (groupRules) + { + GuidUnorderedSet const& allowedLooters = go->GetAllowedLooters(); + if (!allowedLooters.empty()) + for (ObjectGuid const& allowedGuid : allowedLooters) + if (Player* allowedPlayer = ObjectAccessor::FindPlayer(allowedGuid)) + loot->FillNotNormalLootFor(allowedPlayer); + } } if (GameObjectTemplateAddon const* addon = go->GetTemplateAddon()) loot->generateMoneyLoot(addon->mingold, addon->maxgold); @@ -11761,6 +11770,13 @@ void Player::SendInitialPacketsAfterAddToMap() } else if (GetRaidDifficulty() != GetStoredRaidDifficulty()) SendRaidDifficulty(GetGroup() != nullptr); + + // Re-send any pending group loot rolls to this player when they enter a dungeon/raid. + if (Map* map = GetMap()) + if (map->IsDungeon() || map->IsRaid()) + if (Group* group = GetGroup()) + group->SendPendingRollsToPlayer(this, map); + } void Player::SendUpdateToOutOfRangeGroupMembers() diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp index 23470aded..30167c3db 100644 --- a/src/server/game/Groups/Group.cpp +++ b/src/server/game/Groups/Group.cpp @@ -880,6 +880,50 @@ void Group::SendLootStartRoll(uint32 CountDown, uint32 mapid, const Roll& r) } } +void Group::SendPendingRollsToPlayer(Player* player, Map* map) +{ + for (Roll* roll : RollId) + { + auto itr = roll->playerVote.find(player->GetGUID()); + if (itr == roll->playerVote.end()) + continue; + + if (itr->second != NOT_EMITED_YET) + continue; + + Loot* loot = roll->getLoot(); + if (!loot) + continue; + + // Get remaining time from the loot source object + uint32 remainingTime = 60000; + WorldObject* lootedObject = nullptr; + if (GameObject* go = loot->sourceGameObject) + { + remainingTime = go->m_groupLootTimer; + lootedObject = go; + } + else if (!loot->sourceWorldObjectGUID.IsEmpty()) + { + if (Creature* creature = map->GetCreature(loot->sourceWorldObjectGUID)) + { + remainingTime = creature->m_groupLootTimer; + lootedObject = creature; + } + } + + bool canNeed = true; + if (GetLootMethod() == NEED_BEFORE_GREED) + { + ItemTemplate const* proto = sObjectMgr->GetItemTemplate(roll->itemid); + if (proto && lootedObject) + canNeed = (player->CanRollForItemInLFG(proto, lootedObject) == EQUIP_ERR_OK); + } + + SendLootStartRollToPlayer(remainingTime, map->GetId(), player, canNeed, *roll); + } +} + void Group::SendLootStartRollToPlayer(uint32 countDown, uint32 mapId, Player* p, bool canNeed, Roll const& r) { if (!p) @@ -1036,7 +1080,12 @@ void Group::GroupLoot(Loot* loot, WorldObject* pLootedObject) Player* member = itr->GetSource(); if (!member || !member->GetSession()) continue; - if (member->IsAtLootRewardDistance(pLootedObject)) + + bool canLoot = member->IsAtLootRewardDistance(pLootedObject); + if (!canLoot && !pLootedObject->GetAllowedLooters().empty()) + canLoot = pLootedObject->HasAllowedLooter(member->GetGUID()); + + if (canLoot) { r->totalPlayersRolling++; @@ -1122,7 +1171,11 @@ void Group::GroupLoot(Loot* loot, WorldObject* pLootedObject) if (!member || !member->GetSession()) continue; - if (member->IsAtLootRewardDistance(pLootedObject)) + bool canLoot = member->IsAtLootRewardDistance(pLootedObject); + if (!canLoot && !pLootedObject->GetAllowedLooters().empty()) + canLoot = pLootedObject->HasAllowedLooter(member->GetGUID()); + + if (canLoot) { r->totalPlayersRolling++; @@ -1186,7 +1239,11 @@ void Group::NeedBeforeGreed(Loot* loot, WorldObject* lootedObject) if (!playerToRoll || !playerToRoll->GetSession()) continue; - if (playerToRoll->IsAtGroupRewardDistance(lootedObject)) + bool canLoot = playerToRoll->IsAtGroupRewardDistance(lootedObject); + if (!canLoot && !lootedObject->GetAllowedLooters().empty()) + canLoot = lootedObject->HasAllowedLooter(playerToRoll->GetGUID()); + + if (canLoot) { r->totalPlayersRolling++; @@ -1335,6 +1392,7 @@ void Group::MasterLoot(Loot* loot, WorldObject* pLootedObject) } std::vector looters; + bool hasAllowedLooters = !pLootedObject->GetAllowedLooters().empty(); for (GroupReference* itr = GetFirstMember(); itr != nullptr; itr = itr->next()) { Player* looter = itr->GetSource(); @@ -1343,7 +1401,11 @@ void Group::MasterLoot(Loot* loot, WorldObject* pLootedObject) continue; } - if (looter->IsAtLootRewardDistance(pLootedObject)) + bool canLoot = looter->IsAtLootRewardDistance(pLootedObject); + if (!canLoot && hasAllowedLooters) + canLoot = pLootedObject->HasAllowedLooter(looter->GetGUID()); + + if (canLoot) { looters.push_back(looter); } diff --git a/src/server/game/Groups/Group.h b/src/server/game/Groups/Group.h index a59327485..8b020cb60 100644 --- a/src/server/game/Groups/Group.h +++ b/src/server/game/Groups/Group.h @@ -295,6 +295,7 @@ public: bool isRollLootActive() const; void SendLootStartRoll(uint32 CountDown, uint32 mapid, const Roll& r); void SendLootStartRollToPlayer(uint32 countDown, uint32 mapId, Player* p, bool canNeed, Roll const& r); + void SendPendingRollsToPlayer(Player* player, Map* map); void SendLootRoll(ObjectGuid SourceGuid, ObjectGuid TargetGuid, uint8 RollNumber, uint8 RollType, const Roll& r, bool autoPass = false); void SendLootRollWon(ObjectGuid SourceGuid, ObjectGuid TargetGuid, uint8 RollNumber, uint8 RollType, const Roll& r); void SendLootAllPassed(Roll const& roll); From c83cb5de7dcf4478b6aa0ba86b5683aabbb4b13d Mon Sep 17 00:00:00 2001 From: EricksOliveira Date: Sat, 18 Jul 2026 22:58:50 +0000 Subject: [PATCH 019/134] fix(Core/Player): Fixed some spells appearing as available at trainer when they are already known (#22678) Co-authored-by: Shauren * cherry-pick commit (https://github.com/TrinityCore/TrinityCore/commit/baebb2d602ca2f10159ea0039ec3a6d03155c3bd) --- src/server/game/Entities/Player/Player.cpp | 76 ++++++++++++++++++++-- src/server/game/Entities/Player/Player.h | 3 + 2 files changed, 75 insertions(+), 4 deletions(-) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index bd68be918..8728e5252 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -2841,6 +2841,66 @@ void Player::SendInitialSpells() SendDirectMessage(&data); } +void Player::SendUnlearnSpells() +{ + WorldPacket data(SMSG_SEND_UNLEARN_SPELLS, 4 + 4 * m_spells.size()); + + uint32 spellCount = 0; + size_t countPos = data.wpos(); + data << uint32(spellCount); + + for (auto const& itr : m_spells) + { + if (itr.second->State == PLAYERSPELL_REMOVED || itr.second->Active) + continue; + + auto skillLineAbilities = sSpellMgr->GetSkillLineAbilityMapBounds(itr.first); + if (skillLineAbilities.first == skillLineAbilities.second) + continue; + + // Client already hides ranks that have a superseding rank + bool hasSupercedingRank = false; + for (auto slaItr = skillLineAbilities.first; slaItr != skillLineAbilities.second; ++slaItr) + { + if (slaItr->second->SupercededBySpell) + { + hasSupercedingRank = true; + break; + } + } + if (hasSupercedingRank) + continue; + + uint32 nextRank = sSpellMgr->GetNextSpellInChain(itr.first); + if (!nextRank || !HasSpell(nextRank)) + continue; + + data << uint32(itr.first); + ++spellCount; + } + + data.put(countPos, spellCount); + SendDirectMessage(&data); +} + +bool Player::IsUnlearnNeededForSpell(uint32 spellId) +{ + SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(spellId); + if (spellInfo->IsRanked() && !spellInfo->IsStackableWithRanks()) + { + auto skillLineAbilities = sSpellMgr->GetSkillLineAbilityMapBounds(spellId); + if (skillLineAbilities.first != skillLineAbilities.second) + { + for (auto itr = skillLineAbilities.first; itr != skillLineAbilities.second; ++itr) + if (itr->second->SupercededBySpell) + return false; + + return true; + } + } + return false; +} + void Player::RemoveMail(uint32 id) { for (PlayerMails::iterator itr = m_mail.begin(); itr != m_mail.end(); ++itr) @@ -3066,6 +3126,10 @@ bool Player::addSpell(uint32 spellId, uint8 addSpecMask, bool updateActive, bool if (nextSpellInfo->GetRank() < spellInfo->GetRank()) { itr->second->Active = false; + + if (!isBeingLoaded() && IsUnlearnNeededForSpell(spellId)) + SendUnlearnSpells(); + if (IsInWorld()) { WorldPacket data(SMSG_SUPERCEDED_SPELL, 4 + 4); @@ -3080,6 +3144,10 @@ bool Player::addSpell(uint32 spellId, uint8 addSpecMask, bool updateActive, bool PlayerSpellMap::iterator itr2 = m_spells.find(spellInfo->Id); if (itr2 != m_spells.end()) itr2->second->Active = false; + + if (!isBeingLoaded() && IsUnlearnNeededForSpell(spellId)) + SendUnlearnSpells(); + return false; } } @@ -3087,6 +3155,9 @@ bool Player::addSpell(uint32 spellId, uint8 addSpecMask, bool updateActive, bool } } + if (!isBeingLoaded() && IsUnlearnNeededForSpell(spellId)) + SendUnlearnSpells(); + return true; } @@ -11628,10 +11699,7 @@ void Player::SendInitialPacketsBeforeAddToMap() SendDirectMessage(&data); SendInitialSpells(); - - data.Initialize(SMSG_SEND_UNLEARN_SPELLS, 4); - data << uint32(0); // count, for (count) uint32; - SendDirectMessage(&data); + SendUnlearnSpells(); SendInitialActionButtons(); m_reputationMgr->SendInitialReputations(); diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index bfd7491bb..140fee652 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1664,6 +1664,9 @@ public: void UpdateNextMailTimeAndUnreads(); void AddNewMailDeliverTime(time_t deliver_time); + void SendUnlearnSpells(); + static bool IsUnlearnNeededForSpell(uint32 spellId); + void RemoveMail(uint32 id); void AddMail(Mail* mail) { m_mail.push_front(mail); }// for call from WorldSession::SendMailTo From b391cfc8cd483cd5d4278b45241a17a448338245 Mon Sep 17 00:00:00 2001 From: Ryan Turner <16946913+TheSCREWEDSoftware@users.noreply.github.com> Date: Sun, 19 Jul 2026 00:04:40 +0100 Subject: [PATCH 020/134] chore(CI/Labeler): expand auto-label coverage for PRs (#24089) Co-authored-by: FlyingArowana Co-authored-by: sudlud --- .github/labeler.yml | 46 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 42 insertions(+), 4 deletions(-) diff --git a/.github/labeler.yml b/.github/labeler.yml index 55a71d605..e4f1495f3 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -1,6 +1,6 @@ file-cpp: - changed-files: - - any-glob-to-any-file: + - any-glob-to-any-file: - 'src/**/*.cpp' - 'src/**/*.h' - 'deps/**/*.cpp' @@ -25,10 +25,11 @@ CORE: Script: - changed-files: - - any-glob-to-any-file: + - any-glob-to-any-file: - 'src/server/scripts/**/*.cpp' - 'src/server/scripts/**/*.h' + UnitTests: - changed-files: - any-glob-to-any-file: 'src/test/**/*' @@ -39,7 +40,7 @@ Documentation: Bash: - changed-files: - - any-glob-to-any-file: + - any-glob-to-any-file: - '*.sh' - 'apps/**/*.sh' - 'conf/**/*.sh' @@ -48,7 +49,17 @@ Bash: CMake: - changed-files: - - any-glob-to-any-file: '**/*.cmake' + - any-glob-to-any-file: + - '**/*.cmake' + - '**/CMakeLists.txt' + +Platform-Docker: +- changed-files: + - any-glob-to-any-file: + - '**/Dockerfile*' + - '**/docker-compose.yml' + - '**/docker-compose.*.yml' + - '**/docker/**/*' Workflow: - changed-files: @@ -57,3 +68,30 @@ Workflow: Batch: - changed-files: - any-glob-to-any-file: 'apps/**/*.bat' + +Config: +- changed-files: + - any-glob-to-any-file: + - '**/*.json' + - '**/*.yml' + - '**/*.yaml' + - '!**/docker-compose*.yml' + - '!**/docker-compose*.yaml' + - '**/*.conf' + - '**/*.cfg' + - '**/*.nix' + +Utilities: +- changed-files: + - any-glob-to-any-file: + - '**/*.py' + - '**/*.php' + - '**/*.ts' + +MMAPs: +- changed-files: + - any-glob-to-any-file: 'src/common/Collision/Maps/MapDefines.h' + +VMAPs: +- changed-files: + - any-glob-to-any-file: 'src/common/Collision/VMapDefinitions.h' From 92bc564d883742ff12c6838bdeeca387e9762304 Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Sat, 18 Jul 2026 21:23:51 -0300 Subject: [PATCH 021/134] fix(Core/Players): charmed players cast highest known spell rank (#26674) Co-authored-by: Claude Opus 4.8 --- src/server/game/Entities/Player/Player.cpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 8728e5252..47d095b17 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -15838,6 +15838,24 @@ void Player::PrepareCharmAISpells() } } } + + // The selection above can leave a lower rank of a spell chain in a slot (e.g. the + // secondary damage slot for a caster whose top spells are ranks of one chain). While + // charmed the player should cast the highest rank it knows, so walk each slot up its + // chain to the top learned rank. + for (uint32& charmSpellId : m_charmAISpells) + { + if (!charmSpellId) + continue; + + while (uint32 nextRank = sSpellMgr->GetNextSpellInChain(charmSpellId)) + { + if (!HasActiveSpell(nextRank)) + break; + + charmSpellId = nextRank; + } + } } void Player::AddRefundReference(ObjectGuid itemGUID) From 11747f6a5022aec120ceedd8fd86dd409d23e224 Mon Sep 17 00:00:00 2001 From: Benjamin Jackson <38561765+heyitsbench@users.noreply.github.com> Date: Sun, 19 Jul 2026 06:27:43 -0400 Subject: [PATCH 022/134] fix(Core/Transports): Exclude out of world players from receiving transport creations/removes. (#26680) Co-authored-by: Claude --- src/server/game/Handlers/MovementHandler.cpp | 9 +++++++++ src/server/game/Maps/Map.cpp | 9 +++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/server/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp index 46140f5a4..d809747c5 100644 --- a/src/server/game/Handlers/MovementHandler.cpp +++ b/src/server/game/Handlers/MovementHandler.cpp @@ -35,6 +35,7 @@ #include "ScriptMgr.h" #include "SpellAuras.h" #include "Transport.h" +#include "UpdateData.h" #include "Vehicle.h" #include "WaypointMovementGenerator.h" #include "WorldPacket.h" @@ -129,6 +130,14 @@ void WorldSession::HandleMoveWorldportAck() if (Transport* t = _player->GetTransport()) if (!t->IsInMap(_player)) { + // Client was never told to destroy its own transport + // Destroy it now or it keeps a phantom copy of the transport on the new map + UpdateData transData; + t->BuildOutOfRangeUpdateBlock(&transData); + WorldPacket packet; + transData.BuildPacket(packet); + _player->SendDirectMessage(&packet); + t->RemovePassenger(_player); _player->m_transport = nullptr; _player->m_movementInfo.transport.Reset(); diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index 13b4e1bfb..b47e4c5fc 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -376,9 +376,12 @@ bool Map::AddToMap(Transport* obj, bool /*checkTransport*/) _transports.insert(obj); // Broadcast creation to players + // Skip players that are not in world. Sending the create to their loading client + // could materialize a lingering transport on whatever map they are teleporting to. + // They get the correct transport list from SendInitTransports when added to their new map for (Map::PlayerList::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) { - if (itr->GetSource()->GetTransport() != obj) + if (itr->GetSource()->IsInWorld() && itr->GetSource()->GetTransport() != obj) { UpdateData data; obj->BuildCreateUpdateBlockForPlayer(&data, itr->GetSource()); @@ -761,8 +764,10 @@ void Map::RemoveFromMap(Transport* obj, bool remove) obj->BuildOutOfRangeUpdateBlock(&data); WorldPacket packet; data.BuildPacket(packet); + // Skip players that are not in world + // Their client already received the destroy from SendRemoveTransports when leaving this map for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) - if (itr->GetSource()->GetTransport() != obj) + if (itr->GetSource()->IsInWorld() && itr->GetSource()->GetTransport() != obj) itr->GetSource()->SendDirectMessage(&packet); } From 49b1db6df71b1e377aab2ccc3ff43a895a7c2596 Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Sun, 19 Jul 2026 07:51:55 -0300 Subject: [PATCH 023/134] fix(Scripts/ICC): port Valithria Risen Archmage summon groups from TrinityCore (#26682) Co-authored-by: Keader Co-authored-by: sirikfoll <11219553+sirikfoll@users.noreply.github.com> Co-authored-by: ForesterDev <11771800+ForesterDev@users.noreply.github.com> Co-authored-by: Treeston Co-authored-by: Claude Opus 4.8 --- .../rev_1784423027068230400.sql | 14 +++++ .../boss_valithria_dreamwalker.cpp | 54 +++++++++---------- 2 files changed, 41 insertions(+), 27 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1784423027068230400.sql diff --git a/data/sql/updates/pending_db_world/rev_1784423027068230400.sql b/data/sql/updates/pending_db_world/rev_1784423027068230400.sql new file mode 100644 index 000000000..955e66469 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1784423027068230400.sql @@ -0,0 +1,14 @@ +-- +-- Valithria Dreamwalker: turn the initial Risen Archmages (37868) from persistent +-- creature spawns into summon groups on the Green Dragon Combat Trigger (38752). +-- As permanent spawns they carried the world default 7-day respawn, so they failed to +-- return on encounter reset. Ported from TrinityCore (Keader, PR #22754). +DELETE FROM `creature` WHERE `id` = 37868; +DELETE FROM `creature_summon_groups` WHERE `summonerId` = 38752 AND `entry` = 37868; +INSERT INTO `creature_summon_groups` (`summonerId`, `summonerType`, `groupId`, `entry`, `position_x`, `position_y`, `position_z`, `orientation`, `summonType`, `summonTime`, `Comment`) VALUES +(38752, 0, 1, 37868, 4222.86, 2504.58, 364.96, 3.90954, 8, 0, 'Risen Archmage'), +(38752, 0, 1, 37868, 4223.4, 2465.11, 364.952, 2.3911, 8, 0, 'Risen Archmage'), +(38752, 0, 2, 37868, 4230.44, 2478.56, 364.953, 2.93215, 8, 0, 'Risen Archmage'), +(38752, 0, 2, 37868, 4230.53, 2490.22, 364.957, 3.36849, 8, 0, 'Risen Archmage'), +(38752, 0, 3, 37868, 4185.29, 2464.01, 364.87, 0.798137, 8, 0, 'Risen Archmage'), +(38752, 0, 3, 37868, 4183.7, 2503.93, 364.879, 5.50843, 8, 0, 'Risen Archmage'); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp index 74fbddb7f..aaa11b90c 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp @@ -139,24 +139,21 @@ enum Events enum Actions { - ACTION_ENTER_COMBAT = 1, - MISSED_PORTALS = 2, - ACTION_DEATH = 3, + ACTION_ENTER_COMBAT = 1, + MISSED_PORTALS = 2, + ACTION_DEATH = 3, + ACTION_SETUP_ARCHMAGES = 4, +}; + +enum SummonGroups +{ + SUMMON_GROUP_ALL = 1, + SUMMON_GROUP_10 = 2, + SUMMON_GROUP_25 = 3, }; Position const ValithriaSpawnPos = {4210.813f, 2484.443f, 364.9558f, 0.01745329f}; -class RisenArchmageCheck -{ -public: - // look for all permanently spawned Risen Archmages that are not yet in combat - bool operator()(Creature* creature) - { - return creature->IsAlive() && creature->GetEntry() == NPC_RISEN_ARCHMAGE && - creature->GetSpawnId() && !creature->IsInCombat(); - } -}; - struct ManaVoidSelector { public: @@ -249,12 +246,8 @@ public: creature->DespawnOrUnsummon(); return; case NPC_RISEN_ARCHMAGE: - if (!creature->GetSpawnId()) - { - creature->DespawnOrUnsummon(); - return; - } - break; + creature->DespawnOrUnsummon(); + return; default: return; } @@ -498,6 +491,16 @@ public: { _Reset(); me->SetReactState(REACT_PASSIVE); + summons.DespawnAll(); + + me->SummonCreatureGroup(SUMMON_GROUP_ALL); + if (Is25ManRaid()) + me->SummonCreatureGroup(SUMMON_GROUP_25); + else + me->SummonCreatureGroup(SUMMON_GROUP_10); + + EntryCheckPredicate pred(NPC_RISEN_ARCHMAGE); + summons.DoAction(ACTION_SETUP_ARCHMAGES, pred); } void JustEnteredCombat(Unit* target) override @@ -522,12 +525,8 @@ public: if (Creature* lichKing = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_VALITHRIA_LICH_KING))) lichKing->AI()->DoAction(ACTION_ENTER_COMBAT); - std::list archmages; - RisenArchmageCheck check; - Acore::CreatureListSearcher searcher(me, archmages, check); - Cell::VisitObjects(me, searcher, 100.0f); - for (std::list::iterator itr = archmages.begin(); itr != archmages.end(); ++itr) - (*itr)->AI()->DoAction(ACTION_ENTER_COMBAT); + EntryCheckPredicate pred(NPC_RISEN_ARCHMAGE); + summons.DoAction(ACTION_ENTER_COMBAT, pred); } void MoveInLineOfSight(Unit* /*who*/) override {} @@ -675,7 +674,6 @@ public: _events.ScheduleEvent(EVENT_FROSTBOLT_VOLLEY, 5s, 15s); _events.ScheduleEvent(EVENT_MANA_VOID, 20s, 25s); _events.ScheduleEvent(EVENT_COLUMN_OF_FROST, 10s, 20s); - _isInitialArchmage = me->GetSpawnId() != 0; } void JustEnteredCombat(Unit* who) override @@ -701,6 +699,8 @@ public: { if (action == ACTION_ENTER_COMBAT) DoZoneInCombat(); + else if (action == ACTION_SETUP_ARCHMAGES) + _isInitialArchmage = true; } void JustSummoned(Creature* summon) override From 98b06f672339919276008b0193eaea6d9cff74a3 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 19 Jul 2026 10:53:11 +0000 Subject: [PATCH 024/134] chore(DB): import pending files Referenced commit(s): 49b1db6df71b1e377aab2ccc3ff43a895a7c2596 --- .../rev_1784423027068230400.sql => db_world/2026_07_19_00.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1784423027068230400.sql => db_world/2026_07_19_00.sql} (96%) diff --git a/data/sql/updates/pending_db_world/rev_1784423027068230400.sql b/data/sql/updates/db_world/2026_07_19_00.sql similarity index 96% rename from data/sql/updates/pending_db_world/rev_1784423027068230400.sql rename to data/sql/updates/db_world/2026_07_19_00.sql index 955e66469..15efeb318 100644 --- a/data/sql/updates/pending_db_world/rev_1784423027068230400.sql +++ b/data/sql/updates/db_world/2026_07_19_00.sql @@ -1,3 +1,4 @@ +-- DB update 2026_07_18_04 -> 2026_07_19_00 -- -- Valithria Dreamwalker: turn the initial Risen Archmages (37868) from persistent -- creature spawns into summon groups on the Green Dragon Combat Trigger (38752). From f839009e9ad26651126f0c592d9f7f4cd914a28c Mon Sep 17 00:00:00 2001 From: Anton Popovichenko Date: Sun, 19 Jul 2026 13:34:04 +0200 Subject: [PATCH 025/134] fix(Core/MMaps): fix Blade's Edge Arena falling/edge pathing (bump mmap version to 20) (#25720) --- apps/installer/includes/functions.sh | 2 +- src/common/Collision/Maps/MapDefines.h | 2 +- src/server/game/Maps/AreaDefines.h | 1 + .../MovementGenerators/PathGenerator.cpp | 106 +++++++++++++++++- src/tools/mmaps_generator/Config.cpp | 19 +++- src/tools/mmaps_generator/Config.h | 4 + src/tools/mmaps_generator/Info/readme.txt | 5 - src/tools/mmaps_generator/MapBuilder.cpp | 8 +- src/tools/mmaps_generator/MapBuilder.h | 2 - src/tools/mmaps_generator/PathGenerator.cpp | 14 +-- src/tools/mmaps_generator/TerrainBuilder.cpp | 41 +++---- src/tools/mmaps_generator/TerrainBuilder.h | 2 +- src/tools/mmaps_generator/mmaps-config.yaml | 21 +++- 13 files changed, 168 insertions(+), 59 deletions(-) diff --git a/apps/installer/includes/functions.sh b/apps/installer/includes/functions.sh index 7f179e5c1..fce8cdb44 100644 --- a/apps/installer/includes/functions.sh +++ b/apps/installer/includes/functions.sh @@ -155,7 +155,7 @@ function inst_simple_restarter { function inst_download_client_data { # change the following version when needed - local VERSION=v19 + local VERSION=v20 echo "#######################" echo "Client data downloader" diff --git a/src/common/Collision/Maps/MapDefines.h b/src/common/Collision/Maps/MapDefines.h index a3527f16c..8f61275f2 100644 --- a/src/common/Collision/Maps/MapDefines.h +++ b/src/common/Collision/Maps/MapDefines.h @@ -26,7 +26,7 @@ #define SIZE_OF_GRIDS 533.3333f #define MMAP_MAGIC 0x4d4d4150 // 'MMAP' -#define MMAP_VERSION 19 +#define MMAP_VERSION 20 struct MmapTileRecastConfig { diff --git a/src/server/game/Maps/AreaDefines.h b/src/server/game/Maps/AreaDefines.h index be844f3c9..f722edd00 100644 --- a/src/server/game/Maps/AreaDefines.h +++ b/src/server/game/Maps/AreaDefines.h @@ -236,6 +236,7 @@ enum MapIDs : uint32 MAP_AUCHINDOUN_MANA_TOMBS = 557, MAP_AUCHINDOUN_AUCHENAI_CRYPTS = 558, MAP_THE_ESCAPE_FROM_DURNHOLDE = 560, + MAP_BLADES_EDGE_ARENA = 562, MAP_BLACK_TEMPLE = 564, MAP_GRUULS_LAIR = 565, MAP_EYE_OF_THE_STORM = 566, diff --git a/src/server/game/Movement/MovementGenerators/PathGenerator.cpp b/src/server/game/Movement/MovementGenerators/PathGenerator.cpp index 607428cb6..9f92d18f4 100644 --- a/src/server/game/Movement/MovementGenerators/PathGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/PathGenerator.cpp @@ -24,6 +24,104 @@ #include "Map.h" #include "Metric.h" +// Blades Edge Arena Ropes normalization +namespace +{ + constexpr float BLADE_EDGE_ROPE_SNAP_DIST = 1.5f; + constexpr float BLADE_EDGE_ROPE_SNAP_DIST2 = BLADE_EDGE_ROPE_SNAP_DIST * BLADE_EDGE_ROPE_SNAP_DIST; + + struct BladeEdgeArenaRope + { + G3D::Vector3 Start; + G3D::Vector3 End; + float Sag; + }; + + static const std::array BladeEdgeArenaRopes = + {{ + { + {6243.1523f, 267.53094f, 10.929295f}, + {6245.9717f, 271.29346f, 10.879172f}, + 0.43f + }, + { + {6234.3213f, 256.29733f, 11.002348f}, + {6231.3247f, 252.58781f, 10.976968f}, + 0.46f + } + }}; + + bool IsOutsideExpandedXYBounds(G3D::Vector3 const& point, BladeEdgeArenaRope const& rope) + { + float const minX = std::min(rope.Start.x, rope.End.x) - BLADE_EDGE_ROPE_SNAP_DIST; + float const maxX = std::max(rope.Start.x, rope.End.x) + BLADE_EDGE_ROPE_SNAP_DIST; + float const minY = std::min(rope.Start.y, rope.End.y) - BLADE_EDGE_ROPE_SNAP_DIST; + float const maxY = std::max(rope.Start.y, rope.End.y) + BLADE_EDGE_ROPE_SNAP_DIST; + + return point.x < minX || point.x > maxX || point.y < minY || point.y > maxY; + } + + bool GetClosestPointOnBladeEdgeArenaRope(G3D::Vector3 const& point, BladeEdgeArenaRope const& rope, G3D::Vector3& closestPoint) + { + G3D::Vector3 const ropeVector = rope.End - rope.Start; + + float const ropeLength2XY = ropeVector.x * ropeVector.x + ropeVector.y * ropeVector.y; + if (ropeLength2XY < 0.00001f) + return false; + + G3D::Vector3 const pointVector = point - rope.Start; + + float t = (pointVector.x * ropeVector.x + pointVector.y * ropeVector.y) / ropeLength2XY; + t = std::clamp(t, 0.0f, 1.0f); + + float const closestX = rope.Start.x + ropeVector.x * t; + float const closestY = rope.Start.y + ropeVector.y * t; + + float const dx = point.x - closestX; + float const dy = point.y - closestY; + + // If the point is already too far in XY, it cannot be within the 3D snap radius. + if (dx * dx + dy * dy >= BLADE_EDGE_ROPE_SNAP_DIST2) + return false; + + float const linearZ = rope.Start.z + (rope.End.z - rope.Start.z) * t; + float const sagZ = rope.Sag * std::sin(M_PI * t); + + closestPoint = { closestX, closestY, linearZ - sagZ }; + return true; + } + + bool TrySnapToBladeEdgeArenaRope(G3D::Vector3& point) + { + bool snapped = false; + float bestDist2 = BLADE_EDGE_ROPE_SNAP_DIST2; + G3D::Vector3 bestPoint; + + for (BladeEdgeArenaRope const& rope : BladeEdgeArenaRopes) + { + if (IsOutsideExpandedXYBounds(point, rope)) + continue; + + G3D::Vector3 closestPoint; + if (!GetClosestPointOnBladeEdgeArenaRope(point, rope, closestPoint)) + continue; + + float const dist2 = (point - closestPoint).squaredLength(); + if (dist2 < bestDist2) + { + bestDist2 = dist2; + bestPoint = closestPoint; + snapped = true; + } + } + + if (snapped) + point = bestPoint; + + return snapped; + } +} + ////////////////// PathGenerator ////////////////// PathGenerator::PathGenerator(WorldObject const* owner) : _polyLength(0), _type(PATHFIND_BLANK), _useStraightPath(false), _forceDestination(false), @@ -622,9 +720,13 @@ void PathGenerator::BuildPointPath(const float* startPoint, const float* endPoin void PathGenerator::NormalizePath() { - for (uint32 i = 0; i < _pathPoints.size(); ++i) + bool const snapBladeEdgeArenaRopes = _source->GetMapId() == MAP_BLADES_EDGE_ARENA; + for (G3D::Vector3& point : _pathPoints) { - _source->UpdateAllowedPositionZ(_pathPoints[i].x, _pathPoints[i].y, _pathPoints[i].z); + if (snapBladeEdgeArenaRopes && TrySnapToBladeEdgeArenaRope(point)) + continue; + + _source->UpdateAllowedPositionZ(point.x, point.y, point.z); } } diff --git a/src/tools/mmaps_generator/Config.cpp b/src/tools/mmaps_generator/Config.cpp index dabdb0f0d..6dacd579f 100644 --- a/src/tools/mmaps_generator/Config.cpp +++ b/src/tools/mmaps_generator/Config.cpp @@ -191,6 +191,15 @@ namespace MMAP tryBoolean(mmapsNode, "skipBattlegrounds", _skipBattlegrounds); tryBoolean(mmapsNode, "debugOutput", _debugOutput); + if (mmapsNode.contains("offmeshConnections") && mmapsNode["offmeshConnections"].is_sequence()) + { + _offmeshConnections = mmapsNode["offmeshConnections"].get_value>(); + } + else + { + _offmeshConnections.clear(); + } + std::string dataDirPath; tryString(mmapsNode, "dataDir", dataDirPath); _dataDir = dataDirPath; @@ -202,8 +211,8 @@ namespace MMAP tryInt(mmapsNode, "walkableHeight", _global.walkableHeight); tryInt(mmapsNode, "walkableClimb", _global.walkableClimb); tryInt(mmapsNode, "walkableRadius", _global.walkableRadius); - tryInt(mmapsNode, "vertexPerMapEdge", _global.vertexPerMapEdge); - tryInt(mmapsNode, "vertexPerTileEdge", _global.vertexPerTileEdge); + tryInt(mmapsNode, "verticesPerMapEdge", _global.vertexPerMapEdge); + tryInt(mmapsNode, "verticesPerTileEdge", _global.vertexPerTileEdge); tryFloat(mmapsNode, "maxSimplificationError", _global.maxSimplificationError); // Map overrides @@ -225,8 +234,10 @@ namespace MMAP override.walkableHeight = mapNode["walkableHeight"].get_value(); if (mapNode.contains("walkableClimb")) override.walkableClimb = mapNode["walkableClimb"].get_value(); - if (mapNode.contains("vertexPerMapEdge")) - override.vertexPerMapEdge = mapNode["vertexPerMapEdge"].get_value(); + if (mapNode.contains("verticesPerMapEdge")) + override.vertexPerMapEdge = mapNode["verticesPerMapEdge"].get_value(); + if (mapNode.contains("verticesPerTileEdge")) + override.vertexPerTileEdge = mapNode["verticesPerTileEdge"].get_value(); if (mapNode.contains("cellSizeHorizontal")) override.cellSizeHorizontal = mapNode["cellSizeHorizontal"].get_value(); if (mapNode.contains("cellSizeVertical")) diff --git a/src/tools/mmaps_generator/Config.h b/src/tools/mmaps_generator/Config.h index c97fa7999..d214450cc 100644 --- a/src/tools/mmaps_generator/Config.h +++ b/src/tools/mmaps_generator/Config.h @@ -76,6 +76,8 @@ namespace MMAP std::string MMapsPath() const { return (_dataDir / "mmaps").string(); } std::string DataDirPath() const { return _dataDir.string(); } + std::vector const& OffMeshConnections() const { return _offmeshConnections; } + private: explicit Config(); @@ -153,6 +155,8 @@ namespace MMAP bool _debugOutput; std::filesystem::path _dataDir; + + std::vector _offmeshConnections; }; } diff --git a/src/tools/mmaps_generator/Info/readme.txt b/src/tools/mmaps_generator/Info/readme.txt index c0702d50c..c6750aced 100644 --- a/src/tools/mmaps_generator/Info/readme.txt +++ b/src/tools/mmaps_generator/Info/readme.txt @@ -6,11 +6,6 @@ Generator command line args --threads [#] Max number of threads used by the generator Default: 3 ---offMeshInput [file.*] Path to file containing off mesh connections data. - Format must be: (see offmesh_example.txt) - "map_id tile_x,tile_y (start_x start_y start_z) (end_x end_y end_z) size //optional comments" - Single mesh connection per line. - --silent [] Make us script friendly. Do not wait for user input on error or completion. diff --git a/src/tools/mmaps_generator/MapBuilder.cpp b/src/tools/mmaps_generator/MapBuilder.cpp index 45c71367b..bd02d235c 100644 --- a/src/tools/mmaps_generator/MapBuilder.cpp +++ b/src/tools/mmaps_generator/MapBuilder.cpp @@ -55,10 +55,9 @@ namespace MMAP m_workerThread.join(); } - MapBuilder::MapBuilder(Config* config, int mapid, const char* offMeshFilePath, unsigned int threads) : + MapBuilder::MapBuilder(Config* config, int mapid, unsigned int threads) : m_config (config), m_debugOutput (config->IsDebugOutputEnabled()), - m_offMeshFilePath (offMeshFilePath), m_threads (threads), m_skipContinents (config->ShouldSkipContinents()), m_skipJunkMaps (config->ShouldSkipJunkMaps()), @@ -497,8 +496,7 @@ namespace MMAP // get bounds of current tile float bmin[3], bmax[3]; m_mapBuilder->getTileBounds(tileX, tileY, allVerts.getCArray(), allVerts.size() / 3, bmin, bmax); - - m_terrainBuilder->loadOffMeshConnections(mapID, tileX, tileY, meshData, m_mapBuilder->m_offMeshFilePath); + m_terrainBuilder->loadOffMeshConnections(mapID, tileX, tileY, meshData, m_mapBuilder->getConfig().OffMeshConnections()); // build navmesh tile buildMoveMapTile(mapID, tileX, tileY, meshData, bmin, bmax, navMesh); @@ -818,7 +816,7 @@ namespace MMAP } if (params.vertCount >= 0xffff) { - printf("%s Too many vertices! \n", tileString); + printf("%s Too many vertices! %d out of %d! \n", tileString, params.vertCount, 0xffff); break; } if (!params.vertCount || !params.verts) diff --git a/src/tools/mmaps_generator/MapBuilder.h b/src/tools/mmaps_generator/MapBuilder.h index 313c88c52..12ffab06b 100644 --- a/src/tools/mmaps_generator/MapBuilder.h +++ b/src/tools/mmaps_generator/MapBuilder.h @@ -125,7 +125,6 @@ namespace MMAP public: MapBuilder(Config* config, int mapid, - char const* offMeshFilePath, unsigned int threads); ~MapBuilder(); @@ -167,7 +166,6 @@ namespace MMAP bool m_debugOutput; - const char* m_offMeshFilePath; unsigned int m_threads; bool m_skipContinents; bool m_skipJunkMaps; diff --git a/src/tools/mmaps_generator/PathGenerator.cpp b/src/tools/mmaps_generator/PathGenerator.cpp index b7fa572c1..581bb153b 100644 --- a/src/tools/mmaps_generator/PathGenerator.cpp +++ b/src/tools/mmaps_generator/PathGenerator.cpp @@ -63,7 +63,6 @@ bool handleArgs(int argc, char** argv, int& tileY, std::string& configFilePath, bool& silent, - char*& offMeshInputPath, char*& file, unsigned int& threads) { @@ -120,14 +119,6 @@ bool handleArgs(int argc, char** argv, { silent = true; } - else if (strcmp(argv[i], "--offMeshInput") == 0) - { - param = argv[++i]; - if (!param) - return false; - - offMeshInputPath = param; - } else { int map = atoi(argv[i]); @@ -174,11 +165,10 @@ int main(int argc, char** argv) int mapnum = -1; int tileX = -1, tileY = -1; bool silent = false; - char* offMeshInputPath = nullptr; char* file = nullptr; std::string configFilePath = "mmaps-config.yaml"; bool validParam = handleArgs(argc, argv, mapnum, - tileX, tileY, configFilePath, silent, offMeshInputPath, file, threads); + tileX, tileY, configFilePath, silent, file, threads); if (!validParam) return silent ? -1 : finish("You have specified invalid parameters", -1); @@ -202,7 +192,7 @@ int main(int argc, char** argv) if (!checkDirectories(config->DataDirPath(), config->IsDebugOutputEnabled())) return silent ? -3 : finish("Press ENTER to close...", -3); - MapBuilder builder(&config.value(), mapnum, offMeshInputPath, threads); + MapBuilder builder(&config.value(), mapnum, threads); uint32 start = getMSTime(); if (file) diff --git a/src/tools/mmaps_generator/TerrainBuilder.cpp b/src/tools/mmaps_generator/TerrainBuilder.cpp index c85a7933e..5b27f40ce 100644 --- a/src/tools/mmaps_generator/TerrainBuilder.cpp +++ b/src/tools/mmaps_generator/TerrainBuilder.cpp @@ -927,30 +927,29 @@ namespace MMAP } /**************************************************************************/ - void TerrainBuilder::loadOffMeshConnections(uint32 mapID, uint32 tileX, uint32 tileY, MeshData& meshData, const char* offMeshFilePath) + void TerrainBuilder::loadOffMeshConnections(uint32 mapID, uint32 tileX, uint32 tileY, + MeshData& meshData, + const std::vector& offMeshLines) { - // no meshfile input given? - if (!offMeshFilePath) + if (offMeshLines.empty()) return; - FILE* fp = fopen(offMeshFilePath, "rb"); - if (!fp) - { - printf(" loadOffMeshConnections:: input file %s not found!\n", offMeshFilePath); - return; - } - - // pretty silly thing, as we parse entire file and load only the tile we need - // but we don't expect this file to be too large - char* buf = new char[512]; - while (fgets(buf, 512, fp)) + for (const std::string& line : offMeshLines) { float p0[3], p1[3]; uint32 mid, tx, ty; float size; - if (sscanf(buf, "%u %u,%u (%f %f %f) (%f %f %f) %f", &mid, &tx, &ty, - &p0[0], &p0[1], &p0[2], &p1[0], &p1[1], &p1[2], &size) != 10) + + if (sscanf(line.c_str(), + "%u %u,%u (%f %f %f) (%f %f %f) %f", + &mid, &tx, &ty, + &p0[0], &p0[1], &p0[2], + &p1[0], &p1[1], &p1[2], + &size) != 10) + { + printf("Skipped off-mesh connection '%s': invalid format\n", line.c_str()); continue; + } if (mapID == mid && tileX == tx && tileY == ty) { @@ -962,15 +961,11 @@ namespace MMAP meshData.offMeshConnections.append(p1[2]); meshData.offMeshConnections.append(p1[0]); - meshData.offMeshConnectionDirs.append(1); // 1 - both direction, 0 - one sided - meshData.offMeshConnectionRads.append(size); // agent size equivalent - // can be used same way as polygon flags + meshData.offMeshConnectionDirs.append(1); // 1 - both direction, 0 - one sided + meshData.offMeshConnectionRads.append(size); // agent radius equivalent meshData.offMeshConnectionsAreas.append((unsigned char)0xFF); - meshData.offMeshConnectionsFlags.append((unsigned short)0xFF); // all movement masks can make this path + meshData.offMeshConnectionsFlags.append((unsigned short)0xFF); } } - - delete [] buf; - fclose(fp); } } diff --git a/src/tools/mmaps_generator/TerrainBuilder.h b/src/tools/mmaps_generator/TerrainBuilder.h index 63c21fe08..04d0e78a5 100644 --- a/src/tools/mmaps_generator/TerrainBuilder.h +++ b/src/tools/mmaps_generator/TerrainBuilder.h @@ -83,7 +83,7 @@ namespace MMAP void loadMap(uint32 mapID, uint32 tileX, uint32 tileY, MeshData& meshData); bool loadVMap(uint32 mapID, uint32 tileX, uint32 tileY, MeshData& meshData); - void loadOffMeshConnections(uint32 mapID, uint32 tileX, uint32 tileY, MeshData& meshData, const char* offMeshFilePath); + void loadOffMeshConnections(uint32 mapID, uint32 tileX, uint32 tileY, MeshData& meshData, const std::vector& offMeshLines); [[nodiscard]] bool usesLiquids() const { return !m_skipLiquid; } diff --git a/src/tools/mmaps_generator/mmaps-config.yaml b/src/tools/mmaps_generator/mmaps-config.yaml index 7adcee64c..49187c5b9 100644 --- a/src/tools/mmaps_generator/mmaps-config.yaml +++ b/src/tools/mmaps_generator/mmaps-config.yaml @@ -9,6 +9,24 @@ mmapsConfig: # and is also where the "mmaps" folder will be created or located. dataDir: "./" + # Off-mesh connections define manual navigation links that are not part of the generated navmesh. + # They are used to connect two arbitrary points in the world where normal pathfinding cannot reach, + # such as jumps, ropes, ladders, teleports, elevators, or special scripted movement paths. + # + # Format: + # mapID tileX,tileY (start_x start_y start_z) (end_x end_y end_z) size + # + # Fields: + # mapID - Map identifier where this connection exists. + # tileX,tileY- Navmesh tile coordinates the connection belongs to. + # start - World position where the connection begins. + # end - World position where the connection ends. + # size - Effective radius of the connection (agent clearance / usability width). + offmeshConnections: + # Make Blades Edge Arena Ropes wider + - "562 31,20 (6234.474121 256.563721 11.063726) (6230.162598 251.681976 11.199670) 2.1" + - "562 31,20 (6242.273926 266.697540 11.090456) (6246.688965 272.064819 11.235604) 2.1" + meshSettings: # Here we have global config for recast navigation. # It's possible to override these data on map or tile level (see mapsOverrides). @@ -106,9 +124,6 @@ mmapsConfig: # All parameters defined globally are eligible for override. # Just specify the parameter name and new value in the override section. mapsOverrides: - "562": # Blade's Edge Arena - walkableRadius: 0 # This allows walking on the ropes to the pillars - "48": # Blackfathom Deeps cellSizeVertical: 0.5334 # ch*2 = 0.2667 * 2 ≈ 0.5334. Reduce the chance to have underground levels. From 37ac84e71b5fdff6ec8dc9adbd16a4b3676b84ac Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Sun, 19 Jul 2026 08:37:12 -0300 Subject: [PATCH 026/134] fix(Scripts/Ulduar): Mimiron Rocket Strike prefers ranged players (#26685) Co-authored-by: Unholychick Co-authored-by: Claude Opus 4.8 --- .../rev_1784434823383895200.sql | 6 + .../Northrend/Ulduar/Ulduar/boss_mimiron.cpp | 118 ++++++++++++++---- 2 files changed, 97 insertions(+), 27 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1784434823383895200.sql diff --git a/data/sql/updates/pending_db_world/rev_1784434823383895200.sql b/data/sql/updates/pending_db_world/rev_1784434823383895200.sql new file mode 100644 index 000000000..48e54b576 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1784434823383895200.sql @@ -0,0 +1,6 @@ +-- Mimiron Rocket Strike: spell-driven target selection (prefers ranged players) +DELETE FROM `spell_script_names` WHERE `ScriptName` IN ('spell_mimiron_rocket_strike', 'spell_mimiron_rocket_strike_target_select'); +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(64402, 'spell_mimiron_rocket_strike'), +(65034, 'spell_mimiron_rocket_strike'), +(63681, 'spell_mimiron_rocket_strike_target_select'); diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp index 54102ba97..96a31b557 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp @@ -16,9 +16,11 @@ */ #include "AchievementCriteriaScript.h" +#include "Containers.h" #include "CreatureScript.h" #include "GameObjectScript.h" #include "GameTime.h" +#include "GridNotifiers.h" #include "MapMgr.h" #include "PassiveAI.h" #include "Player.h" @@ -54,6 +56,10 @@ enum SpellData SPELL_HEAT_WAVE = 64533, SPELL_ROCKET_STRIKE_AURA = 64064, + SPELL_ROCKET_STRIKE_SINGLE = 64402, // VX-001 fires one of the two mounted rockets + SPELL_ROCKET_STRIKE_BOTH = 65034, // VX-001 fires both mounted rockets + SPELL_ROCKET_STRIKE_TARGET = 63681, // Cast by a fired rocket; picks the impact target (prefers ranged) + SPELL_SUMMON_ROCKET_STRIKE = 63036, // Summons the ground strike at the chosen target NPC_ROCKET_VISUAL = 34050, NPC_ROCKET_STRIKE_N = 34047, @@ -1342,38 +1348,19 @@ struct npc_ulduar_vx001 : public ScriptedAI _events.Repeat(10s); break; case EVENT_SPELL_ROCKET_STRIKE: - if (Vehicle* vk = me->GetVehicleKit()) - { - for( int i = 0; i < (_phase / 2); ++i ) - { - uint8 index = (_phase == 2 ? rand() % 2 : i); - if (Unit* r = vk->GetPassenger(5 + index)) - if (Player* temp = SelectTargetFromPlayerList(100.0f)) - { - if (Creature* trigger = me->SummonCreature(NPC_ROCKET_STRIKE_N, temp->GetPositionX(), temp->GetPositionY(), temp->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN, 6000)) - trigger->CastSpell(trigger, SPELL_ROCKET_STRIKE_AURA, true); - Position exitPos = r->GetPosition(); - exitPos.m_positionX += cos(me->GetOrientation()) * 2.35f; - exitPos.m_positionY += std::sin(me->GetOrientation()) * 2.35f; - exitPos.m_positionZ += 2.0f * _phase; - r->_ExitVehicle(&exitPos); - me->RemoveAurasByType(SPELL_AURA_CONTROL_VEHICLE, r->GetGUID()); - if (r->IsCreature()) - r->ToCreature()->AI()->SetData(0, 0); - } - } - _events.Repeat(20s); - _events.ScheduleEvent(EVENT_REINSTALL_ROCKETS, 10s); - } + me->CastSpell(me, _phase == 2 ? SPELL_ROCKET_STRIKE_SINGLE : SPELL_ROCKET_STRIKE_BOTH, true); + _events.Repeat(20s); + _events.ScheduleEvent(EVENT_REINSTALL_ROCKETS, 10s); break; case EVENT_REINSTALL_ROCKETS: if (Vehicle* vk = me->GetVehicleKit()) { for (uint8 i = 5; i <= 6; ++i) - if (!vk->GetPassenger(i)) - if (TempSummon* accessory = me->SummonCreature(NPC_ROCKET_VISUAL, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() + 4.0f, me->GetOrientation(), TEMPSUMMON_MANUAL_DESPAWN)) - if (!me->HandleSpellClick(accessory, i)) - accessory->UnSummon(); + if (Unit* rocket = vk->GetPassenger(i)) + rocket->SetDisplayId(rocket->GetNativeDisplayId()); // restore the fired rocket's visual + else if (TempSummon* accessory = me->SummonCreature(NPC_ROCKET_VISUAL, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() + 4.0f, me->GetOrientation(), TEMPSUMMON_MANUAL_DESPAWN)) + if (!me->HandleSpellClick(accessory, i)) + accessory->UnSummon(); } break; case EVENT_SPELL_RAPID_BURST: @@ -1822,6 +1809,75 @@ class spell_ulduar_mimiron_mine_explosion : public SpellScript } }; +// 64402, 65034 - Rocket Strike +class spell_mimiron_rocket_strike : public SpellScript +{ + PrepareSpellScript(spell_mimiron_rocket_strike); + + void FilterTargets(std::list& targets) + { + if (targets.empty()) + return; + + // The single-rocket cast picks just one of the two mounted rockets; the "both" cast keeps both. + if (GetSpellInfo()->Id == SPELL_ROCKET_STRIKE_SINGLE && GetCaster()->IsVehicle()) + if (Unit* rocket = GetCaster()->GetVehicleKit()->GetPassenger(urand(5, 6))) + { + targets.clear(); + targets.push_back(rocket); + } + } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + // The fired rocket resolves its own impact target, keeping VX-001 as the original caster for credit. + GetHitUnit()->CastSpell((Unit*)nullptr, SPELL_ROCKET_STRIKE_TARGET, TRIGGERED_FULL_MASK, nullptr, nullptr, GetCaster()->GetGUID()); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_mimiron_rocket_strike::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); + OnEffectHitTarget += SpellEffectFn(spell_mimiron_rocket_strike::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } +}; + +// 63681 - Rocket Strike +class spell_mimiron_rocket_strike_target_select : public SpellScript +{ + PrepareSpellScript(spell_mimiron_rocket_strike_target_select); + + void FilterTargets(std::list& targets) + { + targets.remove_if([](WorldObject* target) { return !target->IsPlayer(); }); + if (targets.empty()) + return; + + WorldObject* target = Acore::Containers::SelectRandomContainerElement(targets); + + // Prefer players out of melee range; only strike someone within 15y if nobody is further out (patch 3.1.3). + targets.remove_if(Acore::AllWorldObjectsInRange(GetCaster(), 15.0f)); + + if (!targets.empty()) + target = Acore::Containers::SelectRandomContainerElement(targets); + + targets.clear(); + targets.push_back(target); + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + ObjectGuid originalCaster = GetOriginalCaster() ? GetOriginalCaster()->GetGUID() : GetCaster()->GetGUID(); + GetCaster()->CastSpell(GetHitUnit(), SPELL_SUMMON_ROCKET_STRIKE, TRIGGERED_FULL_MASK, nullptr, nullptr, originalCaster); + GetCaster()->SetDisplayId(11686); // hide the spent rocket until it is reloaded + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_mimiron_rocket_strike_target_select::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + OnEffectHitTarget += SpellEffectFn(spell_mimiron_rocket_strike_target_select::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + struct npc_ulduar_mimiron_rocket : public NullCreatureAI { npc_ulduar_mimiron_rocket(Creature* creature) : NullCreatureAI(creature) {} @@ -2265,6 +2321,12 @@ struct npc_ulduar_rocket_strike_trigger : public NullCreatureAI { npc_ulduar_rocket_strike_trigger(Creature* creature) : NullCreatureAI(creature) {} + void InitializeAI() override + { + me->CastSpell(me, SPELL_ROCKET_STRIKE_AURA, true); + me->DespawnOrUnsummon(6s); + } + void SpellHitTarget(Unit* target, SpellInfo const* spell) override { if (!target || !spell) @@ -2340,6 +2402,8 @@ void AddSC_boss_mimiron() RegisterSpellScript(spell_mimiron_rapid_burst_aura); RegisterSpellScript(spell_mimiron_p3wx2_laser_barrage_aura); RegisterSpellScript(spell_ulduar_mimiron_mine_explosion); + RegisterSpellScript(spell_mimiron_rocket_strike); + RegisterSpellScript(spell_mimiron_rocket_strike_target_select); new go_ulduar_do_not_push_this_button(); RegisterUlduarCreatureAI(npc_ulduar_flames_initial); RegisterUlduarCreatureAI(npc_ulduar_flames_spread); From 4cd68470d630c7254d27dc9a06936ffd113b0ed3 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 19 Jul 2026 11:57:04 +0000 Subject: [PATCH 027/134] chore(DB): import pending files Referenced commit(s): f839009e9ad26651126f0c592d9f7f4cd914a28c --- .../rev_1784434823383895200.sql => db_world/2026_07_19_01.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1784434823383895200.sql => db_world/2026_07_19_01.sql} (90%) diff --git a/data/sql/updates/pending_db_world/rev_1784434823383895200.sql b/data/sql/updates/db_world/2026_07_19_01.sql similarity index 90% rename from data/sql/updates/pending_db_world/rev_1784434823383895200.sql rename to data/sql/updates/db_world/2026_07_19_01.sql index 48e54b576..cd6ee2f0a 100644 --- a/data/sql/updates/pending_db_world/rev_1784434823383895200.sql +++ b/data/sql/updates/db_world/2026_07_19_01.sql @@ -1,3 +1,4 @@ +-- DB update 2026_07_19_00 -> 2026_07_19_01 -- Mimiron Rocket Strike: spell-driven target selection (prefers ranged players) DELETE FROM `spell_script_names` WHERE `ScriptName` IN ('spell_mimiron_rocket_strike', 'spell_mimiron_rocket_strike_target_select'); INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES From 60dd3da6604dadc02ea98e4b5861963e5f785c26 Mon Sep 17 00:00:00 2001 From: Kitzunu <24550914+Kitzunu@users.noreply.github.com> Date: Sun, 19 Jul 2026 14:01:43 +0200 Subject: [PATCH 028/134] chore(CI/Labeler): fix Config label (#26690) --- .github/labeler.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/labeler.yml b/.github/labeler.yml index e4f1495f3..e62f7c7cc 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -29,7 +29,6 @@ Script: - 'src/server/scripts/**/*.cpp' - 'src/server/scripts/**/*.h' - UnitTests: - changed-files: - any-glob-to-any-file: 'src/test/**/*' @@ -75,8 +74,6 @@ Config: - '**/*.json' - '**/*.yml' - '**/*.yaml' - - '!**/docker-compose*.yml' - - '!**/docker-compose*.yaml' - '**/*.conf' - '**/*.cfg' - '**/*.nix' From ad66a0b768c0d3da13922e0a67951650a9eba942 Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Sun, 19 Jul 2026 09:28:18 -0300 Subject: [PATCH 029/134] fix(Scripts/ZulGurub): reset Thekal encounter after a wipe (#26686) Co-authored-by: Claude Opus 4.8 --- .../EasternKingdoms/ZulGurub/boss_thekal.cpp | 38 +++++++++---------- 1 file changed, 17 insertions(+), 21 deletions(-) diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp index 1ddca06ed..35da38f49 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp @@ -204,14 +204,14 @@ struct boss_thekal : public BossAI void UpdateAI(uint32 diff) override { - if (me->IsInCombat() && !UpdateVictim()) + // Gate on IsEngaged, not IsInCombat: on a wipe the boss leaves combat while still engaged, + // and UpdateVictim must keep running to evade and clear the IN_PROGRESS state. + if (me->IsEngaged()) { - return; - } - else if (me->IsInCombat()) - { - scheduler.Update(diff, - std::bind(&BossAI::DoMeleeAttackIfReady, this)); + if (!UpdateVictim()) + return; + + scheduler.Update(diff, [this] { DoMeleeAttackIfReady(); }); } else { @@ -396,14 +396,12 @@ struct npc_zealot_lorkhan : public ScriptedAI void UpdateAI(uint32 diff) override { - if (me->IsInCombat() && !UpdateVictim()) + if (me->IsEngaged()) { - return; - } - else if (me->IsInCombat()) - { - _scheduler.Update(diff, - std::bind(&BossAI::DoMeleeAttackIfReady, this)); + if (!UpdateVictim()) + return; + + _scheduler.Update(diff, [this] { DoMeleeAttackIfReady(); }); } else { @@ -497,14 +495,12 @@ struct npc_zealot_zath : public ScriptedAI void UpdateAI(uint32 diff) override { - if (me->IsInCombat() && !UpdateVictim()) + if (me->IsEngaged()) { - return; - } - else if (me->IsInCombat()) - { - _scheduler.Update(diff, - std::bind(&BossAI::DoMeleeAttackIfReady, this)); + if (!UpdateVictim()) + return; + + _scheduler.Update(diff, [this] { DoMeleeAttackIfReady(); }); } else { From e2b02697fd7de1aca6eda913867986786e97b1f4 Mon Sep 17 00:00:00 2001 From: Kitzunu <24550914+Kitzunu@users.noreply.github.com> Date: Sun, 19 Jul 2026 14:36:40 +0200 Subject: [PATCH 030/134] feat(Script/Commands): Add account flag commands (#26301) --- .../rev_1781863824915803400.sql | 13 ++ .../rev_1781863825147501000.sql | 15 +++ src/common/Common.cpp | 36 ++++++ src/common/Common.h | 8 ++ src/server/game/Accounts/RBAC.h | 4 + src/server/game/Miscellaneous/Language.h | 9 +- src/server/scripts/Commands/cs_account.cpp | 118 ++++++++++++++++++ src/server/scripts/Commands/cs_misc.cpp | 47 +------ 8 files changed, 204 insertions(+), 46 deletions(-) create mode 100644 data/sql/updates/pending_db_auth/rev_1781863824915803400.sql create mode 100644 data/sql/updates/pending_db_world/rev_1781863825147501000.sql diff --git a/data/sql/updates/pending_db_auth/rev_1781863824915803400.sql b/data/sql/updates/pending_db_auth/rev_1781863824915803400.sql new file mode 100644 index 000000000..50db77464 --- /dev/null +++ b/data/sql/updates/pending_db_auth/rev_1781863824915803400.sql @@ -0,0 +1,13 @@ +DELETE FROM `rbac_permissions` WHERE `id` IN (941, 942, 943, 944); +INSERT INTO `rbac_permissions` (`id`, `name`) VALUES +(941, 'Command: account flag'), +(942, 'Command: account flag list'), +(943, 'Command: account flag add'), +(944, 'Command: account flag remove'); + +DELETE FROM `rbac_linked_permissions` WHERE `linkedId` IN (941, 942, 943, 944); +INSERT INTO `rbac_linked_permissions` (`id`, `linkedId`) VALUES +(197, 941), +(197, 942), +(196, 943), +(196, 944); diff --git a/data/sql/updates/pending_db_world/rev_1781863825147501000.sql b/data/sql/updates/pending_db_world/rev_1781863825147501000.sql new file mode 100644 index 000000000..851b30ae4 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1781863825147501000.sql @@ -0,0 +1,15 @@ +DELETE FROM `command` WHERE `name` IN ('account flag', 'account flag list', 'account flag add', 'account flag remove'); +INSERT INTO `command` (`name`, `security`, `help`) VALUES +('account flag', 2, 'Syntax: .account flag $subcommand\nType .account flag to see the list of possible subcommands or .help account flag $subcommand to see info on subcommands.'), +('account flag list', 2, 'Syntax: .account flag list [$account]\nLists every AccountFlag currently set on $account. Defaults to your own account when no argument is given.'), +('account flag add', 3, 'Syntax: .account flag add $account $flag\nSets an AccountFlag on $account. $flag is a symbolic name in either its full form (e.g. ACCOUNT_FLAG_TRIAL) or short form (e.g. TRIAL). ACCOUNT_FLAG_GM is managed automatically and cannot be changed manually.'), +('account flag remove', 3, 'Syntax: .account flag remove $account $flag\nClears an AccountFlag on $account. $flag is a symbolic name in either its full form (e.g. ACCOUNT_FLAG_TRIAL) or short form (e.g. TRIAL). ACCOUNT_FLAG_GM is managed automatically and cannot be changed manually.'); + +DELETE FROM `acore_string` WHERE `entry` IN (35465, 35466, 35467, 35468, 35469, 35470); +INSERT INTO `acore_string` (`entry`, `content_default`) VALUES +(35465, 'Account flags set on {} ({}):'), +(35466, 'Account {} ({}) has no flags set.'), +(35467, 'Unknown account flag: {}. Use a symbolic name (e.g. ACCOUNT_FLAG_TRIAL or TRIAL).'), +(35468, 'ACCOUNT_FLAG_GM is managed automatically and cannot be changed manually.'), +(35469, 'Added {} to account {} ({}).'), +(35470, 'Removed {} from account {} ({}).'); diff --git a/src/common/Common.cpp b/src/common/Common.cpp index 9d7835248..e58668d7e 100644 --- a/src/common/Common.cpp +++ b/src/common/Common.cpp @@ -30,6 +30,42 @@ char const* localeNames[TOTAL_LOCALES] = "ruRU" }; +AccountFlagName const accountFlagNames[MAX_ACCOUNT_FLAG] = +{ + { "ACCOUNT_FLAG_GM", "GM" }, + { "ACCOUNT_FLAG_NOKICK", "NOKICK" }, + { "ACCOUNT_FLAG_COLLECTOR", "COLLECTOR" }, + { "ACCOUNT_FLAG_TRIAL", "TRIAL" }, + { "ACCOUNT_FLAG_CANCELLED", "CANCELLED" }, + { "ACCOUNT_FLAG_IGR", "IGR" }, + { "ACCOUNT_FLAG_WHOLESALER", "WHOLESALER" }, + { "ACCOUNT_FLAG_PRIVILEGED", "PRIVILEGED" }, + { "ACCOUNT_FLAG_EU_FORBID_ELV", "EU_FORBID_ELV" }, + { "ACCOUNT_FLAG_EU_FORBID_BILLING", "EU_FORBID_BILLING" }, + { "ACCOUNT_FLAG_RESTRICTED", "RESTRICTED" }, + { "ACCOUNT_FLAG_REFERRAL", "REFERRAL" }, + { "ACCOUNT_FLAG_BLIZZARD", "BLIZZARD" }, + { "ACCOUNT_FLAG_RECURRING_BILLING", "RECURRING_BILLING" }, + { "ACCOUNT_FLAG_NOELECTUP", "NOELECTUP" }, + { "ACCOUNT_FLAG_KR_CERTIFICATE", "KR_CERTIFICATE" }, + { "ACCOUNT_FLAG_EXPANSION_COLLECTOR", "EXPANSION_COLLECTOR" }, + { "ACCOUNT_FLAG_DISABLE_VOICE", "DISABLE_VOICE" }, + { "ACCOUNT_FLAG_DISABLE_VOICE_SPEAK", "DISABLE_VOICE_SPEAK" }, + { "ACCOUNT_FLAG_REFERRAL_RESURRECT", "REFERRAL_RESURRECT" }, + { "ACCOUNT_FLAG_EU_FORBID_CC", "EU_FORBID_CC" }, + { "ACCOUNT_FLAG_OPENBETA_DELL", "OPENBETA_DELL" }, + { "ACCOUNT_FLAG_PROPASS", "PROPASS" }, + { "ACCOUNT_FLAG_PROPASS_LOCK", "PROPASS_LOCK" }, + { "ACCOUNT_FLAG_PENDING_UPGRADE", "PENDING_UPGRADE" }, + { "ACCOUNT_FLAG_RETAIL_FROM_TRIAL", "RETAIL_FROM_TRIAL" }, + { "ACCOUNT_FLAG_EXPANSION2_COLLECTOR", "EXPANSION2_COLLECTOR" }, + { "ACCOUNT_FLAG_OVERMIND_LINKED", "OVERMIND_LINKED" }, + { "ACCOUNT_FLAG_DEMOS", "DEMOS" }, + { "ACCOUNT_FLAG_DEATH_KNIGHT_OK", "DEATH_KNIGHT_OK" }, + { "ACCOUNT_FLAG_S2_REQUIRE_IGR", "S2_REQUIRE_IGR" }, + { "ACCOUNT_FLAG_S2_TRIAL", "S2_TRIAL" } +}; + bool IsLocaleValid(std::string const& locale) { for (int i = 0; i < TOTAL_LOCALES; ++i) diff --git a/src/common/Common.h b/src/common/Common.h index b77fe3760..908e5aca6 100644 --- a/src/common/Common.h +++ b/src/common/Common.h @@ -113,6 +113,14 @@ constexpr uint32 ACCOUNT_FLAGS_ALL = ACCOUNT_FLAG_OVERMIND_LINKED | ACCOUNT_FLAG_DEMOS | ACCOUNT_FLAG_DEATH_KNIGHT_OK | ACCOUNT_FLAG_S2_REQUIRE_IGR | ACCOUNT_FLAG_S2_TRIAL; +struct AccountFlagName +{ + char const* full; + char const* shortName; +}; + +AC_COMMON_API extern AccountFlagName const accountFlagNames[MAX_ACCOUNT_FLAG]; + enum LocaleConstant { LOCALE_enUS = 0, diff --git a/src/server/game/Accounts/RBAC.h b/src/server/game/Accounts/RBAC.h index ec4b71654..58481ef8d 100644 --- a/src/server/game/Accounts/RBAC.h +++ b/src/server/game/Accounts/RBAC.h @@ -702,6 +702,10 @@ enum RBACPermissions RBAC_PERM_COMMAND_SPELLINFO_ALL = 938, RBAC_PERM_COMMAND_SERVER_SET_SECURITY = 939, RBAC_PERM_COMMAND_GROUP_INVITES = 940, + RBAC_PERM_COMMAND_ACCOUNT_FLAG = 941, + RBAC_PERM_COMMAND_ACCOUNT_FLAG_LIST = 942, + RBAC_PERM_COMMAND_ACCOUNT_FLAG_ADD = 943, + RBAC_PERM_COMMAND_ACCOUNT_FLAG_REMOVE = 944, // custom permissions 1000+ RBAC_PERM_MAX }; diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h index 26330f93e..b405d0e24 100644 --- a/src/server/game/Miscellaneous/Language.h +++ b/src/server/game/Miscellaneous/Language.h @@ -1537,7 +1537,14 @@ enum AcoreStrings // Group invites toggle command LANG_COMMAND_GROUP_INVITES_ACCEPTING = 35462, LANG_COMMAND_GROUP_INVITES_ON = 35463, - LANG_COMMAND_GROUP_INVITES_OFF = 35464 + LANG_COMMAND_GROUP_INVITES_OFF = 35464, + // Account flag command + LANG_ACCOUNT_FLAG_LIST_HEADER = 35465, + LANG_ACCOUNT_FLAG_LIST_EMPTY = 35466, + LANG_ACCOUNT_FLAG_INVALID = 35467, + LANG_ACCOUNT_FLAG_RESERVED = 35468, + LANG_ACCOUNT_FLAG_ADDED = 35469, + LANG_ACCOUNT_FLAG_REMOVED = 35470 }; #endif diff --git a/src/server/scripts/Commands/cs_account.cpp b/src/server/scripts/Commands/cs_account.cpp index 9c37eff54..3a75acf66 100644 --- a/src/server/scripts/Commands/cs_account.cpp +++ b/src/server/scripts/Commands/cs_account.cpp @@ -20,8 +20,10 @@ #include "Base32.h" #include "Chat.h" #include "CommandScript.h" +#include "Common.h" #include "CryptoGenerics.h" #include "IPLocation.h" +#include "Language.h" #include "Player.h" #include "RBAC.h" #include "Realm.h" @@ -29,6 +31,9 @@ #include "SecretMgr.h" #include "StringConvert.h" #include "TOTP.h" +#include "Util.h" +#include "WorldSession.h" +#include "WorldSessionMgr.h" #include #if AC_COMPILER == AC_COMPILER_GNU @@ -70,12 +75,20 @@ public: { "country", HandleAccountRemoveLockCountryCommand, rbac::RBAC_PERM_COMMAND_ACCOUNT_LOCK_COUNTRY, Console::Yes }, }; + static ChatCommandTable accountFlagCommandTable + { + { "list", HandleAccountFlagListCommand, rbac::RBAC_PERM_COMMAND_ACCOUNT_FLAG_LIST, Console::Yes }, + { "add", HandleAccountFlagAddCommand, rbac::RBAC_PERM_COMMAND_ACCOUNT_FLAG_ADD, Console::Yes }, + { "remove", HandleAccountFlagRemoveCommand, rbac::RBAC_PERM_COMMAND_ACCOUNT_FLAG_REMOVE, Console::Yes } + }; + static ChatCommandTable accountCommandTable = { { "2fa", account2faCommandTable }, { "addon", HandleAccountAddonCommand, rbac::RBAC_PERM_COMMAND_ACCOUNT_ADDON, Console::No }, { "create", HandleAccountCreateCommand, rbac::RBAC_PERM_COMMAND_ACCOUNT_CREATE, Console::Yes }, { "delete", HandleAccountDeleteCommand, rbac::RBAC_PERM_COMMAND_ACCOUNT_DELETE, Console::Yes }, + { "flag", accountFlagCommandTable }, { "onlinelist", HandleAccountOnlineListCommand, rbac::RBAC_PERM_COMMAND_ACCOUNT_ONLINE_LIST, Console::Yes }, { "lock", accountLockCommandTable }, { "set", accountSetCommandTable }, @@ -911,6 +924,111 @@ public: return true; } + static Optional ParseAccountFlagBit(std::string_view input) + { + for (uint8 i = 0; i < MAX_ACCOUNT_FLAG; ++i) + if (StringEqualI(input, accountFlagNames[i].full) || StringEqualI(input, accountFlagNames[i].shortName)) + return i; + + return std::nullopt; + } + + static bool HandleAccountFlagListCommand(ChatHandler* handler, Optional account) + { + uint32 accountId; + std::string accountName; + + if (account) + { + accountId = account->GetID(); + accountName = account->GetName(); + } + else if (WorldSession* session = handler->GetSession()) + { + accountId = session->GetAccountId(); + AccountMgr::GetName(accountId, accountName); + } + else + { + handler->SendErrorMessage(LANG_CMD_SYNTAX); + return false; + } + + if (handler->HasLowerSecurityAccount(nullptr, accountId, true)) + return false; + + uint32 flags; + if (WorldSession* targetSession = sWorldSessionMgr->FindSession(accountId)) + flags = targetSession->GetAccountFlags(); + else + { + LoginDatabasePreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_ACCOUNT_FLAG); + stmt->SetData(0, accountId); + PreparedQueryResult result = LoginDatabase.Query(stmt); + if (!result) + { + handler->SendErrorMessage(LANG_ACCOUNT_NOT_EXIST, accountName); + return false; + } + + flags = (*result)[0].Get(); + } + + if (!flags) + { + handler->PSendSysMessage(LANG_ACCOUNT_FLAG_LIST_EMPTY, accountName, accountId); + return true; + } + + handler->PSendSysMessage(LANG_ACCOUNT_FLAG_LIST_HEADER, accountName, accountId); + for (uint8 i = 0; i < MAX_ACCOUNT_FLAG; ++i) + if (flags & (uint32(1) << i)) + handler->PSendSysMessage(LANG_SUBCMDS_LIST_ENTRY, accountFlagNames[i].full); + + return true; + } + + static bool ChangeAccountFlag(ChatHandler* handler, AccountIdentifier const& account, std::string_view flagArg, bool add) + { + if (handler->HasLowerSecurityAccount(nullptr, account.GetID(), true)) + return false; + + Optional bit = ParseAccountFlagBit(flagArg); + if (!bit) + { + handler->SendErrorMessage(LANG_ACCOUNT_FLAG_INVALID, flagArg); + return false; + } + + // ACCOUNT_FLAG_GM is handled by GMLevel and should not be allowed to set manually + uint32 const flag = uint32(1) << *bit; + if (flag & ACCOUNT_FLAG_GM) + { + handler->SendErrorMessage(LANG_ACCOUNT_FLAG_RESERVED); + return false; + } + + if (WorldSession* session = sWorldSessionMgr->FindSession(account.GetID())) + session->UpdateAccountFlag(flag, !add); + else + LoginDatabase.Execute("UPDATE account SET Flags = Flags {} {} WHERE id = {}", + add ? "|" : "& ~", flag, account.GetID()); + + handler->PSendSysMessage(add ? LANG_ACCOUNT_FLAG_ADDED : LANG_ACCOUNT_FLAG_REMOVED, + accountFlagNames[*bit].full, account.GetName(), account.GetID()); + return true; + } + + static bool HandleAccountFlagAddCommand(ChatHandler* handler, AccountIdentifier account, std::string_view flagArg) + { + return ChangeAccountFlag(handler, account, flagArg, true); + } + + static bool HandleAccountFlagRemoveCommand(ChatHandler* handler, AccountIdentifier account, std::string_view flagArg) + { + return ChangeAccountFlag(handler, account, flagArg, false); + } + /// Set email for account static bool HandleAccountSetEmailCommand(ChatHandler* handler, AccountIdentifier account, std::string email, std::string emailConfirmation) diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp index 456628d03..b795ebf19 100644 --- a/src/server/scripts/Commands/cs_misc.cpp +++ b/src/server/scripts/Commands/cs_misc.cpp @@ -61,49 +61,6 @@ constexpr auto SPELL_STUCK = 7355; constexpr auto SPELL_FREEZE = 9454; -struct AccountFlagText -{ - AccountFlag flag; - std::string text; -}; - -AccountFlagText const accountFlagText[MAX_ACCOUNT_FLAG] = -{ - { ACCOUNT_FLAG_GM, "ACCOUNT_FLAG_GM" }, - { ACCOUNT_FLAG_NOKICK, "ACCOUNT_FLAG_NOKICK" }, - { ACCOUNT_FLAG_COLLECTOR, "ACCOUNT_FLAG_COLLECTOR" }, - { ACCOUNT_FLAG_TRIAL, "ACCOUNT_FLAG_TRIAL" }, - { ACCOUNT_FLAG_CANCELLED, "ACCOUNT_FLAG_CANCELLED" }, - { ACCOUNT_FLAG_IGR, "ACCOUNT_FLAG_IGR" }, - { ACCOUNT_FLAG_WHOLESALER, "ACCOUNT_FLAG_WHOLESALER" }, - { ACCOUNT_FLAG_PRIVILEGED, "ACCOUNT_FLAG_PRIVILEGED" }, - { ACCOUNT_FLAG_EU_FORBID_ELV, "ACCOUNT_FLAG_EU_FORBID_ELV" }, - { ACCOUNT_FLAG_EU_FORBID_BILLING, "ACCOUNT_FLAG_EU_FORBID_BILLING" }, - { ACCOUNT_FLAG_RESTRICTED, "ACCOUNT_FLAG_RESTRICTED" }, - { ACCOUNT_FLAG_REFERRAL, "ACCOUNT_FLAG_REFERRAL" }, - { ACCOUNT_FLAG_BLIZZARD, "ACCOUNT_FLAG_BLIZZARD" }, - { ACCOUNT_FLAG_RECURRING_BILLING, "ACCOUNT_FLAG_RECURRING_BILLING" }, - { ACCOUNT_FLAG_NOELECTUP, "ACCOUNT_FLAG_NOELECTUP" }, - { ACCOUNT_FLAG_KR_CERTIFICATE, "ACCOUNT_FLAG_KR_CERTIFICATE" }, - { ACCOUNT_FLAG_EXPANSION_COLLECTOR, "ACCOUNT_FLAG_EXPANSION_COLLECTOR" }, - { ACCOUNT_FLAG_DISABLE_VOICE, "ACCOUNT_FLAG_DISABLE_VOICE" }, - { ACCOUNT_FLAG_DISABLE_VOICE_SPEAK, "ACCOUNT_FLAG_DISABLE_VOICE_SPEAK" }, - { ACCOUNT_FLAG_REFERRAL_RESURRECT, "ACCOUNT_FLAG_REFERRAL_RESURRECT" }, - { ACCOUNT_FLAG_EU_FORBID_CC, "ACCOUNT_FLAG_EU_FORBID_CC" }, - { ACCOUNT_FLAG_OPENBETA_DELL, "ACCOUNT_FLAG_OPENBETA_DELL" }, - { ACCOUNT_FLAG_PROPASS, "ACCOUNT_FLAG_PROPASS" }, - { ACCOUNT_FLAG_PROPASS_LOCK, "ACCOUNT_FLAG_PROPASS_LOCK" }, - { ACCOUNT_FLAG_PENDING_UPGRADE, "ACCOUNT_FLAG_PENDING_UPGRADE" }, - { ACCOUNT_FLAG_RETAIL_FROM_TRIAL, "ACCOUNT_FLAG_RETAIL_FROM_TRIAL" }, - { ACCOUNT_FLAG_EXPANSION2_COLLECTOR, "ACCOUNT_FLAG_EXPANSION2_COLLECTOR" }, - { ACCOUNT_FLAG_OVERMIND_LINKED, "ACCOUNT_FLAG_OVERMIND_LINKED" }, - { ACCOUNT_FLAG_DEMOS, "ACCOUNT_FLAG_DEMOS" }, - { ACCOUNT_FLAG_DEATH_KNIGHT_OK, "ACCOUNT_FLAG_DEATH_KNIGHT_OK" }, - { ACCOUNT_FLAG_S2_REQUIRE_IGR, "ACCOUNT_FLAG_S2_REQUIRE_IGR" }, - { ACCOUNT_FLAG_S2_TRIAL, "ACCOUNT_FLAG_S2_TRIAL" }, - // { ACCOUNT_FLAG_S2_RESTRICTED, "ACCOUNT_FLAG_S2_RESTRICTED" } -}; - std::string const GetLocalizeCreatureName(Creature* creature, LocaleConstant locale) { auto creatureTemplate = sObjectMgr->GetCreatureTemplate(creature->GetEntry()); @@ -2280,8 +2237,8 @@ public: uint32 accountFlags = playerTarget->GetSession()->GetAccountFlags(); handler->PSendSysMessage(LANG_ACCOUNT_FLAGS_PINFO); for (uint8 i = 0; i < MAX_ACCOUNT_FLAG; i++) - if (accountFlags & static_cast(accountFlagText[i].flag)) - handler->PSendSysMessage(LANG_SUBCMDS_LIST_ENTRY, accountFlagText[i].text); + if (accountFlags & (uint32(1) << i)) + handler->PSendSysMessage(LANG_SUBCMDS_LIST_ENTRY, accountFlagNames[i].full); } // Output VI. LANG_PINFO_ACC_LASTLOGIN From ae038d4541b3d6d00e3d72e511878c707f8ed9b0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 19 Jul 2026 12:48:35 +0000 Subject: [PATCH 031/134] chore(DB): import pending files Referenced commit(s): 60dd3da6604dadc02ea98e4b5861963e5f785c26 --- .../rev_1781863824915803400.sql => db_auth/2026_07_19_00.sql} | 1 + .../rev_1781863825147501000.sql => db_world/2026_07_19_02.sql} | 1 + 2 files changed, 2 insertions(+) rename data/sql/updates/{pending_db_auth/rev_1781863824915803400.sql => db_auth/2026_07_19_00.sql} (91%) rename data/sql/updates/{pending_db_world/rev_1781863825147501000.sql => db_world/2026_07_19_02.sql} (97%) diff --git a/data/sql/updates/pending_db_auth/rev_1781863824915803400.sql b/data/sql/updates/db_auth/2026_07_19_00.sql similarity index 91% rename from data/sql/updates/pending_db_auth/rev_1781863824915803400.sql rename to data/sql/updates/db_auth/2026_07_19_00.sql index 50db77464..2c05aa6c7 100644 --- a/data/sql/updates/pending_db_auth/rev_1781863824915803400.sql +++ b/data/sql/updates/db_auth/2026_07_19_00.sql @@ -1,3 +1,4 @@ +-- DB update 2026_07_18_01 -> 2026_07_19_00 DELETE FROM `rbac_permissions` WHERE `id` IN (941, 942, 943, 944); INSERT INTO `rbac_permissions` (`id`, `name`) VALUES (941, 'Command: account flag'), diff --git a/data/sql/updates/pending_db_world/rev_1781863825147501000.sql b/data/sql/updates/db_world/2026_07_19_02.sql similarity index 97% rename from data/sql/updates/pending_db_world/rev_1781863825147501000.sql rename to data/sql/updates/db_world/2026_07_19_02.sql index 851b30ae4..e65dcaec5 100644 --- a/data/sql/updates/pending_db_world/rev_1781863825147501000.sql +++ b/data/sql/updates/db_world/2026_07_19_02.sql @@ -1,3 +1,4 @@ +-- DB update 2026_07_19_01 -> 2026_07_19_02 DELETE FROM `command` WHERE `name` IN ('account flag', 'account flag list', 'account flag add', 'account flag remove'); INSERT INTO `command` (`name`, `security`, `help`) VALUES ('account flag', 2, 'Syntax: .account flag $subcommand\nType .account flag to see the list of possible subcommands or .help account flag $subcommand to see info on subcommands.'), From 43cce6cb7845101b813db6aa9dafadaf9af40a26 Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Sun, 19 Jul 2026 09:58:14 -0300 Subject: [PATCH 032/134] fix(Scripts/Ulduar): apply Yogg-Saron Sanity at full stacks (#26689) Co-authored-by: horn Co-authored-by: Claude Opus 4.8 --- .../rev_1784460171162193800.sql | 4 ++++ .../Ulduar/Ulduar/boss_yoggsaron.cpp | 24 +++++++++++++------ 2 files changed, 21 insertions(+), 7 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1784460171162193800.sql diff --git a/data/sql/updates/pending_db_world/rev_1784460171162193800.sql b/data/sql/updates/pending_db_world/rev_1784460171162193800.sql new file mode 100644 index 000000000..3957008a4 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1784460171162193800.sql @@ -0,0 +1,4 @@ +-- Attach Sanity (63050) stack-init script +DELETE FROM `spell_script_names` WHERE `spell_id` = 63050 AND `ScriptName` = 'spell_yogg_saron_sanity'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(63050, 'spell_yogg_saron_sanity'); diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yoggsaron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yoggsaron.cpp index 812c72143..05a4f45b0 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yoggsaron.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yoggsaron.cpp @@ -611,13 +611,6 @@ struct boss_yoggsaron_sara : public ScriptedAI } } - void SpellHitTarget(Unit* target, SpellInfo const* spellInfo) override - { - if (spellInfo->Id == SPELL_SANITY) - if (Aura* aur = target->GetAura(SPELL_SANITY)) - aur->SetStackAmount(100); - } - uint32 GetData(uint32 param) const override { if (param == DATA_GET_KEEPERS_COUNT) @@ -2504,6 +2497,22 @@ class spell_yogg_saron_insane_aura : public AuraScript } }; +// 63050 - Sanity +class spell_yogg_saron_sanity : public SpellScript +{ + PrepareSpellScript(spell_yogg_saron_sanity); + + void ModSanityStacks() + { + GetSpell()->SetSpellValue(SPELLVALUE_AURA_STACK, 100); + } + + void Register() override + { + BeforeCast += SpellCastFn(spell_yogg_saron_sanity::ModSanityStacks); + } +}; + // 64169 - Sanity Well class spell_yogg_saron_sanity_well_aura : public AuraScript { @@ -2862,6 +2871,7 @@ void AddSC_boss_yoggsaron() RegisterSpellScript(spell_yogg_saron_empowered_aura); RegisterSpellScript(spell_yogg_saron_insane_periodic_trigger); RegisterSpellScript(spell_yogg_saron_insane_aura); + RegisterSpellScript(spell_yogg_saron_sanity); RegisterSpellScript(spell_yogg_saron_sanity_well_aura); RegisterSpellScript(spell_keeper_freya_summon_sanity_well); RegisterSpellScript(spell_yogg_saron_sanity_reduce); From 04004fc61f77d7df3fc0ca9f6ccc302e43457699 Mon Sep 17 00:00:00 2001 From: Eddy Vega <61223313+Si1ker@users.noreply.github.com> Date: Sun, 19 Jul 2026 07:03:48 -0600 Subject: [PATCH 033/134] fix(Scripts/Ulduar): Adjust Living Constellation's Arcane Barrage (#26681) Co-authored-by: sogladev --- .../updates/pending_db_world/rev_1784454610015867838.sql | 2 ++ .../Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp | 6 +++--- 2 files changed, 5 insertions(+), 3 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1784454610015867838.sql diff --git a/data/sql/updates/pending_db_world/rev_1784454610015867838.sql b/data/sql/updates/pending_db_world/rev_1784454610015867838.sql new file mode 100644 index 000000000..592895576 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1784454610015867838.sql @@ -0,0 +1,2 @@ +-- +UPDATE `creature_template` SET `CreatureImmunitiesId` = -280 WHERE (`entry` IN (33052, 33116)); diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp index 5e4f66eac..1be8c9140 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp @@ -949,7 +949,7 @@ struct npc_living_constellation : public ScriptedAI void Reset() override { events.Reset(); - events.ScheduleEvent(EVENT_ARCANE_BARRAGE, 2500ms); + events.ScheduleEvent(EVENT_ARCANE_BARRAGE, 5s); _isActive = false; } @@ -1007,8 +1007,8 @@ struct npc_living_constellation : public ScriptedAI switch (events.ExecuteEvent()) { case EVENT_ARCANE_BARRAGE: - me->CastCustomSpell(SPELL_ARCANE_BARRAGE, SPELLVALUE_MAX_TARGETS, 1, (Unit*)nullptr, true); - events.Repeat(2500ms); + me->CastCustomSpell(SPELL_ARCANE_BARRAGE, SPELLVALUE_MAX_TARGETS, 1, (Unit*)nullptr, false); + events.Repeat(5s); break; case EVENT_RESUME_UPDATING: events.SetPhase(0); From 9faa125d0614367860699f3cc87a567b29c5b006 Mon Sep 17 00:00:00 2001 From: Xepic90 Date: Sun, 19 Jul 2026 09:05:11 -0400 Subject: [PATCH 034/134] fix(Core/Spells): Curse of the Shadowhorn now targets the player instead of itself (#26657) Co-authored-by: sogladev --- src/server/game/Spells/SpellInfoCorrections.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/server/game/Spells/SpellInfoCorrections.cpp b/src/server/game/Spells/SpellInfoCorrections.cpp index 416287cda..892ebec5a 100644 --- a/src/server/game/Spells/SpellInfoCorrections.cpp +++ b/src/server/game/Spells/SpellInfoCorrections.cpp @@ -5226,6 +5226,12 @@ void SpellMgr::LoadSpellInfoCorrections() spellInfo->Effects[EFFECT_1].SpellClassMask = flag96(0x200, 0, 0); }); + // Shadowhorn Charge (Rank 1) + ApplySpellFix({ 6921 }, [](SpellInfo* spellInfo) + { + spellInfo->AttributesEx3 |= SPELL_ATTR3_SUPPRESS_CASTER_PROCS; + }); + for (uint32 i = 0; i < GetSpellInfoStoreSize(); ++i) { SpellInfo* spellInfo = mSpellInfoMap[i]; From 479f03621e4ba1096551dc1bd83b925c0fa3d26a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 19 Jul 2026 13:25:54 +0000 Subject: [PATCH 035/134] chore(DB): import pending files Referenced commit(s): ae038d4541b3d6d00e3d72e511878c707f8ed9b0 --- .../rev_1784454610015867838.sql => db_world/2026_07_19_03.sql} | 1 + .../rev_1784460171162193800.sql => db_world/2026_07_19_04.sql} | 1 + 2 files changed, 2 insertions(+) rename data/sql/updates/{pending_db_world/rev_1784454610015867838.sql => db_world/2026_07_19_03.sql} (69%) rename data/sql/updates/{pending_db_world/rev_1784460171162193800.sql => db_world/2026_07_19_04.sql} (85%) diff --git a/data/sql/updates/pending_db_world/rev_1784454610015867838.sql b/data/sql/updates/db_world/2026_07_19_03.sql similarity index 69% rename from data/sql/updates/pending_db_world/rev_1784454610015867838.sql rename to data/sql/updates/db_world/2026_07_19_03.sql index 592895576..b013f28d1 100644 --- a/data/sql/updates/pending_db_world/rev_1784454610015867838.sql +++ b/data/sql/updates/db_world/2026_07_19_03.sql @@ -1,2 +1,3 @@ +-- DB update 2026_07_19_02 -> 2026_07_19_03 -- UPDATE `creature_template` SET `CreatureImmunitiesId` = -280 WHERE (`entry` IN (33052, 33116)); diff --git a/data/sql/updates/pending_db_world/rev_1784460171162193800.sql b/data/sql/updates/db_world/2026_07_19_04.sql similarity index 85% rename from data/sql/updates/pending_db_world/rev_1784460171162193800.sql rename to data/sql/updates/db_world/2026_07_19_04.sql index 3957008a4..031b50bfb 100644 --- a/data/sql/updates/pending_db_world/rev_1784460171162193800.sql +++ b/data/sql/updates/db_world/2026_07_19_04.sql @@ -1,3 +1,4 @@ +-- DB update 2026_07_19_03 -> 2026_07_19_04 -- Attach Sanity (63050) stack-init script DELETE FROM `spell_script_names` WHERE `spell_id` = 63050 AND `ScriptName` = 'spell_yogg_saron_sanity'; INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES From e570e3fd2fb969ad574c212e174b6f2c442e1129 Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Sun, 19 Jul 2026 15:10:05 -0300 Subject: [PATCH 036/134] fix(Scripts/Ulduar): XT-002 Searing Light and Gravity Bomb target one non-tank player (#26691) Co-authored-by: Claude Opus 4.8 --- .../rev_1784463884644221000.sql | 8 +++++++ .../Northrend/Ulduar/Ulduar/boss_xt002.cpp | 22 +++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1784463884644221000.sql diff --git a/data/sql/updates/pending_db_world/rev_1784463884644221000.sql b/data/sql/updates/pending_db_world/rev_1784463884644221000.sql new file mode 100644 index 000000000..2a95a387a --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1784463884644221000.sql @@ -0,0 +1,8 @@ +-- +-- XT-002 Deconstructor: restore Searing Light / Gravity Bomb single random non-tank targeting +DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_xt002_searing_light_gravity_bomb'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(63018, 'spell_xt002_searing_light_gravity_bomb'), +(65121, 'spell_xt002_searing_light_gravity_bomb'), +(63024, 'spell_xt002_searing_light_gravity_bomb'), +(64234, 'spell_xt002_searing_light_gravity_bomb'); diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp index 75820d461..0321c7266 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp @@ -18,6 +18,7 @@ #include "AchievementCriteriaScript.h" #include "Containers.h" #include "CreatureScript.h" +#include "GridNotifiers.h" #include "InstanceScript.h" #include "MotionMaster.h" #include "ObjectAccessor.h" @@ -709,6 +710,26 @@ private: TaskScheduler _scheduler; }; +// 63018, 65121 - Searing Light / 63024, 64234 - Gravity Bomb +// Both hit a single random player, never the current tank +class spell_xt002_searing_light_gravity_bomb : public SpellScript +{ + PrepareSpellScript(spell_xt002_searing_light_gravity_bomb); + + void FilterTargets(std::list& targets) + { + if (Unit* victim = GetCaster()->GetVictim()) + targets.remove_if(Acore::ObjectGUIDCheck(victim->GetGUID(), true)); + + Acore::Containers::RandomResize(targets, 1); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_xt002_searing_light_gravity_bomb::FilterTargets, EFFECT_ALL, TARGET_UNIT_DEST_AREA_ENEMY); + } +}; + // 63018, 65121 - Searing Light class spell_xt002_searing_light_spawn_life_spark : public AuraScript { @@ -1057,6 +1078,7 @@ void AddSC_boss_xt002() RegisterUlduarCreatureAI(npc_boombot); RegisterUlduarCreatureAI(npc_life_spark); RegisterUlduarCreatureAI(npc_xt_void_zone); + RegisterSpellScript(spell_xt002_searing_light_gravity_bomb); RegisterSpellScript(spell_xt002_searing_light_spawn_life_spark); RegisterSpellScript(spell_xt002_gravity_bomb_aura); RegisterSpellScript(spell_xt002_gravity_bomb_damage); From 5091ccbd2064030ddd333f9a9954987efbff994b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 19 Jul 2026 18:11:14 +0000 Subject: [PATCH 037/134] chore(DB): import pending files Referenced commit(s): e570e3fd2fb969ad574c212e174b6f2c442e1129 --- .../rev_1784463884644221000.sql => db_world/2026_07_19_05.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1784463884644221000.sql => db_world/2026_07_19_05.sql} (91%) diff --git a/data/sql/updates/pending_db_world/rev_1784463884644221000.sql b/data/sql/updates/db_world/2026_07_19_05.sql similarity index 91% rename from data/sql/updates/pending_db_world/rev_1784463884644221000.sql rename to data/sql/updates/db_world/2026_07_19_05.sql index 2a95a387a..a5d6dfce5 100644 --- a/data/sql/updates/pending_db_world/rev_1784463884644221000.sql +++ b/data/sql/updates/db_world/2026_07_19_05.sql @@ -1,3 +1,4 @@ +-- DB update 2026_07_19_04 -> 2026_07_19_05 -- -- XT-002 Deconstructor: restore Searing Light / Gravity Bomb single random non-tank targeting DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_xt002_searing_light_gravity_bomb'; From 67d4f25777584e2e25b844a025b6709d2e482cbc Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Sun, 19 Jul 2026 15:41:02 -0300 Subject: [PATCH 038/134] fix(DB/Conditions): restrict Mimiron Rocket Strike to the rocket visuals (#26696) Co-authored-by: Claude Opus 4.8 --- .../updates/pending_db_world/rev_1784479606995022900.sql | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1784479606995022900.sql diff --git a/data/sql/updates/pending_db_world/rev_1784479606995022900.sql b/data/sql/updates/pending_db_world/rev_1784479606995022900.sql new file mode 100644 index 000000000..204126885 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1784479606995022900.sql @@ -0,0 +1,6 @@ +-- Rocket Strike must only hit VX-001's mounted rocket visuals, otherwise the +-- area-entry target degrades to any nearby unit and VX-001 fires itself +DELETE FROM `conditions` WHERE (`SourceTypeOrReferenceId` = 13) AND (`SourceGroup` = 1) AND (`SourceEntry` IN (64402, 65034)) AND (`SourceId` = 0) AND (`ElseGroup` = 0) AND (`ConditionTypeOrReference` = 31) AND (`ConditionTarget` = 0) AND (`ConditionValue1` = 3) AND (`ConditionValue2` = 34050) AND (`ConditionValue3` = 0); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(13, 1, 64402, 0, 0, 31, 0, 3, 34050, 0, 0, 0, 0, '', 'Rocket Strike EFFECT_0 can only hit NPC_ROCKET_VISUAL'), +(13, 1, 65034, 0, 0, 31, 0, 3, 34050, 0, 0, 0, 0, '', 'Rocket Strike EFFECT_0 can only hit NPC_ROCKET_VISUAL'); From a0095036edf22f4755c4bd7d3bb0a9cd69a3d61e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 19 Jul 2026 18:42:14 +0000 Subject: [PATCH 039/134] chore(DB): import pending files Referenced commit(s): 67d4f25777584e2e25b844a025b6709d2e482cbc --- .../rev_1784479606995022900.sql => db_world/2026_07_19_06.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1784479606995022900.sql => db_world/2026_07_19_06.sql} (95%) diff --git a/data/sql/updates/pending_db_world/rev_1784479606995022900.sql b/data/sql/updates/db_world/2026_07_19_06.sql similarity index 95% rename from data/sql/updates/pending_db_world/rev_1784479606995022900.sql rename to data/sql/updates/db_world/2026_07_19_06.sql index 204126885..a1a1c4935 100644 --- a/data/sql/updates/pending_db_world/rev_1784479606995022900.sql +++ b/data/sql/updates/db_world/2026_07_19_06.sql @@ -1,3 +1,4 @@ +-- DB update 2026_07_19_05 -> 2026_07_19_06 -- Rocket Strike must only hit VX-001's mounted rocket visuals, otherwise the -- area-entry target degrades to any nearby unit and VX-001 fires itself DELETE FROM `conditions` WHERE (`SourceTypeOrReferenceId` = 13) AND (`SourceGroup` = 1) AND (`SourceEntry` IN (64402, 65034)) AND (`SourceId` = 0) AND (`ElseGroup` = 0) AND (`ConditionTypeOrReference` = 31) AND (`ConditionTarget` = 0) AND (`ConditionValue1` = 3) AND (`ConditionValue2` = 34050) AND (`ConditionValue3` = 0); From df54196febcd1ebcef927cd4b39b6974a21f8819 Mon Sep 17 00:00:00 2001 From: sudlud Date: Sun, 19 Jul 2026 21:43:55 +0200 Subject: [PATCH 040/134] fix(CI): fix data version v20 to v20.0 (#26697) --- apps/installer/includes/functions.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/installer/includes/functions.sh b/apps/installer/includes/functions.sh index fce8cdb44..f20dd8ee9 100644 --- a/apps/installer/includes/functions.sh +++ b/apps/installer/includes/functions.sh @@ -155,7 +155,7 @@ function inst_simple_restarter { function inst_download_client_data { # change the following version when needed - local VERSION=v20 + local VERSION=v20.0 echo "#######################" echo "Client data downloader" From fe5e3c0109307b12c2c3752c47777e45a46bddeb Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Sun, 19 Jul 2026 17:11:31 -0300 Subject: [PATCH 041/134] fix(Scripts/BlackMorass): stop rift adds from spawning once Aeonus is up (#26699) Co-authored-by: Claude Opus 4.8 --- .../CavernsOfTime/TheBlackMorass/instance_the_black_morass.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/instance_the_black_morass.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/instance_the_black_morass.cpp index d413e444f..f082dcc88 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/instance_the_black_morass.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/instance_the_black_morass.cpp @@ -32,6 +32,7 @@ const Position PortalLocation[4] = ObjectData const creatureData[] = { { NPC_MEDIVH, DATA_MEDIVH }, + { NPC_AEONUS, DATA_AEONUS }, { 0, 0 } }; From 3b1df8136db467f5c542597f012a73dcd13d6dd5 Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Sun, 19 Jul 2026 20:47:32 -0300 Subject: [PATCH 042/134] fix(Scripts/Ulduar): keep VX-001 arms deployed through MK II melee swings in Mimiron phase 4 (#26698) Co-authored-by: Claude Fable 5 --- .../scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp index 96a31b557..04514be9c 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp @@ -964,7 +964,10 @@ struct npc_ulduar_leviathan_mkii : public ScriptedAI ScriptedAI::AttackStart(who); // Unit::Attack clears the emote state on target switch, which would retract VX-001's arms if (_phase == 4) + { me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_CUSTOM_SPELL_01); + me->HandleEmoteCommand(EMOTE_STATE_CUSTOM_SPELL_01); + } } void SetData(uint32 id, uint32 value) override @@ -1065,7 +1068,15 @@ struct npc_ulduar_leviathan_mkii : public ScriptedAI _events.Update(diff); if (!me->HasUnitState(UNIT_STATE_CASTING)) + { + bool wasAttackReady = me->isAttackReady(); DoMeleeAttackIfReady(); + // Each melee swing knocks the client out of the arms-deployed loop, retracting + // VX-001's arms. Field updates with an unchanged value are ignored by the client, + // so replay the state emote via SMSG_EMOTE, which is always applied. + if (_phase == 4 && wasAttackReady && !me->isAttackReady()) + me->HandleEmoteCommand(EMOTE_STATE_CUSTOM_SPELL_01); + } Unit* cannon = GetS3(); if (!cannon || cannon->HasUnitState(UNIT_STATE_CASTING) || me->HasUnitState(UNIT_STATE_CASTING) || me->HasSilenceAura()) From 4a44d6a190981eb1e84358ff996ca15abeebd052 Mon Sep 17 00:00:00 2001 From: sogladev Date: Mon, 20 Jul 2026 01:53:19 +0200 Subject: [PATCH 043/134] fix(Core/Unit): correct partial school immunity for dual-school spells (#26254) --- src/server/game/Entities/Unit/Unit.cpp | 137 ++++-------------- src/server/game/Entities/Unit/Unit.h | 3 +- src/server/game/Spells/Spell.cpp | 2 +- .../game/Spells/SpellInfoCorrections.cpp | 10 ++ 4 files changed, 42 insertions(+), 110 deletions(-) diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index b8beef5f0..0b04c04aa 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -939,34 +939,8 @@ bool Unit::IsImmunedToSpell(SpellInfo const* spellInfo, uint32 effectMask, Unit if (hasCheckedEffect && immuneToAllEffects) return true; - if (!spellInfo->HasAttribute(SPELL_ATTR2_NO_SCHOOL_IMMUNITIES)) - { - if (spellInfo->Id == 42292 || spellInfo->Id == 59752 || spellInfo->Id == 19574 || spellInfo->Id == 34471) - return false; - - SpellSchoolMask schoolMask = spellInfo->GetSchoolMask(); - if (schoolMask != SPELL_SCHOOL_MASK_NONE) - { - SpellImmuneContainer const& schoolList = m_spellImmune[IMMUNITY_SCHOOL]; - for (auto const& [immunitySchoolMask, immunityAuraId] : schoolList) - { - SpellInfo const* immuneSpellInfo = sSpellMgr->GetSpellInfo(immunityAuraId); - if (immunityAuraId == spellInfo->Id) - continue; - - if ((immunitySchoolMask & schoolMask) != schoolMask) - continue; - - if (IgnoresSchoolImmunityFromFriendlyCaster(caster, immunityAuraId, immuneSpellInfo)) - continue; - - if (spellInfo->CanPierceImmuneAura(immuneSpellInfo)) - continue; - - return true; - } - } - } + if (!spellInfo->HasAttribute(SPELL_ATTR2_NO_SCHOOL_IMMUNITIES) && HasSchoolImmunityForMask(spellInfo->GetSchoolMask(), caster, spellInfo)) + return true; return false; } @@ -9860,6 +9834,32 @@ bool Unit::IgnoresSchoolImmunityFromFriendlyCaster(Unit const* caster, uint32 im return immunityAuraId == std::numeric_limits::max(); } +bool Unit::HasSchoolImmunityForMask(SpellSchoolMask schoolMask, Unit const* caster, SpellInfo const* spellInfo) const +{ + if (schoolMask == SPELL_SCHOOL_MASK_NONE) + return false; + + uint32 accumulatedMask = 0; + for (auto const& [immunitySchoolMask, immunityAuraId] : m_spellImmune[IMMUNITY_SCHOOL]) + { + // Skip the spell's own immunity entry + if (spellInfo && immunityAuraId == spellInfo->Id) + continue; + + SpellInfo const* immuneSpellInfo = sSpellMgr->GetSpellInfo(immunityAuraId); + + if (IgnoresSchoolImmunityFromFriendlyCaster(caster, immunityAuraId, immuneSpellInfo)) + continue; + + if (spellInfo && immuneSpellInfo && spellInfo->CanPierceImmuneAura(immuneSpellInfo)) + continue; + + accumulatedMask |= immunitySchoolMask; + } + + return (SpellSchoolMask(accumulatedMask) & schoolMask) == schoolMask; +} + bool Unit::IsImmunedToDamage(SpellSchoolMask schoolMask) const { if (schoolMask == SPELL_SCHOOL_MASK_NONE) @@ -9935,68 +9935,10 @@ bool Unit::IsImmunedToSchool(SpellSchoolMask schoolMask) const }); } -bool Unit::IsImmunedToSchool(SpellInfo const* spellInfo) const -{ - if (spellInfo->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES) && !HasSpiritOfRedemptionAura()) - return false; - - uint32 schoolMask = spellInfo->GetSchoolMask(); - if (schoolMask == SPELL_SCHOOL_MASK_NONE) - { - return false; - } - - if (spellInfo->Id != 42292 && spellInfo->Id != 59752 && spellInfo->Id != 19574 && spellInfo->Id != 34471) - { - // Check IMMUNITY_SCHOOL: returns true if ALL schools in the mask are covered and spell can't pierce - SpellImmuneContainer const& schoolList = m_spellImmune[IMMUNITY_SCHOOL]; - for (auto itr = schoolList.begin(); itr != schoolList.end(); ++itr) - if ((itr->first & schoolMask) == schoolMask && !spellInfo->CanPierceImmuneAura(sSpellMgr->GetSpellInfo(itr->second))) - return true; - } - - return false; -} - -bool Unit::IsImmunedToSchool(Spell const* spell) const -{ - SpellInfo const* spellInfo = spell->GetSpellInfo(); - if (spellInfo->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES) && !HasSpiritOfRedemptionAura()) - { - return false; - } - - uint32 schoolMask = spell->GetSpellSchoolMask(); - if (schoolMask == SPELL_SCHOOL_MASK_NONE) - { - return false; - } - - if (spellInfo->Id != 42292 && spellInfo->Id != 59752 && spellInfo->Id != 19574 && spellInfo->Id != 34471) - { - // Check IMMUNITY_SCHOOL: returns true if ALL schools in the mask are covered and spell can't pierce - SpellImmuneContainer const& schoolList = m_spellImmune[IMMUNITY_SCHOOL]; - for (auto itr = schoolList.begin(); itr != schoolList.end(); ++itr) - { - SpellInfo const* immuneSpellInfo = sSpellMgr->GetSpellInfo(itr->second); - if ((itr->first & schoolMask) == schoolMask - && !IgnoresSchoolImmunityFromFriendlyCaster(spell->GetCaster(), itr->second, immuneSpellInfo) - && !spellInfo->CanPierceImmuneAura(immuneSpellInfo)) - { - return true; - } - } - } - - return false; -} - bool Unit::IsImmunedToDamageOrSchool(SpellSchoolMask schoolMask) const { if (schoolMask == SPELL_SCHOOL_MASK_NONE) - { return false; - } return IsImmunedToDamage(schoolMask) || IsImmunedToSchool(schoolMask); } @@ -10102,27 +10044,8 @@ bool Unit::IsImmunedToSpell(SpellInfo const* spellInfo, Unit const* caster, Spel if (!spellInfo->HasAttribute(SPELL_ATTR2_NO_SCHOOL_IMMUNITIES)) { - if (spellSchoolMask != SPELL_SCHOOL_MASK_NONE) - { - 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; - - if (IgnoresSchoolImmunityFromFriendlyCaster(caster, itr->second, immuneSpellInfo)) - continue; - - if (spellInfo->CanPierceImmuneAura(immuneSpellInfo)) - continue; - - return true; - } - } + if (HasSchoolImmunityForMask(spellSchoolMask, caster, spellInfo)) + return true; } return false; diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 211482078..b589fdd13 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1645,14 +1645,13 @@ public: [[nodiscard]] bool IsImmunedToDamage(SpellSchoolMask schoolMask) const; [[nodiscard]] bool IsImmunedToDamage(Unit const* caster, SpellInfo const* spellInfo) const; [[nodiscard]] bool IsImmunedToSchool(SpellSchoolMask schoolMask) const; + [[nodiscard]] bool HasSchoolImmunityForMask(SpellSchoolMask schoolMask, Unit const* caster, SpellInfo const* spellInfo) const; static bool IsImmuneMaskFully(SpellSchoolMask immuneMask, SpellSchoolMask schoolMask) { return (immuneMask & schoolMask) == schoolMask; } [[nodiscard]] uint32 GetSchoolImmunityMask() const; [[nodiscard]] uint32 GetDamageImmunityMask() const; - [[nodiscard]] bool IsImmunedToSchool(SpellInfo const* spellInfo) const; - [[nodiscard]] bool IsImmunedToSchool(Spell const* spell) const; [[nodiscard]] bool IsImmunedToDamageOrSchool(SpellSchoolMask schoolMask) const; [[nodiscard]] bool IsImmunedToAuraPeriodicTick(Unit const* caster, SpellInfo const* spellInfo) const; virtual bool IsImmunedToSpellEffect(SpellInfo const* spellInfo, uint32 index, Unit const* caster = nullptr) const; diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 4609a074d..4ce8e3870 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -2982,7 +2982,7 @@ SpellMissInfo Spell::DoSpellHitOnUnit(Unit* unit, uint32 effectMask, bool scaleA return SPELL_MISS_EVADE; // For delayed spells immunity may be applied between missile launch and hit - check immunity for that case - if (m_spellInfo->Speed && ((m_damage > 0 && unit->IsImmunedToDamage(m_caster, m_spellInfo)) || unit->IsImmunedToSchool(this) || unit->IsImmunedToSpell(m_spellInfo, this))) + if (m_spellInfo->Speed && ((m_damage > 0 && unit->IsImmunedToDamage(m_caster, m_spellInfo)) || unit->IsImmunedToSpell(m_spellInfo, this))) { return SPELL_MISS_IMMUNE; } diff --git a/src/server/game/Spells/SpellInfoCorrections.cpp b/src/server/game/Spells/SpellInfoCorrections.cpp index 892ebec5a..2451f16a5 100644 --- a/src/server/game/Spells/SpellInfoCorrections.cpp +++ b/src/server/game/Spells/SpellInfoCorrections.cpp @@ -5202,6 +5202,16 @@ void SpellMgr::LoadSpellInfoCorrections() spellInfo->Effects[EFFECT_0].BasePoints = 1; }); + ApplySpellFix({ + 42292, // PvP Trinket + 59752, // Every Man for Himself + 19574, // Bestial Wrath + 34471 // The Beast Within + }, [](SpellInfo* spellInfo) + { + spellInfo->AttributesEx2 |= SPELL_ATTR2_NO_SCHOOL_IMMUNITIES; + }); + // 51036 Summon Venture Co. Air Patrol ApplySpellFix({ 51036 }, [](SpellInfo* spellInfo) { From 52c216a016a509dbfc283ea7a3380776a0d25156 Mon Sep 17 00:00:00 2001 From: sogladev Date: Mon, 20 Jul 2026 01:55:50 +0200 Subject: [PATCH 044/134] fix(Scripts/Ulduar): Auriaya spawn and Sanctum Sentry formation (#26631) --- .../rev_1784115921544417667.sql | 35 ++++++++++++++ .../Northrend/Ulduar/Ulduar/boss_auriaya.cpp | 48 +++++++++++-------- 2 files changed, 64 insertions(+), 19 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1784115921544417667.sql diff --git a/data/sql/updates/pending_db_world/rev_1784115921544417667.sql b/data/sql/updates/pending_db_world/rev_1784115921544417667.sql new file mode 100644 index 000000000..8df70e75b --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1784115921544417667.sql @@ -0,0 +1,35 @@ +-- Auriaya and Sanctum Sentry: DB-based spawns and creature_formations +SET @CGUID := 137532; +SET @AURI := 137496; +SET @X := 1938.7361; +SET @Y := 42.06429; +SET @Z := 411.5189; +SET @O := 1.818165; + +-- Update Auriaya's spawn to sniff position +UPDATE `creature` SET `position_x` = @X, `position_y` = @Y, `position_z` = @Z, `orientation` = @O WHERE `id` = 33515 AND `guid` = @AURI; + +-- Add Sanctum Sentry spawns (10-man: 2 sentries, 25-man: 4 sentries) +DELETE FROM `creature` WHERE `id` = 34014 AND `map` = 603; +INSERT INTO `creature` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `wander_distance`, `MovementType`, `ScriptName`, `Comment`, `VerifiedBuild`) VALUES +-- 10-man sentries +(@CGUID+0, 34014, 603, 0, 0, 1, 1, 0, @X, @Y, @Z, @O, 604800, 0, 0, '', 'Sanctum Sentry - follows Auriaya', 0), +(@CGUID+1, 34014, 603, 0, 0, 1, 1, 0, @X, @Y, @Z, @O, 604800, 0, 0, '', 'Sanctum Sentry - follows Auriaya', 0), +-- 25-man sentries +(@CGUID+2, 34014, 603, 0, 0, 2, 1, 0, @X, @Y, @Z, @O, 604800, 0, 0, '', 'Sanctum Sentry - follows Auriaya', 0), +(@CGUID+3, 34014, 603, 0, 0, 2, 1, 0, @X, @Y, @Z, @O, 604800, 0, 0, '', 'Sanctum Sentry - follows Auriaya', 0), +(@CGUID+4, 34014, 603, 0, 0, 2, 1, 0, @X, @Y, @Z, @O, 604800, 0, 0, '', 'Sanctum Sentry - follows Auriaya', 0), +(@CGUID+5, 34014, 603, 0, 0, 2, 1, 0, @X, @Y, @Z, @O, 604800, 0, 0, '', 'Sanctum Sentry - follows Auriaya', 0); + +-- Set creature_formations: sentries follow Auriaya +DELETE FROM `creature_formations` WHERE `leaderGUID` = 137496; +INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES +(@AURI, @AURI, 0, 0, 2, 0, 0), +-- 10-man sentries +(@AURI, @CGUID+0, 7.0, 166, 519, 0, 0), +(@AURI, @CGUID+1, 7.0, 194, 519, 0, 0), +-- 25-man sentries +(@AURI, @CGUID+2, 7.0, 166, 519, 0, 0), +(@AURI, @CGUID+3, 7.0, 194, 519, 0, 0), +(@AURI, @CGUID+4, 12.0, 204, 519, 0, 0), +(@AURI, @CGUID+5, 12.0, 152, 519, 0, 0); diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp index 015436c7a..913e2c32d 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp @@ -17,6 +17,7 @@ #include "AchievementCriteriaScript.h" #include "CreatureScript.h" +#include "CreatureGroups.h" #include "Player.h" #include "ScriptedCreature.h" #include "SpellAuraEffects.h" @@ -90,6 +91,7 @@ enum Misc ACTION_FERAL_DEATH = 2, ACTION_DESPAWN_ADDS = 3, ACTION_FERAL_DEATH_WITH_STACK = 4, + ACTION_SENTRY_DEATH = 5, DATA_CRAZY_CAT = 10, DATA_NINE_LIVES = 11, @@ -102,6 +104,19 @@ struct boss_auriaya : public BossAI bool _feralDied{false}; bool _nineLives{false}; + void DespawnFormationMembers(bool onEvade = false) + { + if (CreatureGroup* formation = me->GetFormation()) + for (auto const& [member, info] : formation->GetMembers()) + if (member && member != me) + { + if (onEvade) + member->DespawnOnEvade(); + else + member->DespawnOrUnsummon(); + } + } + void Reset() override { _feralDied = false; @@ -110,10 +125,10 @@ struct boss_auriaya : public BossAI EntryCheckPredicate pred(NPC_FERAL_DEFENDER); summons.DoAction(ACTION_DESPAWN_ADDS, pred); - BossAI::Reset(); + if (me->IsInEvadeMode()) + DespawnFormationMembers(true); - for (uint8 i = 0; i < RAID_MODE(2, 4); ++i) - me->SummonCreature(NPC_SANCTUM_SENTRY, me->GetPositionX() + urand(4, 12), me->GetPositionY() + urand(4, 12), me->GetPositionZ()); + BossAI::Reset(); me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_INTERRUPT_CAST, false); } @@ -128,22 +143,6 @@ struct boss_auriaya : public BossAI return 0; } - void JustSummoned(Creature* cr) override - { - if (cr->GetEntry() == NPC_SANCTUM_SENTRY) - cr->GetMotionMaster()->MoveFollow(me, 6, rand_norm() * 2 * 3.14f); - else - cr->SetInCombatWithZone(); - - summons.Summon(cr); - } - - void SummonedCreatureDies(Creature* cr, Unit*) override - { - if (cr->GetEntry() == NPC_SANCTUM_SENTRY) - _feralDied = true; - } - void JustEngagedWith(Unit* who) override { BossAI::JustEngagedWith(who); @@ -171,6 +170,8 @@ struct boss_auriaya : public BossAI EntryCheckPredicate pred(NPC_FERAL_DEFENDER); summons.DoAction(ACTION_DESPAWN_ADDS, pred); + DespawnFormationMembers(); + BossAI::JustDied(killer); Talk(EMOTE_DEATH); } @@ -181,6 +182,8 @@ struct boss_auriaya : public BossAI events.ScheduleEvent(EVENT_RESPAWN_FERAL_DEFENDER, 25s); else if (param == ACTION_FERAL_DEATH) _nineLives = true; + else if (param == ACTION_SENTRY_DEATH) + _feralDied = true; } void ExecuteEvent(uint32 eventId) override @@ -228,6 +231,13 @@ struct npc_auriaya_sanctum_sentry : public ScriptedAI { npc_auriaya_sanctum_sentry(Creature* creature) : ScriptedAI(creature) { } + void JustDied(Unit*) override + { + if (InstanceScript* instance = me->GetInstanceScript()) + if (Creature* auriaya = instance->GetCreature(BOSS_AURIAYA)) + auriaya->AI()->DoAction(ACTION_SENTRY_DEATH); + } + void JustEngagedWith(Unit*) override { if (InstanceScript* instance = me->GetInstanceScript()) From dd8909fcd824d79770e55abbbf1bd0e059feecf8 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 19 Jul 2026 23:57:07 +0000 Subject: [PATCH 045/134] chore(DB): import pending files Referenced commit(s): 52c216a016a509dbfc283ea7a3380776a0d25156 --- .../rev_1784115921544417667.sql => db_world/2026_07_19_07.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1784115921544417667.sql => db_world/2026_07_19_07.sql} (97%) diff --git a/data/sql/updates/pending_db_world/rev_1784115921544417667.sql b/data/sql/updates/db_world/2026_07_19_07.sql similarity index 97% rename from data/sql/updates/pending_db_world/rev_1784115921544417667.sql rename to data/sql/updates/db_world/2026_07_19_07.sql index 8df70e75b..b263aa757 100644 --- a/data/sql/updates/pending_db_world/rev_1784115921544417667.sql +++ b/data/sql/updates/db_world/2026_07_19_07.sql @@ -1,3 +1,4 @@ +-- DB update 2026_07_19_06 -> 2026_07_19_07 -- Auriaya and Sanctum Sentry: DB-based spawns and creature_formations SET @CGUID := 137532; SET @AURI := 137496; From 9099404b68ed9aaed29698501cc008812961ef6e Mon Sep 17 00:00:00 2001 From: moostigre Date: Mon, 20 Jul 2026 02:32:24 +0200 Subject: [PATCH 046/134] fix(DB/Creature): Sludge Beast pos (#26456) --- data/sql/updates/pending_db_world/move-a-creature.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 data/sql/updates/pending_db_world/move-a-creature.sql diff --git a/data/sql/updates/pending_db_world/move-a-creature.sql b/data/sql/updates/pending_db_world/move-a-creature.sql new file mode 100644 index 000000000..4168cb842 --- /dev/null +++ b/data/sql/updates/pending_db_world/move-a-creature.sql @@ -0,0 +1,2 @@ +-- Move Sludge Beast out of the wooden plank collision pocket in Sludge Fen. +UPDATE `creature` SET `position_x` = 1062.8604, `position_y` = -3125.564, `position_z` = 71.51024, `orientation` = 3.2642176 WHERE `guid` = 51809 AND `id` = 3295; From 10ff1837848196ca87fddcf9ca3665b48240fd88 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 20 Jul 2026 00:42:11 +0000 Subject: [PATCH 047/134] chore(DB): import pending files Referenced commit(s): 9099404b68ed9aaed29698501cc008812961ef6e --- .../move-a-creature.sql => db_world/2026_07_20_00.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/move-a-creature.sql => db_world/2026_07_20_00.sql} (84%) diff --git a/data/sql/updates/pending_db_world/move-a-creature.sql b/data/sql/updates/db_world/2026_07_20_00.sql similarity index 84% rename from data/sql/updates/pending_db_world/move-a-creature.sql rename to data/sql/updates/db_world/2026_07_20_00.sql index 4168cb842..360854b00 100644 --- a/data/sql/updates/pending_db_world/move-a-creature.sql +++ b/data/sql/updates/db_world/2026_07_20_00.sql @@ -1,2 +1,3 @@ +-- DB update 2026_07_19_07 -> 2026_07_20_00 -- Move Sludge Beast out of the wooden plank collision pocket in Sludge Fen. UPDATE `creature` SET `position_x` = 1062.8604, `position_y` = -3125.564, `position_z` = 71.51024, `orientation` = 3.2642176 WHERE `guid` = 51809 AND `id` = 3295; From 16509bff09591bf31135b49089eb2a50b71117f6 Mon Sep 17 00:00:00 2001 From: Kitzunu <24550914+Kitzunu@users.noreply.github.com> Date: Mon, 20 Jul 2026 03:10:25 +0200 Subject: [PATCH 048/134] fix(DB/Commands): clarify `.debug update` help text (#26705) --- data/sql/updates/pending_db_world/rev_1784509066109903000.sql | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1784509066109903000.sql diff --git a/data/sql/updates/pending_db_world/rev_1784509066109903000.sql b/data/sql/updates/pending_db_world/rev_1784509066109903000.sql new file mode 100644 index 000000000..c9984804d --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1784509066109903000.sql @@ -0,0 +1,4 @@ +-- +DELETE FROM `command` WHERE `name` = 'debug update'; +INSERT INTO `command` (`name`, `security`, `help`) VALUES +('debug update', 3, 'Syntax: .debug update #index [#value]\n\nUSE WITH CAUTION, CAN CRASH THE SERVER\n\nReads or writes the raw 32-bit update field at #index on the selected unit. With no #value, prints the current value; with #value, sets it. Writing an invalid value can crash the server.\nValid #index are the *_FIELD enums in src/server/game/Entities/Object/Updates/UpdateFields.h (UNIT_FIELD_* for creatures, PLAYER_FIELD_* for players).'); From 6dd2fe8b9bf0113349693407763d9e7c2a814b9b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 20 Jul 2026 01:17:19 +0000 Subject: [PATCH 049/134] chore(DB): import pending files Referenced commit(s): 16509bff09591bf31135b49089eb2a50b71117f6 --- .../rev_1784509066109903000.sql => db_world/2026_07_20_01.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1784509066109903000.sql => db_world/2026_07_20_01.sql} (92%) diff --git a/data/sql/updates/pending_db_world/rev_1784509066109903000.sql b/data/sql/updates/db_world/2026_07_20_01.sql similarity index 92% rename from data/sql/updates/pending_db_world/rev_1784509066109903000.sql rename to data/sql/updates/db_world/2026_07_20_01.sql index c9984804d..bb548e999 100644 --- a/data/sql/updates/pending_db_world/rev_1784509066109903000.sql +++ b/data/sql/updates/db_world/2026_07_20_01.sql @@ -1,3 +1,4 @@ +-- DB update 2026_07_20_00 -> 2026_07_20_01 -- DELETE FROM `command` WHERE `name` = 'debug update'; INSERT INTO `command` (`name`, `security`, `help`) VALUES From 300863c7569226316f31648ad64bb34175bd1c1a Mon Sep 17 00:00:00 2001 From: Benjamin Jackson <38561765+heyitsbench@users.noreply.github.com> Date: Mon, 20 Jul 2026 14:01:30 -0400 Subject: [PATCH 050/134] fix(Scripts/Ulduar): Adjust initial spawn timer of Living Constellations. (#26704) --- .../Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp index 1be8c9140..1aaa4af48 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp @@ -508,7 +508,7 @@ struct boss_algalon_the_observer : public ScriptedAI events.ScheduleEvent(EVENT_PHASE_PUNCH, 15500ms + introDelay); events.ScheduleEvent(EVENT_SUMMON_COLLAPSING_STAR, 16500ms + introDelay); events.ScheduleEvent(EVENT_COSMIC_SMASH, 25s + introDelay); - events.ScheduleEvent(EVENT_ACTIVATE_LIVING_CONSTELLATION, 50500ms + introDelay); + events.ScheduleEvent(EVENT_ACTIVATE_LIVING_CONSTELLATION, 60s + introDelay); events.ScheduleEvent(EVENT_BIG_BANG, 90s + introDelay); events.ScheduleEvent(EVENT_ASCEND_TO_THE_HEAVENS, 360s + introDelay); From 9a9924ed43fc7bfaeda78768efe8cf946c800541 Mon Sep 17 00:00:00 2001 From: Eddy Vega <61223313+Si1ker@users.noreply.github.com> Date: Mon, 20 Jul 2026 12:15:17 -0600 Subject: [PATCH 051/134] fix(Scripts/Ulduar): Algalon engage roleplays (#26667) Co-authored-by: sogladev --- .../Ulduar/boss_algalon_the_observer.cpp | 67 ++++++++++--------- .../scripts/Northrend/Ulduar/Ulduar/ulduar.h | 1 + 2 files changed, 35 insertions(+), 33 deletions(-) diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp index 1aaa4af48..ed3024c2d 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp @@ -118,7 +118,7 @@ enum Events EVENT_INTRO_2 = 7, EVENT_INTRO_3 = 8, EVENT_INTRO_FINISH = 9, - EVENT_START_COMBAT = 10, + EVENT_SAY_ALGALON_AGGRO = 10, EVENT_INTRO_TIMER_DONE = 11, EVENT_QUANTUM_STRIKE = 12, EVENT_PHASE_PUNCH = 13, @@ -143,7 +143,7 @@ enum Events EVENT_OUTRO_11 = 32, EVENT_ACTIVATE_LIVING_CONSTELLATION = 33, EVENT_CHECK_HERALD_ITEMS = 34, - EVENT_REMOVE_UNNATTACKABLE = 35, + EVENT_ALGALON_IN_PROGRESS = 35, EVENT_DESPAWN_ALGALON_1 = 36, EVENT_DESPAWN_ALGALON_2 = 37, EVENT_DESPAWN_ALGALON_3 = 38, @@ -264,10 +264,13 @@ struct boss_algalon_the_observer : public ScriptedAI { boss_algalon_the_observer(Creature* creature) : ScriptedAI(creature), summons(me) { - _fedOnTears = true; - _firstPull = true; - _fightWon = false; _instance = me->GetInstanceScript(); + _fedOnTears = true; + _fightWon = false; + if (_instance) + _firstPull = !_instance->GetPersistentData(PERSISTENT_DATA_ALGALON_FIRST_PULL); + else + _firstPull = true; } EventMap events; @@ -381,17 +384,17 @@ struct boss_algalon_the_observer : public ScriptedAI me->SetSheath(SHEATH_STATE_UNARMED); me->SetFaction(190); me->CastSpell(me, SPELL_DUAL_WIELD, true); - _phaseTwo = false; _heraldOfTheTitans = true; - - if (_instance->GetBossState(BOSS_ALGALON) == FAIL) - { - _firstPull = false; - } - if (_instance) + { + if (_instance->GetBossState(BOSS_ALGALON) == FAIL) + { + _firstPull = false; + _instance->StorePersistentData(PERSISTENT_DATA_ALGALON_FIRST_PULL, 1); + } _instance->SetBossState(BOSS_ALGALON, NOT_STARTED); + } } void KilledUnit(Unit* victim) override @@ -452,6 +455,8 @@ struct boss_algalon_the_observer : public ScriptedAI _firstPull = false; _fedOnTears = false; me->SetImmuneToPC(false); + if (_instance) + _instance->StorePersistentData(PERSISTENT_DATA_ALGALON_FIRST_PULL, 1); break; case ACTION_ASCEND: summons.DespawnAll(); @@ -486,32 +491,28 @@ struct boss_algalon_the_observer : public ScriptedAI me->SetImmuneToNPC(true); events.Reset(); events.SetPhase(PHASE_ROLE_PLAY); + events.ScheduleEvent(EVENT_ALGALON_IN_PROGRESS, _firstPull ? 14s : 1500ms); + Talk(SAY_ALGALON_START_TIMER); + summons.DespawnEntry(NPC_AZEROTH); - if (!_firstPull) + if (_firstPull) { - events.ScheduleEvent(EVENT_START_COMBAT, 0ms); - introDelay = 8s; + _firstPull = false; + _instance->SetData(DATA_DESPAWN_ALGALON, 0); + events.ScheduleEvent(EVENT_SAY_ALGALON_AGGRO, 16s); + introDelay = 26s; } else - { - summons.DespawnEntry(NPC_AZEROTH); - _firstPull = false; - Talk(SAY_ALGALON_START_TIMER); - introDelay = 22s; - events.ScheduleEvent(EVENT_START_COMBAT, 14s); - _instance->SetData(DATA_DESPAWN_ALGALON, 0); - } + introDelay = 8500ms; - events.ScheduleEvent(EVENT_REMOVE_UNNATTACKABLE, introDelay - 500ms); events.ScheduleEvent(EVENT_INTRO_TIMER_DONE, introDelay); events.ScheduleEvent(EVENT_QUANTUM_STRIKE, 3500ms + introDelay); events.ScheduleEvent(EVENT_PHASE_PUNCH, 15500ms + introDelay); events.ScheduleEvent(EVENT_SUMMON_COLLAPSING_STAR, 16500ms + introDelay); - events.ScheduleEvent(EVENT_COSMIC_SMASH, 25s + introDelay); + events.ScheduleEvent(EVENT_COSMIC_SMASH, 26s + introDelay); events.ScheduleEvent(EVENT_ACTIVATE_LIVING_CONSTELLATION, 60s + introDelay); events.ScheduleEvent(EVENT_BIG_BANG, 90s + introDelay); events.ScheduleEvent(EVENT_ASCEND_TO_THE_HEAVENS, 360s + introDelay); - events.ScheduleEvent(EVENT_CHECK_HERALD_ITEMS, 5s); DoCheckHeraldOfTheTitans(); } @@ -533,7 +534,7 @@ struct boss_algalon_the_observer : public ScriptedAI events.ScheduleEvent(EVENT_OUTRO_7, 55s + 500ms); events.ScheduleEvent(EVENT_OUTRO_8, 73s + 500ms); events.ScheduleEvent(EVENT_OUTRO_9, 85s + 500ms); - events.ScheduleEvent(EVENT_OUTRO_10, 101s + 500ms); + events.ScheduleEvent(EVENT_OUTRO_10, 111s); events.ScheduleEvent(EVENT_OUTRO_11, 117s + 500ms); } } @@ -659,16 +660,17 @@ struct boss_algalon_the_observer : public ScriptedAI if (Creature* brann = _instance->GetCreature(DATA_BRANN_BRONZEBEARD_ALG)) brann->AI()->DoAction(ACTION_FINISH_INTRO); break; - case EVENT_START_COMBAT: - _instance->SetBossState(BOSS_ALGALON, IN_PROGRESS); + case EVENT_SAY_ALGALON_AGGRO: Talk(SAY_ALGALON_AGGRO); break; - case EVENT_REMOVE_UNNATTACKABLE: + case EVENT_ALGALON_IN_PROGRESS: + if (_instance) + _instance->SetBossState(BOSS_ALGALON, IN_PROGRESS); + break; + case EVENT_INTRO_TIMER_DONE: me->SetSheath(SHEATH_STATE_MELEE); me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE); me->SetImmuneToNPC(false); - break; - case EVENT_INTRO_TIMER_DONE: events.SetPhase(PHASE_NORMAL); me->CastSpell((Unit*)nullptr, SPELL_SUPERMASSIVE_FAIL, true); // Hack: _IsValidTarget failed earlier due to flags, call AttackStart again @@ -677,7 +679,6 @@ struct boss_algalon_the_observer : public ScriptedAI if (Player* target = SelectTargetFromPlayerList(150.0f)) AttackStart(target); me->SetInCombatWithZone(); - for (uint32 i = 0; i < LIVING_CONSTELLATION_COUNT; ++i) me->SummonCreature(NPC_LIVING_CONSTELLATION, ConstellationPos[i], TEMPSUMMON_DEAD_DESPAWN); break; diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.h b/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.h index faaf83d21..8d0fca9d8 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.h +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.h @@ -317,6 +317,7 @@ enum UlduarPersistentData PERSISTENT_DATA_ALGALON_TIMER, PERSISTENT_DATA_C_OF_ULDUAR_MASK, PERSISTENT_DATA_MAGE_BARRIER, + PERSISTENT_DATA_ALGALON_FIRST_PULL, MAX_PERSISTENT_DATA }; From 8eb009fdfc0445722296eecf8aee38fa3a9d8a24 Mon Sep 17 00:00:00 2001 From: Kitzunu <24550914+Kitzunu@users.noreply.github.com> Date: Tue, 21 Jul 2026 06:13:51 +0200 Subject: [PATCH 052/134] refactor(Core/Misc): enforce east-const style and add codestyle check (#26492) Co-authored-by: Ludwig --- apps/codestyle/codestyle-cpp.py | 54 +++++++++++++++---- .../Collision/BoundingIntervalHierarchy.h | 6 +-- .../BoundingIntervalHierarchyWrapper.h | 28 +++++----- src/common/Collision/DynamicTree.cpp | 26 ++++----- src/common/Collision/DynamicTree.h | 12 ++--- src/common/Collision/Management/IVMapMgr.h | 2 +- src/common/Collision/Management/VMapMgr2.cpp | 2 +- src/common/Collision/Management/VMapMgr2.h | 2 +- src/common/Collision/Maps/MapDefines.h | 2 +- src/common/Collision/Maps/MapTree.cpp | 20 +++---- src/common/Collision/Maps/MapTree.h | 22 ++++---- src/common/Collision/Maps/TileAssembler.cpp | 16 +++--- src/common/Collision/Maps/TileAssembler.h | 10 ++-- .../Collision/Models/GameObjectModel.cpp | 2 +- src/common/Collision/Models/GameObjectModel.h | 6 +-- src/common/Collision/Models/ModelInstance.cpp | 10 ++-- src/common/Collision/Models/ModelInstance.h | 14 ++--- src/common/Collision/Models/WorldModel.cpp | 38 ++++++------- src/common/Collision/Models/WorldModel.h | 24 ++++----- src/common/Collision/RegularGrid.h | 18 +++---- src/common/Collision/VMapDefinitions.h | 2 +- src/common/Collision/VMapTools.h | 12 ++--- src/common/Common.cpp | 2 +- src/common/Common.h | 2 +- src/common/Configuration/Config.cpp | 4 +- src/common/DataStores/DBCFileLoader.cpp | 2 +- src/common/DataStores/DBCFileLoader.h | 6 +-- .../Debugging/WheatyExceptionReport.cpp | 6 +-- src/common/Debugging/WheatyExceptionReport.h | 6 +-- src/common/Dynamic/TypeContainer.h | 4 +- src/common/Dynamic/TypeContainerFunctions.h | 20 +++---- .../Dynamic/TypeContainerFunctionsPtr.h | 8 +-- src/common/Dynamic/TypeContainerVisitor.h | 2 +- src/common/Metric/Metric.cpp | 2 +- src/common/Navigation/DetourExtended.cpp | 8 +-- src/common/Navigation/DetourExtended.h | 8 +-- src/common/Threading/LockedQueue.h | 2 +- src/common/Threading/PCQueue.h | 2 +- src/common/Threading/Threading.h | 4 +- src/common/Threading/ThreadingModel.h | 16 +++--- src/common/Utilities/SmartEnum.h | 12 ++--- src/common/Utilities/StringFormat.cpp | 4 +- src/common/Utilities/StringFormat.h | 2 +- src/common/Utilities/Util.cpp | 10 ++-- src/common/Utilities/Util.h | 12 ++--- src/server/apps/worldserver/ACSoap/ACSoap.cpp | 2 +- src/server/apps/worldserver/ACSoap/ACSoap.h | 2 +- .../worldserver/RemoteAccess/RASession.cpp | 4 +- .../apps/worldserver/RemoteAccess/RASession.h | 4 +- .../database/Database/MySQLConnection.cpp | 6 +-- .../database/Database/MySQLConnection.h | 2 +- src/server/database/Database/QueryResult.h | 2 +- src/server/database/Database/Transaction.cpp | 4 +- src/server/database/Updater/DBUpdater.cpp | 6 +-- src/server/game/AI/CoreAI/PetAI.cpp | 2 +- src/server/game/AI/CreatureAI.cpp | 2 +- .../game/AI/ScriptedAI/ScriptedCreature.h | 8 +-- .../game/AI/ScriptedAI/ScriptedFollowerAI.cpp | 2 +- .../game/AI/ScriptedAI/ScriptedFollowerAI.h | 4 +- src/server/game/AI/SmartScripts/SmartAI.cpp | 4 +- src/server/game/AI/SmartScripts/SmartAI.h | 4 +- .../game/Achievements/AchievementMgr.cpp | 6 +-- src/server/game/Addons/AddonMgr.cpp | 2 +- src/server/game/Addons/AddonMgr.h | 2 +- .../game/ArenaSpectator/ArenaSpectator.cpp | 4 +- .../game/ArenaSpectator/ArenaSpectator.h | 14 ++--- .../ArenaSeason/ArenaSeasonMgr.h | 4 +- .../ArenaSeasonRewardsDistributor.cpp | 2 +- src/server/game/Battlegrounds/ArenaTeam.cpp | 8 +-- src/server/game/Battlegrounds/ArenaTeam.h | 8 +-- .../game/Battlegrounds/ArenaTeamMgr.cpp | 2 +- src/server/game/Battlegrounds/Battleground.h | 26 ++++----- .../game/Battlegrounds/BattlegroundMgr.cpp | 2 +- .../Battlegrounds/Zones/BattlegroundEY.cpp | 2 +- src/server/game/Calendar/CalendarMgr.h | 6 +-- src/server/game/Chat/Channels/Channel.cpp | 6 +-- src/server/game/Chat/Channels/Channel.h | 2 +- src/server/game/Chat/Channels/ChannelMgr.cpp | 4 +- src/server/game/Chat/Channels/ChannelMgr.h | 4 +- src/server/game/Chat/Chat.cpp | 6 +-- src/server/game/Chat/Chat.h | 6 +-- src/server/game/Conditions/ConditionMgr.cpp | 8 +-- src/server/game/Conditions/ConditionMgr.h | 2 +- src/server/game/DataStores/DBCStores.cpp | 6 +-- src/server/game/DataStores/DBCStores.h | 4 +- src/server/game/DungeonFinding/LFG.h | 14 ++--- src/server/game/DungeonFinding/LFGMgr.cpp | 26 ++++----- src/server/game/DungeonFinding/LFGMgr.h | 6 +-- .../game/DungeonFinding/LFGPlayerData.cpp | 2 +- .../game/DungeonFinding/LFGPlayerData.h | 2 +- src/server/game/DungeonFinding/LFGQueue.cpp | 8 +-- src/server/game/DungeonFinding/LFGQueue.h | 4 +- .../game/Entities/Creature/Creature.cpp | 8 +-- src/server/game/Entities/Creature/Creature.h | 14 ++--- .../game/Entities/Creature/CreatureGroups.h | 2 +- .../game/Entities/Creature/TemporarySummon.h | 2 +- .../game/Entities/GameObject/GameObject.cpp | 8 +-- .../game/Entities/GameObject/GameObject.h | 2 +- src/server/game/Entities/Item/Item.h | 2 +- src/server/game/Entities/Object/Object.cpp | 12 ++--- src/server/game/Entities/Object/Object.h | 14 ++--- src/server/game/Entities/Object/Position.cpp | 10 ++-- src/server/game/Entities/Object/Position.h | 24 ++++----- .../Entities/Object/Updates/UpdateData.cpp | 4 +- .../game/Entities/Object/Updates/UpdateData.h | 4 +- .../game/Entities/Player/KillRewarder.cpp | 2 +- src/server/game/Entities/Player/Player.cpp | 14 ++--- src/server/game/Entities/Player/Player.h | 18 +++---- .../game/Entities/Player/PlayerQuest.cpp | 6 +-- .../game/Entities/Player/PlayerStorage.cpp | 40 +++++++------- .../game/Entities/Player/PlayerTaxi.cpp | 2 +- .../game/Entities/Player/PlayerUpdates.cpp | 4 +- src/server/game/Entities/Unit/CharmInfo.cpp | 2 +- src/server/game/Entities/Unit/CharmInfo.h | 2 +- src/server/game/Entities/Unit/Unit.cpp | 8 +-- src/server/game/Entities/Unit/Unit.h | 10 ++-- src/server/game/Entities/Unit/UnitUtils.h | 10 ++-- .../game/Events/HolidayDateCalculator.cpp | 8 +-- .../game/Events/HolidayDateCalculator.h | 8 +-- src/server/game/Globals/ObjectMgr.cpp | 26 ++++----- src/server/game/Globals/ObjectMgr.h | 4 +- src/server/game/Grids/Cells/Cell.h | 4 +- src/server/game/Grids/GridDefines.h | 8 +-- src/server/game/Groups/Group.cpp | 12 ++--- src/server/game/Groups/Group.h | 14 ++--- src/server/game/Guilds/Guild.cpp | 18 +++---- src/server/game/Guilds/Guild.h | 10 ++-- src/server/game/Handlers/ArenaTeamHandler.cpp | 2 +- .../game/Handlers/AuctionHouseHandler.cpp | 2 +- src/server/game/Handlers/GroupHandler.cpp | 2 +- src/server/game/Handlers/LFGHandler.cpp | 2 +- src/server/game/Handlers/PetHandler.cpp | 2 +- src/server/game/Handlers/QueryHandler.cpp | 2 +- src/server/game/Handlers/QuestHandler.cpp | 2 +- src/server/game/Handlers/SpellHandler.cpp | 2 +- src/server/game/Instances/InstanceScript.cpp | 8 +-- src/server/game/Loot/LootMgr.cpp | 10 ++-- src/server/game/Loot/LootMgr.h | 6 +-- src/server/game/Maps/Map.cpp | 2 +- src/server/game/Maps/Map.h | 28 +++++----- src/server/game/Maps/MapMgr.h | 4 +- src/server/game/Misc/GameGraveyard.cpp | 4 +- src/server/game/Misc/GameGraveyard.h | 2 +- src/server/game/Movement/MotionMaster.cpp | 2 +- src/server/game/Movement/MotionMaster.h | 4 +- .../MovementGenerators/PathGenerator.cpp | 4 +- .../PointMovementGenerator.h | 2 +- .../game/Movement/Spline/MoveSpline.cpp | 2 +- src/server/game/Movement/Spline/MoveSpline.h | 10 ++-- .../game/Movement/Spline/MoveSplineFlag.h | 6 +-- .../game/Movement/Spline/MoveSplineInit.cpp | 2 +- .../game/Movement/Spline/MoveSplineInit.h | 6 +-- .../Movement/Spline/MovementPacketBuilder.cpp | 18 +++---- .../Movement/Spline/MovementPacketBuilder.h | 6 +-- src/server/game/Movement/Spline/Spline.cpp | 20 +++---- src/server/game/Movement/Spline/Spline.h | 20 +++---- src/server/game/OutdoorPvP/OutdoorPvP.cpp | 4 +- src/server/game/Quests/QuestDef.cpp | 2 +- src/server/game/Reputation/ReputationMgr.cpp | 2 +- src/server/game/Scripting/MapScripts.cpp | 14 ++--- .../Scripting/ScriptDefines/ALEScript.cpp | 2 +- .../game/Scripting/ScriptDefines/ALEScript.h | 2 +- .../Scripting/ScriptDefines/AccountScript.h | 2 +- .../ScriptDefines/AchievementCriteriaScript.h | 2 +- .../ScriptDefines/AchievementScript.cpp | 2 +- .../ScriptDefines/AchievementScript.h | 2 +- .../ScriptDefines/AllBattlegroundScript.h | 2 +- .../ScriptDefines/AllCommandScript.cpp | 2 +- .../ScriptDefines/AllCommandScript.h | 2 +- .../ScriptDefines/AllCreatureScript.cpp | 6 +-- .../ScriptDefines/AllCreatureScript.h | 8 +-- .../ScriptDefines/AllGameObjectScript.cpp | 2 +- .../ScriptDefines/AllGameObjectScript.h | 4 +- .../Scripting/ScriptDefines/AllItemScript.cpp | 6 +-- .../Scripting/ScriptDefines/AllItemScript.h | 4 +- .../Scripting/ScriptDefines/AllMapScript.cpp | 2 +- .../Scripting/ScriptDefines/AllMapScript.h | 2 +- .../Scripting/ScriptDefines/AllSpellScript.h | 2 +- .../ScriptDefines/AreaTriggerScript.cpp | 2 +- .../ScriptDefines/AreaTriggerScript.h | 2 +- .../Scripting/ScriptDefines/ArenaScript.cpp | 2 +- .../Scripting/ScriptDefines/ArenaScript.h | 2 +- .../ScriptDefines/ArenaTeamScript.cpp | 2 +- .../Scripting/ScriptDefines/ArenaTeamScript.h | 2 +- .../ScriptDefines/AuctionHouseScript.cpp | 2 +- .../ScriptDefines/AuctionHouseScript.h | 2 +- .../ScriptDefines/BattlefieldScript.h | 2 +- .../ScriptDefines/BattlegroundMapScript.cpp | 2 +- .../ScriptDefines/BattlegroundMapScript.h | 2 +- .../ScriptDefines/BattlegroundScript.cpp | 2 +- .../ScriptDefines/BattlegroundScript.h | 2 +- .../Scripting/ScriptDefines/CommandScript.cpp | 2 +- .../Scripting/ScriptDefines/CommandScript.h | 2 +- .../ScriptDefines/ConditionScript.cpp | 2 +- .../Scripting/ScriptDefines/ConditionScript.h | 2 +- .../ScriptDefines/CreatureScript.cpp | 4 +- .../Scripting/ScriptDefines/CreatureScript.h | 4 +- .../ScriptDefines/DatabaseScript.cpp | 2 +- .../Scripting/ScriptDefines/DatabaseScript.h | 2 +- .../ScriptDefines/DynamicObjectScript.cpp | 2 +- .../ScriptDefines/DynamicObjectScript.h | 2 +- .../Scripting/ScriptDefines/FormulaScript.cpp | 2 +- .../Scripting/ScriptDefines/FormulaScript.h | 2 +- .../ScriptDefines/GameEventScript.cpp | 2 +- .../Scripting/ScriptDefines/GameEventScript.h | 2 +- .../ScriptDefines/GameObjectScript.cpp | 4 +- .../ScriptDefines/GameObjectScript.h | 4 +- .../Scripting/ScriptDefines/GlobalScript.cpp | 2 +- .../Scripting/ScriptDefines/GlobalScript.h | 2 +- .../Scripting/ScriptDefines/GroupScript.cpp | 4 +- .../Scripting/ScriptDefines/GroupScript.h | 4 +- .../Scripting/ScriptDefines/GuildScript.cpp | 8 +-- .../Scripting/ScriptDefines/GuildScript.h | 8 +-- .../ScriptDefines/InstanceMapScript.cpp | 2 +- .../ScriptDefines/InstanceMapScript.h | 2 +- .../game/Scripting/ScriptDefines/ItemScript.h | 4 +- .../Scripting/ScriptDefines/LootScript.cpp | 2 +- .../game/Scripting/ScriptDefines/LootScript.h | 2 +- .../Scripting/ScriptDefines/MailScript.cpp | 2 +- .../game/Scripting/ScriptDefines/MailScript.h | 2 +- .../Scripting/ScriptDefines/MiscScript.cpp | 4 +- .../game/Scripting/ScriptDefines/MiscScript.h | 4 +- .../Scripting/ScriptDefines/ModuleScript.cpp | 2 +- .../Scripting/ScriptDefines/ModuleScript.h | 2 +- .../ScriptDefines/MovementHandlerScript.cpp | 2 +- .../ScriptDefines/MovementHandlerScript.h | 2 +- .../ScriptDefines/OutdoorPvPScript.cpp | 2 +- .../ScriptDefines/OutdoorPvPScript.h | 2 +- .../Scripting/ScriptDefines/PetScript.cpp | 2 +- .../game/Scripting/ScriptDefines/PetScript.h | 2 +- .../Scripting/ScriptDefines/PlayerScript.cpp | 6 +-- .../Scripting/ScriptDefines/PlayerScript.h | 6 +-- .../Scripting/ScriptDefines/ServerScript.cpp | 2 +- .../Scripting/ScriptDefines/ServerScript.h | 2 +- .../ScriptDefines/SpellScriptLoader.cpp | 2 +- .../ScriptDefines/SpellScriptLoader.h | 2 +- .../ScriptDefines/TransportScript.cpp | 2 +- .../Scripting/ScriptDefines/TransportScript.h | 2 +- .../Scripting/ScriptDefines/UnitScript.cpp | 2 +- .../game/Scripting/ScriptDefines/UnitScript.h | 2 +- .../Scripting/ScriptDefines/VehicleScript.cpp | 2 +- .../Scripting/ScriptDefines/VehicleScript.h | 2 +- .../Scripting/ScriptDefines/WeatherScript.cpp | 2 +- .../Scripting/ScriptDefines/WeatherScript.h | 2 +- .../ScriptDefines/WorldMapScript.cpp | 2 +- .../Scripting/ScriptDefines/WorldMapScript.h | 2 +- .../ScriptDefines/WorldObjectScript.cpp | 2 +- .../ScriptDefines/WorldObjectScript.h | 2 +- .../Scripting/ScriptDefines/WorldScript.cpp | 2 +- .../Scripting/ScriptDefines/WorldScript.h | 2 +- src/server/game/Scripting/ScriptMgr.h | 24 ++++----- src/server/game/Scripting/ScriptObject.h | 4 +- src/server/game/Server/WorldSession.cpp | 2 +- src/server/game/Server/WorldSession.h | 2 +- .../game/Spells/Auras/SpellAuraEffects.cpp | 6 +-- src/server/game/Spells/Auras/SpellAuras.h | 2 +- src/server/game/Spells/Spell.h | 2 +- src/server/game/Spells/SpellEffects.cpp | 2 +- src/server/game/Spells/SpellInfo.cpp | 2 +- src/server/game/Spells/SpellInfo.h | 2 +- src/server/game/Spells/SpellMgr.cpp | 2 +- src/server/game/Spells/SpellMgr.h | 2 +- src/server/game/Tickets/TicketMgr.cpp | 2 +- src/server/game/Tickets/TicketMgr.h | 2 +- .../game/Tools/CharacterDatabaseCleaner.cpp | 2 +- .../game/Tools/CharacterDatabaseCleaner.h | 2 +- src/server/game/Warden/Warden.cpp | 4 +- src/server/game/Warden/WardenPayloadMgr.cpp | 2 +- src/server/game/Warden/WardenPayloadMgr.h | 2 +- src/server/game/World/IWorld.h | 4 +- src/server/game/World/World.cpp | 2 +- src/server/game/World/WorldState.cpp | 2 +- src/server/game/World/WorldState.h | 2 +- src/server/scripts/Commands/cs_inventory.cpp | 2 +- src/server/scripts/Commands/cs_misc.cpp | 2 +- src/server/scripts/Commands/cs_wp.cpp | 16 +++--- .../BlackrockDepths/blackrock_depths.cpp | 2 +- .../instance_blackrock_depths.cpp | 4 +- .../instance_blackrock_spire.cpp | 8 +-- .../Deadmines/instance_deadmines.cpp | 2 +- .../Gnomeregan/instance_gnomeregan.cpp | 2 +- .../ShadowfangKeep/boss_apothecary_hummel.cpp | 2 +- .../SunkenTemple/instance_sunken_temple.cpp | 2 +- .../SunwellPlateau/boss_felmyst.cpp | 2 +- .../EasternKingdoms/ZulGurub/boss_hakkar.cpp | 10 ++-- .../scripts/EasternKingdoms/zone_duskwood.cpp | 2 +- .../EasternKingdoms/zone_undercity.cpp | 2 +- .../scripts/EasternKingdoms/zone_westfall.cpp | 2 +- .../scripts/EasternKingdoms/zone_wetlands.cpp | 2 +- src/server/scripts/Events/midsummer.cpp | 4 +- .../culling_of_stratholme.cpp | 4 +- .../instance_culling_of_stratholme.cpp | 2 +- .../TempleOfAhnQiraj/boss_twinemperors.cpp | 2 +- .../TempleOfAhnQiraj/temple_of_ahnqiraj.cpp | 2 +- .../scripts/Kalimdor/zone_darkshore.cpp | 6 +-- src/server/scripts/Kalimdor/zone_tanaris.cpp | 2 +- .../scripts/Kalimdor/zone_the_barrens.cpp | 2 +- .../Kalimdor/zone_thousand_needles.cpp | 4 +- .../scripts/Kalimdor/zone_ungoro_crater.cpp | 2 +- .../instance_trial_of_the_champion.cpp | 6 +-- .../HallsOfReflection/halls_of_reflection.cpp | 2 +- .../PitOfSaron/boss_forgemaster_garfrost.cpp | 2 +- .../FrozenHalls/PitOfSaron/pit_of_saron.cpp | 2 +- .../Gundrak/boss_drakkari_colossus.cpp | 2 +- .../boss_blood_queen_lana_thel.cpp | 12 ++--- .../boss_lady_deathwhisper.cpp | 2 +- .../Northrend/Naxxramas/boss_maexxna.cpp | 2 +- .../Northrend/Naxxramas/boss_thaddius.cpp | 2 +- .../instance_halls_of_lightning.cpp | 2 +- .../Ulduar/HallsOfStone/brann_bronzebeard.cpp | 2 +- .../scripts/Northrend/zone_icecrown.cpp | 2 +- .../scripts/Northrend/zone_sholazar_basin.cpp | 2 +- .../scripts/Northrend/zone_wintergrasp.cpp | 2 +- src/server/scripts/Northrend/zone_zuldrak.cpp | 6 +-- .../scripts/OutdoorPvP/OutdoorPvPEP.cpp | 2 +- .../scripts/OutdoorPvP/OutdoorPvPNA.cpp | 6 +-- .../underbog/boss_ghazan.cpp | 2 +- src/server/scripts/Outland/zone_nagrand.cpp | 4 +- .../scripts/Outland/zone_netherstorm.cpp | 4 +- src/server/scripts/Pet/pet_generic.cpp | 2 +- src/server/scripts/Spells/spell_generic.cpp | 2 +- src/server/scripts/Spells/spell_mage.cpp | 4 +- src/server/scripts/Spells/spell_priest.cpp | 2 +- src/server/scripts/Spells/spell_warrior.cpp | 2 +- src/server/scripts/World/item_scripts.cpp | 2 +- src/server/scripts/World/scourge_invasion.cpp | 4 +- .../scripts/World/suns_reach_reclamation.cpp | 4 +- src/server/shared/Packets/ByteBuffer.h | 2 +- src/test/common/Configuration/Config.cpp | 2 +- src/test/mocks/WorldMock.h | 4 +- .../game/Events/HolidayDateCalculatorTest.cpp | 6 +-- .../Spells/CascadeProcSuppressionTest.cpp | 2 +- .../Spells/SpellProcDBCValidationTest.cpp | 2 +- .../game/Spells/SpellProcDataDrivenTest.cpp | 4 +- .../game/Spells/SpellProcFullCoverageTest.cpp | 2 +- .../server/game/Spells/SpellProcPPMTest.cpp | 2 +- src/tools/map_extractor/System.cpp | 10 ++-- src/tools/map_extractor/dbcfile.h | 10 ++-- src/tools/map_extractor/mpq_libmpq.cpp | 4 +- src/tools/map_extractor/mpq_libmpq04.h | 8 +-- src/tools/mmaps_generator/Config.cpp | 40 +++++++------- src/tools/mmaps_generator/Config.h | 2 +- .../mmaps_generator/IntermediateValues.cpp | 14 ++--- .../mmaps_generator/IntermediateValues.h | 14 ++--- src/tools/mmaps_generator/MapBuilder.cpp | 2 +- src/tools/mmaps_generator/MapBuilder.h | 4 +- src/tools/mmaps_generator/PathCommon.h | 4 +- src/tools/mmaps_generator/PathGenerator.cpp | 4 +- src/tools/mmaps_generator/TerrainBuilder.cpp | 6 +-- src/tools/mmaps_generator/TerrainBuilder.h | 6 +-- src/tools/vmap4_extractor/adtfile.cpp | 2 +- src/tools/vmap4_extractor/adtfile.h | 2 +- src/tools/vmap4_extractor/dbcfile.h | 12 ++--- .../vmap4_extractor/gameobject_extract.cpp | 2 +- src/tools/vmap4_extractor/model.cpp | 2 +- src/tools/vmap4_extractor/mpq_libmpq.cpp | 4 +- src/tools/vmap4_extractor/mpq_libmpq04.h | 8 +-- src/tools/vmap4_extractor/vec3d.h | 36 ++++++------- src/tools/vmap4_extractor/vmapexport.cpp | 6 +-- src/tools/vmap4_extractor/vmapexport.h | 4 +- src/tools/vmap4_extractor/wmo.h | 2 +- 361 files changed, 1016 insertions(+), 980 deletions(-) diff --git a/apps/codestyle/codestyle-cpp.py b/apps/codestyle/codestyle-cpp.py index 7b0dea93f..6a73a6b87 100644 --- a/apps/codestyle/codestyle-cpp.py +++ b/apps/codestyle/codestyle-cpp.py @@ -6,6 +6,30 @@ import re # Get the src directory of the project src_directory = os.path.join(os.getcwd(), 'src') +# Matches west-const declarations: "const &" / "const *". +# may be a (qualified) identifier, an optional unsigned/signed/long/short +# prefix and an optional (single level of nested) template argument list. +qualifier_align_regex = re.compile( + r'\bconst\s+(' + r'(?:(?:unsigned|signed|long|short)\s+)*' + r'(?:::)?[A-Za-z_]\w*(?:::[A-Za-z_]\w*)*' + r'(?:\s*<[^<>;{}]*(?:<[^<>;{}]*>[^<>;{}]*)*>)?' + r')\s*([&*])') + +# Matches a raw string, line comment, block comment, string literal or char literal +# (whichever starts first at any position, so // inside a string or " inside a comment +# is handled). The raw string alternative comes first so R"delim(...)delim" - which may +# contain unescaped quotes - is consumed whole rather than as a plain "..." string. +literal_or_comment_regex = re.compile( + r'R"([^()\\ \t\r\n]{0,16})\(.*?\)\1"' + r'|//[^\n]*|/\*.*?\*/|"(?:\\.|[^"\\])*"|\'(?:\\.|[^\'\\])*\'', re.DOTALL) + +# Replaces the contents of string/char literals and comments with spaces so the +# qualifier-alignment check never matches text inside them. Whitespace (including +# newlines) is preserved so line numbers stay accurate. +def blank_non_code(text: str) -> str: + return literal_or_comment_regex.sub(lambda m: re.sub(r'\S', ' ', m.group()), text) + # Global variables error_handler = False results = { @@ -16,7 +40,8 @@ results = { "GetTypeId() check": "Passed", "NpcFlagHelpers check": "Passed", "ItemFlagHelpers check": "Passed", - "ItemTemplateFlagHelpers check": "Passed" + "ItemTemplateFlagHelpers check": "Passed", + "Qualifier alignment check": "Passed" } # Main function to parse all the files of the project @@ -46,6 +71,7 @@ def parsing_file(directory: str) -> None: itemflag_helpers_check(file, file_path) if file_name != 'ItemTemplate.h': itemtemplateflag_helpers_check(file, file_path) + qualifier_alignment_check(file, file_path) except UnicodeDecodeError: print(f"\nCould not decode file {file_path}") sys.exit(1) @@ -214,6 +240,24 @@ def itemtemplateflag_helpers_check(file: io, file_path: str) -> None: error_handler = True results["ItemTemplateFlagHelpers check"] = "Failed" +# Codestyle patterns enforcing east-const: "const T&" -> "T const&", "const T*" -> "T const*" +def qualifier_alignment_check(file: io, file_path: str) -> None: + global error_handler, results + file.seek(0) # Reset file pointer to the beginning + check_failed = False + # Blank out strings/comments so we never match inside them, then check line by line + masked_lines = blank_non_code(file.read()).split('\n') + for line_number, line in enumerate(masked_lines, start = 1): + for match in qualifier_align_regex.finditer(line): + type_name, symbol = match.group(1).strip(), match.group(2) + print( + f"Please use the '{type_name} const{symbol}' syntax instead of 'const {type_name}{symbol}': {file_path} at line {line_number}") + check_failed = True + # Handle the script error and update the result output + if check_failed: + error_handler = True + results["Qualifier alignment check"] = "Failed" + # Codestyle patterns checking for various codestyle issues def misc_codestyle_check(file: io, file_path: str) -> None: global error_handler, results @@ -229,14 +273,6 @@ def misc_codestyle_check(file: io, file_path: str) -> None: # Parse all the file for line_number, line in enumerate(file, start = 1): - if 'const auto&' in line: - print( - f"Please use the 'auto const&' syntax instead of 'const auto&': {file_path} at line {line_number}") - check_failed = True - if re.search(r'\bconst\s+\w+\s*\*\b', line): - print( - f"Please use the 'Class/ObjectType const*' syntax instead of 'const Class/ObjectType*': {file_path} at line {line_number}") - check_failed = True if [match for match in [' if(', ' if ( '] if match in line]: print( f"Please use the 'if (XXXX)' syntax instead of 'if(XXXX)': {file_path} at line {line_number}") diff --git a/src/common/Collision/BoundingIntervalHierarchy.h b/src/common/Collision/BoundingIntervalHierarchy.h index 84aa01139..7d9eb0227 100644 --- a/src/common/Collision/BoundingIntervalHierarchy.h +++ b/src/common/Collision/BoundingIntervalHierarchy.h @@ -78,7 +78,7 @@ private: public: BIH() { init_empty(); } template< class BoundsFunc, class PrimArray > - void build(const PrimArray& primitives, BoundsFunc& GetBounds, uint32 leafSize = 3, bool printStats = false) + void build(PrimArray const& primitives, BoundsFunc& GetBounds, uint32 leafSize = 3, bool printStats = false) { if (primitives.size() == 0) { @@ -120,7 +120,7 @@ public: G3D::AABox const& bound() const { return bounds; } template - void intersectRay(const G3D::Ray& r, RayCallback& intersectCallback, float& maxDist, bool stopAtFirstHit) const + void intersectRay(G3D::Ray const& r, RayCallback& intersectCallback, float& maxDist, bool stopAtFirstHit) const { float intervalMin = -1.f; float intervalMax = -1.f; @@ -283,7 +283,7 @@ public: } template - void intersectPoint(const G3D::Vector3& p, IsectCallback& intersectCallback) const + void intersectPoint(G3D::Vector3 const& p, IsectCallback& intersectCallback) const { if (!bounds.contains(p)) { diff --git a/src/common/Collision/BoundingIntervalHierarchyWrapper.h b/src/common/Collision/BoundingIntervalHierarchyWrapper.h index 69aee4802..66fb4673f 100644 --- a/src/common/Collision/BoundingIntervalHierarchyWrapper.h +++ b/src/common/Collision/BoundingIntervalHierarchyWrapper.h @@ -29,20 +29,20 @@ class BIHWrap template struct MDLCallback { - const T* const* objects; + T const* const* objects; RayCallback& _callback; uint32 objects_size; - MDLCallback(RayCallback& callback, const T* const* objects_array, uint32 objects_size ) : objects(objects_array), _callback(callback), objects_size(objects_size) { } + MDLCallback(RayCallback& callback, T const* const* objects_array, uint32 objects_size ) : objects(objects_array), _callback(callback), objects_size(objects_size) { } /// Intersect ray - bool operator() (const G3D::Ray& ray, uint32 idx, float& maxDist, bool stopAtFirstHit) + bool operator() (G3D::Ray const& ray, uint32 idx, float& maxDist, bool stopAtFirstHit) { if (idx >= objects_size) { return false; } - if (const T* obj = objects[idx]) + if (T const* obj = objects[idx]) { return _callback(ray, *obj, maxDist, stopAtFirstHit); } @@ -50,41 +50,41 @@ class BIHWrap } /// Intersect point - void operator() (const G3D::Vector3& p, uint32 idx) + void operator() (G3D::Vector3 const& p, uint32 idx) { if (idx >= objects_size) { return; } - if (const T* obj = objects[idx]) + if (T const* obj = objects[idx]) { _callback(p, *obj); } } }; - typedef G3D::Array ObjArray; + typedef G3D::Array ObjArray; BIH m_tree; ObjArray m_objects; - G3D::Table m_obj2Idx; - G3D::Set m_objects_to_push; + G3D::Table m_obj2Idx; + G3D::Set m_objects_to_push; int unbalanced_times; public: BIHWrap() : unbalanced_times(0) { } - void insert(const T& obj) + void insert(T const& obj) { ++unbalanced_times; m_objects_to_push.insert(&obj); } - void remove(const T& obj) + void remove(T const& obj) { ++unbalanced_times; uint32 Idx = 0; - const T* temp; + T const* temp; if (m_obj2Idx.getRemove(&obj, temp, Idx)) { m_objects[Idx] = nullptr; @@ -112,7 +112,7 @@ public: } template - void intersectRay(const G3D::Ray& ray, RayCallback& intersectCallback, float& maxDist, bool stopAtFirstHit) + void intersectRay(G3D::Ray const& ray, RayCallback& intersectCallback, float& maxDist, bool stopAtFirstHit) { balance(); MDLCallback temp_cb(intersectCallback, m_objects.getCArray(), m_objects.size()); @@ -120,7 +120,7 @@ public: } template - void intersectPoint(const G3D::Vector3& point, IsectCallback& intersectCallback) + void intersectPoint(G3D::Vector3 const& point, IsectCallback& intersectCallback) { balance(); MDLCallback callback(intersectCallback, m_objects.getCArray(), m_objects.size()); diff --git a/src/common/Collision/DynamicTree.cpp b/src/common/Collision/DynamicTree.cpp index 0025bf998..509448c14 100644 --- a/src/common/Collision/DynamicTree.cpp +++ b/src/common/Collision/DynamicTree.cpp @@ -40,18 +40,18 @@ namespace template<> struct HashTrait< GameObjectModel> { - static std::size_t hashCode(const GameObjectModel& g) { return (size_t)(void*)&g; } + static std::size_t hashCode(GameObjectModel const& g) { return (size_t)(void*)&g; } }; template<> struct PositionTrait< GameObjectModel> { - static void GetPosition(const GameObjectModel& g, G3D::Vector3& p) { p = g.GetPosition(); } + static void GetPosition(GameObjectModel const& g, G3D::Vector3& p) { p = g.GetPosition(); } }; template<> struct BoundsTrait< GameObjectModel> { - static void GetBounds(const GameObjectModel& g, G3D::AABox& out) { out = g.GetBounds();} - static void GetBounds2(const GameObjectModel* g, G3D::AABox& out) { out = g->GetBounds();} + static void GetBounds(GameObjectModel const& g, G3D::AABox& out) { out = g.GetBounds();} + static void GetBounds2(GameObjectModel const* g, G3D::AABox& out) { out = g->GetBounds();} }; typedef RegularGrid2D> ParentTree; @@ -67,13 +67,13 @@ struct DynTreeImpl : public ParentTree { } - void insert(const Model& mdl) + void insert(Model const& mdl) { base::insert(mdl); ++unbalanced_times; } - void remove(const Model& mdl) + void remove(Model const& mdl) { base::remove(mdl); ++unbalanced_times; @@ -114,17 +114,17 @@ DynamicMapTree::~DynamicMapTree() delete impl; } -void DynamicMapTree::insert(const GameObjectModel& mdl) +void DynamicMapTree::insert(GameObjectModel const& mdl) { impl->insert(mdl); } -void DynamicMapTree::remove(const GameObjectModel& mdl) +void DynamicMapTree::remove(GameObjectModel const& mdl) { impl->remove(mdl); } -bool DynamicMapTree::contains(const GameObjectModel& mdl) const +bool DynamicMapTree::contains(GameObjectModel const& mdl) const { return impl->contains(mdl); } @@ -149,7 +149,7 @@ struct DynamicTreeIntersectionCallback DynamicTreeIntersectionCallback(uint32 phasemask, VMAP::ModelIgnoreFlags ignoreFlags) : _didHit(false), _phaseMask(phasemask), _ignoreFlags(ignoreFlags) { } - bool operator()(const G3D::Ray& r, const GameObjectModel& obj, float& distance, bool stopAtFirstHit) + bool operator()(G3D::Ray const& r, GameObjectModel const& obj, float& distance, bool stopAtFirstHit) { bool result = obj.intersectRay(r, distance, stopAtFirstHit, _phaseMask, _ignoreFlags); if (result) @@ -196,7 +196,7 @@ private: GameObjectModel const* _hitModel; }; -bool DynamicMapTree::GetIntersectionTime(const uint32 phasemask, const G3D::Ray& ray, const G3D::Vector3& endPos, float& maxDist) const +bool DynamicMapTree::GetIntersectionTime(const uint32 phasemask, G3D::Ray const& ray, G3D::Vector3 const& endPos, float& maxDist) const { float distance = maxDist; DynamicTreeIntersectionCallback callback(phasemask, VMAP::ModelIgnoreFlags::Nothing); @@ -208,8 +208,8 @@ bool DynamicMapTree::GetIntersectionTime(const uint32 phasemask, const G3D::Ray& return callback.didHit(); } -bool DynamicMapTree::GetObjectHitPos(const uint32 phasemask, const G3D::Vector3& startPos, - const G3D::Vector3& endPos, G3D::Vector3& resultHit, +bool DynamicMapTree::GetObjectHitPos(const uint32 phasemask, G3D::Vector3 const& startPos, + G3D::Vector3 const& endPos, G3D::Vector3& resultHit, float modifyDist) const { bool result = false; diff --git a/src/common/Collision/DynamicTree.h b/src/common/Collision/DynamicTree.h index e2ddca550..4575af691 100644 --- a/src/common/Collision/DynamicTree.h +++ b/src/common/Collision/DynamicTree.h @@ -46,19 +46,19 @@ public: [[nodiscard]] bool isInLineOfSight(float x1, float y1, float z1, float x2, float y2, float z2, uint32 phasemask, VMAP::ModelIgnoreFlags ignoreFlags) const; - bool GetIntersectionTime(uint32 phasemask, const G3D::Ray& ray, const G3D::Vector3& endPos, float& maxDist) const; + bool GetIntersectionTime(uint32 phasemask, G3D::Ray const& ray, G3D::Vector3 const& endPos, float& maxDist) const; bool GetAreaAndLiquidData(float x, float y, float z, uint32 phasemask, Optional reqLiquidType, VMAP::AreaAndLiquidData& data) const; - bool GetObjectHitPos(uint32 phasemask, const G3D::Vector3& pPos1, - const G3D::Vector3& pPos2, G3D::Vector3& pResultHitPos, + bool GetObjectHitPos(uint32 phasemask, G3D::Vector3 const& pPos1, + G3D::Vector3 const& pPos2, G3D::Vector3& pResultHitPos, float pModifyDist) const; [[nodiscard]] float getHeight(float x, float y, float z, float maxSearchDist, uint32 phasemask) const; - void insert(const GameObjectModel&); - void remove(const GameObjectModel&); - [[nodiscard]] bool contains(const GameObjectModel&) const; + void insert(GameObjectModel const&); + void remove(GameObjectModel const&); + [[nodiscard]] bool contains(GameObjectModel const&) const; [[nodiscard]] int size() const; void balance(); diff --git a/src/common/Collision/Management/IVMapMgr.h b/src/common/Collision/Management/IVMapMgr.h index 4af323372..e43541106 100644 --- a/src/common/Collision/Management/IVMapMgr.h +++ b/src/common/Collision/Management/IVMapMgr.h @@ -90,7 +90,7 @@ namespace VMAP virtual ~IVMapMgr() = default; - virtual LoadResult existsMap(const char* pBasePath, unsigned int pMapId, int x, int y) = 0; + virtual LoadResult existsMap(char const* pBasePath, unsigned int pMapId, int x, int y) = 0; /** send debug commands diff --git a/src/common/Collision/Management/VMapMgr2.cpp b/src/common/Collision/Management/VMapMgr2.cpp index 24e4745d7..73226f91a 100644 --- a/src/common/Collision/Management/VMapMgr2.cpp +++ b/src/common/Collision/Management/VMapMgr2.cpp @@ -59,7 +59,7 @@ namespace VMAP return fname.str(); } - LoadResult VMapMgr2::existsMap(const char* basePath, unsigned int mapId, int x, int y) + LoadResult VMapMgr2::existsMap(char const* basePath, unsigned int mapId, int x, int y) { return StaticMapTree::CanLoadMap(std::string(basePath), mapId, x, y); } diff --git a/src/common/Collision/Management/VMapMgr2.h b/src/common/Collision/Management/VMapMgr2.h index 3c221b170..2442b6de8 100644 --- a/src/common/Collision/Management/VMapMgr2.h +++ b/src/common/Collision/Management/VMapMgr2.h @@ -72,7 +72,7 @@ namespace VMAP { return getMapFileName(mapId); } - LoadResult existsMap(const char* basePath, unsigned int mapId, int x, int y) override; + LoadResult existsMap(char const* basePath, unsigned int mapId, int x, int y) override; typedef uint32(*GetLiquidFlagsFn)(uint32 liquidType); GetLiquidFlagsFn GetLiquidFlagsPtr; diff --git a/src/common/Collision/Maps/MapDefines.h b/src/common/Collision/Maps/MapDefines.h index 8f61275f2..6cdb313e2 100644 --- a/src/common/Collision/Maps/MapDefines.h +++ b/src/common/Collision/Maps/MapDefines.h @@ -45,7 +45,7 @@ struct MmapTileRecastConfig float cellSizeVertical; float maxSimplificationError; - bool operator==(const MmapTileRecastConfig& b) const { + bool operator==(MmapTileRecastConfig const& b) const { return walkableSlopeAngle == b.walkableSlopeAngle && walkableRadius == b.walkableRadius && walkableHeight == b.walkableHeight && diff --git a/src/common/Collision/Maps/MapTree.cpp b/src/common/Collision/Maps/MapTree.cpp index 877b17085..b7baee96d 100644 --- a/src/common/Collision/Maps/MapTree.cpp +++ b/src/common/Collision/Maps/MapTree.cpp @@ -36,7 +36,7 @@ namespace VMAP { public: MapRayCallback(ModelInstance* val, ModelIgnoreFlags ignoreFlags): prims(val), flags(ignoreFlags), hit(false) { } - bool operator()(const G3D::Ray& ray, uint32 entry, float& distance, bool StopAtFirstHit) + bool operator()(G3D::Ray const& ray, uint32 entry, float& distance, bool StopAtFirstHit) { bool result = prims[entry].intersectRay(ray, distance, StopAtFirstHit, flags); if (result) @@ -56,7 +56,7 @@ namespace VMAP { public: LocationInfoCallback(ModelInstance* val, LocationInfo& info): prims(val), locInfo(info), result(false) {} - void operator()(const Vector3& point, uint32 entry) + void operator()(Vector3 const& point, uint32 entry) { #if defined(VMAP_DEBUG) LOG_DEBUG("maps", "LocationInfoCallback: trying to intersect '{}'", prims[entry].name); @@ -84,14 +84,14 @@ namespace VMAP return tilefilename.str(); } - bool StaticMapTree::GetLocationInfo(const Vector3& pos, LocationInfo& info) const + bool StaticMapTree::GetLocationInfo(Vector3 const& pos, LocationInfo& info) const { LocationInfoCallback intersectionCallBack(iTreeValues, info); iTree.intersectPoint(pos, intersectionCallBack); return intersectionCallBack.result; } - StaticMapTree::StaticMapTree(uint32 mapID, const std::string& basePath) + StaticMapTree::StaticMapTree(uint32 mapID, std::string const& basePath) : iMapID(mapID), iIsTiled(false), iTreeValues(0), iBasePath(basePath) { if (iBasePath.length() > 0 && iBasePath[iBasePath.length() - 1] != '/' && iBasePath[iBasePath.length() - 1] != '\\') @@ -113,7 +113,7 @@ namespace VMAP Else, pMaxDist is not modified and returns false; */ - bool StaticMapTree::GetIntersectionTime(const G3D::Ray& pRay, float& pMaxDist, bool StopAtFirstHit, ModelIgnoreFlags ignoreFlags) const + bool StaticMapTree::GetIntersectionTime(G3D::Ray const& pRay, float& pMaxDist, bool StopAtFirstHit, ModelIgnoreFlags ignoreFlags) const { float distance = pMaxDist; MapRayCallback intersectionCallBack(iTreeValues, ignoreFlags); @@ -126,7 +126,7 @@ namespace VMAP } //========================================================= - bool StaticMapTree::isInLineOfSight(const Vector3& pos1, const Vector3& pos2, ModelIgnoreFlags ignoreFlags) const + bool StaticMapTree::isInLineOfSight(Vector3 const& pos1, Vector3 const& pos2, ModelIgnoreFlags ignoreFlags) const { float maxDist = (pos2 - pos1).magnitude(); // return false if distance is over max float, in case of cheater teleporting to the end of the universe @@ -153,7 +153,7 @@ namespace VMAP Return the hit pos or the original dest pos */ - bool StaticMapTree::GetObjectHitPos(const Vector3& pPos1, const Vector3& pPos2, Vector3& pResultHitPos, float pModifyDist) const + bool StaticMapTree::GetObjectHitPos(Vector3 const& pPos1, Vector3 const& pPos2, Vector3& pResultHitPos, float pModifyDist) const { bool result = false; float maxDist = (pPos2 - pPos1).magnitude(); @@ -198,7 +198,7 @@ namespace VMAP //========================================================= - float StaticMapTree::getHeight(const Vector3& pPos, float maxSearchDist) const + float StaticMapTree::getHeight(Vector3 const& pPos, float maxSearchDist) const { float height = G3D::finf(); Vector3 dir = Vector3(0, 0, -1); @@ -213,7 +213,7 @@ namespace VMAP //========================================================= - LoadResult StaticMapTree::CanLoadMap(const std::string& vmapPath, uint32 mapID, uint32 tileX, uint32 tileY) + LoadResult StaticMapTree::CanLoadMap(std::string const& vmapPath, uint32 mapID, uint32 tileX, uint32 tileY) { std::string basePath = vmapPath; if (basePath.length() > 0 && basePath[basePath.length() - 1] != '/' && basePath[basePath.length() - 1] != '\\') @@ -260,7 +260,7 @@ namespace VMAP //========================================================= - bool StaticMapTree::InitMap(const std::string& fname) + bool StaticMapTree::InitMap(std::string const& fname) { //VMAP_DEBUG_LOG(LOG_FILTER_MAPS, "StaticMapTree::InitMap() : initializing StaticMapTree '{}'", fname); bool success = false; diff --git a/src/common/Collision/Maps/MapTree.h b/src/common/Collision/Maps/MapTree.h index 88f0b8302..56a1675c2 100644 --- a/src/common/Collision/Maps/MapTree.h +++ b/src/common/Collision/Maps/MapTree.h @@ -32,15 +32,15 @@ namespace VMAP struct GroupLocationInfo { - const GroupModel* hitModel = nullptr; + GroupModel const* hitModel = nullptr; int32 rootId = -1; }; struct LocationInfo { LocationInfo(): ground_Z(-G3D::inf()) { } - const ModelInstance* hitInstance{nullptr}; - const GroupModel* hitModel{nullptr}; + ModelInstance const* hitInstance{nullptr}; + GroupModel const* hitModel{nullptr}; float ground_Z; int32 rootId = -1; }; @@ -63,23 +63,23 @@ namespace VMAP std::string iBasePath; private: - bool GetIntersectionTime(const G3D::Ray& pRay, float& pMaxDist, bool StopAtFirstHit, ModelIgnoreFlags ignoreFlags) const; + bool GetIntersectionTime(G3D::Ray const& pRay, float& pMaxDist, bool StopAtFirstHit, ModelIgnoreFlags ignoreFlags) const; //bool containsLoadedMapTile(unsigned int pTileIdent) const { return(iLoadedMapTiles.containsKey(pTileIdent)); } public: static std::string getTileFileName(uint32 mapID, uint32 tileX, uint32 tileY); static uint32 packTileID(uint32 tileX, uint32 tileY) { return tileX << 16 | tileY; } static void unpackTileID(uint32 ID, uint32& tileX, uint32& tileY) { tileX = ID >> 16; tileY = ID & 0xFF; } - static LoadResult CanLoadMap(const std::string& basePath, uint32 mapID, uint32 tileX, uint32 tileY); + static LoadResult CanLoadMap(std::string const& basePath, uint32 mapID, uint32 tileX, uint32 tileY); - StaticMapTree(uint32 mapID, const std::string& basePath); + StaticMapTree(uint32 mapID, std::string const& basePath); ~StaticMapTree(); - [[nodiscard]] bool isInLineOfSight(const G3D::Vector3& pos1, const G3D::Vector3& pos2, ModelIgnoreFlags ignoreFlags) const; - bool GetObjectHitPos(const G3D::Vector3& pos1, const G3D::Vector3& pos2, G3D::Vector3& pResultHitPos, float pModifyDist) const; - [[nodiscard]] float getHeight(const G3D::Vector3& pPos, float maxSearchDist) const; - bool GetLocationInfo(const G3D::Vector3& pos, LocationInfo& info) const; + [[nodiscard]] bool isInLineOfSight(G3D::Vector3 const& pos1, G3D::Vector3 const& pos2, ModelIgnoreFlags ignoreFlags) const; + bool GetObjectHitPos(G3D::Vector3 const& pos1, G3D::Vector3 const& pos2, G3D::Vector3& pResultHitPos, float pModifyDist) const; + [[nodiscard]] float getHeight(G3D::Vector3 const& pPos, float maxSearchDist) const; + bool GetLocationInfo(G3D::Vector3 const& pos, LocationInfo& info) const; - bool InitMap(const std::string& fname); + bool InitMap(std::string const& fname); void UnloadMap(); bool LoadMapTile(uint32 tileX, uint32 tileY); void UnloadMapTile(uint32 tileX, uint32 tileY); diff --git a/src/common/Collision/Maps/TileAssembler.cpp b/src/common/Collision/Maps/TileAssembler.cpp index 368d7e6d7..25bfea52d 100644 --- a/src/common/Collision/Maps/TileAssembler.cpp +++ b/src/common/Collision/Maps/TileAssembler.cpp @@ -32,18 +32,18 @@ using std::pair; template<> struct BoundsTrait { - static void GetBounds(const VMAP::ModelSpawn* const& obj, G3D::AABox& out) { out = obj->GetBounds(); } + static void GetBounds(VMAP::ModelSpawn const* const& obj, G3D::AABox& out) { out = obj->GetBounds(); } }; namespace VMAP { - bool readChunk(FILE* rf, char* dest, const char* compare, uint32 len) + bool readChunk(FILE* rf, char* dest, char const* compare, uint32 len) { if (fread(dest, sizeof(char), len, rf) != len) { return false; } return memcmp(dest, compare, len) == 0; } - Vector3 ModelPosition::transform(const Vector3& pIn) const + Vector3 ModelPosition::transform(Vector3 const& pIn) const { Vector3 out = pIn * iScale; out = iRotation * out; @@ -52,7 +52,7 @@ namespace VMAP //================================================================= - TileAssembler::TileAssembler(const std::string& pSrcDirName, const std::string& pDestDirName) + TileAssembler::TileAssembler(std::string const& pSrcDirName, std::string const& pDestDirName) : iDestDir(pDestDirName), iSrcDir(pSrcDirName) { boost::filesystem::create_directory(iDestDir); @@ -156,7 +156,7 @@ namespace VMAP TileMap::iterator tile; for (tile = tileEntries.begin(); tile != tileEntries.end(); ++tile) { - const ModelSpawn& spawn = map_iter->second->UniqueEntries[tile->second]; + ModelSpawn const& spawn = map_iter->second->UniqueEntries[tile->second]; if (spawn.flags & MOD_WORLDSPAWN) // WDT spawn, saved as tile 65/65 currently... { continue; @@ -181,7 +181,7 @@ namespace VMAP { ++tile; } - const ModelSpawn& spawn2 = map_iter->second->UniqueEntries[tile->second]; + ModelSpawn const& spawn2 = map_iter->second->UniqueEntries[tile->second]; success = success && ModelSpawn::writeToFile(tilefile, spawn2); // MapTree nodes to update when loading tile: std::map::iterator nIdx = modelNodeIdx.find(spawn2.ID); @@ -331,7 +331,7 @@ namespace VMAP }; #pragma pack(pop) //================================================================= - bool TileAssembler::convertRawFile(const std::string& pModelFilename) + bool TileAssembler::convertRawFile(std::string const& pModelFilename) { bool success = true; std::string filename = iSrcDir; @@ -566,7 +566,7 @@ namespace VMAP delete liquid; } - bool WorldModel_Raw::Read(const char* path) + bool WorldModel_Raw::Read(char const* path) { FILE* rf = fopen(path, "rb"); if (!rf) diff --git a/src/common/Collision/Maps/TileAssembler.h b/src/common/Collision/Maps/TileAssembler.h index b51f98307..ad6ac3e6b 100644 --- a/src/common/Collision/Maps/TileAssembler.h +++ b/src/common/Collision/Maps/TileAssembler.h @@ -47,8 +47,8 @@ namespace VMAP { iRotation = G3D::Matrix3::fromEulerAnglesZYX(G3D::pif() * iDir.y / 180.f, G3D::pif() * iDir.x / 180.f, G3D::pif() * iDir.z / 180.f); } - [[nodiscard]] G3D::Vector3 transform(const G3D::Vector3& pIn) const; - void moveToBasePos(const G3D::Vector3& pBasePos) { iPos -= pBasePos; } + [[nodiscard]] G3D::Vector3 transform(G3D::Vector3 const& pIn) const; + void moveToBasePos(G3D::Vector3 const& pBasePos) { iPos -= pBasePos; } }; typedef std::map UniqueEntryMap; @@ -86,7 +86,7 @@ namespace VMAP uint32 RootWMOID; std::vector groupsArray; - bool Read(const char* path); + bool Read(char const* path); }; class TileAssembler @@ -99,7 +99,7 @@ namespace VMAP std::set spawnedModelFiles; public: - TileAssembler(const std::string& pSrcDirName, const std::string& pDestDirName); + TileAssembler(std::string const& pSrcDirName, std::string const& pDestDirName); virtual ~TileAssembler(); bool convertWorld2(); @@ -107,7 +107,7 @@ namespace VMAP bool calculateTransformedBound(ModelSpawn& spawn); void exportGameobjectModels(); - bool convertRawFile(const std::string& pModelFilename); + bool convertRawFile(std::string const& pModelFilename); }; } // VMAP diff --git a/src/common/Collision/Models/GameObjectModel.cpp b/src/common/Collision/Models/GameObjectModel.cpp index 6a28164a2..5077439cd 100644 --- a/src/common/Collision/Models/GameObjectModel.cpp +++ b/src/common/Collision/Models/GameObjectModel.cpp @@ -170,7 +170,7 @@ GameObjectModel* GameObjectModel::Create(std::unique_ptrIsSpawned()) { diff --git a/src/common/Collision/Models/GameObjectModel.h b/src/common/Collision/Models/GameObjectModel.h index 695a5ee43..650978c19 100644 --- a/src/common/Collision/Models/GameObjectModel.h +++ b/src/common/Collision/Models/GameObjectModel.h @@ -57,11 +57,11 @@ class GameObjectModel public: std::string name; - [[nodiscard]] const G3D::AABox& GetBounds() const { return iBound; } + [[nodiscard]] G3D::AABox const& GetBounds() const { return iBound; } ~GameObjectModel() = default; - [[nodiscard]] const G3D::Vector3& GetPosition() const { return iPos; } + [[nodiscard]] G3D::Vector3 const& GetPosition() const { return iPos; } /** Enables\disables collision. */ void disable() { phasemask = 0; } @@ -70,7 +70,7 @@ public: [[nodiscard]] bool isEnabled() const { return phasemask != 0; } [[nodiscard]] bool IsMapObject() const { return isWmo; } - bool intersectRay(const G3D::Ray& Ray, float& MaxDist, bool StopAtFirstHit, uint32 ph_mask, VMAP::ModelIgnoreFlags ignoreFlags) const; + bool intersectRay(G3D::Ray const& Ray, float& MaxDist, bool StopAtFirstHit, uint32 ph_mask, VMAP::ModelIgnoreFlags ignoreFlags) const; bool GetLocationInfo(G3D::Vector3 const& point, VMAP::LocationInfo& info, uint32 ph_mask) const; bool GetLiquidLevel(G3D::Vector3 const& point, VMAP::LocationInfo& info, float& liqHeight) const; diff --git a/src/common/Collision/Models/ModelInstance.cpp b/src/common/Collision/Models/ModelInstance.cpp index ecc97e85f..ebc11316d 100644 --- a/src/common/Collision/Models/ModelInstance.cpp +++ b/src/common/Collision/Models/ModelInstance.cpp @@ -24,13 +24,13 @@ using G3D::Ray; namespace VMAP { - ModelInstance::ModelInstance(const ModelSpawn& spawn, std::shared_ptr model): ModelSpawn(spawn), iModel(model) + ModelInstance::ModelInstance(ModelSpawn const& spawn, std::shared_ptr model): ModelSpawn(spawn), iModel(model) { iInvRot = G3D::Matrix3::fromEulerAnglesZYX(G3D::pi() * iRot.y / 180.f, G3D::pi() * iRot.x / 180.f, G3D::pi() * iRot.z / 180.f).inverse(); iInvScale = 1.f / iScale; } - bool ModelInstance::intersectRay(const G3D::Ray& pRay, float& pMaxDist, bool StopAtFirstHit, ModelIgnoreFlags ignoreFlags) const + bool ModelInstance::intersectRay(G3D::Ray const& pRay, float& pMaxDist, bool StopAtFirstHit, ModelIgnoreFlags ignoreFlags) const { if (!iModel) { @@ -63,7 +63,7 @@ namespace VMAP return hit; } - bool ModelInstance::GetLocationInfo(const G3D::Vector3& p, LocationInfo& info) const + bool ModelInstance::GetLocationInfo(G3D::Vector3 const& p, LocationInfo& info) const { if (!iModel) { @@ -107,7 +107,7 @@ namespace VMAP return false; } - bool ModelInstance::GetLiquidLevel(const G3D::Vector3& p, LocationInfo& info, float& liqHeight) const + bool ModelInstance::GetLiquidLevel(G3D::Vector3 const& p, LocationInfo& info, float& liqHeight) const { // child bounds are defined in object space: Vector3 pModel = iInvRot * (p - iPos) * iInvScale; @@ -170,7 +170,7 @@ namespace VMAP return true; } - bool ModelSpawn::writeToFile(FILE* wf, const ModelSpawn& spawn) + bool ModelSpawn::writeToFile(FILE* wf, ModelSpawn const& spawn) { uint32 check = 0; check += fwrite(&spawn.flags, sizeof(uint32), 1, wf); diff --git a/src/common/Collision/Models/ModelInstance.h b/src/common/Collision/Models/ModelInstance.h index f8c0ecbb1..420d0c697 100644 --- a/src/common/Collision/Models/ModelInstance.h +++ b/src/common/Collision/Models/ModelInstance.h @@ -51,23 +51,23 @@ namespace VMAP float iScale; G3D::AABox iBound; std::string name; - bool operator==(const ModelSpawn& other) const { return ID == other.ID; } + bool operator==(ModelSpawn const& other) const { return ID == other.ID; } //uint32 hashCode() const { return ID; } // temp? - [[nodiscard]] const G3D::AABox& GetBounds() const { return iBound; } + [[nodiscard]] G3D::AABox const& GetBounds() const { return iBound; } static bool readFromFile(FILE* rf, ModelSpawn& spawn); - static bool writeToFile(FILE* rw, const ModelSpawn& spawn); + static bool writeToFile(FILE* rw, ModelSpawn const& spawn); }; class ModelInstance: public ModelSpawn { public: ModelInstance() { } - ModelInstance(const ModelSpawn& spawn, std::shared_ptr model); - bool intersectRay(const G3D::Ray& pRay, float& pMaxDist, bool StopAtFirstHit, ModelIgnoreFlags ignoreFlags) const; - bool GetLocationInfo(const G3D::Vector3& p, LocationInfo& info) const; - bool GetLiquidLevel(const G3D::Vector3& p, LocationInfo& info, float& liqHeight) const; + ModelInstance(ModelSpawn const& spawn, std::shared_ptr model); + bool intersectRay(G3D::Ray const& pRay, float& pMaxDist, bool StopAtFirstHit, ModelIgnoreFlags ignoreFlags) const; + bool GetLocationInfo(G3D::Vector3 const& p, LocationInfo& info) const; + bool GetLiquidLevel(G3D::Vector3 const& p, LocationInfo& info, float& liqHeight) const; WorldModel* getWorldModel() { return iModel.get(); } protected: G3D::Matrix3 iInvRot; diff --git a/src/common/Collision/Models/WorldModel.cpp b/src/common/Collision/Models/WorldModel.cpp index 53bd55a2d..fc2079e11 100644 --- a/src/common/Collision/Models/WorldModel.cpp +++ b/src/common/Collision/Models/WorldModel.cpp @@ -26,12 +26,12 @@ using G3D::Vector3; template<> struct BoundsTrait { - static void GetBounds(const VMAP::GroupModel& obj, G3D::AABox& out) { out = obj.GetBound(); } + static void GetBounds(VMAP::GroupModel const& obj, G3D::AABox& out) { out = obj.GetBound(); } }; namespace VMAP { - bool IntersectTriangle(const MeshTriangle& tri, std::vector::const_iterator points, const G3D::Ray& ray, float& distance) + bool IntersectTriangle(MeshTriangle const& tri, std::vector::const_iterator points, G3D::Ray const& ray, float& distance) { static const float EPS = 1e-5f; @@ -88,7 +88,7 @@ namespace VMAP { public: TriBoundFunc(std::vector& vert): vertices(vert.begin()) { } - void operator()(const MeshTriangle& tri, G3D::AABox& out) const + void operator()(MeshTriangle const& tri, G3D::AABox& out) const { G3D::Vector3 lo = vertices[tri.idx0]; G3D::Vector3 hi = lo; @@ -104,7 +104,7 @@ namespace VMAP // ===================== WmoLiquid ================================== - WmoLiquid::WmoLiquid(uint32 width, uint32 height, const Vector3& corner, uint32 type): + WmoLiquid::WmoLiquid(uint32 width, uint32 height, Vector3 const& corner, uint32 type): iTilesX(width), iTilesY(height), iCorner(corner), iType(type) { if (width && height) @@ -119,7 +119,7 @@ namespace VMAP } } - WmoLiquid::WmoLiquid(const WmoLiquid& other): iHeight(0), iFlags(0) + WmoLiquid::WmoLiquid(WmoLiquid const& other): iHeight(0), iFlags(0) { *this = other; // use assignment operator... } @@ -130,7 +130,7 @@ namespace VMAP delete[] iFlags; } - WmoLiquid& WmoLiquid::operator=(const WmoLiquid& other) + WmoLiquid& WmoLiquid::operator=(WmoLiquid const& other) { if (this == &other) { @@ -163,7 +163,7 @@ namespace VMAP return *this; } - bool WmoLiquid::GetLiquidHeight(const Vector3& pos, float& liqHeight) const + bool WmoLiquid::GetLiquidHeight(Vector3 const& pos, float& liqHeight) const { // simple case if (!iFlags) @@ -311,7 +311,7 @@ namespace VMAP // ===================== GroupModel ================================== - GroupModel::GroupModel(const GroupModel& other): + GroupModel::GroupModel(GroupModel const& other): iBound(other.iBound), iMogpFlags(other.iMogpFlags), iGroupWMOID(other.iGroupWMOID), vertices(other.vertices), triangles(other.triangles), meshTree(other.meshTree), iLiquid(0) { @@ -426,9 +426,9 @@ namespace VMAP struct GModelRayCallback { - GModelRayCallback(const std::vector& tris, const std::vector& vert): + GModelRayCallback(std::vector const& tris, std::vector const& vert): vertices(vert.begin()), triangles(tris.begin()), hit(false) { } - bool operator()(const G3D::Ray& ray, uint32 entry, float& distance, bool /*StopAtFirstHit*/) + bool operator()(G3D::Ray const& ray, uint32 entry, float& distance, bool /*StopAtFirstHit*/) { bool result = IntersectTriangle(triangles[entry], vertices, ray, distance); if (result) { hit = true; } @@ -439,7 +439,7 @@ namespace VMAP bool hit; }; - bool GroupModel::IntersectRay(const G3D::Ray& ray, float& distance, bool stopAtFirstHit) const + bool GroupModel::IntersectRay(G3D::Ray const& ray, float& distance, bool stopAtFirstHit) const { if (triangles.empty()) { @@ -451,7 +451,7 @@ namespace VMAP return callback.hit; } - inline bool IsInsideOrAboveBound(G3D::AABox const& bounds, const G3D::Point3& point) + inline bool IsInsideOrAboveBound(G3D::AABox const& bounds, G3D::Point3 const& point) { return point.x >= bounds.low().x && point.y >= bounds.low().y @@ -493,7 +493,7 @@ namespace VMAP return OUT_OF_BOUNDS; } - bool GroupModel::GetLiquidLevel(const Vector3& pos, float& liqHeight) const + bool GroupModel::GetLiquidLevel(Vector3 const& pos, float& liqHeight) const { if (iLiquid) { @@ -528,8 +528,8 @@ namespace VMAP struct WModelRayCallBack { - WModelRayCallBack(const std::vector& mod): models(mod.begin()), hit(false) { } - bool operator()(const G3D::Ray& ray, uint32 entry, float& distance, bool StopAtFirstHit) + WModelRayCallBack(std::vector const& mod): models(mod.begin()), hit(false) { } + bool operator()(G3D::Ray const& ray, uint32 entry, float& distance, bool StopAtFirstHit) { bool result = models[entry].IntersectRay(ray, distance, StopAtFirstHit); if (result) { hit = true; } @@ -539,7 +539,7 @@ namespace VMAP bool hit; }; - bool WorldModel::IntersectRay(const G3D::Ray& ray, float& distance, bool stopAtFirstHit, ModelIgnoreFlags ignoreFlags) const + bool WorldModel::IntersectRay(G3D::Ray const& ray, float& distance, bool stopAtFirstHit, ModelIgnoreFlags ignoreFlags) const { // If the caller asked us to ignore certain objects we should check flags if ((ignoreFlags & ModelIgnoreFlags::M2) != ModelIgnoreFlags::Nothing) @@ -591,7 +591,7 @@ namespace VMAP } }; - bool WorldModel::GetLocationInfo(const G3D::Vector3& p, const G3D::Vector3& down, float& dist, GroupLocationInfo& info) const + bool WorldModel::GetLocationInfo(G3D::Vector3 const& p, G3D::Vector3 const& down, float& dist, GroupLocationInfo& info) const { if (groupModels.empty()) { @@ -623,7 +623,7 @@ namespace VMAP return false; } - bool WorldModel::writeFile(const std::string& filename) + bool WorldModel::writeFile(std::string const& filename) { FILE* wf = fopen(filename.c_str(), "wb"); if (!wf) @@ -660,7 +660,7 @@ namespace VMAP return result; } - bool WorldModel::readFile(const std::string& filename) + bool WorldModel::readFile(std::string const& filename) { FILE* rf = fopen(filename.c_str(), "rb"); if (!rf) diff --git a/src/common/Collision/Models/WorldModel.h b/src/common/Collision/Models/WorldModel.h index 2d5d8126b..8f532ec8f 100644 --- a/src/common/Collision/Models/WorldModel.h +++ b/src/common/Collision/Models/WorldModel.h @@ -46,11 +46,11 @@ namespace VMAP class WmoLiquid { public: - WmoLiquid(uint32 width, uint32 height, const G3D::Vector3& corner, uint32 type); - WmoLiquid(const WmoLiquid& other); + WmoLiquid(uint32 width, uint32 height, G3D::Vector3 const& corner, uint32 type); + WmoLiquid(WmoLiquid const& other); ~WmoLiquid(); - WmoLiquid& operator=(const WmoLiquid& other); - bool GetLiquidHeight(const G3D::Vector3& pos, float& liqHeight) const; + WmoLiquid& operator=(WmoLiquid const& other); + bool GetLiquidHeight(G3D::Vector3 const& pos, float& liqHeight) const; [[nodiscard]] uint32 GetType() const { return iType; } float* GetHeightStorage() { return iHeight; } uint8* GetFlagsStorage() { return iFlags; } @@ -73,18 +73,18 @@ namespace VMAP { public: GroupModel() { } - GroupModel(const GroupModel& other); - GroupModel(uint32 mogpFlags, uint32 groupWMOID, const G3D::AABox& bound): + GroupModel(GroupModel const& other); + GroupModel(uint32 mogpFlags, uint32 groupWMOID, G3D::AABox const& bound): iBound(bound), iMogpFlags(mogpFlags), iGroupWMOID(groupWMOID), iLiquid(nullptr) { } ~GroupModel() { delete iLiquid; } //! pass mesh data to object and create BIH. Passed vectors get get swapped with old geometry! void setMeshData(std::vector& vert, std::vector& tri); void setLiquidData(WmoLiquid*& liquid) { iLiquid = liquid; liquid = nullptr; } - bool IntersectRay(const G3D::Ray& ray, float& distance, bool stopAtFirstHit) const; + bool IntersectRay(G3D::Ray const& ray, float& distance, bool stopAtFirstHit) const; enum InsideResult { INSIDE = 0, MAYBE_INSIDE = 1, ABOVE = 2, OUT_OF_BOUNDS = -1 }; InsideResult IsInsideObject(G3D::Ray const& ray, float& z_dist) const; - bool GetLiquidLevel(const G3D::Vector3& pos, float& liqHeight) const; + bool GetLiquidLevel(G3D::Vector3 const& pos, float& liqHeight) const; [[nodiscard]] uint32 GetLiquidType() const; bool writeToFile(FILE* wf); bool readFromFile(FILE* rf); @@ -111,10 +111,10 @@ namespace VMAP //! pass group models to WorldModel and create BIH. Passed vector is swapped with old geometry! void setGroupModels(std::vector& models); void setRootWmoID(uint32 id) { RootWMOID = id; } - bool IntersectRay(const G3D::Ray& ray, float& distance, bool stopAtFirstHit, ModelIgnoreFlags ignoreFlags) const; - bool GetLocationInfo(const G3D::Vector3& p, const G3D::Vector3& down, float& dist, GroupLocationInfo& info) const; - bool writeFile(const std::string& filename); - bool readFile(const std::string& filename); + bool IntersectRay(G3D::Ray const& ray, float& distance, bool stopAtFirstHit, ModelIgnoreFlags ignoreFlags) const; + bool GetLocationInfo(G3D::Vector3 const& p, G3D::Vector3 const& down, float& dist, GroupLocationInfo& info) const; + bool writeFile(std::string const& filename); + bool readFile(std::string const& filename); void GetGroupModels(std::vector& outGroupModels); uint32 Flags; protected: diff --git a/src/common/Collision/RegularGrid.h b/src/common/Collision/RegularGrid.h index 1a24c4258..19f770ddb 100644 --- a/src/common/Collision/RegularGrid.h +++ b/src/common/Collision/RegularGrid.h @@ -51,7 +51,7 @@ public: #define HGRID_MAP_SIZE (533.33333f * 64.f) // shouldn't be changed #define CELL_SIZE float(HGRID_MAP_SIZE/(float)CELL_NUMBER) - typedef G3D::Table> MemberTable; + typedef G3D::Table> MemberTable; MemberTable memberTable; Node* nodes[CELL_NUMBER][CELL_NUMBER]; @@ -70,7 +70,7 @@ public: } } - void insert(const T& value) + void insert(T const& value) { G3D::Vector3 pos[9]; pos[0] = value.GetBounds().corner(0); @@ -110,7 +110,7 @@ public: memberTable.set(&value, na); } - void remove(const T& value) + void remove(T const& value) { NodeArray& na = memberTable[&value]; for (uint8 i = 0; i < 9; ++i) @@ -139,13 +139,13 @@ public: } } - bool contains(const T& value) const { return memberTable.containsKey(&value); } + bool contains(T const& value) const { return memberTable.containsKey(&value); } int size() const { return memberTable.size(); } struct Cell { int x, y; - bool operator == (const Cell& c2) const { return x == c2.x && y == c2.y;} + bool operator == (Cell const& c2) const { return x == c2.x && y == c2.y;} static Cell ComputeCell(float fx, float fy) { @@ -173,13 +173,13 @@ public: } template - void intersectRay(const G3D::Ray& ray, RayCallback& intersectCallback, float max_dist, bool stopAtFirstHit) + void intersectRay(G3D::Ray const& ray, RayCallback& intersectCallback, float max_dist, bool stopAtFirstHit) { intersectRay(ray, intersectCallback, max_dist, ray.origin() + ray.direction() * max_dist, stopAtFirstHit); } template - void intersectRay(const G3D::Ray& ray, RayCallback& intersectCallback, float& max_dist, const G3D::Vector3& end, bool stopAtFirstHit) + void intersectRay(G3D::Ray const& ray, RayCallback& intersectCallback, float& max_dist, G3D::Vector3 const& end, bool stopAtFirstHit) { Cell cell = Cell::ComputeCell(ray.origin().x, ray.origin().y); if (!cell.isValid()) @@ -261,7 +261,7 @@ public: } template - void intersectPoint(const G3D::Vector3& point, IsectCallback& intersectCallback) + void intersectPoint(G3D::Vector3 const& point, IsectCallback& intersectCallback) { Cell cell = Cell::ComputeCell(point.x, point.y); if (!cell.isValid()) @@ -276,7 +276,7 @@ public: // Optimized verson of intersectRay function for rays with vertical directions template - void intersectZAllignedRay(const G3D::Ray& ray, RayCallback& intersectCallback, float& max_dist) + void intersectZAllignedRay(G3D::Ray const& ray, RayCallback& intersectCallback, float& max_dist) { Cell cell = Cell::ComputeCell(ray.origin().x, ray.origin().y); if (!cell.isValid()) diff --git a/src/common/Collision/VMapDefinitions.h b/src/common/Collision/VMapDefinitions.h index b8026d949..971913a0e 100644 --- a/src/common/Collision/VMapDefinitions.h +++ b/src/common/Collision/VMapDefinitions.h @@ -27,6 +27,6 @@ namespace VMAP const char GAMEOBJECT_MODELS[] = "GameObjectModels.dtree"; // defined in TileAssembler.cpp currently... - bool readChunk(FILE* rf, char* dest, const char* compare, uint32 len); + bool readChunk(FILE* rf, char* dest, char const* compare, uint32 len); } #endif diff --git a/src/common/Collision/VMapTools.h b/src/common/Collision/VMapTools.h index ba47cdf62..23ac971d7 100644 --- a/src/common/Collision/VMapTools.h +++ b/src/common/Collision/VMapTools.h @@ -37,7 +37,7 @@ namespace VMAP G3D::Vector3 hitLocation; G3D::Vector3 hitNormal; - void operator()(const G3D::Ray& ray, const TValue* entity, bool StopAtFirstHit, float& distance) + void operator()(G3D::Ray const& ray, TValue const* entity, bool StopAtFirstHit, float& distance) { entity->intersect(ray, distance, StopAtFirstHit, hitLocation, hitNormal); } @@ -51,9 +51,9 @@ namespace VMAP { public: static bool collisionLocationForMovingPointFixedAABox( - const G3D::Vector3& origin, - const G3D::Vector3& dir, - const G3D::AABox& box, + G3D::Vector3 const& origin, + G3D::Vector3 const& dir, + G3D::AABox const& box, G3D::Vector3& location, bool& Inside) { @@ -61,8 +61,8 @@ namespace VMAP #define IR(x) (reinterpret_cast(x)) Inside = true; - const G3D::Vector3& MinB = box.low(); - const G3D::Vector3& MaxB = box.high(); + G3D::Vector3 const& MinB = box.low(); + G3D::Vector3 const& MaxB = box.high(); G3D::Vector3 MaxT(-1.0f, -1.0f, -1.0f); // Find candidate planes. diff --git a/src/common/Common.cpp b/src/common/Common.cpp index e58668d7e..70371ae47 100644 --- a/src/common/Common.cpp +++ b/src/common/Common.cpp @@ -75,7 +75,7 @@ bool IsLocaleValid(std::string const& locale) return false; } -LocaleConstant GetLocaleByName(const std::string& name) +LocaleConstant GetLocaleByName(std::string const& name) { for (uint32 i = 0; i < TOTAL_LOCALES; ++i) if (name == localeNames[i]) diff --git a/src/common/Common.h b/src/common/Common.h index 908e5aca6..264b06ca9 100644 --- a/src/common/Common.h +++ b/src/common/Common.h @@ -144,7 +144,7 @@ enum LocaleConstant AC_COMMON_API extern char const* localeNames[TOTAL_LOCALES]; AC_COMMON_API bool IsLocaleValid(std::string const& locale); -AC_COMMON_API LocaleConstant GetLocaleByName(const std::string& name); +AC_COMMON_API LocaleConstant GetLocaleByName(std::string const& name); AC_COMMON_API const std::string GetNameByLocaleConstant(LocaleConstant localeConstant); AC_COMMON_API void CleanStringForMysqlQuery(std::string& str); diff --git a/src/common/Configuration/Config.cpp b/src/common/Configuration/Config.cpp index 7548fd490..79c58af7d 100644 --- a/src/common/Configuration/Config.cpp +++ b/src/common/Configuration/Config.cpp @@ -359,7 +359,7 @@ namespace { return ParseFile(file, isOptional, isReload); } - catch (const std::exception& e) + catch (std::exception const& e) { PrintError(file, "> {}", e.what()); } @@ -376,7 +376,7 @@ namespace { std::string result; - const char* str = key.c_str(); + char const* str = key.c_str(); std::size_t n = key.length(); char curr; diff --git a/src/common/DataStores/DBCFileLoader.cpp b/src/common/DataStores/DBCFileLoader.cpp index 91bc24eb0..973bc238c 100644 --- a/src/common/DataStores/DBCFileLoader.cpp +++ b/src/common/DataStores/DBCFileLoader.cpp @@ -307,7 +307,7 @@ char* DBCFileLoader::AutoProduceStrings(char const* format, char* dataTable) char** slot = (char**)(&dataTable[offset]); if (!*slot || !** slot) { - const char* st = getRecord(y).getString(x); + char const* st = getRecord(y).getString(x); *slot = stringPool + (st - (char const*)stringTable); } offset += sizeof(char*); diff --git a/src/common/DataStores/DBCFileLoader.h b/src/common/DataStores/DBCFileLoader.h index 3d7608e58..6838c3261 100644 --- a/src/common/DataStores/DBCFileLoader.h +++ b/src/common/DataStores/DBCFileLoader.h @@ -41,7 +41,7 @@ public: DBCFileLoader(); ~DBCFileLoader(); - bool Load(const char* filename, const char* fmt); + bool Load(char const* filename, char const* fmt); class Record { @@ -68,7 +68,7 @@ public: return *reinterpret_cast(offset + file.GetOffset(field)); } - [[nodiscard]] const char* getString(std::size_t field) const + [[nodiscard]] char const* getString(std::size_t field) const { ASSERT(field < file.fieldCount); std::size_t stringOffset = getUInt(field); @@ -94,7 +94,7 @@ public: [[nodiscard]] bool IsLoaded() const { return data != nullptr; } char* AutoProduceData(char const* fmt, uint32& count, char**& indexTable); char* AutoProduceStrings(char const* fmt, char* dataTable); - static uint32 GetFormatRecordSize(const char* format, int32* index_pos = nullptr); + static uint32 GetFormatRecordSize(char const* format, int32* index_pos = nullptr); private: uint32 recordSize; diff --git a/src/common/Debugging/WheatyExceptionReport.cpp b/src/common/Debugging/WheatyExceptionReport.cpp index 57ba80cae..251d47199 100644 --- a/src/common/Debugging/WheatyExceptionReport.cpp +++ b/src/common/Debugging/WheatyExceptionReport.cpp @@ -1589,7 +1589,7 @@ DWORD_PTR WheatyExceptionReport::DereferenceUnsafePointer(DWORD_PTR address) // Helper function that writes to the report file, and allows the user to use // printf style formating //============================================================================ -int __cdecl WheatyExceptionReport::Log(const TCHAR* format, ...) +int __cdecl WheatyExceptionReport::Log(TCHAR const* format, ...) { int retValue; va_list argptr; @@ -1609,7 +1609,7 @@ int __cdecl WheatyExceptionReport::Log(const TCHAR* format, ...) return retValue; } -int __cdecl WheatyExceptionReport::StackLog(const TCHAR* format, va_list argptr) +int __cdecl WheatyExceptionReport::StackLog(TCHAR const* format, va_list argptr) { int retValue; DWORD cbWritten; @@ -1621,7 +1621,7 @@ int __cdecl WheatyExceptionReport::StackLog(const TCHAR* format, va_list argptr) return retValue; } -int __cdecl WheatyExceptionReport::HeapLog(const TCHAR* format, va_list argptr) +int __cdecl WheatyExceptionReport::HeapLog(TCHAR const* format, va_list argptr) { int retValue = 0; DWORD cbWritten; diff --git a/src/common/Debugging/WheatyExceptionReport.h b/src/common/Debugging/WheatyExceptionReport.h index 94e91e869..cfda3118b 100644 --- a/src/common/Debugging/WheatyExceptionReport.h +++ b/src/common/Debugging/WheatyExceptionReport.h @@ -169,9 +169,9 @@ private: static BasicType GetBasicType(DWORD typeIndex, DWORD64 modBase); static DWORD_PTR DereferenceUnsafePointer(DWORD_PTR address); - static int __cdecl Log(const TCHAR* format, ...); - static int __cdecl StackLog(const TCHAR* format, va_list argptr); - static int __cdecl HeapLog(const TCHAR* format, va_list argptr); + static int __cdecl Log(TCHAR const* format, ...); + static int __cdecl StackLog(TCHAR const* format, va_list argptr); + static int __cdecl HeapLog(TCHAR const* format, va_list argptr); static bool StoreSymbol(DWORD type, DWORD_PTR offset); static void ClearSymbols(); diff --git a/src/common/Dynamic/TypeContainer.h b/src/common/Dynamic/TypeContainer.h index a43ddfd6e..1f9f49fd1 100644 --- a/src/common/Dynamic/TypeContainer.h +++ b/src/common/Dynamic/TypeContainer.h @@ -136,7 +136,7 @@ public: //} ContainerMapList& GetElements() { return i_elements; } - [[nodiscard]] const ContainerMapList& GetElements() const { return i_elements;} + [[nodiscard]] ContainerMapList const& GetElements() const { return i_elements;} private: ContainerMapList i_elements; @@ -163,7 +163,7 @@ public: } ContainerVector& GetElements() { return i_elements; } - [[nodiscard]] const ContainerVector& GetElements() const { return i_elements; } + [[nodiscard]] ContainerVector const& GetElements() const { return i_elements; } private: ContainerVector i_elements; diff --git a/src/common/Dynamic/TypeContainerFunctions.h b/src/common/Dynamic/TypeContainerFunctions.h index f2f606e23..eba2f8378 100644 --- a/src/common/Dynamic/TypeContainerFunctions.h +++ b/src/common/Dynamic/TypeContainerFunctions.h @@ -156,31 +156,31 @@ namespace Acore /* ContainerMapList Helpers */ // count functions template - std::size_t Count(const ContainerMapList& elements, SPECIFIC_TYPE* /*fake*/) + std::size_t Count(ContainerMapList const& elements, SPECIFIC_TYPE* /*fake*/) { return elements._element.getSize(); } template - std::size_t Count(const ContainerMapList& /*elements*/, SPECIFIC_TYPE* /*fake*/) + std::size_t Count(ContainerMapList const& /*elements*/, SPECIFIC_TYPE* /*fake*/) { return 0; } template - std::size_t Count(const ContainerMapList& /*elements*/, SPECIFIC_TYPE* /*fake*/) + std::size_t Count(ContainerMapList const& /*elements*/, SPECIFIC_TYPE* /*fake*/) { return 0; } template - std::size_t Count(const ContainerMapList>& elements, SPECIFIC_TYPE* fake) + std::size_t Count(ContainerMapList> const& elements, SPECIFIC_TYPE* fake) { return Count(elements._elements, fake); } template - std::size_t Count(const ContainerMapList>& elements, SPECIFIC_TYPE* fake) + std::size_t Count(ContainerMapList> const& elements, SPECIFIC_TYPE* fake) { return Count(elements._TailElements, fake); } @@ -243,31 +243,31 @@ namespace Acore /* ContainerVector Helpers */ // count functions template - std::size_t Count(const ContainerVector& elements, SPECIFIC_TYPE* /*fake*/) + std::size_t Count(ContainerVector const& elements, SPECIFIC_TYPE* /*fake*/) { return elements._element.getSize(); } template - std::size_t Count(const ContainerVector& /*elements*/, SPECIFIC_TYPE* /*fake*/) + std::size_t Count(ContainerVector const& /*elements*/, SPECIFIC_TYPE* /*fake*/) { return 0; } template - std::size_t Count(const ContainerVector& /*elements*/, SPECIFIC_TYPE* /*fake*/) + std::size_t Count(ContainerVector const& /*elements*/, SPECIFIC_TYPE* /*fake*/) { return 0; } template - std::size_t Count(const ContainerVector>& elements, SPECIFIC_TYPE* fake) + std::size_t Count(ContainerVector> const& elements, SPECIFIC_TYPE* fake) { return Count(elements._elements, fake); } template - std::size_t Count(const ContainerVector>& elements, SPECIFIC_TYPE* fake) + std::size_t Count(ContainerVector> const& elements, SPECIFIC_TYPE* fake) { return Count(elements._TailElements, fake); } diff --git a/src/common/Dynamic/TypeContainerFunctionsPtr.h b/src/common/Dynamic/TypeContainerFunctionsPtr.h index 7855089c6..b328bfcd2 100644 --- a/src/common/Dynamic/TypeContainerFunctionsPtr.h +++ b/src/common/Dynamic/TypeContainerFunctionsPtr.h @@ -81,23 +81,23 @@ namespace Acore } // const find functions - template const CountedPtr& Find(const ContainerMapList& elements, OBJECT_HANDLE hdl, CountedPtr* /*fake*/) + template CountedPtr const& Find(ContainerMapList const& elements, OBJECT_HANDLE hdl, CountedPtr* /*fake*/) { typename CountedPtr::iterator iter = elements._element.find(hdl); return (iter == elements._element.end() ? NullPtr((SPECIFIC_TYPE*)nullptr) : iter->second); }; - template const CountedPtr& Find(const ContainerMapList& elements, OBJECT_HANDLE hdl, CountedPtr* /*fake*/) + template CountedPtr const& Find(ContainerMapList const& elements, OBJECT_HANDLE hdl, CountedPtr* /*fake*/) { return NullPtr((SPECIFIC_TYPE*)nullptr); } - template const CountedPtr& Find(const ContainerMapList& elements, OBJECT_HANDLE hdl, CountedPtr* /*fake*/) + template CountedPtr const& Find(ContainerMapList const& elements, OBJECT_HANDLE hdl, CountedPtr* /*fake*/) { return NullPtr((SPECIFIC_TYPE*)nullptr); } - template CountedPtr& Find(const ContainerMapList>& elements, OBJECT_HANDLE hdl, CountedPtr* fake) + template CountedPtr& Find(ContainerMapList> const& elements, OBJECT_HANDLE hdl, CountedPtr* fake) { CountedPtr& t = Find(elements._elements, hdl, fake); if (!t) diff --git a/src/common/Dynamic/TypeContainerVisitor.h b/src/common/Dynamic/TypeContainerVisitor.h index a85ad9a9f..001515494 100644 --- a/src/common/Dynamic/TypeContainerVisitor.h +++ b/src/common/Dynamic/TypeContainerVisitor.h @@ -111,7 +111,7 @@ public: VisitorHelper(i_visitor, c); } - void Visit(const TYPE_CONTAINER& c) const + void Visit(TYPE_CONTAINER const& c) const { VisitorHelper(i_visitor, c); } diff --git a/src/common/Metric/Metric.cpp b/src/common/Metric/Metric.cpp index 75cc58dc6..6c86d2b84 100644 --- a/src/common/Metric/Metric.cpp +++ b/src/common/Metric/Metric.cpp @@ -315,7 +315,7 @@ void Metric::ScheduleOverallStatusLog() if (_enabled) { _overallStatusTimer->expires_at(Acore::Asio::SteadyTimer::GetExpirationTime(_overallStatusTimerInterval)); - _overallStatusTimer->async_wait([this](const boost::system::error_code&) + _overallStatusTimer->async_wait([this](boost::system::error_code const&) { _overallStatusTimerTriggered = true; ScheduleOverallStatusLog(); diff --git a/src/common/Navigation/DetourExtended.cpp b/src/common/Navigation/DetourExtended.cpp index 2b208eb99..c99b02142 100644 --- a/src/common/Navigation/DetourExtended.cpp +++ b/src/common/Navigation/DetourExtended.cpp @@ -6,10 +6,10 @@ #include "DetourCommon.h" #include "Geometry.h" -float dtQueryFilterExt::getCost(const float* pa, const float* pb, - const dtPolyRef /*prevRef*/, const dtMeshTile* /*prevTile*/, const dtPoly* /*prevPoly*/, - const dtPolyRef /*curRef*/, const dtMeshTile* /*curTile*/, const dtPoly* curPoly, - const dtPolyRef /*nextRef*/, const dtMeshTile* /*nextTile*/, const dtPoly* /*nextPoly*/) const +float dtQueryFilterExt::getCost(float const* pa, float const* pb, + const dtPolyRef /*prevRef*/, dtMeshTile const* /*prevTile*/, dtPoly const* /*prevPoly*/, + const dtPolyRef /*curRef*/, dtMeshTile const* /*curTile*/, dtPoly const* curPoly, + const dtPolyRef /*nextRef*/, dtMeshTile const* /*nextTile*/, dtPoly const* /*nextPoly*/) const { float startX = pa[2], startY = pa[0], startZ = pa[1]; float destX = pb[2], destY = pb[0], destZ = pb[1]; diff --git a/src/common/Navigation/DetourExtended.h b/src/common/Navigation/DetourExtended.h index ea718c128..e2bb710ad 100644 --- a/src/common/Navigation/DetourExtended.h +++ b/src/common/Navigation/DetourExtended.h @@ -10,10 +10,10 @@ class dtQueryFilterExt: public dtQueryFilter { public: - float getCost(const float* pa, const float* pb, - const dtPolyRef prevRef, const dtMeshTile* prevTile, const dtPoly* prevPoly, - const dtPolyRef curRef, const dtMeshTile* curTile, const dtPoly* curPoly, - const dtPolyRef nextRef, const dtMeshTile* nextTile, const dtPoly* nextPoly) const override; + float getCost(float const* pa, float const* pb, + const dtPolyRef prevRef, dtMeshTile const* prevTile, dtPoly const* prevPoly, + const dtPolyRef curRef, dtMeshTile const* curTile, dtPoly const* curPoly, + const dtPolyRef nextRef, dtMeshTile const* nextTile, dtPoly const* nextPoly) const override; }; #endif // _ACORE_DETOUR_EXTENDED_H diff --git a/src/common/Threading/LockedQueue.h b/src/common/Threading/LockedQueue.h index 1c8bbb199..7844b656d 100644 --- a/src/common/Threading/LockedQueue.h +++ b/src/common/Threading/LockedQueue.h @@ -49,7 +49,7 @@ public: * * @param item The item to be added to the queue. */ - void add(const T& item) + void add(T const& item) { std::lock_guard lock(_lock); _queue.push_back(std::move(item)); diff --git a/src/common/Threading/PCQueue.h b/src/common/Threading/PCQueue.h index 94e69a402..f66adb235 100644 --- a/src/common/Threading/PCQueue.h +++ b/src/common/Threading/PCQueue.h @@ -36,7 +36,7 @@ private: public: ProducerConsumerQueue() = default; - void Push(const T& value) + void Push(T const& value) { { std::lock_guard lock(_queueLock); diff --git a/src/common/Threading/Threading.h b/src/common/Threading/Threading.h index fdac117ff..786587b34 100644 --- a/src/common/Threading/Threading.h +++ b/src/common/Threading/Threading.h @@ -68,8 +68,8 @@ namespace Acore static std::thread::id currentId(); private: - Thread(const Thread&); - Thread& operator=(const Thread&); + Thread(Thread const&); + Thread& operator=(Thread const&); static void ThreadTask(void* param); diff --git a/src/common/Threading/ThreadingModel.h b/src/common/Threading/ThreadingModel.h index cf013ec76..f0a5fc50f 100644 --- a/src/common/Threading/ThreadingModel.h +++ b/src/common/Threading/ThreadingModel.h @@ -41,8 +41,8 @@ namespace Acore } private: - GeneralLock(const GeneralLock&); - GeneralLock& operator=(const GeneralLock&); + GeneralLock(GeneralLock const&); + GeneralLock& operator=(GeneralLock const&); MUTEX& i_mutex; }; @@ -55,11 +55,11 @@ namespace Acore Lock() { } - Lock(const T&) + Lock(T const&) { } - Lock(const SingleThreaded&) // for single threaded we ignore this + Lock(SingleThreaded const&) // for single threaded we ignore this { } }; @@ -90,8 +90,8 @@ namespace Acore private: // prevent the compiler creating a copy construct - ObjectLevelLockable(const ObjectLevelLockable&); - ObjectLevelLockable& operator=(const ObjectLevelLockable&); + ObjectLevelLockable(ObjectLevelLockable const&); + ObjectLevelLockable& operator=(ObjectLevelLockable const&); MUTEX i_mtx; }; @@ -109,12 +109,12 @@ namespace Acore class Lock { public: - Lock(const T& /*host*/) + Lock(T const& /*host*/) { ClassLevelLockable::si_mtx.lock(); } - Lock(const ClassLevelLockable&) + Lock(ClassLevelLockable const&) { ClassLevelLockable::si_mtx.lock(); } diff --git a/src/common/Utilities/SmartEnum.h b/src/common/Utilities/SmartEnum.h index a3ce5608a..62e647c79 100644 --- a/src/common/Utilities/SmartEnum.h +++ b/src/common/Utilities/SmartEnum.h @@ -85,13 +85,13 @@ public: Iterator() : _index(EnumUtils::Count()) {} explicit Iterator(std::size_t index) : _index(index) { } - bool operator==(const Iterator& other) const { return other._index == _index; } - bool operator!=(const Iterator& other) const { return !operator==(other); } + bool operator==(Iterator const& other) const { return other._index == _index; } + bool operator!=(Iterator const& other) const { return !operator==(other); } difference_type operator-(Iterator const& other) const { return _index - other._index; } - bool operator<(const Iterator& other) const { return _index < other._index; } - bool operator<=(const Iterator& other) const { return _index <= other._index; } - bool operator>(const Iterator& other) const { return _index > other._index; } - bool operator>=(const Iterator& other) const { return _index >= other._index; } + bool operator<(Iterator const& other) const { return _index < other._index; } + bool operator<=(Iterator const& other) const { return _index <= other._index; } + bool operator>(Iterator const& other) const { return _index > other._index; } + bool operator>=(Iterator const& other) const { return _index >= other._index; } value_type operator[](difference_type d) const { return FromIndex(_index + d); } value_type operator*() const { return operator[](0); } diff --git a/src/common/Utilities/StringFormat.cpp b/src/common/Utilities/StringFormat.cpp index 55edca815..43b3cb4b5 100644 --- a/src/common/Utilities/StringFormat.cpp +++ b/src/common/Utilities/StringFormat.cpp @@ -19,7 +19,7 @@ #include "Define.h" template -AC_COMMON_API Str Acore::String::Trim(const Str& s, const std::locale& loc /*= std::locale()*/) +AC_COMMON_API Str Acore::String::Trim(Str const& s, std::locale const& loc /*= std::locale()*/) { typename Str::const_iterator first = s.begin(); typename Str::const_iterator end = s.end(); @@ -78,4 +78,4 @@ std::string Acore::String::AddSuffixIfNotExists(std::string str, const char suff } // Template Trim -template AC_COMMON_API std::string Acore::String::Trim(const std::string& s, const std::locale& loc /*= std::locale()*/); +template AC_COMMON_API std::string Acore::String::Trim(std::string const& s, std::locale const& loc /*= std::locale()*/); diff --git a/src/common/Utilities/StringFormat.h b/src/common/Utilities/StringFormat.h index 2aecd8e45..5129a6965 100644 --- a/src/common/Utilities/StringFormat.h +++ b/src/common/Utilities/StringFormat.h @@ -110,7 +110,7 @@ namespace Acore namespace Acore::String { template - AC_COMMON_API Str Trim(const Str& s, const std::locale& loc = std::locale()); + AC_COMMON_API Str Trim(Str const& s, std::locale const& loc = std::locale()); AC_COMMON_API std::string TrimRightInPlace(std::string& str); diff --git a/src/common/Utilities/Util.cpp b/src/common/Utilities/Util.cpp index 6e5757f1e..719467004 100644 --- a/src/common/Utilities/Util.cpp +++ b/src/common/Utilities/Util.cpp @@ -160,7 +160,7 @@ Optional MoneyStringToMoney(std::string_view moneyString) return money; } -uint32 TimeStringToSecs(const std::string& timestring) +uint32 TimeStringToSecs(std::string const& timestring) { uint32 secs = 0; uint32 buffer = 0; @@ -291,7 +291,7 @@ bool Utf8toWStr(char const* utf8str, std::size_t csize, wchar_t* wstr, std::size { // Replace the converted string with an error message if there is enough space // Otherwise just return an empty string - const wchar_t* errorMessage = L"An error occurred converting string from UTF-8 to WStr"; + wchar_t const* errorMessage = L"An error occurred converting string from UTF-8 to WStr"; std::size_t errorMessageLength = std::char_traits::length(errorMessage); if (wsize >= errorMessageLength) { @@ -421,7 +421,7 @@ std::wstring GetMainPartOfName(std::wstring const& wname, uint32_t declension) std::size_t const thisLen = wname.length(); std::array const& endings = dropEnds[declension]; - for (const std::wstring* endingPtr : endings) + for (std::wstring const* endingPtr : endings) { if (endingPtr == nullptr) { @@ -498,7 +498,7 @@ bool Utf8FitTo(std::string_view str, std::wstring_view search) return true; } -void utf8printf(FILE* out, const char* str, ...) +void utf8printf(FILE* out, char const* str, ...) { va_list ap; va_start(ap, str); @@ -506,7 +506,7 @@ void utf8printf(FILE* out, const char* str, ...) va_end(ap); } -void vutf8printf(FILE* out, const char* str, va_list* ap) +void vutf8printf(FILE* out, char const* str, va_list* ap) { #if AC_PLATFORM == AC_PLATFORM_WINDOWS char temp_buf[32 * 1024]; diff --git a/src/common/Utilities/Util.h b/src/common/Utilities/Util.h index 3976d4e76..b0bbe0a78 100644 --- a/src/common/Utilities/Util.h +++ b/src/common/Utilities/Util.h @@ -37,7 +37,7 @@ template struct Finder T S::* idMember_; Finder(T val, T S::* idMember) : val_(val), idMember_(idMember) {} - bool operator()(const std::pair& obj) { return obj.second.*idMember_ == val_; } + bool operator()(std::pair const& obj) { return obj.second.*idMember_ == val_; } }; void stripLineInvisibleChars(std::string& src); @@ -45,7 +45,7 @@ void stripLineInvisibleChars(std::string& src); AC_COMMON_API Optional MoneyStringToMoney(std::string_view moneyString); std::string secsToTimeString(uint64 timeInSecs, bool shortText = false); -uint32 TimeStringToSecs(const std::string& timestring); +uint32 TimeStringToSecs(std::string const& timestring); // Percentage calculation template @@ -353,13 +353,13 @@ std::wstring GetMainPartOfName(std::wstring const& wname, uint32 declension); AC_COMMON_API bool utf8ToConsole(std::string_view utf8str, std::string& conStr); AC_COMMON_API bool consoleToUtf8(std::string_view conStr, std::string& utf8str); AC_COMMON_API bool Utf8FitTo(std::string_view str, std::wstring_view search); -AC_COMMON_API void utf8printf(FILE* out, const char* str, ...); -AC_COMMON_API void vutf8printf(FILE* out, const char* str, va_list* ap); +AC_COMMON_API void utf8printf(FILE* out, char const* str, ...); +AC_COMMON_API void vutf8printf(FILE* out, char const* str, va_list* ap); AC_COMMON_API bool Utf8ToUpperOnlyLatin(std::string& utf8String); bool IsIPAddress(char const* ipaddress); -uint32 CreatePIDFile(const std::string& filename); +uint32 CreatePIDFile(std::string const& filename); uint32 GetPID(); namespace Acore::Impl @@ -506,7 +506,7 @@ public: part[2] = right.part[2]; return *this; } - flag96(const flag96&) = default; + flag96(flag96 const&) = default; flag96(flag96&&) = default; inline flag96 operator&(flag96 const& right) const diff --git a/src/server/apps/worldserver/ACSoap/ACSoap.cpp b/src/server/apps/worldserver/ACSoap/ACSoap.cpp index 4b76d2b58..5e595392e 100644 --- a/src/server/apps/worldserver/ACSoap/ACSoap.cpp +++ b/src/server/apps/worldserver/ACSoap/ACSoap.cpp @@ -23,7 +23,7 @@ #include #include -void ACSoapThread(const std::string& host, uint16 port) +void ACSoapThread(std::string const& host, uint16 port) { struct soap soap; soap_init(&soap); diff --git a/src/server/apps/worldserver/ACSoap/ACSoap.h b/src/server/apps/worldserver/ACSoap/ACSoap.h index 36162a33c..73e2bc296 100644 --- a/src/server/apps/worldserver/ACSoap/ACSoap.h +++ b/src/server/apps/worldserver/ACSoap/ACSoap.h @@ -23,7 +23,7 @@ #include void process_message(struct soap* soap_message); -void ACSoapThread(const std::string& host, uint16 port); +void ACSoapThread(std::string const& host, uint16 port); class SOAPCommand { diff --git a/src/server/apps/worldserver/RemoteAccess/RASession.cpp b/src/server/apps/worldserver/RemoteAccess/RASession.cpp index 03645044e..219169d6d 100644 --- a/src/server/apps/worldserver/RemoteAccess/RASession.cpp +++ b/src/server/apps/worldserver/RemoteAccess/RASession.cpp @@ -120,7 +120,7 @@ std::string RASession::ReadString() return line; } -bool RASession::CheckAccessLevel(const std::string& user) +bool RASession::CheckAccessLevel(std::string const& user) { std::string safeUser = user; @@ -152,7 +152,7 @@ bool RASession::CheckAccessLevel(const std::string& user) return true; } -bool RASession::CheckPassword(const std::string& user, const std::string& pass) +bool RASession::CheckPassword(std::string const& user, std::string const& pass) { std::string safe_user = user; std::transform(safe_user.begin(), safe_user.end(), safe_user.begin(), ::toupper); diff --git a/src/server/apps/worldserver/RemoteAccess/RASession.h b/src/server/apps/worldserver/RemoteAccess/RASession.h index 1f06b32ae..a2d016378 100644 --- a/src/server/apps/worldserver/RemoteAccess/RASession.h +++ b/src/server/apps/worldserver/RemoteAccess/RASession.h @@ -38,8 +38,8 @@ public: private: int Send(std::string_view data); std::string ReadString(); - bool CheckAccessLevel(const std::string& user); - bool CheckPassword(const std::string& user, const std::string& pass); + bool CheckAccessLevel(std::string const& user); + bool CheckPassword(std::string const& user, std::string const& pass); bool ProcessCommand(std::string& command); static void CommandPrint(void* callbackArg, std::string_view text); diff --git a/src/server/database/Database/MySQLConnection.cpp b/src/server/database/Database/MySQLConnection.cpp index 48c9c4a62..b62d0ed82 100644 --- a/src/server/database/Database/MySQLConnection.cpp +++ b/src/server/database/Database/MySQLConnection.cpp @@ -399,7 +399,7 @@ int MySQLConnection::ExecuteTransaction(std::shared_ptr transac { stmt = std::get(data.element); } - catch (const std::bad_variant_access& ex) + catch (std::bad_variant_access const& ex) { LOG_FATAL("sql.sql", "> PreparedStatementBase not found in SQLElementData. {}", ex.what()); ABORT(); @@ -424,7 +424,7 @@ int MySQLConnection::ExecuteTransaction(std::shared_ptr transac { sql = std::get(data.element); } - catch (const std::bad_variant_access& ex) + catch (std::bad_variant_access const& ex) { LOG_FATAL("sql.sql", "> std::string not found in SQLElementData. {}", ex.what()); ABORT(); @@ -453,7 +453,7 @@ int MySQLConnection::ExecuteTransaction(std::shared_ptr transac return 0; } -std::size_t MySQLConnection::EscapeString(char* to, const char* from, std::size_t length) +std::size_t MySQLConnection::EscapeString(char* to, char const* from, std::size_t length) { return mysql_real_escape_string(m_Mysql, to, from, length); } diff --git a/src/server/database/Database/MySQLConnection.h b/src/server/database/Database/MySQLConnection.h index d19fdc59b..e1b51836a 100644 --- a/src/server/database/Database/MySQLConnection.h +++ b/src/server/database/Database/MySQLConnection.h @@ -79,7 +79,7 @@ public: void RollbackTransaction(); void CommitTransaction(); int ExecuteTransaction(std::shared_ptr transaction); - std::size_t EscapeString(char* to, const char* from, std::size_t length); + std::size_t EscapeString(char* to, char const* from, std::size_t length); void Ping(); uint32 GetLastError(); diff --git a/src/server/database/Database/QueryResult.h b/src/server/database/Database/QueryResult.h index 2aad4cffa..d7aafc5b3 100644 --- a/src/server/database/Database/QueryResult.h +++ b/src/server/database/Database/QueryResult.h @@ -39,7 +39,7 @@ struct ResultIterator pointer operator->() { return _ptr; } ResultIterator& operator++() { if (!_ptr->NextRow()) _ptr = nullptr; return *this; } - bool operator!=(const ResultIterator& right) { return _ptr != right._ptr; } + bool operator!=(ResultIterator const& right) { return _ptr != right._ptr; } private: pointer _ptr; diff --git a/src/server/database/Database/Transaction.cpp b/src/server/database/Database/Transaction.cpp index 6f76dfbf4..dba55aefe 100644 --- a/src/server/database/Database/Transaction.cpp +++ b/src/server/database/Database/Transaction.cpp @@ -66,7 +66,7 @@ void TransactionBase::Cleanup() delete stmt; } - catch (const std::bad_variant_access& ex) + catch (std::bad_variant_access const& ex) { LOG_FATAL("sql.sql", "> PreparedStatementBase not found in SQLElementData. {}", ex.what()); ABORT(); @@ -79,7 +79,7 @@ void TransactionBase::Cleanup() { std::get(data.element).clear(); } - catch (const std::bad_variant_access& ex) + catch (std::bad_variant_access const& ex) { LOG_FATAL("sql.sql", "> std::string not found in SQLElementData. {}", ex.what()); ABORT(); diff --git a/src/server/database/Updater/DBUpdater.cpp b/src/server/database/Updater/DBUpdater.cpp index 2d023faed..a98cae3ff 100644 --- a/src/server/database/Updater/DBUpdater.cpp +++ b/src/server/database/Updater/DBUpdater.cpp @@ -175,7 +175,7 @@ bool DBUpdater::Create(DatabaseWorkerPool& pool) { LOG_WARN("sql.updates", "Database \"{}\" does not exist", pool.GetConnectionInfo()->database); - const char* disableInteractive = std::getenv("AC_DISABLE_INTERACTIVE"); + char const* disableInteractive = std::getenv("AC_DISABLE_INTERACTIVE"); if (!sConfigMgr->isDryRun() && (disableInteractive == nullptr || std::strcmp(disableInteractive, "1") != 0)) { @@ -402,7 +402,7 @@ bool DBUpdater::Populate(DatabaseWorkerPool& pool) std::vector sqlFiles; - for (const auto &entry : std::filesystem::directory_iterator(DirPath)) + for (auto const& entry : std::filesystem::directory_iterator(DirPath)) { if (entry.path().extension() == ".sql") sqlFiles.push_back(entry.path()); @@ -410,7 +410,7 @@ bool DBUpdater::Populate(DatabaseWorkerPool& pool) std::sort(sqlFiles.begin(), sqlFiles.end()); - for (const auto &file : sqlFiles) + for (auto const& file : sqlFiles) { LOG_INFO("sql.updates", ">> Applying \'{}\'...", file.filename().generic_string()); diff --git a/src/server/game/AI/CoreAI/PetAI.cpp b/src/server/game/AI/CoreAI/PetAI.cpp index 14bd1d530..019f55fb3 100644 --- a/src/server/game/AI/CoreAI/PetAI.cpp +++ b/src/server/game/AI/CoreAI/PetAI.cpp @@ -494,7 +494,7 @@ Unit* PetAI::SelectNextTarget(bool allowAutoSelect) const // Check pet's attackers first to prevent dragging mobs back to owner if (me->HasTauntAura()) { - const Unit::AuraEffectList& tauntAuras = me->GetAuraEffectsByType(SPELL_AURA_MOD_TAUNT); + Unit::AuraEffectList const& tauntAuras = me->GetAuraEffectsByType(SPELL_AURA_MOD_TAUNT); if (!tauntAuras.empty()) for (Unit::AuraEffectList::const_reverse_iterator itr = tauntAuras.rbegin(); itr != tauntAuras.rend(); ++itr) if (Unit* caster = (*itr)->GetCaster()) diff --git a/src/server/game/AI/CreatureAI.cpp b/src/server/game/AI/CreatureAI.cpp index 4dfeb897c..f16f2a3d8 100644 --- a/src/server/game/AI/CreatureAI.cpp +++ b/src/server/game/AI/CreatureAI.cpp @@ -625,7 +625,7 @@ void CreatureAI::SetBoundary(CreatureBoundary const* boundary, bool negateBounda me->DoImmediateBoundaryCheck(); } -Creature* CreatureAI::DoSummon(uint32 entry, const Position& pos, uint32 despawnTime, TempSummonType summonType) +Creature* CreatureAI::DoSummon(uint32 entry, Position const& pos, uint32 despawnTime, TempSummonType summonType) { return me->SummonCreature(entry, pos, summonType, despawnTime); } diff --git a/src/server/game/AI/ScriptedAI/ScriptedCreature.h b/src/server/game/AI/ScriptedAI/ScriptedCreature.h index deb7bba10..a39f1a417 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedCreature.h +++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.h @@ -244,7 +244,7 @@ struct ScriptedAI : public CreatureAI * Hodir is in room until his Y position is below the Door position: * IsInRoom(doorPosition, AXIS_Y, false); */ - bool IsInRoom(const Position* pos, Axis axis, bool above) + bool IsInRoom(Position const* pos, Axis axis, bool above) { if (!pos) { @@ -389,7 +389,7 @@ struct ScriptedAI : public CreatureAI bool Is25ManRaid() const { return _difficulty & RAID_DIFFICULTY_MASK_25MAN; } template inline - const T& DUNGEON_MODE(const T& normal5, const T& heroic10) const + T const& DUNGEON_MODE(T const& normal5, T const& heroic10) const { switch (_difficulty) { @@ -405,7 +405,7 @@ struct ScriptedAI : public CreatureAI } template inline - const T& RAID_MODE(const T& normal10, const T& normal25) const + T const& RAID_MODE(T const& normal10, T const& normal25) const { switch (_difficulty) { @@ -421,7 +421,7 @@ struct ScriptedAI : public CreatureAI } template inline - const T& RAID_MODE(const T& normal10, const T& normal25, const T& heroic10, const T& heroic25) const + T const& RAID_MODE(T const& normal10, T const& normal25, T const& heroic10, T const& heroic25) const { switch (_difficulty) { diff --git a/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp b/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp index ab059e8bb..fb972f2a9 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp +++ b/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp @@ -257,7 +257,7 @@ void FollowerAI::MovementInform(uint32 motionType, uint32 pointId) } } -void FollowerAI::StartFollow(Player* player, uint32 factionForFollower, const Quest* quest, bool inheritWalkState, bool inheritSpeed) +void FollowerAI::StartFollow(Player* player, uint32 factionForFollower, Quest const* quest, bool inheritWalkState, bool inheritSpeed) { if (me->GetVictim()) { diff --git a/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.h b/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.h index beec7c23a..cbac6d799 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.h +++ b/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.h @@ -55,7 +55,7 @@ public: void UpdateAI(uint32) override; //the "internal" update, calls UpdateFollowerAI() virtual void UpdateFollowerAI(uint32); //used when it's needed to add code in update (abilities, scripted events, etc) - void StartFollow(Player* player, uint32 factionForFollower = 0, const Quest* quest = nullptr, bool inheritWalkState = true, bool inheritSpeed = true); + void StartFollow(Player* player, uint32 factionForFollower = 0, Quest const* quest = nullptr, bool inheritWalkState = true, bool inheritSpeed = true); void SetFollowPaused(bool bPaused); //if special event require follow mode to hold/resume during the follow void SetFollowComplete(bool bWithEndEvent = false); @@ -75,7 +75,7 @@ private: uint32 m_uiUpdateFollowTimer; uint32 m_uiFollowState; - const Quest* m_pQuestForFollow; //normally we have a quest + Quest const* m_pQuestForFollow; //normally we have a quest }; #endif diff --git a/src/server/game/AI/SmartScripts/SmartAI.cpp b/src/server/game/AI/SmartScripts/SmartAI.cpp index 23d7466f5..b1dafb95c 100644 --- a/src/server/game/AI/SmartScripts/SmartAI.cpp +++ b/src/server/game/AI/SmartScripts/SmartAI.cpp @@ -1151,7 +1151,7 @@ void SmartAI::sGossipSelect(Player* player, uint32 sender, uint32 action) GetScript()->ProcessEventsFor(SMART_EVENT_GOSSIP_SELECT, player, sender, action); } -void SmartAI::sGossipSelectCode(Player* /*player*/, uint32 /*sender*/, uint32 /*action*/, const char* /*code*/) +void SmartAI::sGossipSelectCode(Player* /*player*/, uint32 /*sender*/, uint32 /*action*/, char const* /*code*/) { } @@ -1404,7 +1404,7 @@ bool SmartGameObjectAI::GossipSelect(Player* player, uint32 sender, uint32 actio } // Called when a player selects a gossip with a code in the gameobject's gossip menu. -bool SmartGameObjectAI::GossipSelectCode(Player* /*player*/, uint32 /*sender*/, uint32 /*action*/, const char* /*code*/) +bool SmartGameObjectAI::GossipSelectCode(Player* /*player*/, uint32 /*sender*/, uint32 /*action*/, char const* /*code*/) { return false; } diff --git a/src/server/game/AI/SmartScripts/SmartAI.h b/src/server/game/AI/SmartScripts/SmartAI.h index 5a8ec52bc..d84c72929 100644 --- a/src/server/game/AI/SmartScripts/SmartAI.h +++ b/src/server/game/AI/SmartScripts/SmartAI.h @@ -190,7 +190,7 @@ public: void sGossipHello(Player* player) override; void sGossipSelect(Player* player, uint32 sender, uint32 action) override; - void sGossipSelectCode(Player* player, uint32 sender, uint32 action, const char* code) override; + void sGossipSelectCode(Player* player, uint32 sender, uint32 action, char const* code) override; void sQuestAccept(Player* player, Quest const* quest) override; //void sQuestSelect(Player* player, Quest const* quest); //void sQuestComplete(Player* player, Quest const* quest); @@ -298,7 +298,7 @@ public: bool GossipHello(Player* player, bool reportUse) override; bool GossipSelect(Player* player, uint32 sender, uint32 action) override; - bool GossipSelectCode(Player* /*player*/, uint32 /*sender*/, uint32 /*action*/, const char* /*code*/) override; + bool GossipSelectCode(Player* /*player*/, uint32 /*sender*/, uint32 /*action*/, char const* /*code*/) override; bool QuestAccept(Player* player, Quest const* quest) override; bool QuestReward(Player* player, Quest const* quest, uint32 opt) override; void Destroyed(Player* player, uint32 eventId) override; diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index e27ec45f2..d538a3863 100644 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -1085,7 +1085,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui uint32 counter = 0; - const RewardedQuestSet& rewQuests = GetPlayer()->getRewardedQuests(); + RewardedQuestSet const& rewQuests = GetPlayer()->getRewardedQuests(); for (RewardedQuestSet::const_iterator itr = rewQuests.begin(); itr != rewQuests.end(); ++itr) { Quest const* quest = sObjectMgr->GetQuestTemplate(*itr); @@ -2186,7 +2186,7 @@ void AchievementMgr::SetCriteriaProgress(AchievementCriteriaEntry const* entry, sScriptMgr->OnPlayerCriteriaProgress(GetPlayer(), entry); } -void AchievementMgr::RemoveCriteriaProgress(const AchievementCriteriaEntry* entry) +void AchievementMgr::RemoveCriteriaProgress(AchievementCriteriaEntry const* entry) { CriteriaProgressMap::iterator criteriaProgress = _criteriaProgress.find(entry->ID); if (criteriaProgress == _criteriaProgress.end()) @@ -2974,7 +2974,7 @@ void AchievementGlobalMgr::LoadCompletedAchievements() Field* fields = result->Fetch(); uint16 achievementId = fields[0].Get(); - const AchievementEntry* achievement = sAchievementStore.LookupEntry(achievementId); + AchievementEntry const* achievement = sAchievementStore.LookupEntry(achievementId); if (!achievement) { // Remove non existent achievements from all characters diff --git a/src/server/game/Addons/AddonMgr.cpp b/src/server/game/Addons/AddonMgr.cpp index 4e139b748..e127951d8 100644 --- a/src/server/game/Addons/AddonMgr.cpp +++ b/src/server/game/Addons/AddonMgr.cpp @@ -104,7 +104,7 @@ namespace AddonMgr m_knownAddons.emplace_back(addon.Name, addon.CRC); } - SavedAddon const* GetAddonInfo(const std::string& name) + SavedAddon const* GetAddonInfo(std::string const& name) { for (auto const& addon : m_knownAddons) { diff --git a/src/server/game/Addons/AddonMgr.h b/src/server/game/Addons/AddonMgr.h index 1c9037f89..effc55cc5 100644 --- a/src/server/game/Addons/AddonMgr.h +++ b/src/server/game/Addons/AddonMgr.h @@ -60,7 +60,7 @@ namespace AddonMgr { void LoadFromDB(); void SaveAddon(AddonInfo const& addon); - SavedAddon const* GetAddonInfo(const std::string& name); + SavedAddon const* GetAddonInfo(std::string const& name); typedef std::list BannedAddonList; BannedAddonList const* GetBannedAddons(); diff --git a/src/server/game/ArenaSpectator/ArenaSpectator.cpp b/src/server/game/ArenaSpectator/ArenaSpectator.cpp index fe0e49c12..b7b63dc8b 100644 --- a/src/server/game/ArenaSpectator/ArenaSpectator.cpp +++ b/src/server/game/ArenaSpectator/ArenaSpectator.cpp @@ -113,7 +113,7 @@ bool ArenaSpectator::HandleSpectatorSpectateCommand(ChatHandler* handler, std::s if (!player->m_Controlled.empty()) errors.push_back("Can't be controlling creatures."); - const Unit::VisibleAuraMap* va = player->GetVisibleAuras(); + Unit::VisibleAuraMap const* va = player->GetVisibleAuras(); for (auto itr = va->begin(); itr != va->end(); ++itr) if (Aura* aura = itr->second->GetBase()) if (!itr->second->IsPositive() && !aura->IsPermanent() && aura->GetDuration() < HOUR * IN_MILLISECONDS) @@ -310,7 +310,7 @@ AC_GAME_API void ArenaSpectator::SendPacketTo(Player const* player, std::string& } template<> -AC_GAME_API void ArenaSpectator::SendPacketTo(const Map* map, std::string&& message) +AC_GAME_API void ArenaSpectator::SendPacketTo(Map const* map, std::string&& message) { if (!map->IsBattleArena()) return; diff --git a/src/server/game/ArenaSpectator/ArenaSpectator.h b/src/server/game/ArenaSpectator/ArenaSpectator.h index 9bb2f20b2..2abc9da77 100644 --- a/src/server/game/ArenaSpectator/ArenaSpectator.h +++ b/src/server/game/ArenaSpectator/ArenaSpectator.h @@ -41,7 +41,7 @@ class WorldPacket; namespace ArenaSpectator { template - AC_GAME_API void SendPacketTo(const T* object, std::string&& message); + AC_GAME_API void SendPacketTo(T const* object, std::string&& message); template inline void SendCommand(T* o, Format&& fmt, Args&& ... args) @@ -50,7 +50,7 @@ namespace ArenaSpectator } template - inline void SendCommand_String(T* o, ObjectGuid targetGUID, const char* prefix, const char* c) + inline void SendCommand_String(T* o, ObjectGuid targetGUID, char const* prefix, char const* c) { if (!targetGUID.IsPlayer()) return; @@ -59,7 +59,7 @@ namespace ArenaSpectator } template - inline void SendCommand_UInt32Value(T* o, ObjectGuid targetGUID, const char* prefix, uint32 t) + inline void SendCommand_UInt32Value(T* o, ObjectGuid targetGUID, char const* prefix, uint32 t) { if (!targetGUID.IsPlayer()) return; @@ -68,7 +68,7 @@ namespace ArenaSpectator } template - inline void SendCommand_GUID(T* o, ObjectGuid targetGUID, const char* prefix, ObjectGuid t) + inline void SendCommand_GUID(T* o, ObjectGuid targetGUID, char const* prefix, ObjectGuid t) { if (!targetGUID.IsPlayer()) return; @@ -77,7 +77,7 @@ namespace ArenaSpectator } template - inline void SendCommand_Spell(T* o, ObjectGuid targetGUID, const char* prefix, uint32 id, int32 casttime) + inline void SendCommand_Spell(T* o, ObjectGuid targetGUID, char const* prefix, uint32 id, int32 casttime) { if (!targetGUID.IsPlayer()) return; @@ -86,7 +86,7 @@ namespace ArenaSpectator } template - inline void SendCommand_Cooldown(T* o, ObjectGuid targetGUID, const char* prefix, uint32 id, uint32 dur, uint32 maxdur) + inline void SendCommand_Cooldown(T* o, ObjectGuid targetGUID, char const* prefix, uint32 id, uint32 dur, uint32 maxdur) { if (!targetGUID.IsPlayer()) return; @@ -99,7 +99,7 @@ namespace ArenaSpectator } template - inline void SendCommand_Aura(T* o, ObjectGuid targetGUID, const char* prefix, ObjectGuid caster, uint32 id, bool isDebuff, uint32 dispel, int32 dur, int32 maxdur, uint32 stack, bool remove) + inline void SendCommand_Aura(T* o, ObjectGuid targetGUID, char const* prefix, ObjectGuid caster, uint32 id, bool isDebuff, uint32 dispel, int32 dur, int32 maxdur, uint32 stack, bool remove) { if (!targetGUID.IsPlayer()) return; diff --git a/src/server/game/Battlegrounds/ArenaSeason/ArenaSeasonMgr.h b/src/server/game/Battlegrounds/ArenaSeason/ArenaSeasonMgr.h index f238b2a90..4ee086af2 100644 --- a/src/server/game/Battlegrounds/ArenaSeason/ArenaSeasonMgr.h +++ b/src/server/game/Battlegrounds/ArenaSeason/ArenaSeasonMgr.h @@ -52,7 +52,7 @@ struct ArenaSeasonReward ArenaSeasonRewardType type{ARENA_SEASON_REWARD_TYPE_ITEM}; // Used in unit tests. - bool operator==(const ArenaSeasonReward& other) const + bool operator==(ArenaSeasonReward const& other) const { return entry == other.entry && type == other.type; } @@ -78,7 +78,7 @@ struct ArenaSeasonRewardGroup std::vector achievementRewards; // Used in unit tests. - bool operator==(const ArenaSeasonRewardGroup& other) const + bool operator==(ArenaSeasonRewardGroup const& other) const { return minCriteria == other.minCriteria && maxCriteria == other.maxCriteria && diff --git a/src/server/game/Battlegrounds/ArenaSeason/ArenaSeasonRewardsDistributor.cpp b/src/server/game/Battlegrounds/ArenaSeason/ArenaSeasonRewardsDistributor.cpp index a575e61ff..59c8afe81 100644 --- a/src/server/game/Battlegrounds/ArenaSeason/ArenaSeasonRewardsDistributor.cpp +++ b/src/server/game/Battlegrounds/ArenaSeason/ArenaSeasonRewardsDistributor.cpp @@ -24,7 +24,7 @@ constexpr float minPctTeamGamesForMemberToGetReward = 30; -void ArenaSeasonTeamRewarderImpl::RewardTeamWithRewardGroup(ArenaTeam *arenaTeam, const ArenaSeasonRewardGroup &rewardGroup) +void ArenaSeasonTeamRewarderImpl::RewardTeamWithRewardGroup(ArenaTeam *arenaTeam, ArenaSeasonRewardGroup const& rewardGroup) { RewardWithMail(arenaTeam, rewardGroup); RewardWithAchievements(arenaTeam, rewardGroup); diff --git a/src/server/game/Battlegrounds/ArenaTeam.cpp b/src/server/game/Battlegrounds/ArenaTeam.cpp index 8e32b3c99..8a168ed63 100644 --- a/src/server/game/Battlegrounds/ArenaTeam.cpp +++ b/src/server/game/Battlegrounds/ArenaTeam.cpp @@ -778,7 +778,7 @@ int32 ArenaTeam::GetRatingMod(uint32 ownRating, uint32 opponentRating, bool won return (int32)ceil(mod); } -void ArenaTeam::FinishGame(int32 mod, const Map* bgMap) +void ArenaTeam::FinishGame(int32 mod, Map const* bgMap) { // Rating can only drop to 0 if (int32(Stats.Rating) + mod < 0) @@ -808,7 +808,7 @@ void ArenaTeam::FinishGame(int32 mod, const Map* bgMap) } } -int32 ArenaTeam::WonAgainst(uint32 Own_MMRating, uint32 Opponent_MMRating, int32& rating_change, const Map* bgMap) +int32 ArenaTeam::WonAgainst(uint32 Own_MMRating, uint32 Opponent_MMRating, int32& rating_change, Map const* bgMap) { // Called when the team has won // Change in Matchmaker rating @@ -828,7 +828,7 @@ int32 ArenaTeam::WonAgainst(uint32 Own_MMRating, uint32 Opponent_MMRating, int32 return mod; } -int32 ArenaTeam::LostAgainst(uint32 Own_MMRating, uint32 Opponent_MMRating, int32& rating_change, const Map* bgMap) +int32 ArenaTeam::LostAgainst(uint32 Own_MMRating, uint32 Opponent_MMRating, int32& rating_change, Map const* bgMap) { // Called when the team has lost // Change in Matchmaker Rating @@ -1013,7 +1013,7 @@ bool ArenaTeam::IsFighting() const return false; } -ArenaTeamMember* ArenaTeam::GetMember(const std::string& name) +ArenaTeamMember* ArenaTeam::GetMember(std::string const& name) { return GetMember(sCharacterCache->GetCharacterGuidByName(name)); } diff --git a/src/server/game/Battlegrounds/ArenaTeam.h b/src/server/game/Battlegrounds/ArenaTeam.h index 33c47920e..f1d02683e 100644 --- a/src/server/game/Battlegrounds/ArenaTeam.h +++ b/src/server/game/Battlegrounds/ArenaTeam.h @@ -152,7 +152,7 @@ public: static uint8 GetReqPlayersForType(uint32 type); [[nodiscard]] ObjectGuid GetCaptain() const { return CaptainGuid; } [[nodiscard]] std::string const& GetName() const { return TeamName; } - [[nodiscard]] const ArenaTeamStats& GetStats() const { return Stats; } + [[nodiscard]] ArenaTeamStats const& GetStats() const { return Stats; } void SetArenaTeamStats(ArenaTeamStats& stats) { Stats = stats; } [[nodiscard]] uint32 GetRating() const { return Stats.Rating; } @@ -198,15 +198,15 @@ public: int32 GetMatchmakerRatingMod(uint32 ownRating, uint32 opponentRating, bool won); int32 GetRatingMod(uint32 ownRating, uint32 opponentRating, bool won); float GetChanceAgainst(uint32 ownRating, uint32 opponentRating); - int32 WonAgainst(uint32 Own_MMRating, uint32 Opponent_MMRating, int32& rating_change, const Map* bgMap); + int32 WonAgainst(uint32 Own_MMRating, uint32 Opponent_MMRating, int32& rating_change, Map const* bgMap); void MemberWon(Player* player, uint32 againstMatchmakerRating, int32 MatchmakerRatingChange); - int32 LostAgainst(uint32 Own_MMRating, uint32 Opponent_MMRating, int32& rating_change, const Map* bgMap); + int32 LostAgainst(uint32 Own_MMRating, uint32 Opponent_MMRating, int32& rating_change, Map const* bgMap); void MemberLost(Player* player, uint32 againstMatchmakerRating, int32 MatchmakerRatingChange = -12); void UpdateArenaPointsHelper(std::map& PlayerPoints); bool FinishWeek(); // returns true if arena team played this week - void FinishGame(int32 mod, const Map* bgMap); + void FinishGame(int32 mod, Map const* bgMap); void SetPreviousOpponents(uint32 arenaTeamId) { PreviousOpponents = arenaTeamId; } uint32 GetPreviousOpponents() { return PreviousOpponents; } diff --git a/src/server/game/Battlegrounds/ArenaTeamMgr.cpp b/src/server/game/Battlegrounds/ArenaTeamMgr.cpp index 4eb240b3c..b3fb4d71a 100644 --- a/src/server/game/Battlegrounds/ArenaTeamMgr.cpp +++ b/src/server/game/Battlegrounds/ArenaTeamMgr.cpp @@ -55,7 +55,7 @@ ArenaTeam* ArenaTeamMgr::GetArenaTeamById(uint32 arenaTeamId) const return nullptr; } -ArenaTeam* ArenaTeamMgr::GetArenaTeamByName(const std::string& arenaTeamName) const +ArenaTeam* ArenaTeamMgr::GetArenaTeamByName(std::string const& arenaTeamName) const { std::string search = arenaTeamName; std::transform(search.begin(), search.end(), search.begin(), ::toupper); diff --git a/src/server/game/Battlegrounds/Battleground.h b/src/server/game/Battlegrounds/Battleground.h index 3c42603c6..84b2f1f53 100644 --- a/src/server/game/Battlegrounds/Battleground.h +++ b/src/server/game/Battlegrounds/Battleground.h @@ -404,7 +404,7 @@ public: void AddSpectator(Player* p) { m_Spectators.insert(p); } void RemoveSpectator(Player* p) { m_Spectators.erase(p); } bool HaveSpectators() { return !m_Spectators.empty(); } - [[nodiscard]] const SpectatorList& GetSpectators() const { return m_Spectators; } + [[nodiscard]] SpectatorList const& GetSpectators() const { return m_Spectators; } void AddToBeTeleported(ObjectGuid spectator, ObjectGuid participant) { m_ToBeTeleported[spectator] = participant; } void RemoveToBeTeleported(ObjectGuid spectator) { ToBeTeleportedMap::iterator itr = m_ToBeTeleported.find(spectator); if (itr != m_ToBeTeleported.end()) m_ToBeTeleported.erase(itr); } void SpectatorsSendPacket(WorldPacket& data); @@ -456,7 +456,7 @@ public: virtual void FillInitialWorldStates(WorldPackets::WorldState::InitWorldStates& /*packet*/) { } void SendPacketToTeam(TeamId teamId, WorldPacket const* packet, Player* sender = nullptr, bool self = true); void SendPacketToAll(WorldPacket const* packet); - void YellToAll(Creature* creature, const char* text, uint32 language); + void YellToAll(Creature* creature, char const* text, uint32 language); void SendChatMessage(Creature* source, uint8 textId, WorldObject* target = nullptr); void SendBroadcastText(uint32 id, ChatMsg msgType, WorldObject const* target = nullptr); @@ -576,37 +576,37 @@ public: [[nodiscard]] uint8 GetUniqueBracketId() const; BattlegroundAV* ToBattlegroundAV() { if (GetBgTypeID(true) == BATTLEGROUND_AV) return reinterpret_cast(this); else return nullptr; } - [[nodiscard]] BattlegroundAV const* ToBattlegroundAV() const { if (GetBgTypeID(true) == BATTLEGROUND_AV) return reinterpret_cast(this); else return nullptr; } + [[nodiscard]] BattlegroundAV const* ToBattlegroundAV() const { if (GetBgTypeID(true) == BATTLEGROUND_AV) return reinterpret_cast(this); else return nullptr; } BattlegroundWS* ToBattlegroundWS() { if (GetBgTypeID(true) == BATTLEGROUND_WS) return reinterpret_cast(this); else return nullptr; } - [[nodiscard]] BattlegroundWS const* ToBattlegroundWS() const { if (GetBgTypeID(true) == BATTLEGROUND_WS) return reinterpret_cast(this); else return nullptr; } + [[nodiscard]] BattlegroundWS const* ToBattlegroundWS() const { if (GetBgTypeID(true) == BATTLEGROUND_WS) return reinterpret_cast(this); else return nullptr; } BattlegroundAB* ToBattlegroundAB() { if (GetBgTypeID(true) == BATTLEGROUND_AB) return reinterpret_cast(this); else return nullptr; } - [[nodiscard]] BattlegroundAB const* ToBattlegroundAB() const { if (GetBgTypeID(true) == BATTLEGROUND_AB) return reinterpret_cast(this); else return nullptr; } + [[nodiscard]] BattlegroundAB const* ToBattlegroundAB() const { if (GetBgTypeID(true) == BATTLEGROUND_AB) return reinterpret_cast(this); else return nullptr; } BattlegroundNA* ToBattlegroundNA() { if (GetBgTypeID(true) == BATTLEGROUND_NA) return reinterpret_cast(this); else return nullptr; } - [[nodiscard]] BattlegroundNA const* ToBattlegroundNA() const { if (GetBgTypeID(true) == BATTLEGROUND_NA) return reinterpret_cast(this); else return nullptr; } + [[nodiscard]] BattlegroundNA const* ToBattlegroundNA() const { if (GetBgTypeID(true) == BATTLEGROUND_NA) return reinterpret_cast(this); else return nullptr; } BattlegroundBE* ToBattlegroundBE() { if (GetBgTypeID(true) == BATTLEGROUND_BE) return reinterpret_cast(this); else return nullptr; } - [[nodiscard]] BattlegroundBE const* ToBattlegroundBE() const { if (GetBgTypeID(true) == BATTLEGROUND_BE) return reinterpret_cast(this); else return nullptr; } + [[nodiscard]] BattlegroundBE const* ToBattlegroundBE() const { if (GetBgTypeID(true) == BATTLEGROUND_BE) return reinterpret_cast(this); else return nullptr; } BattlegroundEY* ToBattlegroundEY() { if (GetBgTypeID(true) == BATTLEGROUND_EY) return reinterpret_cast(this); else return nullptr; } - [[nodiscard]] BattlegroundEY const* ToBattlegroundEY() const { if (GetBgTypeID(true) == BATTLEGROUND_EY) return reinterpret_cast(this); else return nullptr; } + [[nodiscard]] BattlegroundEY const* ToBattlegroundEY() const { if (GetBgTypeID(true) == BATTLEGROUND_EY) return reinterpret_cast(this); else return nullptr; } BattlegroundRL* ToBattlegroundRL() { if (GetBgTypeID(true) == BATTLEGROUND_RL) return reinterpret_cast(this); else return nullptr; } - [[nodiscard]] BattlegroundRL const* ToBattlegroundRL() const { if (GetBgTypeID(true) == BATTLEGROUND_RL) return reinterpret_cast(this); else return nullptr; } + [[nodiscard]] BattlegroundRL const* ToBattlegroundRL() const { if (GetBgTypeID(true) == BATTLEGROUND_RL) return reinterpret_cast(this); else return nullptr; } BattlegroundSA* ToBattlegroundSA() { if (GetBgTypeID(true) == BATTLEGROUND_SA) return reinterpret_cast(this); else return nullptr; } - [[nodiscard]] BattlegroundSA const* ToBattlegroundSA() const { if (GetBgTypeID(true) == BATTLEGROUND_SA) return reinterpret_cast(this); else return nullptr; } + [[nodiscard]] BattlegroundSA const* ToBattlegroundSA() const { if (GetBgTypeID(true) == BATTLEGROUND_SA) return reinterpret_cast(this); else return nullptr; } BattlegroundDS* ToBattlegroundDS() { if (GetBgTypeID(true) == BATTLEGROUND_DS) return reinterpret_cast(this); else return nullptr; } - [[nodiscard]] BattlegroundDS const* ToBattlegroundDS() const { if (GetBgTypeID(true) == BATTLEGROUND_DS) return reinterpret_cast(this); else return nullptr; } + [[nodiscard]] BattlegroundDS const* ToBattlegroundDS() const { if (GetBgTypeID(true) == BATTLEGROUND_DS) return reinterpret_cast(this); else return nullptr; } BattlegroundRV* ToBattlegroundRV() { if (GetBgTypeID(true) == BATTLEGROUND_RV) return reinterpret_cast(this); else return nullptr; } - [[nodiscard]] BattlegroundRV const* ToBattlegroundRV() const { if (GetBgTypeID(true) == BATTLEGROUND_RV) return reinterpret_cast(this); else return nullptr; } + [[nodiscard]] BattlegroundRV const* ToBattlegroundRV() const { if (GetBgTypeID(true) == BATTLEGROUND_RV) return reinterpret_cast(this); else return nullptr; } BattlegroundIC* ToBattlegroundIC() { if (GetBgTypeID(true) == BATTLEGROUND_IC) return reinterpret_cast(this); else return nullptr; } - [[nodiscard]] BattlegroundIC const* ToBattlegroundIC() const { if (GetBgTypeID(true) == BATTLEGROUND_IC) return reinterpret_cast(this); else return nullptr; } + [[nodiscard]] BattlegroundIC const* ToBattlegroundIC() const { if (GetBgTypeID(true) == BATTLEGROUND_IC) return reinterpret_cast(this); else return nullptr; } protected: // this method is called, when BG cannot spawn its own spirit guide, or something is wrong, It correctly ends Battleground diff --git a/src/server/game/Battlegrounds/BattlegroundMgr.cpp b/src/server/game/Battlegrounds/BattlegroundMgr.cpp index 5c2328e43..6824d4602 100644 --- a/src/server/game/Battlegrounds/BattlegroundMgr.cpp +++ b/src/server/game/Battlegrounds/BattlegroundMgr.cpp @@ -343,7 +343,7 @@ std::vector BattlegroundMgr::GetActiveBattlegrounds() for (auto const& [bgType, bgData] : bgDataStore) for (auto const& [id, bg] : bgData._Battlegrounds) if (bg->GetStatus() == STATUS_WAIT_JOIN || bg->GetStatus() == STATUS_IN_PROGRESS) - result.push_back(static_cast(bg)); + result.push_back(static_cast(bg)); return result; } diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp index da6bfb289..268c28688 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp @@ -135,7 +135,7 @@ void BattlegroundEY::UpdatePointsState() _capturePointInfo[point]._playersCount[TEAM_HORDE] = 0; } - const BattlegroundPlayerMap& bgPlayerMap = GetPlayers(); + BattlegroundPlayerMap const& bgPlayerMap = GetPlayers(); for (BattlegroundPlayerMap::const_iterator itr = bgPlayerMap.begin(); itr != bgPlayerMap.end(); ++itr) { itr->second->SendUpdateWorldState(WORLD_STATE_BATTLEGROUND_EY_PROGRESS_BAR_SHOW, BG_EY_PROGRESS_BAR_DONT_SHOW); diff --git a/src/server/game/Calendar/CalendarMgr.h b/src/server/game/Calendar/CalendarMgr.h index b33d74c32..2731613ac 100644 --- a/src/server/game/Calendar/CalendarMgr.h +++ b/src/server/game/Calendar/CalendarMgr.h @@ -171,7 +171,7 @@ public: void SetStatusTime(time_t statusTime) { _statusTime = statusTime; } time_t GetStatusTime() const { return _statusTime; } - void SetText(const std::string& text) { _text = text; } + void SetText(std::string const& text) { _text = text; } std::string GetText() const { return _text; } void SetStatus(CalendarInviteStatus status) { _status = status; } @@ -228,10 +228,10 @@ public: void SetGuildId(uint32 guildId) { _guildId = guildId; } uint32 GetGuildId() const { return _guildId; } - void SetTitle(const std::string& title) { _title = title; } + void SetTitle(std::string const& title) { _title = title; } std::string GetTitle() const { return _title; } - void SetDescription(const std::string& description) { _description = description; } + void SetDescription(std::string const& description) { _description = description; } std::string GetDescription() const { return _description; } void SetType(CalendarEventType type) { _type = type; } diff --git a/src/server/game/Chat/Channels/Channel.cpp b/src/server/game/Chat/Channels/Channel.cpp index ad7b9dfc9..723fa3458 100644 --- a/src/server/game/Chat/Channels/Channel.cpp +++ b/src/server/game/Chat/Channels/Channel.cpp @@ -1083,7 +1083,7 @@ void Channel::MakePlayerUnbanned(WorldPacket* data, ObjectGuid bad, ObjectGuid g *data << good; } -void Channel::MakePlayerNotBanned(WorldPacket* data, const std::string& name) +void Channel::MakePlayerNotBanned(WorldPacket* data, std::string const& name) { MakeNotifyPacket(data, CHAT_PLAYER_NOT_BANNED_NOTICE); *data << name; @@ -1121,13 +1121,13 @@ void Channel::MakeNotModerated(WorldPacket* data) MakeNotifyPacket(data, CHAT_NOT_MODERATED_NOTICE); } -void Channel::MakePlayerInvited(WorldPacket* data, const std::string& name) +void Channel::MakePlayerInvited(WorldPacket* data, std::string const& name) { MakeNotifyPacket(data, CHAT_PLAYER_INVITED_NOTICE); *data << name; } -void Channel::MakePlayerInviteBanned(WorldPacket* data, const std::string& name) +void Channel::MakePlayerInviteBanned(WorldPacket* data, std::string const& name) { MakeNotifyPacket(data, CHAT_PLAYER_INVITE_BANNED_NOTICE); *data << name; diff --git a/src/server/game/Chat/Channels/Channel.h b/src/server/game/Chat/Channels/Channel.h index 32e9bec91..1c4956679 100644 --- a/src/server/game/Chat/Channels/Channel.h +++ b/src/server/game/Chat/Channels/Channel.h @@ -119,7 +119,7 @@ class ChannelRights { public: ChannelRights() = default; - ChannelRights(const uint32& f, const uint32& d, std::string jm, std::string sm, std::set ml) : flags(f), speakDelay(d), joinMessage(std::move(jm)), speakMessage(std::move(sm)), moderators(std::move(ml)) {} + ChannelRights(uint32 const& f, uint32 const& d, std::string jm, std::string sm, std::set ml) : flags(f), speakDelay(d), joinMessage(std::move(jm)), speakMessage(std::move(sm)), moderators(std::move(ml)) {} uint32 flags{0}; uint32 speakDelay{0}; std::string joinMessage; diff --git a/src/server/game/Chat/Channels/ChannelMgr.cpp b/src/server/game/Chat/Channels/ChannelMgr.cpp index 8c651125a..38a81da1f 100644 --- a/src/server/game/Chat/Channels/ChannelMgr.cpp +++ b/src/server/game/Chat/Channels/ChannelMgr.cpp @@ -205,7 +205,7 @@ void ChannelMgr::LoadChannelRights() LOG_INFO("server.loading", " "); } -const ChannelRights& ChannelMgr::GetChannelRightsFor(const std::string& name) +ChannelRights const& ChannelMgr::GetChannelRightsFor(std::string const& name) { std::string nameStr = name; std::transform(nameStr.begin(), nameStr.end(), nameStr.begin(), ::tolower); @@ -215,7 +215,7 @@ const ChannelRights& ChannelMgr::GetChannelRightsFor(const std::string& name) return channelRightsEmpty; } -void ChannelMgr::SetChannelRightsFor(const std::string& name, const uint32& flags, const uint32& speakDelay, const std::string& joinmessage, const std::string& speakmessage, const std::set& moderators) +void ChannelMgr::SetChannelRightsFor(std::string const& name, uint32 const& flags, uint32 const& speakDelay, std::string const& joinmessage, std::string const& speakmessage, std::set const& moderators) { std::string nameStr = name; std::transform(nameStr.begin(), nameStr.end(), nameStr.begin(), ::tolower); diff --git a/src/server/game/Chat/Channels/ChannelMgr.h b/src/server/game/Chat/Channels/ChannelMgr.h index daf595d2f..1255e7ea8 100644 --- a/src/server/game/Chat/Channels/ChannelMgr.h +++ b/src/server/game/Chat/Channels/ChannelMgr.h @@ -43,8 +43,8 @@ public: static void LoadChannels(); static void LoadChannelRights(); - static const ChannelRights& GetChannelRightsFor(const std::string& name); - static void SetChannelRightsFor(const std::string& name, const uint32& flags, const uint32& speakDelay, const std::string& joinmessage, const std::string& speakmessage, const std::set& moderators); + static ChannelRights const& GetChannelRightsFor(std::string const& name); + static void SetChannelRightsFor(std::string const& name, uint32 const& flags, uint32 const& speakDelay, std::string const& joinmessage, std::string const& speakmessage, std::set const& moderators); static uint32 _channelIdMax; private: diff --git a/src/server/game/Chat/Chat.cpp b/src/server/game/Chat/Chat.cpp index 8781540e3..09108d84f 100644 --- a/src/server/game/Chat/Chat.cpp +++ b/src/server/game/Chat/Chat.cpp @@ -191,7 +191,7 @@ void ChatHandler::SendSysMessage(std::string_view str, bool escapeCharacters) } } -void ChatHandler::SendGlobalSysMessage(const char* str) +void ChatHandler::SendGlobalSysMessage(char const* str) { WorldPacket data; for (std::string_view line : Acore::Tokenize(str, '\n', true)) @@ -201,7 +201,7 @@ void ChatHandler::SendGlobalSysMessage(const char* str) } } -void ChatHandler::SendGlobalGMSysMessage(const char* str) +void ChatHandler::SendGlobalGMSysMessage(char const* str) { WorldPacket data; for (std::string_view line : Acore::Tokenize(str, '\n', true)) @@ -928,7 +928,7 @@ bool CliHandler::needReportToTarget(Player* /*chr*/) const return true; } -bool ChatHandler::GetPlayerGroupAndGUIDByName(const char* cname, Player*& player, Group*& group, ObjectGuid& guid, bool offline) +bool ChatHandler::GetPlayerGroupAndGUIDByName(char const* cname, Player*& player, Group*& group, ObjectGuid& guid, bool offline) { player = nullptr; guid = ObjectGuid::Empty; diff --git a/src/server/game/Chat/Chat.h b/src/server/game/Chat/Chat.h index 0992c2091..0cc1de91b 100644 --- a/src/server/game/Chat/Chat.h +++ b/src/server/game/Chat/Chat.h @@ -191,7 +191,7 @@ public: bool _ParseCommands(std::string_view text); virtual bool ParseCommands(std::string_view text); - void SendGlobalSysMessage(const char* str); + void SendGlobalSysMessage(char const* str); // function with different implementation for chat/console virtual bool IsHumanReadable() const { return true; } @@ -203,7 +203,7 @@ public: bool HasLowerSecurity(Player* target, ObjectGuid guid = ObjectGuid::Empty, bool strong = false); bool HasLowerSecurityAccount(WorldSession* target, uint32 account, bool strong = false); - void SendGlobalGMSysMessage(const char* str); + void SendGlobalGMSysMessage(char const* str); Player* getSelectedPlayer() const; Creature* getSelectedCreature() const; Unit* getSelectedUnit() const; @@ -223,7 +223,7 @@ public: uint32 extractSpellIdFromLink(char* text); ObjectGuid::LowType extractLowGuidFromLink(char* text, HighGuid& guidHigh); - bool GetPlayerGroupAndGUIDByName(const char* cname, Player*& player, Group*& group, ObjectGuid& guid, bool offline = false); + bool GetPlayerGroupAndGUIDByName(char const* cname, Player*& player, Group*& group, ObjectGuid& guid, bool offline = false); std::string extractPlayerNameFromLink(char* text); // select by arg (name/link) or in-game selection online/offline player bool extractPlayerTarget(char* args, Player** player, ObjectGuid* player_guid = nullptr, std::string* player_name = nullptr); diff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp index 32695a2e8..fdd00e8e2 100644 --- a/src/server/game/Conditions/ConditionMgr.cpp +++ b/src/server/game/Conditions/ConditionMgr.cpp @@ -217,7 +217,7 @@ bool Condition::Meets(ConditionSourceInfo& sourceInfo) if (Player* player = unit->GetCharmerOrOwnerPlayerOrPlayerItself()) { // Xinef: cannot be null, checked at loading - const Quest* quest = sObjectMgr->GetQuestTemplate(ConditionValue1); + Quest const* quest = sObjectMgr->GetQuestTemplate(ConditionValue1); condMeets = !player->IsQuestRewarded(ConditionValue1) && player->SatisfyQuestExclusiveGroup(quest, false); } } @@ -1083,7 +1083,7 @@ ConditionList ConditionMgr::GetConditionsForNpcVendorEvent(uint32 creatureId, ui return cond; } -ConditionList ConditionMgr::GetConditionsForObjectVisibility(const WorldObject* object) const +ConditionList ConditionMgr::GetConditionsForObjectVisibility(WorldObject const* object) const { ConditionList cond; @@ -1199,7 +1199,7 @@ void ConditionMgr::LoadConditions(bool isReload) } cond->ReferenceId = uint32(std::abs(iConditionTypeOrReference)); - const char* rowType = "reference template"; + char const* rowType = "reference template"; if (iSourceTypeOrReferenceId >= 0) rowType = "reference"; // check for useless data @@ -2546,7 +2546,7 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond) } case CONDITION_QUEST_OBJECTIVE_PROGRESS: { - const Quest* quest = sObjectMgr->GetQuestTemplate(cond->ConditionValue1); + Quest const* quest = sObjectMgr->GetQuestTemplate(cond->ConditionValue1); if (!quest) { LOG_ERROR("sql.sql", "CONDITION_QUEST_OBJECTIVE_PROGRESS points to non-existing quest ({}), skipped.", cond->ConditionValue1); diff --git a/src/server/game/Conditions/ConditionMgr.h b/src/server/game/Conditions/ConditionMgr.h index 5cfd108fe..ad65af59b 100644 --- a/src/server/game/Conditions/ConditionMgr.h +++ b/src/server/game/Conditions/ConditionMgr.h @@ -271,7 +271,7 @@ public: ConditionList GetConditionsForSmartEvent(int32 entryOrGuid, uint32 eventId, uint32 sourceType); ConditionList GetConditionsForVehicleSpell(uint32 creatureId, uint32 spellId); ConditionList GetConditionsForNpcVendorEvent(uint32 creatureId, uint32 itemId); - ConditionList GetConditionsForObjectVisibility(const WorldObject* object) const; + ConditionList GetConditionsForObjectVisibility(WorldObject const* object) const; private: bool isSourceTypeValid(Condition* cond); diff --git a/src/server/game/DataStores/DBCStores.cpp b/src/server/game/DataStores/DBCStores.cpp index 7aa741332..a2e58a005 100644 --- a/src/server/game/DataStores/DBCStores.cpp +++ b/src/server/game/DataStores/DBCStores.cpp @@ -201,7 +201,7 @@ typedef std::list StoreProblemList; uint32 DBCFileCount = 0; -static bool LoadDBC_assert_print(uint32 fsize, uint32 rsize, const std::string& filename) +static bool LoadDBC_assert_print(uint32 fsize, uint32 rsize, std::string const& filename) { LOG_ERROR("dbc", "Size of '{}' set by format string ({}) not equal size of C++ structure ({}).", filename, fsize, rsize); @@ -258,7 +258,7 @@ inline void LoadDBC(uint32& availableDbcLocales, StoreProblemList& errors, DBCSt } } -void LoadDBCStores(const std::string& dataPath) +void LoadDBCStores(std::string const& dataPath) { uint32 oldMSTime = getMSTime(); @@ -913,7 +913,7 @@ SkillRaceClassInfoEntry const* GetSkillRaceClassInfo(uint32 skill, uint8 race, u return nullptr; } -const std::vector& GetSkillLineAbilitiesBySkillLine(uint32 skillLine) +std::vector const& GetSkillLineAbilitiesBySkillLine(uint32 skillLine) { auto it = sSkillLineAbilityIndexBySkillLine.find(skillLine); if (it == sSkillLineAbilityIndexBySkillLine.end()) diff --git a/src/server/game/DataStores/DBCStores.h b/src/server/game/DataStores/DBCStores.h index ec8cb68bb..92b378e04 100644 --- a/src/server/game/DataStores/DBCStores.h +++ b/src/server/game/DataStores/DBCStores.h @@ -73,7 +73,7 @@ typedef std::pair > SkillLineAbilityIndexBySkillLine; -const std::vector& GetSkillLineAbilitiesBySkillLine(uint32 skillLine); +std::vector const& GetSkillLineAbilitiesBySkillLine(uint32 skillLine); extern DBCStorage sAchievementStore; extern DBCStorage sAchievementCriteriaStore; @@ -194,6 +194,6 @@ extern DBCStorage sWMOAreaTableStore; //extern DBCStorage sWorldMapAreaStore; -- use Zone2MapCoordinates and Map2ZoneCoordinates extern DBCStorage sWorldMapOverlayStore; -void LoadDBCStores(const std::string& dataPath); +void LoadDBCStores(std::string const& dataPath); #endif diff --git a/src/server/game/DungeonFinding/LFG.h b/src/server/game/DungeonFinding/LFG.h index 260f29f08..7941d7988 100644 --- a/src/server/game/DungeonFinding/LFG.h +++ b/src/server/game/DungeonFinding/LFG.h @@ -182,7 +182,7 @@ namespace lfg return 0; } - void insert(const ObjectGuid& g) + void insert(ObjectGuid const& g) { // avoid loops for performance if (!guids[0]) @@ -273,7 +273,7 @@ namespace lfg guids[4] = g; } - void force_insert_front(const ObjectGuid& g) + void force_insert_front(ObjectGuid const& g) { if (guids[3]) { @@ -294,7 +294,7 @@ namespace lfg guids[0] = g; } - void remove(const ObjectGuid& g) + void remove(ObjectGuid const& g) { // avoid loops for performance if (guids[0] == g) @@ -427,12 +427,12 @@ namespace lfg } } - [[nodiscard]] bool hasGuid(const ObjectGuid& g) const + [[nodiscard]] bool hasGuid(ObjectGuid const& g) const { return g && (guids[0] == g || guids[1] == g || guids[2] == g || guids[3] == g || guids[4] == g); } - bool operator<(const Lfg5Guids& x) const + bool operator<(Lfg5Guids const& x) const { if (guids[0] <= x.guids[0]) { @@ -474,12 +474,12 @@ namespace lfg return false; } - bool operator==(const Lfg5Guids& x) const + bool operator==(Lfg5Guids const& x) const { return guids[0] == x.guids[0] && guids[1] == x.guids[1] && guids[2] == x.guids[2] && guids[3] == x.guids[3] && guids[4] == x.guids[4]; } - void operator=(const Lfg5Guids& x) + void operator=(Lfg5Guids const& x) { guids = x.guids; delete roles; diff --git a/src/server/game/DungeonFinding/LFGMgr.cpp b/src/server/game/DungeonFinding/LFGMgr.cpp index 6651c7a01..b823c7bcb 100644 --- a/src/server/game/DungeonFinding/LFGMgr.cpp +++ b/src/server/game/DungeonFinding/LFGMgr.cpp @@ -513,7 +513,7 @@ namespace lfg else if (ar) { // Check required items - for (const ProgressionRequirement* itemRequirement : ar->items) + for (ProgressionRequirement const* itemRequirement : ar->items) { if (!itemRequirement->checkLeaderOnly || !group || group->GetLeaderGUID() == player->GetGUID()) { @@ -529,7 +529,7 @@ namespace lfg } //Check for quests - for (const ProgressionRequirement* questRequirement : ar->quests) + for (ProgressionRequirement const* questRequirement : ar->quests) { if (!questRequirement->checkLeaderOnly || !group || group->GetLeaderGUID() == player->GetGUID()) { @@ -551,7 +551,7 @@ namespace lfg } //Check if player has the required achievements - for (const ProgressionRequirement* achievementRequirement : ar->achievements) + for (ProgressionRequirement const* achievementRequirement : ar->achievements) { if (!achievementRequirement->checkLeaderOnly || !group || group->GetLeaderGUID() == player->GetGUID()) { @@ -595,7 +595,7 @@ namespace lfg @param[in] dungeons Dungeons the player/group is applying for @param[in] comment Player selected comment */ - void LFGMgr::JoinLfg(Player* player, uint8 roles, LfgDungeonSet& dungeons, const std::string& comment) + void LFGMgr::JoinLfg(Player* player, uint8 roles, LfgDungeonSet& dungeons, std::string const& comment) { if (!player || dungeons.empty()) return; @@ -919,7 +919,7 @@ namespace lfg queue.RemoveFromQueue(gguid); uint32 dungeonId = GetDungeon(gguid); SetState(gguid, LFG_STATE_NONE); - const LfgGuidSet& players = GetPlayers(gguid); + LfgGuidSet const& players = GetPlayers(gguid); for (LfgGuidSet::const_iterator it = players.begin(); it != players.end(); ++it) { SetState(*it, LFG_STATE_NONE); @@ -1318,7 +1318,7 @@ namespace lfg } } - void LFGMgr::RBPacketAppendGroup(const RBInternalInfo& info, ByteBuffer& buffer) + void LFGMgr::RBPacketAppendGroup(RBInternalInfo const& info, ByteBuffer& buffer) { buffer << info.groupGuid; uint32 flags = LFG_UPDATE_FLAG_COMMENT | LFG_UPDATE_FLAG_ROLES | LFG_UPDATE_FLAG_BINDED; @@ -1334,7 +1334,7 @@ namespace lfg buffer << (uint32)info.encounterMask; } - void LFGMgr::RBPacketAppendPlayer(const RBInternalInfo& info, ByteBuffer& buffer) + void LFGMgr::RBPacketAppendPlayer(RBInternalInfo const& info, ByteBuffer& buffer) { buffer << info.guid; uint32 flags = LFG_UPDATE_FLAG_CHARACTERINFO | LFG_UPDATE_FLAG_ROLES | LFG_UPDATE_FLAG_COMMENT | (info.groupGuid ? LFG_UPDATE_FLAG_GROUPGUID : LFG_UPDATE_FLAG_BINDED) | (info.isGroupLeader ? LFG_UPDATE_FLAG_GROUPLEADER : 0) | (!info.groupGuid || info.isGroupLeader ? LFG_UPDATE_FLAG_AREA : 0); @@ -1467,7 +1467,7 @@ namespace lfg if (GetState(gguid) == LFG_STATE_QUEUED) { SetState(gguid, LFG_STATE_NONE); - const LfgGuidSet& players = GetPlayers(gguid); + LfgGuidSet const& players = GetPlayers(gguid); for (LfgGuidSet::const_iterator it = players.begin(); it != players.end(); ++it) { SetState(*it, LFG_STATE_NONE); @@ -2315,7 +2315,7 @@ namespace lfg @param[in] guid Group guid @param[in] dungeonId Dungeonid */ - void LFGMgr::FinishDungeon(ObjectGuid gguid, const uint32 dungeonId, const Map* currMap) + void LFGMgr::FinishDungeon(ObjectGuid gguid, const uint32 dungeonId, Map const* currMap) { uint32 gDungeonId = GetDungeon(gguid); if (gDungeonId != dungeonId) @@ -2333,7 +2333,7 @@ namespace lfg SetState(gguid, LFG_STATE_FINISHED_DUNGEON); _SaveToDB(gguid); // pussywizard - const LfgGuidSet& players = GetPlayers(gguid); + LfgGuidSet const& players = GetPlayers(gguid); for (LfgGuidSet::const_iterator it = players.begin(); it != players.end(); ++it) { ObjectGuid guid = (*it); @@ -2344,7 +2344,7 @@ namespace lfg } uint32 rDungeonId = 0; - const LfgDungeonSet& dungeons = GetSelectedDungeons(guid); + LfgDungeonSet const& dungeons = GetSelectedDungeons(guid); if (!dungeons.empty()) rDungeonId = (*dungeons.begin()); @@ -2522,7 +2522,7 @@ namespace lfg return roles; } - const std::string& LFGMgr::GetComment(ObjectGuid guid) + std::string const& LFGMgr::GetComment(ObjectGuid guid) { LOG_DEBUG("lfg", "LFGMgr::GetComment: [{}] = {}", guid.ToString(), PlayersStore[guid].GetComment()); return PlayersStore[guid].GetComment(); @@ -2692,7 +2692,7 @@ namespace lfg void LFGMgr::AddPlayerQueuedForRandomDungeonToGroup(ObjectGuid gguid, ObjectGuid guid) { - const LfgDungeonSet& dungeons = GetSelectedDungeons(guid); + LfgDungeonSet const& dungeons = GetSelectedDungeons(guid); if (dungeons.empty()) return; diff --git a/src/server/game/DungeonFinding/LFGMgr.h b/src/server/game/DungeonFinding/LFGMgr.h index 358c5802a..034e92b94 100644 --- a/src/server/game/DungeonFinding/LFGMgr.h +++ b/src/server/game/DungeonFinding/LFGMgr.h @@ -446,7 +446,7 @@ namespace lfg // World.cpp /// Finish the dungeon for the given group. All check are performed using internal lfg data - void FinishDungeon(ObjectGuid gguid, uint32 dungeonId, const Map* currMap); + void FinishDungeon(ObjectGuid gguid, uint32 dungeonId, Map const* currMap); /// Loads rewards for random dungeons void LoadRewards(); /// Loads dungeons from dbc and adds teleport coords @@ -561,8 +561,8 @@ namespace lfg void UpdateRaidBrowser(uint32 diff); void LfrSetComment(Player* p, std::string comment); void SendRaidBrowserJoinedPacket(Player* p, LfgDungeonSet& dungeons, std::string comment); - void RBPacketAppendGroup(const RBInternalInfo& info, ByteBuffer& buffer); - void RBPacketAppendPlayer(const RBInternalInfo& info, ByteBuffer& buffer); + void RBPacketAppendGroup(RBInternalInfo const& info, ByteBuffer& buffer); + void RBPacketAppendPlayer(RBInternalInfo const& info, ByteBuffer& buffer); void RBPacketBuildDifference(WorldPacket& differencePacket, uint32 dungeonId, uint32 deletedCounter, ByteBuffer const& bufferDeleted, uint32 groupCounter, ByteBuffer const& bufferGroups, uint32 playerCounter, ByteBuffer const& bufferPlayers); void RBPacketBuildFull(WorldPacket& fullPacket, uint32 dungeonId, RBInternalInfoMap const& infoMap); diff --git a/src/server/game/DungeonFinding/LFGPlayerData.cpp b/src/server/game/DungeonFinding/LFGPlayerData.cpp index 8328c22c8..e617c0abf 100644 --- a/src/server/game/DungeonFinding/LFGPlayerData.cpp +++ b/src/server/game/DungeonFinding/LFGPlayerData.cpp @@ -112,7 +112,7 @@ namespace lfg return m_OldState; } - const LfgLockMap& LfgPlayerData::GetLockedDungeons() const + LfgLockMap const& LfgPlayerData::GetLockedDungeons() const { return m_LockedDungeons; } diff --git a/src/server/game/DungeonFinding/LFGPlayerData.h b/src/server/game/DungeonFinding/LFGPlayerData.h index 94d2b0801..eb8f84855 100644 --- a/src/server/game/DungeonFinding/LFGPlayerData.h +++ b/src/server/game/DungeonFinding/LFGPlayerData.h @@ -45,7 +45,7 @@ namespace lfg // Queue void SetRoles(uint8 roles); void SetComment(std::string const& comment); - void SetSelectedDungeons(const LfgDungeonSet& dungeons); + void SetSelectedDungeons(LfgDungeonSet const& dungeons); // General [[nodiscard]] LfgState GetState() const; diff --git a/src/server/game/DungeonFinding/LFGQueue.cpp b/src/server/game/DungeonFinding/LFGQueue.cpp index b45d7a0c5..8f2ced139 100644 --- a/src/server/game/DungeonFinding/LFGQueue.cpp +++ b/src/server/game/DungeonFinding/LFGQueue.cpp @@ -194,7 +194,7 @@ namespace lfg return newGroupsProcessed; } - LfgCompatibility LFGQueue::FindNewGroups(const ObjectGuid& newGuid) + LfgCompatibility LFGQueue::FindNewGroups(ObjectGuid const& newGuid) { // each combination of dps+heal+tank (tank*8 + heal+4 + dps) has a value assigned 0..15 // first 16 bits of the mask are for marking if such combination was found once, second 16 bits for marking second occurence of that combination, etc @@ -243,7 +243,7 @@ namespace lfg return selfCompatibility; } - LfgCompatibility LFGQueue::CheckCompatibility(Lfg5Guids const& checkWith, const ObjectGuid& newGuid, uint64& foundMask, uint32& foundCount, const std::set& currentCompatibles) + LfgCompatibility LFGQueue::CheckCompatibility(Lfg5Guids const& checkWith, ObjectGuid const& newGuid, uint64& foundMask, uint32& foundCount, std::set const& currentCompatibles) { LOG_DEBUG("lfg", "CHECK CheckCompatibility: {}, new guid: {}", checkWith.toString(), newGuid.ToString()); Lfg5Guids check(checkWith, false); // here newGuid is at front @@ -315,7 +315,7 @@ namespace lfg { for (uint8 i = 0; i < 5 && check.guids[i]; ++i) { - const LfgRolesMap& roles = QueueDataStore[check.guids[i]].roles; + LfgRolesMap const& roles = QueueDataStore[check.guids[i]].roles; for (LfgRolesMap::const_iterator itRoles = roles.begin(); itRoles != roles.end(); ++itRoles) { LfgRolesMap::const_iterator itPlayer; @@ -383,7 +383,7 @@ namespace lfg else { ObjectGuid gguid = check.front(); - const LfgQueueData& queue = QueueDataStore[gguid]; + LfgQueueData const& queue = QueueDataStore[gguid]; proposalDungeons = queue.dungeons; proposalRoles = queue.roles; LFGMgr::CheckGroupRoles(proposalRoles); // assing new roles diff --git a/src/server/game/DungeonFinding/LFGQueue.h b/src/server/game/DungeonFinding/LFGQueue.h index 1ce753730..7c6183582 100644 --- a/src/server/game/DungeonFinding/LFGQueue.h +++ b/src/server/game/DungeonFinding/LFGQueue.h @@ -103,8 +103,8 @@ namespace lfg uint32 FindBestCompatibleInQueue(LfgQueueDataContainer::iterator itrQueue); void UpdateBestCompatibleInQueue(LfgQueueDataContainer::iterator itrQueue, Lfg5Guids const& key); - LfgCompatibility FindNewGroups(const ObjectGuid& newGuid); - LfgCompatibility CheckCompatibility(Lfg5Guids const& checkWith, const ObjectGuid& newGuid, uint64& foundMask, uint32& foundCount, const std::set& currentCompatibles); + LfgCompatibility FindNewGroups(ObjectGuid const& newGuid); + LfgCompatibility CheckCompatibility(Lfg5Guids const& checkWith, ObjectGuid const& newGuid, uint64& foundMask, uint32& foundCount, std::set const& currentCompatibles); // Queue uint32 m_QueueStatusTimer; // used to check interval of sending queue status diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 58c4336e8..c2fd3c40b 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -474,7 +474,7 @@ void Creature::RemoveCorpse(bool setSpawnTime, bool skipVisibility) /** * change the entry of creature until respawn */ -bool Creature::InitEntry(uint32 Entry, const CreatureData* data) +bool Creature::InitEntry(uint32 Entry, CreatureData const* data) { CreatureTemplate const* normalInfo = sObjectMgr->GetCreatureTemplate(Entry); if (!normalInfo) @@ -578,7 +578,7 @@ bool Creature::InitEntry(uint32 Entry, const CreatureData* data) return true; } -bool Creature::UpdateEntry(uint32 Entry, const CreatureData* data, bool changelevel, bool updateAI) +bool Creature::UpdateEntry(uint32 Entry, CreatureData const* data, bool changelevel, bool updateAI) { if (!InitEntry(Entry, data)) return false; @@ -1148,7 +1148,7 @@ void Creature::Motion_Initialize() GetMotionMaster()->Initialize(); } -bool Creature::Create(ObjectGuid::LowType guidlow, Map* map, uint32 phaseMask, uint32 Entry, uint32 vehId, float x, float y, float z, float ang, const CreatureData* data) +bool Creature::Create(ObjectGuid::LowType guidlow, Map* map, uint32 phaseMask, uint32 Entry, uint32 vehId, float x, float y, float z, float ang, CreatureData const* data) { ASSERT(map); SetMap(map); @@ -1612,7 +1612,7 @@ float Creature::GetSpellDamageMod(int32 Rank) } } -bool Creature::CreateFromProto(ObjectGuid::LowType guidlow, uint32 Entry, uint32 vehId, const CreatureData* data) +bool Creature::CreateFromProto(ObjectGuid::LowType guidlow, uint32 Entry, uint32 vehId, CreatureData const* data) { SetZoneScript(); if (GetZoneScript() && data) diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index 6b14d82f2..a26e257a8 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -61,7 +61,7 @@ public: [[nodiscard]] bool isVendorWithIconSpeak() const; - bool Create(ObjectGuid::LowType guidlow, Map* map, uint32 phaseMask, uint32 Entry, uint32 vehId, float x, float y, float z, float ang, const CreatureData* data = nullptr); + bool Create(ObjectGuid::LowType guidlow, Map* map, uint32 phaseMask, uint32 Entry, uint32 vehId, float x, float y, float z, float ang, CreatureData const* data = nullptr); bool LoadCreaturesAddon(bool reload = false); void SelectLevel(bool changelevel = true); void LoadEquipment(int8 id = 1, bool force = false); @@ -175,7 +175,7 @@ public: void UpdateMovementFlags(); uint32 GetRandomId(uint32 id1, uint32 id2, uint32 id3); - bool UpdateEntry(uint32 entry, const CreatureData* data = nullptr, bool changelevel = true, bool updateAI = false); + bool UpdateEntry(uint32 entry, CreatureData const* data = nullptr, bool changelevel = true, bool updateAI = false); bool UpdateEntry(uint32 entry, bool updateAI) { return UpdateEntry(entry, nullptr, true, updateAI); } bool UpdateStats(Stats stat) override; bool UpdateAllStats() override; @@ -342,15 +342,15 @@ public: [[nodiscard]] bool IsNotReachableAndNeedRegen() const; void SetPosition(float x, float y, float z, float o); - void SetPosition(const Position& pos) { SetPosition(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation()); } + void SetPosition(Position const& pos) { SetPosition(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation()); } void SetHomePosition(float x, float y, float z, float o) { m_homePosition.Relocate(x, y, z, o); } - void SetHomePosition(const Position& pos) { m_homePosition.Relocate(pos); } + void SetHomePosition(Position const& pos) { m_homePosition.Relocate(pos); } void GetHomePosition(float& x, float& y, float& z, float& ori) const { m_homePosition.GetPosition(x, y, z, ori); } [[nodiscard]] Position const& GetHomePosition() const { return m_homePosition; } void SetTransportHomePosition(float x, float y, float z, float o) { m_transportHomePosition.Relocate(x, y, z, o); } - void SetTransportHomePosition(const Position& pos) { m_transportHomePosition.Relocate(pos); } + void SetTransportHomePosition(Position const& pos) { m_transportHomePosition.Relocate(pos); } void GetTransportHomePosition(float& x, float& y, float& z, float& ori) const { m_transportHomePosition.GetPosition(x, y, z, ori); } [[nodiscard]] Position const& GetTransportHomePosition() const { return m_transportHomePosition; } @@ -460,8 +460,8 @@ public: bool IsUpdateNeeded() override; protected: - bool CreateFromProto(ObjectGuid::LowType guidlow, uint32 Entry, uint32 vehId, const CreatureData* data = nullptr); - bool InitEntry(uint32 entry, const CreatureData* data = nullptr); + bool CreateFromProto(ObjectGuid::LowType guidlow, uint32 Entry, uint32 vehId, CreatureData const* data = nullptr); + bool InitEntry(uint32 entry, CreatureData const* data = nullptr); // vendor items VendorItemCounts m_vendorItemCounts; diff --git a/src/server/game/Entities/Creature/CreatureGroups.h b/src/server/game/Entities/Creature/CreatureGroups.h index a397a5b3c..5ce935319 100644 --- a/src/server/game/Entities/Creature/CreatureGroups.h +++ b/src/server/game/Entities/Creature/CreatureGroups.h @@ -102,7 +102,7 @@ public: bool IsEmpty() const { return m_members.empty(); } bool IsFormed() const { return m_Formed; } - const CreatureGroupMemberType& GetMembers() const { return m_members; } + CreatureGroupMemberType const& GetMembers() const { return m_members; } void AddMember(Creature* member); void RemoveMember(Creature* member); diff --git a/src/server/game/Entities/Creature/TemporarySummon.h b/src/server/game/Entities/Creature/TemporarySummon.h index 740779162..ed5947140 100644 --- a/src/server/game/Entities/Creature/TemporarySummon.h +++ b/src/server/game/Entities/Creature/TemporarySummon.h @@ -71,7 +71,7 @@ public: void SetVisibleBySummonerOnly(bool visibleBySummonerOnly) { _visibleBySummonerOnly = visibleBySummonerOnly; } [[nodiscard]] bool IsVisibleBySummonerOnly() const { return _visibleBySummonerOnly; } - const SummonPropertiesEntry* const m_Properties; + SummonPropertiesEntry const* const m_Properties; std::string GetDebugInfo() const override; diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index 955bd32cb..ff5984b1f 100644 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -1031,7 +1031,7 @@ void GameObject::SaveToDB(bool saveAddon /*= false*/) void GameObject::SaveToDB(uint32 mapid, uint8 spawnMask, uint32 phaseMask, bool saveAddon /*= false*/) { - const GameObjectTemplate* goI = GetGOInfo(); + GameObjectTemplate const* goI = GetGOInfo(); if (!goI) return; @@ -1431,7 +1431,7 @@ void GameObject::SetGoArtKit(uint8 kit) void GameObject::SetGoArtKit(uint8 artkit, GameObject* go, ObjectGuid::LowType lowguid) { - const GameObjectData* data = nullptr; + GameObjectData const* data = nullptr; if (go) { go->SetGoArtKit(artkit); @@ -2815,7 +2815,7 @@ void GameObject::BuildValuesUpdate(uint8 updateType, ByteBuffer* data, Player* t dynFlags |= GO_DYNFLAG_LO_SPARKLE; break; case GAMEOBJECT_TYPE_TRANSPORT: - if (const StaticTransport* t = ToStaticTransport()) + if (StaticTransport const* t = ToStaticTransport()) if (t->GetPauseTime()) { if (GetGoState() == GO_STATE_READY) @@ -2832,7 +2832,7 @@ void GameObject::BuildValuesUpdate(uint8 updateType, ByteBuffer* data, Player* t // else it's ignored break; case GAMEOBJECT_TYPE_MO_TRANSPORT: - if (const MotionTransport* t = ToMotionTransport()) + if (MotionTransport const* t = ToMotionTransport()) pathProgress = int16(float(t->GetPathProgress()) / float(t->GetPeriod()) * 65535.0f); break; default: diff --git a/src/server/game/Entities/GameObject/GameObject.h b/src/server/game/Entities/GameObject/GameObject.h index 3cae54de9..98bde1ac6 100644 --- a/src/server/game/Entities/GameObject/GameObject.h +++ b/src/server/game/Entities/GameObject/GameObject.h @@ -314,7 +314,7 @@ public: void GetRespawnPosition(float& x, float& y, float& z, float* ori = nullptr) const; void SetPosition(float x, float y, float z, float o); - void SetPosition(const Position& pos) { SetPosition(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation()); } + void SetPosition(Position const& pos) { SetPosition(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation()); } [[nodiscard]] bool IsStaticTransport() const { return GetGOInfo()->type == GAMEOBJECT_TYPE_TRANSPORT; } [[nodiscard]] bool IsMotionTransport() const { return GetGOInfo()->type == GAMEOBJECT_TYPE_MO_TRANSPORT; } diff --git a/src/server/game/Entities/Item/Item.h b/src/server/game/Entities/Item/Item.h index 51289594b..572467aa2 100644 --- a/src/server/game/Entities/Item/Item.h +++ b/src/server/game/Entities/Item/Item.h @@ -248,7 +248,7 @@ public: void DeleteRefundDataFromDB(CharacterDatabaseTransaction* trans); Bag* ToBag() { if (IsBag()) return reinterpret_cast(this); else return nullptr; } - [[nodiscard]] const Bag* ToBag() const { if (IsBag()) return reinterpret_cast(this); else return nullptr; } + [[nodiscard]] Bag const* ToBag() const { if (IsBag()) return reinterpret_cast(this); else return nullptr; } [[nodiscard]] bool IsLocked() const { return !HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_UNLOCKED); } [[nodiscard]] bool IsBag() const { return GetTemplate()->InventoryType == INVTYPE_BAG; } diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 7ff045e0b..abbae3d26 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -1298,7 +1298,7 @@ float WorldObject::GetDistance(WorldObject const* obj) const return d > 0.0f ? d : 0.0f; } -[[nodiscard]] float WorldObject::GetDistance(const Position& pos) const +[[nodiscard]] float WorldObject::GetDistance(Position const& pos) const { float d = GetExactDist(&pos) - GetObjectSize(); return d > 0.0f ? d : 0.0f; @@ -1347,7 +1347,7 @@ bool WorldObject::IsInMap(WorldObject const* obj) const return IsInDist(x, y, z, dist + GetObjectSize()); } -bool WorldObject::IsWithinDist3d(const Position* pos, float dist) const +bool WorldObject::IsWithinDist3d(Position const* pos, float dist) const { return IsInDist(pos, dist + GetObjectSize()); } @@ -1357,7 +1357,7 @@ bool WorldObject::IsWithinDist3d(const Position* pos, float dist) const return IsInDist2d(x, y, dist + GetObjectSize()); } -bool WorldObject::IsWithinDist2d(const Position* pos, float dist) const +bool WorldObject::IsWithinDist2d(Position const* pos, float dist) const { return IsInDist2d(pos, dist + GetObjectSize()); } @@ -1555,7 +1555,7 @@ bool WorldObject::isInBack(WorldObject const* target, float arc) const return !HasInArc(2 * M_PI - arc, target); } -void WorldObject::GetRandomPoint(const Position& pos, float distance, float& rand_x, float& rand_y, float& rand_z) const +void WorldObject::GetRandomPoint(Position const& pos, float distance, float& rand_x, float& rand_y, float& rand_z) const { if (!distance) { @@ -1576,7 +1576,7 @@ void WorldObject::GetRandomPoint(const Position& pos, float distance, float& ran UpdateGroundPositionZ(rand_x, rand_y, rand_z); // update to LOS height if available } -Position WorldObject::GetRandomPoint(const Position& srcPos, float distance) const +Position WorldObject::GetRandomPoint(Position const& srcPos, float distance) const { float x, y, z; GetRandomPoint(srcPos, distance, x, y, z); @@ -2441,7 +2441,7 @@ void WorldObject::ClearZoneScript() m_zoneScript = nullptr; } -TempSummon* WorldObject::SummonCreature(uint32 entry, const Position& pos, TempSummonType spwtype, uint32 duration, uint32 /*vehId*/, SummonPropertiesEntry const* properties, bool visibleBySummonerOnly /*= false*/) const +TempSummon* WorldObject::SummonCreature(uint32 entry, Position const& pos, TempSummonType spwtype, uint32 duration, uint32 /*vehId*/, SummonPropertiesEntry const* properties, bool visibleBySummonerOnly /*= false*/) const { if (Map* map = FindMap()) { diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h index 454537353..8d57e1d0d 100644 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -280,7 +280,7 @@ private: // for output helpfull error messages from asserts [[nodiscard]] bool PrintIndexError(uint32 index, bool set) const; - Object(const Object&); // prevent generation copy constructor + Object(Object const&); // prevent generation copy constructor Object& operator=(Object const&); // prevent generation assigment operator }; @@ -507,8 +507,8 @@ public: void UpdateGroundPositionZ(float x, float y, float& z) const; void UpdateAllowedPositionZ(float x, float y, float& z, float* groundZ = nullptr) const; - void GetRandomPoint(const Position& srcPos, float distance, float& rand_x, float& rand_y, float& rand_z) const; - [[nodiscard]] Position GetRandomPoint(const Position& srcPos, float distance) const; + void GetRandomPoint(Position const& srcPos, float distance, float& rand_x, float& rand_y, float& rand_z) const; + [[nodiscard]] Position GetRandomPoint(Position const& srcPos, float distance) const; [[nodiscard]] uint32 GetInstanceId() const { return m_InstanceId; } @@ -531,7 +531,7 @@ public: [[nodiscard]] virtual std::string const& GetNameForLocaleIdx(LocaleConstant /*locale_idx*/) const { return m_name; } float GetDistance(WorldObject const* obj) const; - [[nodiscard]] float GetDistance(const Position& pos) const; + [[nodiscard]] float GetDistance(Position const& pos) const; [[nodiscard]] float GetDistance(float x, float y, float z) const; float GetDistance2d(WorldObject const* obj) const; [[nodiscard]] float GetDistance2d(float x, float y) const; @@ -540,9 +540,9 @@ public: bool IsSelfOrInSameMap(WorldObject const* obj) const; bool IsInMap(WorldObject const* obj) const; [[nodiscard]] bool IsWithinDist3d(float x, float y, float z, float dist) const; - bool IsWithinDist3d(const Position* pos, float dist) const; + bool IsWithinDist3d(Position const* pos, float dist) const; [[nodiscard]] bool IsWithinDist2d(float x, float y, float dist) const; - bool IsWithinDist2d(const Position* pos, float dist) const; + bool IsWithinDist2d(Position const* pos, float dist) const; virtual bool IsWithinSightRange(Position const& pos, float dist) const; // use only if you will sure about placing both object at same map bool IsWithinDist(WorldObject const* obj, float dist2compare, bool is3D = true, bool incOwnRadius = true, bool incTargetRadius = true) const; @@ -635,7 +635,7 @@ public: void ClearZoneScript(); [[nodiscard]] ZoneScript* GetZoneScript() const { return m_zoneScript; } - TempSummon* SummonCreature(uint32 id, const Position& pos, TempSummonType spwtype = TEMPSUMMON_MANUAL_DESPAWN, uint32 despwtime = 0, uint32 vehId = 0, SummonPropertiesEntry const* properties = nullptr, bool visibleBySummonerOnly = false) const; + TempSummon* SummonCreature(uint32 id, Position const& pos, TempSummonType spwtype = TEMPSUMMON_MANUAL_DESPAWN, uint32 despwtime = 0, uint32 vehId = 0, SummonPropertiesEntry const* properties = nullptr, bool visibleBySummonerOnly = false) const; TempSummon* SummonCreature(uint32 id, float x, float y, float z, float ang = 0, TempSummonType spwtype = TEMPSUMMON_MANUAL_DESPAWN, uint32 despwtime = 0, SummonPropertiesEntry const* properties = nullptr, bool visibleBySummonerOnly = false); GameObject* SummonGameObject(uint32 entry, float x, float y, float z, float ang, float rotation0, float rotation1, float rotation2, float rotation3, uint32 respawnTime, bool checkTransport = true, GOSummonType summonType = GO_SUMMON_TIMED_OR_CORPSE_DESPAWN); Creature* SummonTrigger(float x, float y, float z, float ang, uint32 dur, bool setLevel = false, CreatureAI * (*GetAI)(Creature*) = nullptr); diff --git a/src/server/game/Entities/Object/Position.cpp b/src/server/game/Entities/Object/Position.cpp index 77f17ea54..5bf65e5e7 100644 --- a/src/server/game/Entities/Object/Position.cpp +++ b/src/server/game/Entities/Object/Position.cpp @@ -63,7 +63,7 @@ std::string Position::ToString() const return sstr.str(); } -void Position::RelocateOffset(const Position& offset) +void Position::RelocateOffset(Position const& offset) { m_positionX = GetPositionX() + (offset.GetPositionX() * std::cos(GetOrientation()) + offset.GetPositionY() * std::sin(GetOrientation() + M_PI)); m_positionY = GetPositionY() + (offset.GetPositionY() * std::cos(GetOrientation()) + offset.GetPositionX() * std::sin(GetOrientation())); @@ -71,7 +71,7 @@ void Position::RelocateOffset(const Position& offset) m_orientation = GetOrientation() + offset.GetOrientation(); } -void Position::GetPositionOffsetTo(const Position& endPos, Position& retOffset) const +void Position::GetPositionOffsetTo(Position const& endPos, Position& retOffset) const { float dx = endPos.GetPositionX() - GetPositionX(); float dy = endPos.GetPositionY() - GetPositionY(); @@ -82,7 +82,7 @@ void Position::GetPositionOffsetTo(const Position& endPos, Position& retOffset) retOffset.m_orientation = endPos.GetOrientation() - GetOrientation(); } -float Position::GetAngle(const Position* obj) const +float Position::GetAngle(Position const* obj) const { if (!obj) return 0; @@ -115,7 +115,7 @@ void Position::GetSinCos(const float x, const float y, float& vsin, float& vcos) } } -bool Position::IsWithinBox(const Position& center, float xradius, float yradius, float zradius) const +bool Position::IsWithinBox(Position const& center, float xradius, float yradius, float zradius) const { // rotate the WorldObject position instead of rotating the whole cube, that way we can make a simplified // is-in-cube check and we have to calculate only one point instead of 4 @@ -145,7 +145,7 @@ bool Position::IsWithinBox(const Position& center, float xradius, float yradius, return true; } -bool Position::HasInArc(float arc, const Position* obj, float targetRadius) const +bool Position::HasInArc(float arc, Position const* obj, float targetRadius) const { // always have self in arc if (obj == this) diff --git a/src/server/game/Entities/Object/Position.h b/src/server/game/Entities/Object/Position.h index 8ffb41928..f1e0cfab6 100644 --- a/src/server/game/Entities/Object/Position.h +++ b/src/server/game/Entities/Object/Position.h @@ -31,7 +31,7 @@ struct Position Position(Position const& loc) { Relocate(loc); } /* requried as of C++ 11 */ Position(Position&&) = default; - Position& operator=(const Position&) = default; + Position& operator=(Position const&) = default; Position& operator=(Position&&) = default; struct PositionXYStreamer @@ -95,7 +95,7 @@ struct Position m_orientation = orientation; } - void Relocate(const Position& pos) + void Relocate(Position const& pos) { m_positionX = pos.m_positionX; m_positionY = pos.m_positionY; @@ -103,7 +103,7 @@ struct Position m_orientation = pos.m_orientation; } - void Relocate(const Position* pos) + void Relocate(Position const* pos) { m_positionX = pos->m_positionX; m_positionY = pos->m_positionY; @@ -112,7 +112,7 @@ struct Position } void RelocatePolarOffset(float angle, float dist, float z = 0.0f); - void RelocateOffset(const Position& offset); + void RelocateOffset(Position const& offset); void SetOrientation(float orientation) { m_orientation = orientation; @@ -183,10 +183,10 @@ struct Position [[nodiscard]] float GetExactDist(Position const& pos) const { return GetExactDist(pos.m_positionX, pos.m_positionY, pos.m_positionZ); } float GetExactDist(Position const* pos) const { return GetExactDist(*pos); } - void GetPositionOffsetTo(const Position& endPos, Position& retOffset) const; + void GetPositionOffsetTo(Position const& endPos, Position& retOffset) const; [[nodiscard]] Position GetPositionWithOffset(Position const& offset) const; - float GetAngle(const Position* pos) const; + float GetAngle(Position const* pos) const; [[nodiscard]] float GetAngle(float x, float y) const; [[nodiscard]] float GetAbsoluteAngle(float x, float y) const { @@ -198,7 +198,7 @@ struct Position [[nodiscard]] float GetAbsoluteAngle(Position const& pos) const { return GetAbsoluteAngle(pos.m_positionX, pos.m_positionY); } [[nodiscard]] float GetAbsoluteAngle(Position const* pos) const { return GetAbsoluteAngle(*pos); } - float GetRelativeAngle(const Position* pos) const + float GetRelativeAngle(Position const* pos) const { return NormalizeOrientation(GetAngle(pos) - m_orientation); } @@ -213,7 +213,7 @@ struct Position return GetExactDist2dSq(x, y) < dist * dist; } - bool IsInDist2d(const Position* pos, float dist) const + bool IsInDist2d(Position const* pos, float dist) const { return GetExactDist2dSq(pos) < dist * dist; } @@ -223,13 +223,13 @@ struct Position return GetExactDistSq(x, y, z) < dist * dist; } - bool IsInDist(const Position* pos, float dist) const + bool IsInDist(Position const* pos, float dist) const { return GetExactDistSq(pos) < dist * dist; } - [[nodiscard]] bool IsWithinBox(const Position& center, float xradius, float yradius, float zradius) const; - bool HasInArc(float arcangle, const Position* pos, float targetRadius = 0.0f) const; + [[nodiscard]] bool IsWithinBox(Position const& center, float xradius, float yradius, float zradius) const; + bool HasInArc(float arcangle, Position const* pos, float targetRadius = 0.0f) const; bool HasInLine(Position const* pos, float width) const; bool HasInLine(Position const* pos, float objSize, float width) const; [[nodiscard]] std::string ToString() const; @@ -261,7 +261,7 @@ public: WorldLocation(uint32 mapId, Position const& position) : Position(position), m_mapId(mapId) { } - void WorldRelocate(const WorldLocation& loc) + void WorldRelocate(WorldLocation const& loc) { m_mapId = loc.GetMapId(); Relocate(loc); diff --git a/src/server/game/Entities/Object/Updates/UpdateData.cpp b/src/server/game/Entities/Object/Updates/UpdateData.cpp index 361d50d4a..55ccb7c55 100644 --- a/src/server/game/Entities/Object/Updates/UpdateData.cpp +++ b/src/server/game/Entities/Object/Updates/UpdateData.cpp @@ -33,13 +33,13 @@ void UpdateData::AddOutOfRangeGUID(ObjectGuid guid) m_outOfRangeGUIDs.push_back(guid); } -void UpdateData::AddUpdateBlock(const ByteBuffer& block) +void UpdateData::AddUpdateBlock(ByteBuffer const& block) { m_data.append(block); ++m_blockCount; } -void UpdateData::AddUpdateBlock(const UpdateData& block) +void UpdateData::AddUpdateBlock(UpdateData const& block) { m_data.append(block.m_data); m_blockCount += block.m_blockCount; diff --git a/src/server/game/Entities/Object/Updates/UpdateData.h b/src/server/game/Entities/Object/Updates/UpdateData.h index dbf54b720..7d4471eab 100644 --- a/src/server/game/Entities/Object/Updates/UpdateData.h +++ b/src/server/game/Entities/Object/Updates/UpdateData.h @@ -54,8 +54,8 @@ public: UpdateData(); void AddOutOfRangeGUID(ObjectGuid guid); - void AddUpdateBlock(const ByteBuffer& block); - void AddUpdateBlock(const UpdateData& block); + void AddUpdateBlock(ByteBuffer const& block); + void AddUpdateBlock(UpdateData const& block); bool BuildPacket(WorldPacket& packet); [[nodiscard]] bool HasData() const { return m_blockCount > 0 || !m_outOfRangeGUIDs.empty(); } void Clear(); diff --git a/src/server/game/Entities/Player/KillRewarder.cpp b/src/server/game/Entities/Player/KillRewarder.cpp index 5a32ec4b0..c84037953 100644 --- a/src/server/game/Entities/Player/KillRewarder.cpp +++ b/src/server/game/Entities/Player/KillRewarder.cpp @@ -134,7 +134,7 @@ void KillRewarder::_InitXP(Player* player) if (_xp && !_isBattleGround && _victim) // pussywizard: npcs with relatively low hp give lower exp if (_victim->IsCreature()) - if (const CreatureTemplate* ct = _victim->ToCreature()->GetCreatureTemplate()) + if (CreatureTemplate const* ct = _victim->ToCreature()->GetCreatureTemplate()) if (ct->ModHealth <= 0.75f && ct->ModHealth >= 0.0f) _xp = uint32(_xp * ct->ModHealth); } diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 47d095b17..49ab2e722 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -2325,7 +2325,7 @@ void Player::UninviteFromGroup() } } -void Player::RemoveFromGroup(Group* group, ObjectGuid guid, RemoveMethod method /* = GROUP_REMOVEMETHOD_DEFAULT*/, ObjectGuid kicker /* = ObjectGuid::Empty */, const char* reason /* = nullptr */) +void Player::RemoveFromGroup(Group* group, ObjectGuid guid, RemoveMethod method /* = GROUP_REMOVEMETHOD_DEFAULT*/, ObjectGuid kicker /* = ObjectGuid::Empty */, char const* reason /* = nullptr */) { if (group) { @@ -11397,7 +11397,7 @@ void Player::SetEntryPoint() if (GetMap()->IsDungeon()) { - if (const GraveyardStruct* entry = sGraveyard->GetClosestGraveyard(this, GetTeamId())) + if (GraveyardStruct const* entry = sGraveyard->GetClosestGraveyard(this, GetTeamId())) m_entryPointData.joinPos = WorldLocation(entry->Map, entry->x, entry->y, entry->z, 0.0f); } else if (!GetMap()->IsBattlegroundOrArena()) @@ -14259,7 +14259,7 @@ void Player::LearnTalent(uint32 talentId, uint32 talentRank, bool command /*= fa uint32 spentPoints = 0; if (talentInfo->Row > 0) { - const PlayerTalentMap& talentMap = GetTalentMap(); + PlayerTalentMap const& talentMap = GetTalentMap(); for (PlayerTalentMap::const_iterator itr = talentMap.begin(); itr != talentMap.end(); ++itr) if (TalentSpellPos const* talentPos = GetTalentSpellPos(itr->first)) if (TalentEntry const* itrTalentInfo = sTalentStore.LookupEntry(talentPos->talent_id)) @@ -14401,7 +14401,7 @@ void Player::LearnPetTalent(ObjectGuid petGuid, uint32 talentId, uint32 talentRa for (uint32 i = 0; i < numRows; ++i) // Loop through all talents. { // Someday, someone needs to revamp - const TalentEntry* tmpTalent = sTalentStore.LookupEntry(i); + TalentEntry const* tmpTalent = sTalentStore.LookupEntry(i); if (tmpTalent) // the way talents are tracked { if (tmpTalent->TalentTab == tTab) @@ -14655,7 +14655,7 @@ void Player::BuildPlayerTalentsInfoData(WorldPacket* data) std::size_t pos = data->wpos(); *data << uint8(talentIdCount); // [PH], talentIdCount - const PlayerTalentMap& talentMap = GetTalentMap(); + PlayerTalentMap const& talentMap = GetTalentMap(); for (PlayerTalentMap::const_iterator itr = talentMap.begin(); itr != talentMap.end(); ++itr) if (TalentSpellPos const* talentPos = GetTalentSpellPos(itr->first)) if (itr->second->State != PLAYERSPELL_REMOVED && itr->second->IsInSpec(specIdx)) // pussywizard @@ -15616,7 +15616,7 @@ void Player::LoadActions(PreparedQueryResult result) void Player::GetTalentTreePoints(uint8 (&specPoints)[3]) const { - const PlayerTalentMap& talentMap = GetTalentMap(); + PlayerTalentMap const& talentMap = GetTalentMap(); for (PlayerTalentMap::const_iterator itr = talentMap.begin(); itr != talentMap.end(); ++itr) if (itr->second->State != PLAYERSPELL_REMOVED && itr->second->IsInSpec(GetActiveSpec())) if (TalentEntry const* talentInfo = sTalentStore.LookupEntry(itr->second->talentID)) @@ -15638,7 +15638,7 @@ void Player::GetTalentTreePoints(uint8 (&specPoints)[3]) const uint8 Player::GetMostPointsTalentTree() const { uint32 specPoints[3] = {0, 0, 0}; - const PlayerTalentMap& talentMap = GetTalentMap(); + PlayerTalentMap const& talentMap = GetTalentMap(); for (PlayerTalentMap::const_iterator itr = talentMap.begin(); itr != talentMap.end(); ++itr) if (itr->second->State != PLAYERSPELL_REMOVED && itr->second->IsInSpec(GetActiveSpec())) if (TalentEntry const* talentInfo = sTalentStore.LookupEntry(itr->second->talentID)) diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 140fee652..c4da190fb 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1453,7 +1453,7 @@ public: bool CanSeeStartQuest(Quest const* quest); bool CanTakeQuest(Quest const* quest, bool msg); bool CanAddQuest(Quest const* quest, bool msg); - bool CanCompleteQuest(uint32 quest_id, const QuestStatusData* q_savedStatus = nullptr); + bool CanCompleteQuest(uint32 quest_id, QuestStatusData const* q_savedStatus = nullptr); bool CanCompleteRepeatableQuest(Quest const* quest); bool CanRewardQuest(Quest const* quest, bool msg); bool CanRewardQuest(Quest const* quest, uint32 reward, bool msg); @@ -1911,7 +1911,7 @@ public: bool IsInSameGroupWith(Player const* p) const; bool IsInSameRaidWith(Player const* p) const { return p == this || (GetGroup() != nullptr && GetGroup() == p->GetGroup()); } void UninviteFromGroup(); - static void RemoveFromGroup(Group* group, ObjectGuid guid, RemoveMethod method = GROUP_REMOVEMETHOD_DEFAULT, ObjectGuid kicker = ObjectGuid::Empty, const char* reason = nullptr); + static void RemoveFromGroup(Group* group, ObjectGuid guid, RemoveMethod method = GROUP_REMOVEMETHOD_DEFAULT, ObjectGuid kicker = ObjectGuid::Empty, char const* reason = nullptr); void RemoveFromGroup(RemoveMethod method = GROUP_REMOVEMETHOD_DEFAULT) { RemoveFromGroup(GetGroup(), GetGUID(), method); } void SendUpdateToOutOfRangeGroupMembers(); @@ -2050,7 +2050,7 @@ public: void SendResetFailedNotify(uint32 mapid); bool UpdatePosition(float x, float y, float z, float orientation, bool teleport = false) override; - bool UpdatePosition(const Position& pos, bool teleport = false) { return UpdatePosition(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation(), teleport); } + bool UpdatePosition(Position const& pos, bool teleport = false) { return UpdatePosition(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation(), teleport); } void ProcessTerrainStatusUpdate() override; @@ -2487,9 +2487,9 @@ public: [[nodiscard]] uint32 GetPendingBind() const { return _pendingBindId; } void SendRaidInfo(); void SendSavedInstances(); - void PrettyPrintRequirementsQuestList(const std::vector& missingQuests) const; - void PrettyPrintRequirementsAchievementsList(const std::vector& missingAchievements) const; - void PrettyPrintRequirementsItemsList(const std::vector& missingItems) const; + void PrettyPrintRequirementsQuestList(std::vector const& missingQuests) const; + void PrettyPrintRequirementsAchievementsList(std::vector const& missingAchievements) const; + void PrettyPrintRequirementsItemsList(std::vector const& missingItems) const; bool Satisfy(DungeonProgressionRequirements const* ar, uint32 target_map, bool report = false); bool CheckInstanceLoginValid(); [[nodiscard]] bool CheckInstanceCount(uint32 instanceId) const; @@ -2513,7 +2513,7 @@ public: Group* GetGroupInvite() { return m_groupInvite; } void SetGroupInvite(Group* group) { m_groupInvite = group; } Group* GetGroup() { return m_group.getTarget(); } - [[nodiscard]] const Group* GetGroup() const { return (const Group*)m_group.getTarget(); } + [[nodiscard]] Group const* GetGroup() const { return (Group const*)m_group.getTarget(); } GroupReference& GetGroupRef() { return m_group; } void SetGroup(Group* group, int8 subgroup = -1); [[nodiscard]] uint8 GetSubGroup() const { return m_group.getSubGroup(); } @@ -2654,7 +2654,7 @@ public: [[nodiscard]] float GetRealParry() const { return m_realParry; } [[nodiscard]] float GetRealDodge() const { return m_realDodge; } // mt maps - [[nodiscard]] const PlayerTalentMap& GetTalentMap() const { return m_talents; } + [[nodiscard]] PlayerTalentMap const& GetTalentMap() const { return m_talents; } [[nodiscard]] uint32 GetNextSave() const { return m_nextSave; } [[nodiscard]] SpellModContainer const& GetSpellModList(uint32 type) const { return m_spellMods[type]; } @@ -2698,7 +2698,7 @@ protected: public: std::deque SpellQueue; - const PendingSpellCastRequest* GetCastRequest(uint32 category) const; + PendingSpellCastRequest const* GetCastRequest(uint32 category) const; bool CanExecutePendingSpellCastRequest(SpellInfo const* spellInfo); void ExecuteOrCancelSpellCastRequest(PendingSpellCastRequest* castRequest, bool isCancel = false); bool CanRequestSpellCast(SpellInfo const* spellInfo); diff --git a/src/server/game/Entities/Player/PlayerQuest.cpp b/src/server/game/Entities/Player/PlayerQuest.cpp index 57735685e..58476621b 100644 --- a/src/server/game/Entities/Player/PlayerQuest.cpp +++ b/src/server/game/Entities/Player/PlayerQuest.cpp @@ -288,7 +288,7 @@ bool Player::CanAddQuest(Quest const* quest, bool msg) return true; } -bool Player::CanCompleteQuest(uint32 quest_id, const QuestStatusData* q_savedStatus) +bool Player::CanCompleteQuest(uint32 quest_id, QuestStatusData const* q_savedStatus) { if (quest_id) { @@ -2442,7 +2442,7 @@ void Player::SendCanTakeQuestResponse(QuestFailedReason msg) const LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTGIVER_QUEST_INVALID"); } -void Player::SendQuestConfirmAccept(const Quest* quest, Player* pReceiver) +void Player::SendQuestConfirmAccept(Quest const* quest, Player* pReceiver) { if (pReceiver) { @@ -2451,7 +2451,7 @@ void Player::SendQuestConfirmAccept(const Quest* quest, Player* pReceiver) int loc_idx = pReceiver->GetSession()->GetSessionDbLocaleIndex(); if (loc_idx >= 0) - if (const QuestLocale* pLocale = sObjectMgr->GetQuestLocale(quest->GetQuestId())) + if (QuestLocale const* pLocale = sObjectMgr->GetQuestLocale(quest->GetQuestId())) ObjectMgr::GetLocaleString(pLocale->Title, loc_idx, strTitle); WorldPackets::Quest::QuestConfirmAccept questConfirmAccept; diff --git a/src/server/game/Entities/Player/PlayerStorage.cpp b/src/server/game/Entities/Player/PlayerStorage.cpp index 308f502a7..2c4ddf10c 100644 --- a/src/server/game/Entities/Player/PlayerStorage.cpp +++ b/src/server/game/Entities/Player/PlayerStorage.cpp @@ -5211,7 +5211,7 @@ bool Player::LoadFromDB(ObjectGuid playerGuid, CharacterDatabaseQueryHolder cons ResurrectPlayer(1.0f); } - const WorldLocation& _loc = GetEntryPoint(); + WorldLocation const& _loc = GetEntryPoint(); mapId = _loc.GetMapId(); instanceId = 0; @@ -5703,7 +5703,7 @@ bool Player::isAllowedToLoot(Creature const* creature) if (HasPendingBind()) return false; - const Loot* loot = &creature->loot; + Loot const* loot = &creature->loot; if (loot->isLooted()) // nothing to loot or everything looted. return false; @@ -6706,10 +6706,10 @@ void Player::SendSavedInstances() } } -void Player::PrettyPrintRequirementsQuestList(const std::vector& missingQuests) const +void Player::PrettyPrintRequirementsQuestList(std::vector const& missingQuests) const { LocaleConstant loc_idx = GetSession()->GetSessionDbLocaleIndex(); - for (const ProgressionRequirement* missingReq : missingQuests) + for (ProgressionRequirement const* missingReq : missingQuests) { Quest const* questTemplate = sObjectMgr->GetQuestTemplate(missingReq->id); if (!questTemplate) @@ -6743,10 +6743,10 @@ void Player::PrettyPrintRequirementsQuestList(const std::vector& missingAchievements) const +void Player::PrettyPrintRequirementsAchievementsList(std::vector const& missingAchievements) const { LocaleConstant loc_idx = GetSession()->GetSessionDbLocaleIndex(); - for (const ProgressionRequirement* missingReq : missingAchievements) + for (ProgressionRequirement const* missingReq : missingAchievements) { AchievementEntry const* achievementEntry = sAchievementStore.LookupEntry(missingReq->id); if (!achievementEntry) @@ -6776,10 +6776,10 @@ void Player::PrettyPrintRequirementsAchievementsList(const std::vector& missingItems) const +void Player::PrettyPrintRequirementsItemsList(std::vector const& missingItems) const { LocaleConstant loc_idx = GetSession()->GetSessionDbLocaleIndex(); - for (const ProgressionRequirement* missingReq : missingItems) + for (ProgressionRequirement const* missingReq : missingItems) { ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(missingReq->id); if (!itemTemplate) @@ -6855,12 +6855,12 @@ bool Player::Satisfy(DungeonProgressionRequirements const* ar, uint32 target_map } //Check all items - std::vector missingPlayerItems; - std::vector missingLeaderItems; - for (const ProgressionRequirement* itemRequirement : ar->items) + std::vector missingPlayerItems; + std::vector missingLeaderItems; + for (ProgressionRequirement const* itemRequirement : ar->items) { Player* checkPlayer = this; - std::vector* missingItems = &missingPlayerItems; + std::vector* missingItems = &missingPlayerItems; if (itemRequirement->checkLeaderOnly) { checkPlayer = partyLeader; @@ -6877,12 +6877,12 @@ bool Player::Satisfy(DungeonProgressionRequirements const* ar, uint32 target_map } //Check all achievements - std::vector missingPlayerAchievements; - std::vector missingLeaderAchievements; - for (const ProgressionRequirement* achievementRequirement : ar->achievements) + std::vector missingPlayerAchievements; + std::vector missingLeaderAchievements; + for (ProgressionRequirement const* achievementRequirement : ar->achievements) { Player* checkPlayer = this; - std::vector* missingAchievements = &missingPlayerAchievements; + std::vector* missingAchievements = &missingPlayerAchievements; if (achievementRequirement->checkLeaderOnly) { checkPlayer = partyLeader; @@ -6899,12 +6899,12 @@ bool Player::Satisfy(DungeonProgressionRequirements const* ar, uint32 target_map } //Check all quests - std::vector missingPlayerQuests; - std::vector missingLeaderQuests; - for (const ProgressionRequirement* questRequirement : ar->quests) + std::vector missingPlayerQuests; + std::vector missingLeaderQuests; + for (ProgressionRequirement const* questRequirement : ar->quests) { Player* checkPlayer = this; - std::vector* missingQuests = &missingPlayerQuests; + std::vector* missingQuests = &missingPlayerQuests; if (questRequirement->checkLeaderOnly) { checkPlayer = partyLeader; diff --git a/src/server/game/Entities/Player/PlayerTaxi.cpp b/src/server/game/Entities/Player/PlayerTaxi.cpp index 29afc666e..6cf62c95d 100644 --- a/src/server/game/Entities/Player/PlayerTaxi.cpp +++ b/src/server/game/Entities/Player/PlayerTaxi.cpp @@ -127,7 +127,7 @@ void PlayerTaxi::AppendTaximaskTo(ByteBuffer& data, bool all) } } -bool PlayerTaxi::LoadTaxiDestinationsFromString(const std::string& values, TeamId teamId) +bool PlayerTaxi::LoadTaxiDestinationsFromString(std::string const& values, TeamId teamId) { ClearTaxiDestinations(); diff --git a/src/server/game/Entities/Player/PlayerUpdates.cpp b/src/server/game/Entities/Player/PlayerUpdates.cpp index c9265d3a4..1ba0916f2 100644 --- a/src/server/game/Entities/Player/PlayerUpdates.cpp +++ b/src/server/game/Entities/Player/PlayerUpdates.cpp @@ -2323,9 +2323,9 @@ bool Player::CanExecutePendingSpellCastRequest(SpellInfo const* spellInfo) return true; } -const PendingSpellCastRequest* Player::GetCastRequest(uint32 category) const +PendingSpellCastRequest const* Player::GetCastRequest(uint32 category) const { - for (const PendingSpellCastRequest& request : SpellQueue) + for (PendingSpellCastRequest const& request : SpellQueue) if (request.category == category) return &request; return nullptr; diff --git a/src/server/game/Entities/Unit/CharmInfo.cpp b/src/server/game/Entities/Unit/CharmInfo.cpp index da08245c4..63b9b97fe 100644 --- a/src/server/game/Entities/Unit/CharmInfo.cpp +++ b/src/server/game/Entities/Unit/CharmInfo.cpp @@ -246,7 +246,7 @@ void CharmInfo::SetPetNumber(uint32 petnumber, bool statwindow) _unit->SetUInt32Value(UNIT_FIELD_PETNUMBER, 0); } -void CharmInfo::LoadPetActionBar(const std::string& data) +void CharmInfo::LoadPetActionBar(std::string const& data) { std::vector tokens = Acore::Tokenize(data, ' ', false); diff --git a/src/server/game/Entities/Unit/CharmInfo.h b/src/server/game/Entities/Unit/CharmInfo.h index 10b86eb26..e6cbce754 100644 --- a/src/server/game/Entities/Unit/CharmInfo.h +++ b/src/server/game/Entities/Unit/CharmInfo.h @@ -144,7 +144,7 @@ public: //return true if successful bool AddSpellToActionBar(SpellInfo const* spellInfo, ActiveStates newstate = ACT_DECIDE, uint32 index = MAX_UNIT_ACTION_BAR_INDEX + 1); bool RemoveSpellFromActionBar(uint32 spell_id); - void LoadPetActionBar(const std::string& data); + void LoadPetActionBar(std::string const& data); void BuildActionBar(WorldPacket* data); void SetSpellAutocast(SpellInfo const* spellInfo, bool state); void SetActionBar(uint8 index, uint32 spellOrAction, ActiveStates type) diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 0b04c04aa..614632961 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -816,7 +816,7 @@ bool Unit::IsWithinRange(Unit const* obj, float dist) const return distsq <= dist * dist; } -bool Unit::IsWithinBoundaryRadius(const Unit* obj) const +bool Unit::IsWithinBoundaryRadius(Unit const* obj) const { if (!obj || !IsInMap(obj) || !InSamePhase(obj)) return false; @@ -5231,7 +5231,7 @@ void Unit::RemoveAurasDueToSpellByDispel(uint32 spellId, uint32 dispellerSpellId { noxious->SetDuration(aura->GetDuration() * aureff->GetAmount() / 100); if (aura->GetUnitOwner()) - if (const std::vector* spell_triggered = sSpellMgr->GetSpellLinked(-int32(aura->GetId()))) + if (std::vector const* spell_triggered = sSpellMgr->GetSpellLinked(-int32(aura->GetId()))) for (std::vector::const_iterator itr = spell_triggered->begin(); itr != spell_triggered->end(); ++itr) aura->GetUnitOwner()->RemoveAurasDueToSpell(*itr); } @@ -14442,7 +14442,7 @@ void Unit::SetRooted(bool apply, bool stun, bool logout) void Unit::SendMoveRoot(bool apply) { - const Player* client = GetClientControlling(); + Player const* client = GetClientControlling(); // Apply flags in-place when unit currently is not controlled by a player if (!client) @@ -14461,7 +14461,7 @@ void Unit::SendMoveRoot(bool apply) if (!IsInWorld()) return; - const PackedGuid& guid = GetPackGUID(); + PackedGuid const& guid = GetPackGUID(); // Wrath+ spline root: when unit is currently not controlled by a player if (!client) { diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index b589fdd13..fd01e4909 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -730,7 +730,7 @@ public: Pet* ToPet() { if (IsPet()) return reinterpret_cast(this); else return nullptr; } Totem* ToTotem() { if (IsTotem()) return reinterpret_cast(this); else return nullptr; } TempSummon* ToTempSummon() { if (IsSummon()) return reinterpret_cast(this); else return nullptr; } - [[nodiscard]] const TempSummon* ToTempSummon() const { if (IsSummon()) return reinterpret_cast(this); else return nullptr; } + [[nodiscard]] TempSummon const* ToTempSummon() const { if (IsSummon()) return reinterpret_cast(this); else return nullptr; } // Unit state void AddUnitState(uint32 f) { m_state |= f; } @@ -878,7 +878,7 @@ public: [[nodiscard]] float GetCombatReach() const override { return m_floatValues[UNIT_FIELD_COMBATREACH]; } [[nodiscard]] float GetMeleeReach() const { float reach = m_floatValues[UNIT_FIELD_COMBATREACH]; return reach > MIN_MELEE_REACH ? reach : MIN_MELEE_REACH; } [[nodiscard]] bool IsWithinRange(Unit const* obj, float dist) const; - bool IsWithinBoundaryRadius(const Unit* obj) const; + bool IsWithinBoundaryRadius(Unit const* obj) const; bool IsWithinCombatRange(Unit const* obj, float dist2compare) const; bool IsWithinMeleeRange(Unit const* obj, float dist = 0.f) const; float GetMeleeRange(Unit const* target) const; @@ -1524,7 +1524,7 @@ public: [[nodiscard]] int32 GetTotalAuraModifierByMiscMask(AuraType auratype, uint32 misc_mask) const; [[nodiscard]] float GetTotalAuraMultiplierByMiscMask(AuraType auratype, uint32 misc_mask) const; - [[nodiscard]] int32 GetMaxPositiveAuraModifierByMiscMask(AuraType auratype, uint32 misc_mask, const AuraEffect* except = nullptr) const; + [[nodiscard]] int32 GetMaxPositiveAuraModifierByMiscMask(AuraType auratype, uint32 misc_mask, AuraEffect const* except = nullptr) const; [[nodiscard]] int32 GetMaxNegativeAuraModifierByMiscMask(AuraType auratype, uint32 misc_mask) const; [[nodiscard]] int32 GetTotalAuraModifierByMiscValue(AuraType auratype, int32 misc_value) const; @@ -1754,7 +1754,7 @@ public: void SetHover(bool enable); MotionMaster* GetMotionMaster() { return i_motionMaster; } - [[nodiscard]] const MotionMaster* GetMotionMaster() const { return i_motionMaster; } + [[nodiscard]] MotionMaster const* GetMotionMaster() const { return i_motionMaster; } [[nodiscard]] virtual MovementGeneratorType GetDefaultMovementType() const; [[nodiscard]] bool IsStopped() const { return !(HasUnitState(UNIT_STATE_MOVING)); } @@ -2002,7 +2002,7 @@ public: void UpdateHeight(float newZ); virtual bool UpdatePosition(float x, float y, float z, float ang, bool teleport = false); - bool UpdatePosition(const Position& pos, bool teleport = false) { return UpdatePosition(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation(), teleport); } + bool UpdatePosition(Position const& pos, bool teleport = false) { return UpdatePosition(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation(), teleport); } void ProcessPositionDataChanged(PositionFullTerrainStatus const& data) override; virtual void ProcessTerrainStatusUpdate(); diff --git a/src/server/game/Entities/Unit/UnitUtils.h b/src/server/game/Entities/Unit/UnitUtils.h index e86342660..3d9184bc2 100644 --- a/src/server/game/Entities/Unit/UnitUtils.h +++ b/src/server/game/Entities/Unit/UnitUtils.h @@ -19,22 +19,22 @@ class MMapTargetData { public: MMapTargetData() = default; - MMapTargetData(uint32 endTime, const Position* o, const Position* t) + MMapTargetData(uint32 endTime, Position const* o, Position const* t) { _endTime = endTime; _posOwner.Relocate(o); _posTarget.Relocate(t); } - MMapTargetData(const MMapTargetData& c) + MMapTargetData(MMapTargetData const& c) { _endTime = c._endTime; _posOwner.Relocate(c._posOwner); _posTarget.Relocate(c._posTarget); } MMapTargetData(MMapTargetData&&) = default; - MMapTargetData& operator=(const MMapTargetData&) = default; + MMapTargetData& operator=(MMapTargetData const&) = default; MMapTargetData& operator=(MMapTargetData&&) = default; - [[nodiscard]] bool PosChanged(const Position& o, const Position& t) const + [[nodiscard]] bool PosChanged(Position const& o, Position const& t) const { return _posOwner.GetExactDistSq(&o) > 0.5f * 0.5f || _posTarget.GetExactDistSq(&t) > 0.5f * 0.5f; } @@ -47,7 +47,7 @@ class SafeUnitPointer { public: explicit SafeUnitPointer(Unit* defVal) : ptr(defVal), defaultValue(defVal) {} - SafeUnitPointer(const SafeUnitPointer& /*p*/) { ABORT(); } + SafeUnitPointer(SafeUnitPointer const& /*p*/) { ABORT(); } void Initialize(Unit* defVal) { defaultValue = defVal; ptr = defVal; } ~SafeUnitPointer(); void SetPointedTo(Unit* u); diff --git a/src/server/game/Events/HolidayDateCalculator.cpp b/src/server/game/Events/HolidayDateCalculator.cpp index 367fd7056..ae29d5804 100644 --- a/src/server/game/Events/HolidayDateCalculator.cpp +++ b/src/server/game/Events/HolidayDateCalculator.cpp @@ -143,7 +143,7 @@ static const std::vector HolidayRules = { { HOLIDAY_DARKMOON_FAIRE_SHATTRATH, HolidayCalculationType::DARKMOON_FAIRE, 2, 0, 0, -2 } // Feb, May, Aug, Nov }; -const std::vector& HolidayDateCalculator::GetHolidayRules() +std::vector const& HolidayDateCalculator::GetHolidayRules() { return HolidayRules; } @@ -479,7 +479,7 @@ std::tm HolidayDateCalculator::CalculateWinterSolstice(int year) return result; } -std::tm HolidayDateCalculator::CalculateHolidayDate(const HolidayRule& rule, int year) +std::tm HolidayDateCalculator::CalculateHolidayDate(HolidayRule const& rule, int year) { std::tm result = {}; @@ -572,7 +572,7 @@ std::tm HolidayDateCalculator::CalculateHolidayDate(const HolidayRule& rule, int return result; } -uint32_t HolidayDateCalculator::PackDate(const std::tm& date) +uint32_t HolidayDateCalculator::PackDate(std::tm const& date) { // WoW packed date format (same as ByteBuffer::AppendPackedTime): // bits 24-28: year offset from 2000 (5 bits = 0-31, valid years 2000-2031) @@ -648,7 +648,7 @@ std::vector HolidayDateCalculator::GetDarkmoonFaireDates(int locationO return dates; } -time_t HolidayDateCalculator::FindStartTimeForStage(const uint32_t* packedDates, uint8_t numDates, +time_t HolidayDateCalculator::FindStartTimeForStage(uint32_t const* packedDates, uint8_t numDates, time_t stageOffset, uint32_t stageLengthMinutes, time_t curTime) { for (uint8_t i = 0; i < numDates && packedDates[i]; ++i) diff --git a/src/server/game/Events/HolidayDateCalculator.h b/src/server/game/Events/HolidayDateCalculator.h index 50b9eb909..62017f1f9 100644 --- a/src/server/game/Events/HolidayDateCalculator.h +++ b/src/server/game/Events/HolidayDateCalculator.h @@ -80,16 +80,16 @@ public: static std::tm CalculateWinterSolstice(int year); // Calculate holiday start date for a given year - static std::tm CalculateHolidayDate(const HolidayRule& rule, int year); + static std::tm CalculateHolidayDate(HolidayRule const& rule, int year); // Convert std::tm to WoW's packed date format - static uint32_t PackDate(const std::tm& date); + static uint32_t PackDate(std::tm const& date); // Convert WoW's packed date format to std::tm static std::tm UnpackDate(uint32_t packed); // Get all holiday rules - static const std::vector& GetHolidayRules(); + static std::vector const& GetHolidayRules(); // Calculate date for a specific holiday ID and year static uint32_t GetPackedHolidayDate(uint32_t holidayId, int year); @@ -104,7 +104,7 @@ public: // For multi-stage holidays, stageOffset is the cumulative duration (in seconds) of all prior stages. // stageLengthMinutes is the duration of the current stage in minutes. // Returns the computed stage start time (startTime + stageOffset), or 0 if no valid date found. - static time_t FindStartTimeForStage(const uint32_t* packedDates, uint8_t numDates, + static time_t FindStartTimeForStage(uint32_t const* packedDates, uint8_t numDates, time_t stageOffset, uint32_t stageLengthMinutes, time_t curTime); // Start time for a looping holiday event (Battleground Call to Arms): rolls the packed anchor diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 849ee2627..f9c76d214 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -1381,7 +1381,7 @@ void ObjectMgr::LoadGameObjectAddons() ObjectGuid::LowType guid = fields[0].Get(); - const GameObjectData* goData = GetGameObjectData(guid); + GameObjectData const* goData = GetGameObjectData(guid); if (!goData) { LOG_ERROR("sql.sql", "GameObject (GUID: {}) does not exist but has a record in `gameobject_addon`", guid); @@ -1656,7 +1656,7 @@ CreatureModel const* ObjectMgr::ChooseDisplayId(CreatureTemplate const* cinfo, C return cinfo->GetFirstInvisibleModel(); } -void ObjectMgr::ChooseCreatureFlags(const CreatureTemplate* cinfo, uint32& npcflag, uint32& unit_flags, uint32& dynamicflags, const CreatureData* data /*= nullptr*/) +void ObjectMgr::ChooseCreatureFlags(CreatureTemplate const* cinfo, uint32& npcflag, uint32& unit_flags, uint32& dynamicflags, CreatureData const* data /*= nullptr*/) { npcflag = cinfo->npcflag; unit_flags = cinfo->unit_flags; @@ -1947,7 +1947,7 @@ void ObjectMgr::LoadLinkedRespawn() { case CREATURE_TO_CREATURE: { - const CreatureData* slave = GetCreatureData(guidLow); + CreatureData const* slave = GetCreatureData(guidLow); if (!slave) { LOG_ERROR("sql.sql", "LinkedRespawn: Creature (guid) {} not found in creature table", guidLow); @@ -1955,7 +1955,7 @@ void ObjectMgr::LoadLinkedRespawn() break; } - const CreatureData* master = GetCreatureData(linkedGuidLow); + CreatureData const* master = GetCreatureData(linkedGuidLow); if (!master) { LOG_ERROR("sql.sql", "LinkedRespawn: Creature (linkedGuid) {} not found in creature table", linkedGuidLow); @@ -1984,7 +1984,7 @@ void ObjectMgr::LoadLinkedRespawn() } case CREATURE_TO_GO: { - const CreatureData* slave = GetCreatureData(guidLow); + CreatureData const* slave = GetCreatureData(guidLow); if (!slave) { LOG_ERROR("sql.sql", "LinkedRespawn: Creature (guid) {} not found in creature table", guidLow); @@ -1992,7 +1992,7 @@ void ObjectMgr::LoadLinkedRespawn() break; } - const GameObjectData* master = GetGameObjectData(linkedGuidLow); + GameObjectData const* master = GetGameObjectData(linkedGuidLow); if (!master) { LOG_ERROR("sql.sql", "LinkedRespawn: Gameobject (linkedGuid) {} not found in gameobject table", linkedGuidLow); @@ -2021,7 +2021,7 @@ void ObjectMgr::LoadLinkedRespawn() } case GO_TO_GO: { - const GameObjectData* slave = GetGameObjectData(guidLow); + GameObjectData const* slave = GetGameObjectData(guidLow); if (!slave) { LOG_ERROR("sql.sql", "LinkedRespawn: Gameobject (guid) {} not found in gameobject table", guidLow); @@ -2029,7 +2029,7 @@ void ObjectMgr::LoadLinkedRespawn() break; } - const GameObjectData* master = GetGameObjectData(linkedGuidLow); + GameObjectData const* master = GetGameObjectData(linkedGuidLow); if (!master) { LOG_ERROR("sql.sql", "LinkedRespawn: Gameobject (linkedGuid) {} not found in gameobject table", linkedGuidLow); @@ -2058,7 +2058,7 @@ void ObjectMgr::LoadLinkedRespawn() } case GO_TO_CREATURE: { - const GameObjectData* slave = GetGameObjectData(guidLow); + GameObjectData const* slave = GetGameObjectData(guidLow); if (!slave) { LOG_ERROR("sql.sql", "LinkedRespawn: Gameobject (guid) {} not found in gameobject table", guidLow); @@ -2066,7 +2066,7 @@ void ObjectMgr::LoadLinkedRespawn() break; } - const CreatureData* master = GetCreatureData(linkedGuidLow); + CreatureData const* master = GetCreatureData(linkedGuidLow); if (!master) { LOG_ERROR("sql.sql", "LinkedRespawn: Creature (linkedGuid) {} not found in creature table", linkedGuidLow); @@ -7623,7 +7623,7 @@ void ObjectMgr::LoadAccessRequirements() } //Sort all arrays for priority - auto sortFunction = [](const ProgressionRequirement* const a, const ProgressionRequirement* const b) {return a->priority > b->priority; }; + auto sortFunction = [](ProgressionRequirement const* const a, ProgressionRequirement const* const b) {return a->priority > b->priority; }; std::sort(ar->achievements.begin(), ar->achievements.end(), sortFunction); std::sort(ar->quests.begin(), ar->quests.end(), sortFunction); std::sort(ar->items.begin(), ar->items.end(), sortFunction); @@ -9464,7 +9464,7 @@ bool ObjectMgr::IsValidCharterName(std::string_view name) return isValidString(wname, strictMask, true); } -bool ObjectMgr::IsValidChannelName(const std::string& name) +bool ObjectMgr::IsValidChannelName(std::string const& name) { std::wstring wname; if (!Utf8toWStr(name, wname)) @@ -9927,7 +9927,7 @@ GameTele const* ObjectMgr::GetGameTele(std::string_view name, bool exactSearch) wstrToLower(wname); // Alternative first GameTele what contains wnameLow as substring in case no GameTele location found - const GameTele* alt = nullptr; + GameTele const* alt = nullptr; for (GameTeleContainer::const_iterator itr = _gameTeleStore.begin(); itr != _gameTeleStore.end(); ++itr) { if (itr->second.wnameLow == wname) diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h index 8a89fc3fc..c384ae2f3 100644 --- a/src/server/game/Globals/ObjectMgr.h +++ b/src/server/game/Globals/ObjectMgr.h @@ -1172,7 +1172,7 @@ public: if (map_itr == _mailLevelRewardStore.end()) return nullptr; - for (const auto & set_itr : map_itr->second) + for (auto const& set_itr : map_itr->second) if (set_itr.raceMask & raceMask) return &set_itr; @@ -1496,7 +1496,7 @@ public: else return {}; } - static inline void GetLocaleString(const std::vector& data, int loc_idx, std::string& value) + static inline void GetLocaleString(std::vector const& data, int loc_idx, std::string& value) { if (data.size() > std::size_t(loc_idx) && !data[loc_idx].empty()) value = data[loc_idx]; diff --git a/src/server/game/Grids/Cells/Cell.h b/src/server/game/Grids/Cells/Cell.h index d077a19c6..fe000f2de 100644 --- a/src/server/game/Grids/Cells/Cell.h +++ b/src/server/game/Grids/Cells/Cell.h @@ -54,13 +54,13 @@ struct Cell y = data.Part.grid_y * MAX_NUMBER_OF_CELLS + data.Part.cell_y; } - [[nodiscard]] bool DiffCell(const Cell& cell) const + [[nodiscard]] bool DiffCell(Cell const& cell) const { return(data.Part.cell_x != cell.data.Part.cell_x || data.Part.cell_y != cell.data.Part.cell_y); } - [[nodiscard]] bool DiffGrid(const Cell& cell) const + [[nodiscard]] bool DiffGrid(Cell const& cell) const { return(data.Part.grid_x != cell.data.Part.grid_x || data.Part.grid_y != cell.data.Part.grid_y); diff --git a/src/server/game/Grids/GridDefines.h b/src/server/game/Grids/GridDefines.h index 8904ff41d..9abb47e39 100644 --- a/src/server/game/Grids/GridDefines.h +++ b/src/server/game/Grids/GridDefines.h @@ -91,12 +91,12 @@ struct CoordPair , y_coord(y) {} - CoordPair(const CoordPair& obj) + CoordPair(CoordPair const& obj) : x_coord(obj.x_coord) , y_coord(obj.y_coord) {} - CoordPair& operator=(const CoordPair& obj) + CoordPair& operator=(CoordPair const& obj) { x_coord = obj.x_coord; y_coord = obj.y_coord; @@ -157,13 +157,13 @@ struct CoordPair }; template -bool operator==(const CoordPair& p1, const CoordPair& p2) +bool operator==(CoordPair const& p1, CoordPair const& p2) { return (p1.x_coord == p2.x_coord && p1.y_coord == p2.y_coord); } template -bool operator!=(const CoordPair& p1, const CoordPair& p2) +bool operator!=(CoordPair const& p1, CoordPair const& p2) { return !(p1 == p2); } diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp index 30167c3db..8d960a56f 100644 --- a/src/server/game/Groups/Group.cpp +++ b/src/server/game/Groups/Group.cpp @@ -411,7 +411,7 @@ Player* Group::GetInvited(ObjectGuid guid) const return nullptr; } -Player* Group::GetInvited(const std::string& name) const +Player* Group::GetInvited(std::string const& name) const { for (InvitesList::const_iterator itr = m_invitees.begin(); itr != m_invitees.end(); ++itr) { @@ -577,7 +577,7 @@ bool Group::AddMember(Player* player, uint8 roles /* = 0 */) return true; } -bool Group::RemoveMember(ObjectGuid guid, const RemoveMethod& method /*= GROUP_REMOVEMETHOD_DEFAULT*/, ObjectGuid kicker /*= ObjectGuid::Empty*/, const char* reason /*= nullptr*/) +bool Group::RemoveMember(ObjectGuid guid, RemoveMethod const& method /*= GROUP_REMOVEMETHOD_DEFAULT*/, ObjectGuid kicker /*= ObjectGuid::Empty*/, char const* reason /*= nullptr*/) { BroadcastGroupUpdate(); @@ -856,7 +856,7 @@ void Group::Disband(bool hideDestroy /* = false */) /*** LOOT SYSTEM ***/ /*********************************************************/ -void Group::SendLootStartRoll(uint32 CountDown, uint32 mapid, const Roll& r) +void Group::SendLootStartRoll(uint32 CountDown, uint32 mapid, Roll const& r) { WorldPacket data(SMSG_LOOT_START_ROLL, (8 + 4 + 4 + 4 + 4 + 4 + 4 + 1)); data << r.itemGUID; // guid of rolled item @@ -1736,7 +1736,7 @@ void Group::CountTheRoll(Rolls::iterator rollI) if (Loot* loot = roll->getLoot(); loot && loot->isLooted() && loot->sourceGameObject) { - const GameObjectTemplate* goInfo = loot->sourceGameObject->GetGOInfo(); + GameObjectTemplate const* goInfo = loot->sourceGameObject->GetGOInfo(); if (goInfo && goInfo->type == GAMEOBJECT_TYPE_CHEST) { // Deactivate chest if the last item was rolled in group @@ -2445,7 +2445,7 @@ ObjectGuid Group::GetGUID() const return m_guid; } -const char* Group::GetLeaderName() const +char const* Group::GetLeaderName() const { return m_leaderName.c_str(); } @@ -2480,7 +2480,7 @@ bool Group::IsLeader(ObjectGuid guid) const return (GetLeaderGUID() == guid); } -ObjectGuid Group::GetMemberGUID(const std::string& name) +ObjectGuid Group::GetMemberGUID(std::string const& name) { for (member_citerator itr = m_memberSlots.begin(); itr != m_memberSlots.end(); ++itr) if (itr->name == name) diff --git a/src/server/game/Groups/Group.h b/src/server/game/Groups/Group.h index 8b020cb60..50c51c451 100644 --- a/src/server/game/Groups/Group.h +++ b/src/server/game/Groups/Group.h @@ -205,7 +205,7 @@ public: void RemoveAllInvites(); bool AddLeaderInvite(Player* player); bool AddMember(Player* player, uint8 roles = 0); - bool RemoveMember(ObjectGuid guid, const RemoveMethod& method = GROUP_REMOVEMETHOD_DEFAULT, ObjectGuid kicker = ObjectGuid::Empty, const char* reason = nullptr); + bool RemoveMember(ObjectGuid guid, RemoveMethod const& method = GROUP_REMOVEMETHOD_DEFAULT, ObjectGuid kicker = ObjectGuid::Empty, char const* reason = nullptr); void ChangeLeader(ObjectGuid guid); void SetLootMethod(LootMethod method); void SetLooterGuid(ObjectGuid guid); @@ -226,7 +226,7 @@ public: ObjectGuid GetLeaderGUID() const; Player* GetLeader(); ObjectGuid GetGUID() const; - const char* GetLeaderName() const; + char const* GetLeaderName() const; LootMethod GetLootMethod() const; ObjectGuid GetLooterGuid() const; ObjectGuid GetMasterLooterGuid() const; @@ -235,11 +235,11 @@ public: // member manipulation methods bool IsMember(ObjectGuid guid) const; bool IsLeader(ObjectGuid guid) const; - ObjectGuid GetMemberGUID(const std::string& name); + ObjectGuid GetMemberGUID(std::string const& name); bool IsAssistant(ObjectGuid guid) const; Player* GetInvited(ObjectGuid guid) const; - Player* GetInvited(const std::string& name) const; + Player* GetInvited(std::string const& name) const; bool SameSubGroup(ObjectGuid guid1, ObjectGuid guid2) const; bool SameSubGroup(ObjectGuid guid1, MemberSlot const* slot2) const; @@ -293,11 +293,11 @@ public: /*********************************************************/ bool isRollLootActive() const; - void SendLootStartRoll(uint32 CountDown, uint32 mapid, const Roll& r); + void SendLootStartRoll(uint32 CountDown, uint32 mapid, Roll const& r); void SendLootStartRollToPlayer(uint32 countDown, uint32 mapId, Player* p, bool canNeed, Roll const& r); void SendPendingRollsToPlayer(Player* player, Map* map); - void SendLootRoll(ObjectGuid SourceGuid, ObjectGuid TargetGuid, uint8 RollNumber, uint8 RollType, const Roll& r, bool autoPass = false); - void SendLootRollWon(ObjectGuid SourceGuid, ObjectGuid TargetGuid, uint8 RollNumber, uint8 RollType, const Roll& r); + void SendLootRoll(ObjectGuid SourceGuid, ObjectGuid TargetGuid, uint8 RollNumber, uint8 RollType, Roll const& r, bool autoPass = false); + void SendLootRollWon(ObjectGuid SourceGuid, ObjectGuid TargetGuid, uint8 RollNumber, uint8 RollType, Roll const& r); void SendLootAllPassed(Roll const& roll); void SendLooter(Creature* creature, Player* pLooter); void GroupLoot(Loot* loot, WorldObject* pLootedObject); diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp index abd12702d..b1f8b7654 100644 --- a/src/server/game/Guilds/Guild.cpp +++ b/src/server/game/Guilds/Guild.cpp @@ -1319,7 +1319,7 @@ void Guild::HandleSetInfo(WorldSession* session, std::string_view info) } } -void Guild::HandleSetEmblem(WorldSession* session, const EmblemInfo& emblemInfo) +void Guild::HandleSetEmblem(WorldSession* session, EmblemInfo const& emblemInfo) { Player* player = session->GetPlayer(); if (!_IsLeader(player)) @@ -2483,7 +2483,7 @@ bool Guild::_IsLeader(Player* player) const { if (player->GetGUID() == m_leaderGuid) return true; - if (const Member* member = GetMember(player->GetGUID())) + if (Member const* member = GetMember(player->GetGUID())) return member->IsRank(GR_GUILDMASTER); return false; } @@ -2544,21 +2544,21 @@ void Guild::_SetRankBankTabRightsAndSlots(uint8 rankId, GuildBankRightsAndSlots inline std::string Guild::_GetRankName(uint8 rankId) const { - if (const RankInfo* rankInfo = GetRankInfo(rankId)) + if (RankInfo const* rankInfo = GetRankInfo(rankId)) return rankInfo->GetName(); return ""; } inline uint32 Guild::_GetRankRights(uint8 rankId) const { - if (const RankInfo* rankInfo = GetRankInfo(rankId)) + if (RankInfo const* rankInfo = GetRankInfo(rankId)) return rankInfo->GetRights(); return 0; } inline int32 Guild::_GetRankBankMoneyPerDay(uint8 rankId) const { - if (const RankInfo* rankInfo = GetRankInfo(rankId)) + if (RankInfo const* rankInfo = GetRankInfo(rankId)) return rankInfo->GetBankMoneyPerDay(); return 0; } @@ -2566,14 +2566,14 @@ inline int32 Guild::_GetRankBankMoneyPerDay(uint8 rankId) const inline int32 Guild::_GetRankBankTabSlotsPerDay(uint8 rankId, uint8 tabId) const { if (tabId < _GetPurchasedTabsSize()) - if (const RankInfo* rankInfo = GetRankInfo(rankId)) + if (RankInfo const* rankInfo = GetRankInfo(rankId)) return rankInfo->GetBankTabSlotsPerDay(tabId); return 0; } inline int8 Guild::_GetRankBankTabRights(uint8 rankId, uint8 tabId) const { - if (const RankInfo* rankInfo = GetRankInfo(rankId)) + if (RankInfo const* rankInfo = GetRankInfo(rankId)) return rankInfo->GetBankTabRights(tabId); return 0; } @@ -2620,7 +2620,7 @@ inline void Guild::_UpdateMemberWithdrawSlots(CharacterDatabaseTransaction trans inline bool Guild::_MemberHasTabRights(ObjectGuid guid, uint8 tabId, uint32 rights) const { - if (const Member* member = GetMember(guid)) + if (Member const* member = GetMember(guid)) { // Leader always has full rights if (member->IsRank(GR_GUILDMASTER) || m_leaderGuid == guid) @@ -2664,7 +2664,7 @@ void Guild::_LogBankEvent(CharacterDatabaseTransaction trans, GuildBankEventLogT inline Item* Guild::_GetItem(uint8 tabId, uint8 slotId) const { - if (const BankTab* tab = GetBankTab(tabId)) + if (BankTab const* tab = GetBankTab(tabId)) return tab->GetItem(slotId); return nullptr; } diff --git a/src/server/game/Guilds/Guild.h b/src/server/game/Guilds/Guild.h index ab5d47295..c2cd4bb42 100644 --- a/src/server/game/Guilds/Guild.h +++ b/src/server/game/Guilds/Guild.h @@ -378,7 +378,7 @@ public: // pussywizard: public class Member }; // pussywizard: public GetMember - inline const Member* GetMember(ObjectGuid guid) const + inline Member const* GetMember(ObjectGuid guid) const { auto itr = m_members.find(guid.GetCounter()); return (itr != m_members.end()) ? &itr->second : nullptr; @@ -566,7 +566,7 @@ private: void SetInfo(std::string_view name, std::string_view icon); void SetText(std::string_view text); - void SendText(const Guild* guild, WorldSession* session) const; + void SendText(Guild const* guild, WorldSession* session) const; std::string const& GetName() const { return m_name; } std::string const& GetIcon() const { return m_icon; } @@ -696,7 +696,7 @@ public: void HandleQuery(WorldSession* session); void HandleSetMOTD(WorldSession* session, std::string_view motd); void HandleSetInfo(WorldSession* session, std::string_view info); - void HandleSetEmblem(WorldSession* session, const EmblemInfo& emblemInfo); + void HandleSetEmblem(WorldSession* session, EmblemInfo const& emblemInfo); void HandleSetLeader(WorldSession* session, std::string_view name); void HandleSetBankTabInfo(WorldSession* session, uint8 tabId, std::string_view name, std::string_view icon); void HandleSetMemberNote(WorldSession* session, std::string_view name, std::string_view note, bool isPublic); @@ -776,7 +776,7 @@ public: void ResetTimes(); - [[nodiscard]] bool ModifyBankMoney(CharacterDatabaseTransaction trans, const uint64& amount, bool add) { return _ModifyBankMoney(trans, amount, add); } + [[nodiscard]] bool ModifyBankMoney(CharacterDatabaseTransaction trans, uint64 const& amount, bool add) { return _ModifyBankMoney(trans, amount, add); } [[nodiscard]] uint32 GetMemberSize() const { return m_members.size(); } protected: @@ -801,7 +801,7 @@ protected: private: inline uint8 _GetRanksSize() const { return uint8(m_ranks.size()); } - inline const RankInfo* GetRankInfo(uint8 rankId) const { return rankId < _GetRanksSize() ? &m_ranks[rankId] : nullptr; } + inline RankInfo const* GetRankInfo(uint8 rankId) const { return rankId < _GetRanksSize() ? &m_ranks[rankId] : nullptr; } inline RankInfo* GetRankInfo(uint8 rankId) { return rankId < _GetRanksSize() ? &m_ranks[rankId] : nullptr; } inline bool _HasRankRight(Player* player, uint32 right) const { diff --git a/src/server/game/Handlers/ArenaTeamHandler.cpp b/src/server/game/Handlers/ArenaTeamHandler.cpp index 65ad0e0c7..58fb2541c 100644 --- a/src/server/game/Handlers/ArenaTeamHandler.cpp +++ b/src/server/game/Handlers/ArenaTeamHandler.cpp @@ -403,7 +403,7 @@ void WorldSession::HandleArenaTeamLeaderOpcode(WorldPacket& recvData) arenaTeam->BroadcastEvent(ERR_ARENA_TEAM_LEADER_CHANGED_SSS, ObjectGuid::Empty, 3, _player->GetName().c_str(), name, arenaTeam->GetName()); } -void WorldSession::SendArenaTeamCommandResult(uint32 teamAction, const std::string& team, const std::string& player, uint32 errorId) +void WorldSession::SendArenaTeamCommandResult(uint32 teamAction, std::string const& team, std::string const& player, uint32 errorId) { WorldPacket data(SMSG_ARENA_TEAM_COMMAND_RESULT, 4 + team.length() + 1 + player.length() + 1 + 4); data << uint32(teamAction); diff --git a/src/server/game/Handlers/AuctionHouseHandler.cpp b/src/server/game/Handlers/AuctionHouseHandler.cpp index 19d878289..bba72f7ff 100644 --- a/src/server/game/Handlers/AuctionHouseHandler.cpp +++ b/src/server/game/Handlers/AuctionHouseHandler.cpp @@ -294,7 +294,7 @@ void WorldSession::HandleAuctionSellItem(WorldPacket& recvData) return; } - const AuctionHouseEntry* AHEntry = sAuctionMgr->GetAuctionHouseEntryFromFactionTemplate(auctioneerInfo->faction); + AuctionHouseEntry const* AHEntry = sAuctionMgr->GetAuctionHouseEntryFromFactionTemplate(auctioneerInfo->faction); AH->houseId = AuctionHouseId(AHEntry->houseId); } diff --git a/src/server/game/Handlers/GroupHandler.cpp b/src/server/game/Handlers/GroupHandler.cpp index d0bd34262..ad09e714e 100644 --- a/src/server/game/Handlers/GroupHandler.cpp +++ b/src/server/game/Handlers/GroupHandler.cpp @@ -50,7 +50,7 @@ class Aura; -FIX sending PartyMemberStats */ -void WorldSession::SendPartyResult(PartyOperation operation, const std::string& member, PartyResult res, uint32 val /* = 0 */) +void WorldSession::SendPartyResult(PartyOperation operation, std::string const& member, PartyResult res, uint32 val /* = 0 */) { WorldPacket data(SMSG_PARTY_COMMAND_RESULT, 4 + member.size() + 1 + 4 + 4); data << uint32(operation); diff --git a/src/server/game/Handlers/LFGHandler.cpp b/src/server/game/Handlers/LFGHandler.cpp index 867a3c939..98aff9882 100644 --- a/src/server/game/Handlers/LFGHandler.cpp +++ b/src/server/game/Handlers/LFGHandler.cpp @@ -37,7 +37,7 @@ void BuildPlayerLockDungeonBlock(WorldPacket& data, lfg::LfgLockMap const& lock) } } -void BuildPartyLockDungeonBlock(WorldPacket& data, const lfg::LfgLockPartyMap& lockMap) +void BuildPartyLockDungeonBlock(WorldPacket& data, lfg::LfgLockPartyMap const& lockMap) { data << uint8(lockMap.size()); for (lfg::LfgLockPartyMap::const_iterator it = lockMap.begin(); it != lockMap.end(); ++it) diff --git a/src/server/game/Handlers/PetHandler.cpp b/src/server/game/Handlers/PetHandler.cpp index 6433450a4..bc3caab8c 100644 --- a/src/server/game/Handlers/PetHandler.cpp +++ b/src/server/game/Handlers/PetHandler.cpp @@ -1088,7 +1088,7 @@ void WorldSession::HandlePetCastSpellOpcode(WorldPacket& recvPacket) caster->AddUnitState(UNIT_STATE_FOLLOW); } -void WorldSession::SendPetNameInvalid(uint32 error, const std::string& name, DeclinedName* declinedName) +void WorldSession::SendPetNameInvalid(uint32 error, std::string const& name, DeclinedName* declinedName) { WorldPacket data(SMSG_PET_NAME_INVALID, 4 + name.size() + 1 + 1); data << uint32(error); diff --git a/src/server/game/Handlers/QueryHandler.cpp b/src/server/game/Handlers/QueryHandler.cpp index 478dbe5ab..eb0142aa4 100644 --- a/src/server/game/Handlers/QueryHandler.cpp +++ b/src/server/game/Handlers/QueryHandler.cpp @@ -170,7 +170,7 @@ void WorldSession::HandleGameObjectQueryOpcode(WorldPacket& recvData) ObjectGuid guid; recvData >> guid; - const GameObjectTemplate* info = sObjectMgr->GetGameObjectTemplate(entry); + GameObjectTemplate const* info = sObjectMgr->GetGameObjectTemplate(entry); if (info) { std::string Name; diff --git a/src/server/game/Handlers/QuestHandler.cpp b/src/server/game/Handlers/QuestHandler.cpp index 89a0a84af..ed9699a93 100644 --- a/src/server/game/Handlers/QuestHandler.cpp +++ b/src/server/game/Handlers/QuestHandler.cpp @@ -629,7 +629,7 @@ void WorldSession::HandleQueryQuestsCompleted(WorldPacket& /*recvData*/) WorldPacket data(SMSG_QUERY_QUESTS_COMPLETED_RESPONSE, 4 + 4 * rew_count); data << uint32(rew_count); - const RewardedQuestSet& rewQuests = _player->getRewardedQuests(); + RewardedQuestSet const& rewQuests = _player->getRewardedQuests(); for (RewardedQuestSet::const_iterator itr = rewQuests.begin(); itr != rewQuests.end(); ++itr) data << uint32(*itr); diff --git a/src/server/game/Handlers/SpellHandler.cpp b/src/server/game/Handlers/SpellHandler.cpp index bbb3a1f55..a69c15045 100644 --- a/src/server/game/Handlers/SpellHandler.cpp +++ b/src/server/game/Handlers/SpellHandler.cpp @@ -477,7 +477,7 @@ void WorldSession::HandleCastSpellOpcode(WorldPacket& recvPacket) // pussywizard: casting player's spells from vehicle when seat allows it // if ANYTHING CHANGES in this function, INFORM ME BEFORE applying!!! if (Vehicle* veh = mover->GetVehicleKit()) - if (const VehicleSeatEntry* seat = veh->GetSeatForPassenger(_player)) + if (VehicleSeatEntry const* seat = veh->GetSeatForPassenger(_player)) if (seat->m_flags & VEHICLE_SEAT_FLAG_CAN_ATTACK || spellInfo->Effects[EFFECT_0].Effect == SPELL_EFFECT_OPEN_LOCK /*allow looting from vehicle, but only if player has required spell (all necessary opening spells are in playercreateinfo_spell)*/) if ((mover->IsCreature() && !mover->ToCreature()->HasSpell(spellId)) || spellInfo->IsPassive()) // the creature can't cast that spell, check player instead { diff --git a/src/server/game/Instances/InstanceScript.cpp b/src/server/game/Instances/InstanceScript.cpp index ab0813234..14a5fac34 100644 --- a/src/server/game/Instances/InstanceScript.cpp +++ b/src/server/game/Instances/InstanceScript.cpp @@ -149,7 +149,7 @@ bool InstanceScript::IsEncounterInProgress() const return false; } -void InstanceScript::LoadBossBoundaries(const BossBoundaryData& data) +void InstanceScript::LoadBossBoundaries(BossBoundaryData const& data) { for (BossBoundaryEntry const& entry : data) if (entry.bossId < bosses.size()) @@ -167,7 +167,7 @@ void InstanceScript::SetHeaders(std::string const& dataHeaders) } } -void InstanceScript::LoadMinionData(const MinionData* data) +void InstanceScript::LoadMinionData(MinionData const* data) { while (data->entry) { @@ -179,7 +179,7 @@ void InstanceScript::LoadMinionData(const MinionData* data) LOG_DEBUG("scripts.ai", "InstanceScript::LoadMinionData: {} minions loaded.", uint64(minions.size())); } -void InstanceScript::LoadDoorData(const DoorData* data) +void InstanceScript::LoadDoorData(DoorData const* data) { while (data->entry) { @@ -462,7 +462,7 @@ void InstanceScript::DoForAllMinions(uint32 id, std::function e } } -void InstanceScript::Load(const char* data) +void InstanceScript::Load(char const* data) { if (!data) { diff --git a/src/server/game/Loot/LootMgr.cpp b/src/server/game/Loot/LootMgr.cpp index d65883255..a103aab09 100644 --- a/src/server/game/Loot/LootMgr.cpp +++ b/src/server/game/Loot/LootMgr.cpp @@ -292,12 +292,12 @@ void LootStore::ReportNonExistingId(uint32 lootId) const LOG_ERROR("sql.sql", "Table '{}' Entry {} does not exist", GetName(), lootId); } -void LootStore::ReportNonExistingId(uint32 lootId, const char* ownerType, uint32 ownerId) const +void LootStore::ReportNonExistingId(uint32 lootId, char const* ownerType, uint32 ownerId) const { LOG_ERROR("sql.sql", "Table '{}' Entry {} does not exist but it is used by {} {}", GetName(), lootId, ownerType, ownerId); } -void LootStore::ReportInvalidCount(uint32 lootId, const char* ownerType, uint32 ownerId, uint32 itemId, uint8 minCount, uint8 maxCount) const +void LootStore::ReportInvalidCount(uint32 lootId, char const* ownerType, uint32 ownerId, uint32 itemId, uint8 minCount, uint8 maxCount) const { LOG_ERROR("sql.sql", "Table '{}' Entry {} used by {} entry {} item {} has minCount ( {} ) != maxCount ( {} ) which is not supported for this loot type.", GetName(), lootId, ownerType, ownerId, itemId, minCount, maxCount); } @@ -913,7 +913,7 @@ bool Loot::hasItemFor(Player* player) const QuestItemList* q_list = q_itr->second; for (QuestItemList::const_iterator qi = q_list->begin(); qi != q_list->end(); ++qi) { - const LootItem& item = quest_items[qi->index]; + LootItem const& item = quest_items[qi->index]; if (!qi->is_looted && !item.is_looted) return true; } @@ -926,7 +926,7 @@ bool Loot::hasItemFor(Player* player) const QuestItemList* ffa_list = ffa_itr->second; for (QuestItemList::const_iterator fi = ffa_list->begin(); fi != ffa_list->end(); ++fi) { - const LootItem& item = items[fi->index]; + LootItem const& item = items[fi->index]; if (!fi->is_looted && !item.is_looted) return true; } @@ -939,7 +939,7 @@ bool Loot::hasItemFor(Player* player) const QuestItemList* conditional_list = nn_itr->second; for (QuestItemList::const_iterator ci = conditional_list->begin(); ci != conditional_list->end(); ++ci) { - const LootItem& item = items[ci->index]; + LootItem const& item = items[ci->index]; if (!ci->is_looted && !item.is_looted) return true; } diff --git a/src/server/game/Loot/LootMgr.h b/src/server/game/Loot/LootMgr.h index fd2b0e8b5..9f92a1f75 100644 --- a/src/server/game/Loot/LootMgr.h +++ b/src/server/game/Loot/LootMgr.h @@ -178,7 +178,7 @@ struct LootItem // Basic checks for player/item compatibility - if false no chance to see the item in the loot bool AllowedForPlayer(Player const* player, ObjectGuid source) const; void AddAllowedLooter(Player const* player); - [[nodiscard]] const AllowedLooterSet& GetAllowedLooters() const { return allowedGUIDs; } + [[nodiscard]] AllowedLooterSet const& GetAllowedLooters() const { return allowedGUIDs; } }; struct QuestItem @@ -218,8 +218,8 @@ public: void CheckLootRefs(LootIdSet* ref_set = nullptr) const; // check existence reference and remove it from ref_set void ReportUnusedIds(LootIdSet const& ids_set) const; void ReportNonExistingId(uint32 lootId) const; - void ReportNonExistingId(uint32 lootId, const char* ownerType, uint32 ownerId) const; - void ReportInvalidCount(uint32 lootId, const char* ownerType, uint32 ownerId, uint32 itemId, uint8 minCount, uint8 maxCount) const; + void ReportNonExistingId(uint32 lootId, char const* ownerType, uint32 ownerId) const; + void ReportInvalidCount(uint32 lootId, char const* ownerType, uint32 ownerId, uint32 itemId, uint8 minCount, uint8 maxCount) const; [[nodiscard]] bool HaveLootFor(uint32 loot_id) const { return m_LootTemplates.find(loot_id) != m_LootTemplates.end(); } [[nodiscard]] bool HaveQuestLootFor(uint32 loot_id) const; diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index b47e4c5fc..cb9056d0a 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -2951,7 +2951,7 @@ void Map::LogEncounterFinished(EncounterCreditType type, uint32 creditEntry) if (Player* p = itr->GetSource()) { std::string auraStr; - const Unit::AuraApplicationMap& a = p->GetAppliedAuras(); + Unit::AuraApplicationMap const& a = p->GetAppliedAuras(); for (auto iterator = a.begin(); iterator != a.end(); ++iterator) { snprintf(buffer2, 255, "%u(%u) ", iterator->first, iterator->second->GetEffectMask()); diff --git a/src/server/game/Maps/Map.h b/src/server/game/Maps/Map.h index e91378040..3575b91ff 100644 --- a/src/server/game/Maps/Map.h +++ b/src/server/game/Maps/Map.h @@ -206,7 +206,7 @@ public: void GameObjectRelocation(GameObject* go, float x, float y, float z, float o); void DynamicObjectRelocation(DynamicObject* go, float x, float y, float z, float o); - template void Visit(const Cell& cell, TypeContainerVisitor& visitor); + template void Visit(Cell const& cell, TypeContainerVisitor& visitor); bool IsGridLoaded(GridCoord const& gridCoord) const; bool IsGridLoaded(float x, float y) const @@ -286,7 +286,7 @@ public: virtual EnterState CannotEnter(Player* /*player*/, bool /*loginCheck = false*/) { return CAN_ENTER; } - [[nodiscard]] const char* GetMapName() const; + [[nodiscard]] char const* GetMapName() const; // have meaning only for instanced map (that have set real difficulty) [[nodiscard]] Difficulty GetDifficulty() const { return Difficulty(GetSpawnMode()); } @@ -376,10 +376,10 @@ public: } MapInstanced* ToMapInstanced() { if (Instanceable()) return reinterpret_cast(this); else return nullptr; } - [[nodiscard]] MapInstanced const* ToMapInstanced() const { if (Instanceable()) return (const MapInstanced*)((MapInstanced*)this); else return nullptr; } + [[nodiscard]] MapInstanced const* ToMapInstanced() const { if (Instanceable()) return (MapInstanced const*)((MapInstanced*)this); else return nullptr; } InstanceMap* ToInstanceMap() { if (IsDungeon()) return reinterpret_cast(this); else return nullptr; } - [[nodiscard]] InstanceMap const* ToInstanceMap() const { if (IsDungeon()) return (const InstanceMap*)((InstanceMap*)this); else return nullptr; } + [[nodiscard]] InstanceMap const* ToInstanceMap() const { if (IsDungeon()) return (InstanceMap const*)((InstanceMap*)this); else return nullptr; } BattlegroundMap* ToBattlegroundMap() { if (IsBattlegroundOrArena()) return reinterpret_cast(this); else return nullptr; } [[nodiscard]] BattlegroundMap const* ToBattlegroundMap() const { if (IsBattlegroundOrArena()) return reinterpret_cast(this); return nullptr; } @@ -392,9 +392,9 @@ public: bool CanReachPositionAndGetValidCoords(WorldObject const* source, float startX, float startY, float startZ, float &destX, float &destY, float &destZ, bool failOnCollision = true, bool failOnSlopes = true) const; bool CheckCollisionAndGetValidCoords(WorldObject const* source, float startX, float startY, float startZ, float &destX, float &destY, float &destZ, bool failOnCollision = true) const; void Balance() { _mapCollisionData.GetDynamicTree().balance(); } - void RemoveGameObjectModel(const GameObjectModel& model) { _mapCollisionData.GetDynamicTree().remove(model); } - void InsertGameObjectModel(const GameObjectModel& model) { _mapCollisionData.GetDynamicTree().insert(model); } - [[nodiscard]] bool ContainsGameObjectModel(const GameObjectModel& model) const { return _mapCollisionData.GetDynamicTree().contains(model);} + void RemoveGameObjectModel(GameObjectModel const& model) { _mapCollisionData.GetDynamicTree().remove(model); } + void InsertGameObjectModel(GameObjectModel const& model) { _mapCollisionData.GetDynamicTree().insert(model); } + [[nodiscard]] bool ContainsGameObjectModel(GameObjectModel const& model) const { return _mapCollisionData.GetDynamicTree().contains(model);} [[nodiscard]] DynamicMapTree const& GetDynamicMapTree() const { return _mapCollisionData.GetDynamicTree(); } [[nodiscard]] float GetGameObjectFloor(uint32 phasemask, float x, float y, float z, float maxSearchDist = DEFAULT_HEIGHT_SEARCH) const { @@ -608,13 +608,13 @@ protected: TransportsContainer::iterator _transportsUpdateIter; private: - Player* _GetScriptPlayerSourceOrTarget(Object* source, Object* target, const ScriptInfo* scriptInfo) const; - Creature* _GetScriptCreatureSourceOrTarget(Object* source, Object* target, const ScriptInfo* scriptInfo, bool bReverse = false) const; - Unit* _GetScriptUnit(Object* obj, bool isSource, const ScriptInfo* scriptInfo) const; - Player* _GetScriptPlayer(Object* obj, bool isSource, const ScriptInfo* scriptInfo) const; - Creature* _GetScriptCreature(Object* obj, bool isSource, const ScriptInfo* scriptInfo) const; - WorldObject* _GetScriptWorldObject(Object* obj, bool isSource, const ScriptInfo* scriptInfo) const; - void _ScriptProcessDoor(Object* source, Object* target, const ScriptInfo* scriptInfo) const; + Player* _GetScriptPlayerSourceOrTarget(Object* source, Object* target, ScriptInfo const* scriptInfo) const; + Creature* _GetScriptCreatureSourceOrTarget(Object* source, Object* target, ScriptInfo const* scriptInfo, bool bReverse = false) const; + Unit* _GetScriptUnit(Object* obj, bool isSource, ScriptInfo const* scriptInfo) const; + Player* _GetScriptPlayer(Object* obj, bool isSource, ScriptInfo const* scriptInfo) const; + Creature* _GetScriptCreature(Object* obj, bool isSource, ScriptInfo const* scriptInfo) const; + WorldObject* _GetScriptWorldObject(Object* obj, bool isSource, ScriptInfo const* scriptInfo) const; + void _ScriptProcessDoor(Object* source, Object* target, ScriptInfo const* scriptInfo) const; GameObject* _FindGameObject(WorldObject* pWorldObject, ObjectGuid::LowType guid) const; //used for fast base_map (e.g. MapInstanced class object) search for diff --git a/src/server/game/Maps/MapMgr.h b/src/server/game/Maps/MapMgr.h index c2336707e..8524382c1 100644 --- a/src/server/game/Maps/MapMgr.h +++ b/src/server/game/Maps/MapMgr.h @@ -165,8 +165,8 @@ private: MapMgr(); ~MapMgr(); - MapMgr(const MapMgr&); - MapMgr& operator=(const MapMgr&); + MapMgr(MapMgr const&); + MapMgr& operator=(MapMgr const&); std::mutex Lock; MapMapType i_maps; diff --git a/src/server/game/Misc/GameGraveyard.cpp b/src/server/game/Misc/GameGraveyard.cpp index e497a9245..d5d19d477 100644 --- a/src/server/game/Misc/GameGraveyard.cpp +++ b/src/server/game/Misc/GameGraveyard.cpp @@ -416,7 +416,7 @@ void Graveyard::LoadGraveyardZones() LOG_INFO("server.loading", " "); } -GraveyardStruct const* Graveyard::GetGraveyard(const std::string& name) const +GraveyardStruct const* Graveyard::GetGraveyard(std::string const& name) const { // explicit name case std::wstring wname; @@ -427,7 +427,7 @@ GraveyardStruct const* Graveyard::GetGraveyard(const std::string& name) const wstrToLower(wname); // Alternative first GameTele what contains wnameLow as substring in case no GameTele location found - const GraveyardStruct* alt = nullptr; + GraveyardStruct const* alt = nullptr; for (GraveyardContainer::const_iterator itr = _graveyardStore.begin(); itr != _graveyardStore.end(); ++itr) { if (itr->second.wnameLow == wname) diff --git a/src/server/game/Misc/GameGraveyard.h b/src/server/game/Misc/GameGraveyard.h index 1ba22d1f7..1ea59c204 100644 --- a/src/server/game/Misc/GameGraveyard.h +++ b/src/server/game/Misc/GameGraveyard.h @@ -54,7 +54,7 @@ public: typedef std::unordered_map GraveyardContainer; GraveyardStruct const* GetGraveyard(uint32 ID) const; - GraveyardStruct const* GetGraveyard(const std::string& name) const; + GraveyardStruct const* GetGraveyard(std::string const& name) const; GraveyardStruct const* GetDefaultGraveyard(TeamId teamId); GraveyardStruct const* GetClosestGraveyard(Player* player, TeamId teamId, bool nearCorpse = false); GraveyardData const* FindGraveyardData(uint32 id, uint32 zone); diff --git a/src/server/game/Movement/MotionMaster.cpp b/src/server/game/Movement/MotionMaster.cpp index 96b7f470f..1b5812272 100644 --- a/src/server/game/Movement/MotionMaster.cpp +++ b/src/server/game/Movement/MotionMaster.cpp @@ -738,7 +738,7 @@ void MotionMaster::MoveFall(uint32 id /*=0*/, bool addFlagForNPC) /** * @brief The unit will charge the target. Doesn't work with UNIT_FLAG_DISABLE_MOVE */ -void MotionMaster::MoveCharge(float x, float y, float z, float speed, uint32 id, const Movement::PointsArray* path, bool generatePath, float orientation /* = 0.0f*/, ObjectGuid targetGUID /*= ObjectGuid::Empty*/) +void MotionMaster::MoveCharge(float x, float y, float z, float speed, uint32 id, Movement::PointsArray const* path, bool generatePath, float orientation /* = 0.0f*/, ObjectGuid targetGUID /*= ObjectGuid::Empty*/) { if (_owner->HasUnitFlag(UNIT_FLAG_DISABLE_MOVE)) return; diff --git a/src/server/game/Movement/MotionMaster.h b/src/server/game/Movement/MotionMaster.h index c33c29473..2d83a86c9 100644 --- a/src/server/game/Movement/MotionMaster.h +++ b/src/server/game/Movement/MotionMaster.h @@ -237,7 +237,7 @@ public: void MoveForwards(Unit* target, float dist); void MoveConfused(); void MoveFleeing(Unit* enemy, uint32 time = 0); - void MovePoint(uint32 id, const Position& pos, ForcedMovement forcedMovement = FORCED_MOVEMENT_NONE, float speed = 0.f, bool generatePath = true, bool forceDestination = true, std::optional animTier = std::nullopt) + void MovePoint(uint32 id, Position const& pos, ForcedMovement forcedMovement = FORCED_MOVEMENT_NONE, float speed = 0.f, bool generatePath = true, bool forceDestination = true, std::optional animTier = std::nullopt) { MovePoint(id, pos.m_positionX, pos.m_positionY, pos.m_positionZ, forcedMovement, speed, pos.GetOrientation(), generatePath, forceDestination, MOTION_SLOT_ACTIVE, animTier); } void MovePoint(uint32 id, float x, float y, float z, ForcedMovement forcedMovement = FORCED_MOVEMENT_NONE, float speed = 0.f, float orientation = 0.0f, bool generatePath = true, bool forceDestination = true, MovementSlot slot = MOTION_SLOT_ACTIVE, std::optional animTier = std::nullopt); void MoveSplinePath(Movement::PointsArray* path, ForcedMovement forcedMovement = FORCED_MOVEMENT_NONE); @@ -249,7 +249,7 @@ public: void MoveTakeoff(uint32 id, Position const& pos, float speed = 0.0f, bool skipAnimation = false); void MoveTakeoff(uint32 id, float x, float y, float z, float speed = 0.0f, bool skipAnimation = false); // pussywizard: added for easy calling by passing 3 floats x, y, z - void MoveCharge(float x, float y, float z, float speed = SPEED_CHARGE, uint32 id = EVENT_CHARGE, const Movement::PointsArray* path = nullptr, bool generatePath = false, float orientation = 0.0f, ObjectGuid targetGUID = ObjectGuid::Empty); + void MoveCharge(float x, float y, float z, float speed = SPEED_CHARGE, uint32 id = EVENT_CHARGE, Movement::PointsArray const* path = nullptr, bool generatePath = false, float orientation = 0.0f, ObjectGuid targetGUID = ObjectGuid::Empty); void MoveCharge(PathGenerator const& path, float speed = SPEED_CHARGE, ObjectGuid targetGUID = ObjectGuid::Empty); void MoveKnockbackFrom(float srcX, float srcY, float speedXY, float speedZ); void MoveJumpTo(float angle, float speedXY, float speedZ); diff --git a/src/server/game/Movement/MovementGenerators/PathGenerator.cpp b/src/server/game/Movement/MovementGenerators/PathGenerator.cpp index 9f92d18f4..fddbb29d7 100644 --- a/src/server/game/Movement/MovementGenerators/PathGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/PathGenerator.cpp @@ -612,7 +612,7 @@ void PathGenerator::BuildPolyPath(G3D::Vector3 const& startPos, G3D::Vector3 con BuildPointPath(startPoint, endPoint); } -void PathGenerator::BuildPointPath(const float* startPoint, const float* endPoint) +void PathGenerator::BuildPointPath(float const* startPoint, float const* endPoint) { float pathPoints[MAX_POINT_PATH_LENGTH * VERTEX_SIZE]; uint32 pointCount = 0; @@ -814,7 +814,7 @@ NavTerrain PathGenerator::GetNavTerrain(float x, float y, float z) const } } -bool PathGenerator::HaveTile(const G3D::Vector3& p) const +bool PathGenerator::HaveTile(G3D::Vector3 const& p) const { int tx = -1, ty = -1; float point[VERTEX_SIZE] = { p.y, p.z, p.x }; diff --git a/src/server/game/Movement/MovementGenerators/PointMovementGenerator.h b/src/server/game/Movement/MovementGenerators/PointMovementGenerator.h index b30db5ed2..5099c1b36 100644 --- a/src/server/game/Movement/MovementGenerators/PointMovementGenerator.h +++ b/src/server/game/Movement/MovementGenerators/PointMovementGenerator.h @@ -27,7 +27,7 @@ template class PointMovementGenerator : public MovementGeneratorMedium< T, PointMovementGenerator > { public: - PointMovementGenerator(uint32 _id, float _x, float _y, float _z, ForcedMovement forcedMovement, float _speed = 0.0f, float orientation = 0.0f, const Movement::PointsArray* _path = nullptr, + PointMovementGenerator(uint32 _id, float _x, float _y, float _z, ForcedMovement forcedMovement, float _speed = 0.0f, float orientation = 0.0f, Movement::PointsArray const* _path = nullptr, bool generatePath = false, bool forceDestination = false, std::optional animTier = std::nullopt, ObjectGuid chargeTargetGUID = ObjectGuid::Empty, bool reverseOrientation = false, ObjectGuid facingTargetGuid = ObjectGuid()) : id(_id), i_x(_x), i_y(_y), i_z(_z), speed(_speed), i_orientation(orientation), _generatePath(generatePath), _forceDestination(forceDestination), _reverseOrientation(reverseOrientation), _chargeTargetGUID(chargeTargetGUID), _forcedMovement(forcedMovement), _facingTargetGuid(facingTargetGuid), _animTier(animTier) diff --git a/src/server/game/Movement/Spline/MoveSpline.cpp b/src/server/game/Movement/Spline/MoveSpline.cpp index f10f055be..1ef4ea3d8 100644 --- a/src/server/game/Movement/Spline/MoveSpline.cpp +++ b/src/server/game/Movement/Spline/MoveSpline.cpp @@ -119,7 +119,7 @@ namespace Movement int32 _time; }; - void MoveSpline::init_spline(const MoveSplineInitArgs& args) + void MoveSpline::init_spline(MoveSplineInitArgs const& args) { const SplineBase::EvaluationMode modes[2] = {SplineBase::ModeLinear, SplineBase::ModeCatmullrom}; if (args.flags.cyclic) diff --git a/src/server/game/Movement/Spline/MoveSpline.h b/src/server/game/Movement/Spline/MoveSpline.h index 07cfcb41f..2261f47f7 100644 --- a/src/server/game/Movement/Spline/MoveSpline.h +++ b/src/server/game/Movement/Spline/MoveSpline.h @@ -27,8 +27,8 @@ namespace Movement { Location() = default; Location(float x, float y, float z, float o) : Vector3(x, y, z), orientation(o) {} - Location(const Vector3& v) : Vector3(v) {} - Location(const Vector3& v, float o) : Vector3(v), orientation(o) {} + Location(Vector3 const& v) : Vector3(v) {} + Location(Vector3 const& v, float o) : Vector3(v), orientation(o) {} float orientation{0}; }; @@ -69,10 +69,10 @@ namespace Movement int32 point_Idx; int32 point_Idx_offset; - void init_spline(const MoveSplineInitArgs& args); + void init_spline(MoveSplineInitArgs const& args); protected: - [[nodiscard]] const MySpline::ControlArray& getPath() const { return spline.getPoints(); } + [[nodiscard]] MySpline::ControlArray const& getPath() const { return spline.getPoints(); } void computeParabolicElevation(float& el) const; void computeFallElevation(float& el) const; @@ -91,7 +91,7 @@ namespace Movement void _Interrupt() { splineflags.done = true; } public: - void Initialize(const MoveSplineInitArgs&); + void Initialize(MoveSplineInitArgs const&); [[nodiscard]] bool Initialized() const { return !spline.empty(); } MoveSpline(); diff --git a/src/server/game/Movement/Spline/MoveSplineFlag.h b/src/server/game/Movement/Spline/MoveSplineFlag.h index 08c9c3d6a..d8bbeef52 100644 --- a/src/server/game/Movement/Spline/MoveSplineFlag.h +++ b/src/server/game/Movement/Spline/MoveSplineFlag.h @@ -74,13 +74,13 @@ namespace Movement }; inline uint32& raw() { return (uint32&) * this; } - [[nodiscard]] inline const uint32& raw() const { return (const uint32&) * this; } + [[nodiscard]] inline uint32 const& raw() const { return (uint32 const&) * this; } MoveSplineFlag() { raw() = 0; } MoveSplineFlag(uint32 f) { raw() = f; } - MoveSplineFlag(const MoveSplineFlag& f) { raw() = f.raw(); } + MoveSplineFlag(MoveSplineFlag const& f) { raw() = f.raw(); } MoveSplineFlag(MoveSplineFlag&&) = default; - MoveSplineFlag& operator=(const MoveSplineFlag&) = default; + MoveSplineFlag& operator=(MoveSplineFlag const&) = default; MoveSplineFlag& operator=(MoveSplineFlag&&) = default; // Constant interface diff --git a/src/server/game/Movement/Spline/MoveSplineInit.cpp b/src/server/game/Movement/Spline/MoveSplineInit.cpp index 16b58a45d..d28b07425 100644 --- a/src/server/game/Movement/Spline/MoveSplineInit.cpp +++ b/src/server/game/Movement/Spline/MoveSplineInit.cpp @@ -218,7 +218,7 @@ namespace Movement args.path[1] = transform(dest); } - void MoveSplineInit::MoveTo(const Vector3& dest, bool generatePath, bool forceDestination) + void MoveSplineInit::MoveTo(Vector3 const& dest, bool generatePath, bool forceDestination) { if (generatePath) { diff --git a/src/server/game/Movement/Spline/MoveSplineInit.h b/src/server/game/Movement/Spline/MoveSplineInit.h index 16120d9bb..01c4dfef7 100644 --- a/src/server/game/Movement/Spline/MoveSplineInit.h +++ b/src/server/game/Movement/Spline/MoveSplineInit.h @@ -95,12 +95,12 @@ namespace Movement * @param path - array of points, shouldn't be empty * @param pointId - Id of fisrt point of the path. Example: when third path point will be done it will notify that pointId + 3 done */ - void MovebyPath(const PointsArray& path, int32 pointId = 0); + void MovebyPath(PointsArray const& path, int32 pointId = 0); /* Initializes simple A to B motion, A is current unit's position, B is destination */ void MoveTo(Vector3 const& start, Vector3 const& destination, bool generatePath = true, bool forceDestination = false); - void MoveTo(const Vector3& destination, bool generatePath = false, bool forceDestination = false); + void MoveTo(Vector3 const& destination, bool generatePath = false, bool forceDestination = false); void MoveTo(float x, float y, float z, bool generatePath = false, bool forceDestination = false); /* Sets Id of fisrt point of the path. When N-th path point will be done ILisener will notify that pointId + N done @@ -165,7 +165,7 @@ namespace Movement inline void MoveSplineInit::SetTransportExit() { args.flags.EnableTransportExit(); } inline void MoveSplineInit::SetOrientationFixed(bool enable) { args.flags.orientationFixed = enable; } - inline void MoveSplineInit::MovebyPath(const PointsArray& controls, int32 path_offset) + inline void MoveSplineInit::MovebyPath(PointsArray const& controls, int32 path_offset) { args.path_Idx_offset = path_offset; args.path.resize(controls.size()); diff --git a/src/server/game/Movement/Spline/MovementPacketBuilder.cpp b/src/server/game/Movement/Spline/MovementPacketBuilder.cpp index 7aa6838d8..593dd6973 100644 --- a/src/server/game/Movement/Spline/MovementPacketBuilder.cpp +++ b/src/server/game/Movement/Spline/MovementPacketBuilder.cpp @@ -21,7 +21,7 @@ namespace Movement { - inline void operator << (ByteBuffer& b, const Vector3& v) + inline void operator << (ByteBuffer& b, Vector3 const& v) { b << v.x << v.y << v.z; } @@ -40,7 +40,7 @@ namespace Movement MonsterMoveFacingAngle = 4 }; - void PacketBuilder::WriteCommonMonsterMovePart(const MoveSpline& move_spline, ByteBuffer& data) + void PacketBuilder::WriteCommonMonsterMovePart(MoveSpline const& move_spline, ByteBuffer& data) { MoveSplineFlag splineflags = move_spline.splineflags; @@ -96,10 +96,10 @@ namespace Movement data << uint8(MonsterMoveStop); } - void WriteLinearPath(const Spline& spline, ByteBuffer& data) + void WriteLinearPath(Spline const& spline, ByteBuffer& data) { uint32 last_idx = spline.getPointCount() - 3; - const Vector3* real_path = &spline.getPoint(1); + Vector3 const* real_path = &spline.getPoint(1); data << last_idx; data << real_path[last_idx]; // destination @@ -116,14 +116,14 @@ namespace Movement } } - void WriteCatmullRomPath(const Spline& spline, ByteBuffer& data) + void WriteCatmullRomPath(Spline const& spline, ByteBuffer& data) { uint32 count = spline.getPointCount() - 3; data << count; data.append(&spline.getPoint(2), count); } - void WriteCatmullRomCyclicPath(const Spline& spline, ByteBuffer& data, bool flying) + void WriteCatmullRomCyclicPath(Spline const& spline, ByteBuffer& data, bool flying) { uint32 count = spline.getPointCount() - 3; data << uint32(count + 1); @@ -139,11 +139,11 @@ namespace Movement } } - void PacketBuilder::WriteMonsterMove(const MoveSpline& move_spline, ByteBuffer& data) + void PacketBuilder::WriteMonsterMove(MoveSpline const& move_spline, ByteBuffer& data) { WriteCommonMonsterMovePart(move_spline, data); - const Spline& spline = move_spline.spline; + Spline const& spline = move_spline.spline; MoveSplineFlag splineflags = move_spline.splineflags; if (splineflags & MoveSplineFlag::Mask_CatmullRom) { @@ -156,7 +156,7 @@ namespace Movement WriteLinearPath(spline, data); } - void PacketBuilder::WriteCreate(const MoveSpline& move_spline, ByteBuffer& data) + void PacketBuilder::WriteCreate(MoveSpline const& move_spline, ByteBuffer& data) { //WriteClientStatus(mov, data); //data.append(&mov.m_float_values[SpeedWalk], SpeedMaxCount); diff --git a/src/server/game/Movement/Spline/MovementPacketBuilder.h b/src/server/game/Movement/Spline/MovementPacketBuilder.h index 7177f7274..7160f0b00 100644 --- a/src/server/game/Movement/Spline/MovementPacketBuilder.h +++ b/src/server/game/Movement/Spline/MovementPacketBuilder.h @@ -33,11 +33,11 @@ namespace Movement class MoveSpline; class PacketBuilder { - static void WriteCommonMonsterMovePart(const MoveSpline& mov, ByteBuffer& data); + static void WriteCommonMonsterMovePart(MoveSpline const& mov, ByteBuffer& data); public: - static void WriteMonsterMove(const MoveSpline& mov, ByteBuffer& data); + static void WriteMonsterMove(MoveSpline const& mov, ByteBuffer& data); static void WriteStopMovement(Vector3 const& loc, uint32 splineId, ByteBuffer& data); - static void WriteCreate(const MoveSpline& mov, ByteBuffer& data); + static void WriteCreate(MoveSpline const& mov, ByteBuffer& data); }; } #endif // AC_PACKET_BUILDER_H diff --git a/src/server/game/Movement/Spline/Spline.cpp b/src/server/game/Movement/Spline/Spline.cpp index 5baf32027..c33b5abb6 100644 --- a/src/server/game/Movement/Spline/Spline.cpp +++ b/src/server/game/Movement/Spline/Spline.cpp @@ -94,7 +94,7 @@ namespace Movement position.z = z; }*/ - inline void C_Evaluate(const Vector3* vertice, float t, const Matrix4& matr, Vector3& result) + inline void C_Evaluate(Vector3 const* vertice, float t, Matrix4 const& matr, Vector3& result) { Vector4 tvec(t * t * t, t * t, t, 1.f); Vector4 weights(tvec * matr); @@ -103,7 +103,7 @@ namespace Movement + vertice[2] * weights[2] + vertice[3] * weights[3]; } - inline void C_Evaluate_Derivative(const Vector3* vertice, float t, const Matrix4& matr, Vector3& result) + inline void C_Evaluate_Derivative(Vector3 const* vertice, float t, Matrix4 const& matr, Vector3& result) { Vector4 tvec(3.f * t * t, 2.f * t, 1.f, 0.f); Vector4 weights(tvec * matr); @@ -161,7 +161,7 @@ namespace Movement ASSERT(index >= index_lo && index < index_hi); Vector3 curPos, nextPos; - const Vector3* p = &points[index - 1]; + Vector3 const* p = &points[index - 1]; curPos = nextPos = p[1]; index_type i = 1; @@ -182,7 +182,7 @@ namespace Movement ASSERT(index >= index_lo && index < index_hi); Vector3 curPos, nextPos; - const Vector3* p = &points[index]; + Vector3 const* p = &points[index]; C_Evaluate(p, 0.f, s_Bezier3Coeffs, nextPos); curPos = nextPos; @@ -199,7 +199,7 @@ namespace Movement return length; } - void SplineBase::init_spline(const Vector3* controls, index_type count, EvaluationMode m, float orientation) + void SplineBase::init_spline(Vector3 const* controls, index_type count, EvaluationMode m, float orientation) { m_mode = m; cyclic = false; @@ -208,7 +208,7 @@ namespace Movement (this->*initializers[m_mode])(controls, count, cyclic, 0); } - void SplineBase::init_cyclic_spline(const Vector3* controls, index_type count, EvaluationMode m, index_type cyclic_point, float orientation) + void SplineBase::init_cyclic_spline(Vector3 const* controls, index_type count, EvaluationMode m, index_type cyclic_point, float orientation) { m_mode = m; cyclic = true; @@ -217,7 +217,7 @@ namespace Movement (this->*initializers[m_mode])(controls, count, cyclic, cyclic_point); } - void SplineBase::InitLinear(const Vector3* controls, index_type count, bool cyclic, index_type cyclic_point) + void SplineBase::InitLinear(Vector3 const* controls, index_type count, bool cyclic, index_type cyclic_point) { ASSERT(count >= 2); const int real_size = count + 1; @@ -237,7 +237,7 @@ namespace Movement index_hi = cyclic ? count : (count - 1); } - void SplineBase::InitCatmullRom(const Vector3* controls, index_type count, bool cyclic, index_type cyclic_point) + void SplineBase::InitCatmullRom(Vector3 const* controls, index_type count, bool cyclic, index_type cyclic_point) { const int real_size = count + (cyclic ? (1 + 2) : (1 + 1)); @@ -274,7 +274,7 @@ namespace Movement index_hi = high_index + (cyclic ? 1 : 0); } - void SplineBase::InitBezier3(const Vector3* controls, index_type count, bool /*cyclic*/, index_type /*cyclic_point*/) + void SplineBase::InitBezier3(Vector3 const* controls, index_type count, bool /*cyclic*/, index_type /*cyclic_point*/) { index_type c = count / 3u * 3u; index_type t = c / 3u; @@ -297,7 +297,7 @@ namespace Movement std::string SplineBase::ToString() const { std::stringstream str; - const char* mode_str[ModesEnd] = {"Linear", "CatmullRom", "Bezier3", "Uninitialized"}; + char const* mode_str[ModesEnd] = {"Linear", "CatmullRom", "Bezier3", "Uninitialized"}; index_type count = this->points.size(); str << "mode: " << mode_str[mode()] << std::endl; diff --git a/src/server/game/Movement/Spline/Spline.h b/src/server/game/Movement/Spline/Spline.h index ef0b6aee5..e5c5e2c27 100644 --- a/src/server/game/Movement/Spline/Spline.h +++ b/src/server/game/Movement/Spline/Spline.h @@ -78,10 +78,10 @@ namespace Movement typedef float (SplineBase::*SegLenghtMethtod)(index_type) const; static SegLenghtMethtod seglengths[ModesEnd]; - void InitLinear(const Vector3*, index_type, bool, index_type); - void InitCatmullRom(const Vector3*, index_type, bool, index_type); - void InitBezier3(const Vector3*, index_type, bool, index_type); - typedef void (SplineBase::*InitMethtod)(const Vector3*, index_type, bool, index_type); + void InitLinear(Vector3 const*, index_type, bool, index_type); + void InitCatmullRom(Vector3 const*, index_type, bool, index_type); + void InitBezier3(Vector3 const*, index_type, bool, index_type); + typedef void (SplineBase::*InitMethtod)(Vector3 const*, index_type, bool, index_type); static InitMethtod initializers[ModesEnd]; void UninitializedSplineEvaluationMethod(index_type, float, Vector3&) const { ABORT(); } @@ -112,13 +112,13 @@ namespace Movement [[nodiscard]] bool isCyclic() const { return cyclic;} // Xinef: DO NOT USE EXCEPT FOR SPLINE INITIALIZATION!!!!!! - [[nodiscard]] const ControlArray& getPoints() const { return points;} + [[nodiscard]] ControlArray const& getPoints() const { return points;} [[nodiscard]] index_type getPointCount() const { return points.size();} - [[nodiscard]] const Vector3& getPoint(index_type i) const { return points[i];} + [[nodiscard]] Vector3 const& getPoint(index_type i) const { return points[i];} /** Initializes spline. Don't call other methods while spline not initialized. */ - void init_spline(const Vector3* controls, index_type count, EvaluationMode m, float orientation); - void init_cyclic_spline(const Vector3* controls, index_type count, EvaluationMode m, index_type cyclic_point, float orientation); + void init_spline(Vector3 const* controls, index_type count, EvaluationMode m, float orientation); + void init_cyclic_spline(Vector3 const* controls, index_type count, EvaluationMode m, index_type cyclic_point, float orientation); /** As i can see there are a lot of ways how spline can be initialized would be no harm to have some custom initializers. */ @@ -171,8 +171,8 @@ namespace Movement void computeIndex(float t, index_type& out_idx, float& out_u) const; /** Initializes spline. Don't call other methods while spline not initialized. */ - void init_spline(const Vector3* controls, index_type count, EvaluationMode m, float orientation = 0) { SplineBase::init_spline(controls, count, m, orientation);} - void init_cyclic_spline(const Vector3* controls, index_type count, EvaluationMode m, index_type cyclic_point, float orientation = 0) { SplineBase::init_cyclic_spline(controls, count, m, cyclic_point, orientation);} + void init_spline(Vector3 const* controls, index_type count, EvaluationMode m, float orientation = 0) { SplineBase::init_spline(controls, count, m, orientation);} + void init_cyclic_spline(Vector3 const* controls, index_type count, EvaluationMode m, index_type cyclic_point, float orientation = 0) { SplineBase::init_cyclic_spline(controls, count, m, cyclic_point, orientation);} /** Initializes lengths with SplineBase::SegLength method. */ void initLengths(); diff --git a/src/server/game/OutdoorPvP/OutdoorPvP.cpp b/src/server/game/OutdoorPvP/OutdoorPvP.cpp index fcc5de454..6ea63c3ab 100644 --- a/src/server/game/OutdoorPvP/OutdoorPvP.cpp +++ b/src/server/game/OutdoorPvP/OutdoorPvP.cpp @@ -73,7 +73,7 @@ void OPvPCapturePoint::AddGO(uint32 type, ObjectGuid::LowType guid, uint32 entry { if (!entry) { - const GameObjectData* data = sObjectMgr->GetGameObjectData(guid); + GameObjectData const* data = sObjectMgr->GetGameObjectData(guid); if (!data) { return; @@ -90,7 +90,7 @@ void OPvPCapturePoint::AddCre(uint32 type, ObjectGuid::LowType guid, uint32 entr { if (!entry) { - const CreatureData* data = sObjectMgr->GetCreatureData(guid); + CreatureData const* data = sObjectMgr->GetCreatureData(guid); if (!data) { return; diff --git a/src/server/game/Quests/QuestDef.cpp b/src/server/game/Quests/QuestDef.cpp index 867471737..80149f93e 100644 --- a/src/server/game/Quests/QuestDef.cpp +++ b/src/server/game/Quests/QuestDef.cpp @@ -199,7 +199,7 @@ void Quest::LoadQuestTemplateAddon(Field* fields) uint32 Quest::XPValue(uint8 playerLevel) const { int32 quest_level = (Level == -1 ? playerLevel : Level); - const QuestXPEntry* xpentry = sQuestXPStore.LookupEntry(quest_level); + QuestXPEntry const* xpentry = sQuestXPStore.LookupEntry(quest_level); if (!xpentry) { return 0; diff --git a/src/server/game/Reputation/ReputationMgr.cpp b/src/server/game/Reputation/ReputationMgr.cpp index a02c3b604..4c1c9eb65 100644 --- a/src/server/game/Reputation/ReputationMgr.cpp +++ b/src/server/game/Reputation/ReputationMgr.cpp @@ -301,7 +301,7 @@ bool ReputationMgr::SetReputation(FactionEntry const* factionEntry, float standi if (!noSpillOver) { // if spillover definition exists in DB, override DBC - if (const RepSpilloverTemplate* repTemplate = sObjectMgr->GetRepSpilloverTemplate(factionEntry->ID)) + if (RepSpilloverTemplate const* repTemplate = sObjectMgr->GetRepSpilloverTemplate(factionEntry->ID)) { for (uint32 i = 0; i < MAX_SPILLOVER_FACTIONS; ++i) { diff --git a/src/server/game/Scripting/MapScripts.cpp b/src/server/game/Scripting/MapScripts.cpp index 321b02c92..579bf471d 100644 --- a/src/server/game/Scripting/MapScripts.cpp +++ b/src/server/game/Scripting/MapScripts.cpp @@ -95,7 +95,7 @@ void Map::ScriptCommandStart(ScriptInfo const& script, uint32 delay, Object* sou } // Helpers for ScriptProcess method. -inline Player* Map::_GetScriptPlayerSourceOrTarget(Object* source, Object* target, const ScriptInfo* scriptInfo) const +inline Player* Map::_GetScriptPlayerSourceOrTarget(Object* source, Object* target, ScriptInfo const* scriptInfo) const { Player* player = nullptr; if (!source && !target) @@ -117,7 +117,7 @@ inline Player* Map::_GetScriptPlayerSourceOrTarget(Object* source, Object* targe return player; } -inline Creature* Map::_GetScriptCreatureSourceOrTarget(Object* source, Object* target, const ScriptInfo* scriptInfo, bool bReverse) const +inline Creature* Map::_GetScriptCreatureSourceOrTarget(Object* source, Object* target, ScriptInfo const* scriptInfo, bool bReverse) const { Creature* creature = nullptr; if (!source && !target) @@ -150,7 +150,7 @@ inline Creature* Map::_GetScriptCreatureSourceOrTarget(Object* source, Object* t return creature; } -inline Unit* Map::_GetScriptUnit(Object* obj, bool isSource, const ScriptInfo* scriptInfo) const +inline Unit* Map::_GetScriptUnit(Object* obj, bool isSource, ScriptInfo const* scriptInfo) const { Unit* unit = nullptr; if (!obj) @@ -168,7 +168,7 @@ inline Unit* Map::_GetScriptUnit(Object* obj, bool isSource, const ScriptInfo* s return unit; } -inline Player* Map::_GetScriptPlayer(Object* obj, bool isSource, const ScriptInfo* scriptInfo) const +inline Player* Map::_GetScriptPlayer(Object* obj, bool isSource, ScriptInfo const* scriptInfo) const { Player* player = nullptr; if (!obj) @@ -183,7 +183,7 @@ inline Player* Map::_GetScriptPlayer(Object* obj, bool isSource, const ScriptInf return player; } -inline Creature* Map::_GetScriptCreature(Object* obj, bool isSource, const ScriptInfo* scriptInfo) const +inline Creature* Map::_GetScriptCreature(Object* obj, bool isSource, ScriptInfo const* scriptInfo) const { Creature* creature = nullptr; if (!obj) @@ -198,7 +198,7 @@ inline Creature* Map::_GetScriptCreature(Object* obj, bool isSource, const Scrip return creature; } -inline WorldObject* Map::_GetScriptWorldObject(Object* obj, bool isSource, const ScriptInfo* scriptInfo) const +inline WorldObject* Map::_GetScriptWorldObject(Object* obj, bool isSource, ScriptInfo const* scriptInfo) const { WorldObject* pWorldObject = nullptr; if (!obj) @@ -214,7 +214,7 @@ inline WorldObject* Map::_GetScriptWorldObject(Object* obj, bool isSource, const return pWorldObject; } -inline void Map::_ScriptProcessDoor(Object* source, Object* target, const ScriptInfo* scriptInfo) const +inline void Map::_ScriptProcessDoor(Object* source, Object* target, ScriptInfo const* scriptInfo) const { bool bOpen = false; ObjectGuid::LowType guid = scriptInfo->ToggleDoor.GOGuid; diff --git a/src/server/game/Scripting/ScriptDefines/ALEScript.cpp b/src/server/game/Scripting/ScriptDefines/ALEScript.cpp index 480ddaa51..9a0fb6728 100644 --- a/src/server/game/Scripting/ScriptDefines/ALEScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/ALEScript.cpp @@ -18,7 +18,7 @@ #include "ALEScript.h" #include "ScriptMgr.h" -ALEScript::ALEScript(const char* name) : ScriptObject(name) +ALEScript::ALEScript(char const* name) : ScriptObject(name) { ScriptRegistry::AddScript(this); } diff --git a/src/server/game/Scripting/ScriptDefines/ALEScript.h b/src/server/game/Scripting/ScriptDefines/ALEScript.h index a95c05d48..eb765b011 100644 --- a/src/server/game/Scripting/ScriptDefines/ALEScript.h +++ b/src/server/game/Scripting/ScriptDefines/ALEScript.h @@ -23,7 +23,7 @@ class ALEScript : public ScriptObject { protected: - ALEScript(const char* name); + ALEScript(char const* name); public: /** diff --git a/src/server/game/Scripting/ScriptDefines/AccountScript.h b/src/server/game/Scripting/ScriptDefines/AccountScript.h index 038663ee3..049ca6bfa 100644 --- a/src/server/game/Scripting/ScriptDefines/AccountScript.h +++ b/src/server/game/Scripting/ScriptDefines/AccountScript.h @@ -38,7 +38,7 @@ enum AccountHook class AccountScript : public ScriptObject { protected: - AccountScript(const char* name, std::vector enabledHooks = std::vector()); + AccountScript(char const* name, std::vector enabledHooks = std::vector()); public: // Called when an account logged in successfully diff --git a/src/server/game/Scripting/ScriptDefines/AchievementCriteriaScript.h b/src/server/game/Scripting/ScriptDefines/AchievementCriteriaScript.h index 9de6ad446..7d248fd86 100644 --- a/src/server/game/Scripting/ScriptDefines/AchievementCriteriaScript.h +++ b/src/server/game/Scripting/ScriptDefines/AchievementCriteriaScript.h @@ -23,7 +23,7 @@ class AchievementCriteriaScript : public ScriptObject { protected: - AchievementCriteriaScript(const char* name); + AchievementCriteriaScript(char const* name); public: [[nodiscard]] bool IsDatabaseBound() const override { return true; } diff --git a/src/server/game/Scripting/ScriptDefines/AchievementScript.cpp b/src/server/game/Scripting/ScriptDefines/AchievementScript.cpp index af8490737..84cebfe1f 100644 --- a/src/server/game/Scripting/ScriptDefines/AchievementScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/AchievementScript.cpp @@ -44,7 +44,7 @@ bool ScriptMgr::CanCheckCriteria(AchievementMgr* mgr, AchievementCriteriaEntry c CALL_ENABLED_BOOLEAN_HOOKS(AchievementScript, ACHIEVEMENTHOOK_CAN_CHECK_CRITERIA, !script->CanCheckCriteria(mgr, achievementCriteria)); } -AchievementScript::AchievementScript(const char* name, std::vector enabledHooks) +AchievementScript::AchievementScript(char const* name, std::vector enabledHooks) : ScriptObject(name, ACHIEVEMENTHOOK_END) { // If empty - enable all available hooks. diff --git a/src/server/game/Scripting/ScriptDefines/AchievementScript.h b/src/server/game/Scripting/ScriptDefines/AchievementScript.h index 04c7e6204..8280a0935 100644 --- a/src/server/game/Scripting/ScriptDefines/AchievementScript.h +++ b/src/server/game/Scripting/ScriptDefines/AchievementScript.h @@ -36,7 +36,7 @@ enum AchievementHook class AchievementScript : public ScriptObject { protected: - AchievementScript(const char* name, std::vector enabledHooks = std::vector()); + AchievementScript(char const* name, std::vector enabledHooks = std::vector()); public: [[nodiscard]] bool IsDatabaseBound() const override { return false; } diff --git a/src/server/game/Scripting/ScriptDefines/AllBattlegroundScript.h b/src/server/game/Scripting/ScriptDefines/AllBattlegroundScript.h index f1aaca7b3..2c164b49d 100644 --- a/src/server/game/Scripting/ScriptDefines/AllBattlegroundScript.h +++ b/src/server/game/Scripting/ScriptDefines/AllBattlegroundScript.h @@ -57,7 +57,7 @@ struct GroupQueueInfo; class AllBattlegroundScript : public ScriptObject { protected: - AllBattlegroundScript(const char* name, std::vector enabledHooks = std::vector()); + AllBattlegroundScript(char const* name, std::vector enabledHooks = std::vector()); public: [[nodiscard]] bool IsDatabaseBound() const override { return false; } diff --git a/src/server/game/Scripting/ScriptDefines/AllCommandScript.cpp b/src/server/game/Scripting/ScriptDefines/AllCommandScript.cpp index 0a5e795bb..e535f6276 100644 --- a/src/server/game/Scripting/ScriptDefines/AllCommandScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/AllCommandScript.cpp @@ -35,7 +35,7 @@ bool ScriptMgr::OnBeforeIsInvokerVisible(std::string name, Acore::Impl::ChatComm CALL_ENABLED_BOOLEAN_HOOKS(AllCommandScript, ALLCOMMANDHOOK_ON_BEFORE_IS_INVOKER_VISIBLE, !script->OnBeforeIsInvokerVisible(name, permissions, who)); } -AllCommandScript::AllCommandScript(const char* name, std::vector enabledHooks) +AllCommandScript::AllCommandScript(char const* name, std::vector enabledHooks) : ScriptObject(name, ALLCOMMANDHOOK_END) { // If empty - enable all available hooks. diff --git a/src/server/game/Scripting/ScriptDefines/AllCommandScript.h b/src/server/game/Scripting/ScriptDefines/AllCommandScript.h index 87d124739..9420f3078 100644 --- a/src/server/game/Scripting/ScriptDefines/AllCommandScript.h +++ b/src/server/game/Scripting/ScriptDefines/AllCommandScript.h @@ -33,7 +33,7 @@ enum AllCommandHook class AllCommandScript : public ScriptObject { protected: - AllCommandScript(const char* name, std::vector enabledHooks = std::vector()); + AllCommandScript(char const* name, std::vector enabledHooks = std::vector()); public: [[nodiscard]] bool IsDatabaseBound() const override { return false; } diff --git a/src/server/game/Scripting/ScriptDefines/AllCreatureScript.cpp b/src/server/game/Scripting/ScriptDefines/AllCreatureScript.cpp index 1093a4479..119809d48 100644 --- a/src/server/game/Scripting/ScriptDefines/AllCreatureScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/AllCreatureScript.cpp @@ -49,7 +49,7 @@ void ScriptMgr::OnCreatureSaveToDB(Creature* creature) }); } -void ScriptMgr::OnBeforeCreatureSelectLevel(const CreatureTemplate* cinfo, Creature* creature, uint8& level) +void ScriptMgr::OnBeforeCreatureSelectLevel(CreatureTemplate const* cinfo, Creature* creature, uint8& level) { ExecuteScript([&](AllCreatureScript* script) { @@ -57,7 +57,7 @@ void ScriptMgr::OnBeforeCreatureSelectLevel(const CreatureTemplate* cinfo, Creat }); } -void ScriptMgr::OnCreatureSelectLevel(const CreatureTemplate* cinfo, Creature* creature) +void ScriptMgr::OnCreatureSelectLevel(CreatureTemplate const* cinfo, Creature* creature) { ExecuteScript([&](AllCreatureScript* script) { @@ -78,7 +78,7 @@ void ScriptMgr::OnCreatureSelectLevel(const CreatureTemplate* cinfo, Creature* c // return true; //} -AllCreatureScript::AllCreatureScript(const char* name) : +AllCreatureScript::AllCreatureScript(char const* name) : ScriptObject(name) { ScriptRegistry::AddScript(this); diff --git a/src/server/game/Scripting/ScriptDefines/AllCreatureScript.h b/src/server/game/Scripting/ScriptDefines/AllCreatureScript.h index d734f06c3..30d1e187a 100644 --- a/src/server/game/Scripting/ScriptDefines/AllCreatureScript.h +++ b/src/server/game/Scripting/ScriptDefines/AllCreatureScript.h @@ -23,17 +23,17 @@ class AllCreatureScript : public ScriptObject { protected: - AllCreatureScript(const char* name); + AllCreatureScript(char const* name); public: // Called from End of Creature Update. virtual void OnAllCreatureUpdate(Creature* /*creature*/, uint32 /*diff*/) { } // Called just before the level of the creature is set. - virtual void OnBeforeCreatureSelectLevel(const CreatureTemplate* /*cinfo*/, Creature* /*creature*/, uint8& /*level*/) { } + virtual void OnBeforeCreatureSelectLevel(CreatureTemplate const* /*cinfo*/, Creature* /*creature*/, uint8& /*level*/) { } // Called from End of Creature SelectLevel. - virtual void OnCreatureSelectLevel(const CreatureTemplate* /*cinfo*/, Creature* /*creature*/) { } + virtual void OnCreatureSelectLevel(CreatureTemplate const* /*cinfo*/, Creature* /*creature*/) { } /** * @brief This hook runs after add creature in world @@ -89,7 +89,7 @@ public: * * @return True if you want to continue, false if you want to disable */ - [[nodiscard]] virtual bool CanCreatureGossipSelectCode(Player* /*player*/, Creature* /*creature*/, uint32 /*sender*/, uint32 /*action*/, const char* /*code*/) { return false; } + [[nodiscard]] virtual bool CanCreatureGossipSelectCode(Player* /*player*/, Creature* /*creature*/, uint32 /*sender*/, uint32 /*action*/, char const* /*code*/) { return false; } // Called when a player accepts a quest from the creature. [[nodiscard]] virtual bool CanCreatureQuestAccept(Player* /*player*/, Creature* /*creature*/, Quest const* /*quest*/) { return false; } diff --git a/src/server/game/Scripting/ScriptDefines/AllGameObjectScript.cpp b/src/server/game/Scripting/ScriptDefines/AllGameObjectScript.cpp index 2a1f09d67..5052712a9 100644 --- a/src/server/game/Scripting/ScriptDefines/AllGameObjectScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/AllGameObjectScript.cpp @@ -49,7 +49,7 @@ void ScriptMgr::OnGameObjectSaveToDB(GameObject* go) }); } -AllGameObjectScript::AllGameObjectScript(const char* name) : +AllGameObjectScript::AllGameObjectScript(char const* name) : ScriptObject(name) { ScriptRegistry::AddScript(this); diff --git a/src/server/game/Scripting/ScriptDefines/AllGameObjectScript.h b/src/server/game/Scripting/ScriptDefines/AllGameObjectScript.h index 496bc5300..3595f0e0b 100644 --- a/src/server/game/Scripting/ScriptDefines/AllGameObjectScript.h +++ b/src/server/game/Scripting/ScriptDefines/AllGameObjectScript.h @@ -23,7 +23,7 @@ class AllGameObjectScript : public ScriptObject { protected: - AllGameObjectScript(const char* name); + AllGameObjectScript(char const* name); public: /** @@ -59,7 +59,7 @@ public: [[nodiscard]] virtual bool CanGameObjectGossipSelect(Player* /*player*/, GameObject* /*go*/, uint32 /*sender*/, uint32 /*action*/) { return false; } // Called when a player selects a gossip with a code in the gameobject's gossip menu. - [[nodiscard]] virtual bool CanGameObjectGossipSelectCode(Player* /*player*/, GameObject* /*go*/, uint32 /*sender*/, uint32 /*action*/, const char* /*code*/) { return false; } + [[nodiscard]] virtual bool CanGameObjectGossipSelectCode(Player* /*player*/, GameObject* /*go*/, uint32 /*sender*/, uint32 /*action*/, char const* /*code*/) { return false; } // Called when a player accepts a quest from the gameobject. [[nodiscard]] virtual bool CanGameObjectQuestAccept(Player* /*player*/, GameObject* /*go*/, Quest const* /*quest*/) { return false; } diff --git a/src/server/game/Scripting/ScriptDefines/AllItemScript.cpp b/src/server/game/Scripting/ScriptDefines/AllItemScript.cpp index ecc51c5cd..a34081ab3 100644 --- a/src/server/game/Scripting/ScriptDefines/AllItemScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/AllItemScript.cpp @@ -126,7 +126,7 @@ void ScriptMgr::OnGossipSelect(Player* player, Item* item, uint32 sender, uint32 } } -void ScriptMgr::OnGossipSelectCode(Player* player, Item* item, uint32 sender, uint32 action, const char* code) +void ScriptMgr::OnGossipSelectCode(Player* player, Item* item, uint32 sender, uint32 action, char const* code) { ASSERT(player); ASSERT(item); @@ -142,13 +142,13 @@ void ScriptMgr::OnGossipSelectCode(Player* player, Item* item, uint32 sender, ui } } -AllItemScript::AllItemScript(const char* name) : +AllItemScript::AllItemScript(char const* name) : ScriptObject(name) { ScriptRegistry::AddScript(this); } -ItemScript::ItemScript(const char* name) : +ItemScript::ItemScript(char const* name) : ScriptObject(name) { ScriptRegistry::AddScript(this); diff --git a/src/server/game/Scripting/ScriptDefines/AllItemScript.h b/src/server/game/Scripting/ScriptDefines/AllItemScript.h index c28cf6acb..775c30445 100644 --- a/src/server/game/Scripting/ScriptDefines/AllItemScript.h +++ b/src/server/game/Scripting/ScriptDefines/AllItemScript.h @@ -23,7 +23,7 @@ class AllItemScript : public ScriptObject { protected: - AllItemScript(const char* name); + AllItemScript(char const* name); public: // Called when a player accepts a quest from the item. @@ -42,7 +42,7 @@ public: virtual void OnItemGossipSelect(Player* /*player*/, Item* /*item*/, uint32 /*sender*/, uint32 /*action*/) { } // Called when a player selects an option in an item gossip window - virtual void OnItemGossipSelectCode(Player* /*player*/, Item* /*item*/, uint32 /*sender*/, uint32 /*action*/, const char* /*code*/) { } + virtual void OnItemGossipSelectCode(Player* /*player*/, Item* /*item*/, uint32 /*sender*/, uint32 /*action*/, char const* /*code*/) { } }; #endif diff --git a/src/server/game/Scripting/ScriptDefines/AllMapScript.cpp b/src/server/game/Scripting/ScriptDefines/AllMapScript.cpp index 5f14b352d..f30b91680 100644 --- a/src/server/game/Scripting/ScriptDefines/AllMapScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/AllMapScript.cpp @@ -273,7 +273,7 @@ void ScriptMgr::OnDestroyInstance(MapInstanced* mapInstanced, Map* map) CALL_ENABLED_HOOKS(AllMapScript, ALLMAPHOOK_ON_DESTROY_INSTANCE, script->OnDestroyInstance(mapInstanced, map)); } -AllMapScript::AllMapScript(const char* name, std::vector enabledHooks) : ScriptObject(name, ALLMAPHOOK_END) +AllMapScript::AllMapScript(char const* name, std::vector enabledHooks) : ScriptObject(name, ALLMAPHOOK_END) { // If empty - enable all available hooks. if (enabledHooks.empty()) diff --git a/src/server/game/Scripting/ScriptDefines/AllMapScript.h b/src/server/game/Scripting/ScriptDefines/AllMapScript.h index 31b97c7d6..69474dc0d 100644 --- a/src/server/game/Scripting/ScriptDefines/AllMapScript.h +++ b/src/server/game/Scripting/ScriptDefines/AllMapScript.h @@ -36,7 +36,7 @@ enum AllMapHook class AllMapScript : public ScriptObject { protected: - AllMapScript(const char* name, std::vector enabledHooks = std::vector()); + AllMapScript(char const* name, std::vector enabledHooks = std::vector()); public: /** diff --git a/src/server/game/Scripting/ScriptDefines/AllSpellScript.h b/src/server/game/Scripting/ScriptDefines/AllSpellScript.h index df069bcb1..1354502e9 100644 --- a/src/server/game/Scripting/ScriptDefines/AllSpellScript.h +++ b/src/server/game/Scripting/ScriptDefines/AllSpellScript.h @@ -46,7 +46,7 @@ enum SpellEffIndex : uint8; class AllSpellScript : public ScriptObject { protected: - AllSpellScript(const char* name, std::vector enabledHooks = std::vector()); + AllSpellScript(char const* name, std::vector enabledHooks = std::vector()); public: [[nodiscard]] bool IsDatabaseBound() const override { return false; } diff --git a/src/server/game/Scripting/ScriptDefines/AreaTriggerScript.cpp b/src/server/game/Scripting/ScriptDefines/AreaTriggerScript.cpp index bb809d7cd..bb9ba84ff 100644 --- a/src/server/game/Scripting/ScriptDefines/AreaTriggerScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/AreaTriggerScript.cpp @@ -40,7 +40,7 @@ bool ScriptMgr::OnAreaTrigger(Player* player, AreaTrigger const* trigger) return tempScript ? tempScript->OnTrigger(player, trigger) : false; } -AreaTriggerScript::AreaTriggerScript(const char* name) +AreaTriggerScript::AreaTriggerScript(char const* name) : ScriptObject(name) { ScriptRegistry::AddScript(this); diff --git a/src/server/game/Scripting/ScriptDefines/AreaTriggerScript.h b/src/server/game/Scripting/ScriptDefines/AreaTriggerScript.h index 186a87bc7..2f9064718 100644 --- a/src/server/game/Scripting/ScriptDefines/AreaTriggerScript.h +++ b/src/server/game/Scripting/ScriptDefines/AreaTriggerScript.h @@ -23,7 +23,7 @@ class AreaTriggerScript : public ScriptObject { protected: - AreaTriggerScript(const char* name); + AreaTriggerScript(char const* name); public: [[nodiscard]] bool IsDatabaseBound() const override { return true; } diff --git a/src/server/game/Scripting/ScriptDefines/ArenaScript.cpp b/src/server/game/Scripting/ScriptDefines/ArenaScript.cpp index 5521e7cbc..8223bd690 100644 --- a/src/server/game/Scripting/ScriptDefines/ArenaScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/ArenaScript.cpp @@ -54,7 +54,7 @@ bool ScriptMgr::CanSaveArenaStatsForMember(ArenaTeam* team, ObjectGuid playerGui CALL_ENABLED_BOOLEAN_HOOKS(ArenaScript, ARENAHOOK_CAN_SAVE_ARENA_STATS_FOR_MEMBER, !script->CanSaveArenaStatsForMember(team, playerGuid)); } -ArenaScript::ArenaScript(const char* name, std::vector enabledHooks) +ArenaScript::ArenaScript(char const* name, std::vector enabledHooks) : ScriptObject(name, ARENAHOOK_END) { // If empty - enable all available hooks. diff --git a/src/server/game/Scripting/ScriptDefines/ArenaScript.h b/src/server/game/Scripting/ScriptDefines/ArenaScript.h index 0529d23ac..92ed08af2 100644 --- a/src/server/game/Scripting/ScriptDefines/ArenaScript.h +++ b/src/server/game/Scripting/ScriptDefines/ArenaScript.h @@ -38,7 +38,7 @@ class ArenaScript : public ScriptObject { protected: - ArenaScript(const char* name, std::vector enabledHooks = std::vector()); + ArenaScript(char const* name, std::vector enabledHooks = std::vector()); public: diff --git a/src/server/game/Scripting/ScriptDefines/ArenaTeamScript.cpp b/src/server/game/Scripting/ScriptDefines/ArenaTeamScript.cpp index a5cc123c1..df0d8ddb1 100644 --- a/src/server/game/Scripting/ScriptDefines/ArenaTeamScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/ArenaTeamScript.cpp @@ -44,7 +44,7 @@ void ScriptMgr::OnSetArenaMaxPlayersPerTeam(const uint8 arenaType, uint32& maxPl CALL_ENABLED_HOOKS(ArenaTeamScript, ARENATEAMHOOK_ON_SET_ARENA_MAX_PLAYERS_PER_TEAM, script->OnSetArenaMaxPlayersPerTeam(arenaType, maxPlayerPerTeam)); } -ArenaTeamScript::ArenaTeamScript(const char* name, std::vector enabledHooks) +ArenaTeamScript::ArenaTeamScript(char const* name, std::vector enabledHooks) : ScriptObject(name, ARENATEAMHOOK_END) { // If empty - enable all available hooks. diff --git a/src/server/game/Scripting/ScriptDefines/ArenaTeamScript.h b/src/server/game/Scripting/ScriptDefines/ArenaTeamScript.h index 1a6c99704..64aa74f30 100644 --- a/src/server/game/Scripting/ScriptDefines/ArenaTeamScript.h +++ b/src/server/game/Scripting/ScriptDefines/ArenaTeamScript.h @@ -35,7 +35,7 @@ enum ArenaTeamHook class ArenaTeamScript : public ScriptObject { protected: - ArenaTeamScript(const char* name, std::vector enabledHooks = std::vector()); + ArenaTeamScript(char const* name, std::vector enabledHooks = std::vector()); public: [[nodiscard]] bool IsDatabaseBound() const override { return false; }; diff --git a/src/server/game/Scripting/ScriptDefines/AuctionHouseScript.cpp b/src/server/game/Scripting/ScriptDefines/AuctionHouseScript.cpp index bb978bc81..ee36f13fd 100644 --- a/src/server/game/Scripting/ScriptDefines/AuctionHouseScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/AuctionHouseScript.cpp @@ -86,7 +86,7 @@ void ScriptMgr::OnBeforeAuctionHouseMgrUpdate() CALL_ENABLED_HOOKS(AuctionHouseScript, AUCTIONHOUSEHOOK_ON_BEFORE_AUCTIONHOUSEMGR_UPDATE, script->OnBeforeAuctionHouseMgrUpdate()); } -AuctionHouseScript::AuctionHouseScript(const char* name, std::vector enabledHooks) +AuctionHouseScript::AuctionHouseScript(char const* name, std::vector enabledHooks) : ScriptObject(name, AUCTIONHOUSEHOOK_END) { // If empty - enable all available hooks. diff --git a/src/server/game/Scripting/ScriptDefines/AuctionHouseScript.h b/src/server/game/Scripting/ScriptDefines/AuctionHouseScript.h index c821da64a..3430661c8 100644 --- a/src/server/game/Scripting/ScriptDefines/AuctionHouseScript.h +++ b/src/server/game/Scripting/ScriptDefines/AuctionHouseScript.h @@ -40,7 +40,7 @@ enum AuctionHouseHook class AuctionHouseScript : public ScriptObject { protected: - AuctionHouseScript(const char* name, std::vector enabledHooks = std::vector()); + AuctionHouseScript(char const* name, std::vector enabledHooks = std::vector()); public: // Called when an auction is added to an auction house. diff --git a/src/server/game/Scripting/ScriptDefines/BattlefieldScript.h b/src/server/game/Scripting/ScriptDefines/BattlefieldScript.h index f61d10ded..66d0fb72b 100644 --- a/src/server/game/Scripting/ScriptDefines/BattlefieldScript.h +++ b/src/server/game/Scripting/ScriptDefines/BattlefieldScript.h @@ -39,7 +39,7 @@ class Player; class BattlefieldScript : public ScriptObject { protected: - BattlefieldScript(const char* name, std::vector enabledHooks = std::vector()); + BattlefieldScript(char const* name, std::vector enabledHooks = std::vector()); public: [[nodiscard]] bool IsDatabaseBound() const override { return false; } diff --git a/src/server/game/Scripting/ScriptDefines/BattlegroundMapScript.cpp b/src/server/game/Scripting/ScriptDefines/BattlegroundMapScript.cpp index 6f084bd5e..97bd569fd 100644 --- a/src/server/game/Scripting/ScriptDefines/BattlegroundMapScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/BattlegroundMapScript.cpp @@ -19,7 +19,7 @@ #include "Log.h" #include "ScriptMgr.h" -BattlegroundMapScript::BattlegroundMapScript(const char* name, uint32 mapId) : +BattlegroundMapScript::BattlegroundMapScript(char const* name, uint32 mapId) : ScriptObject(name), MapScript(mapId) { ScriptRegistry::AddScript(this); diff --git a/src/server/game/Scripting/ScriptDefines/BattlegroundMapScript.h b/src/server/game/Scripting/ScriptDefines/BattlegroundMapScript.h index 090206c0d..21bf0f70c 100644 --- a/src/server/game/Scripting/ScriptDefines/BattlegroundMapScript.h +++ b/src/server/game/Scripting/ScriptDefines/BattlegroundMapScript.h @@ -23,7 +23,7 @@ class BattlegroundMapScript : public ScriptObject, public MapScript { protected: - BattlegroundMapScript(const char* name, uint32 mapId); + BattlegroundMapScript(char const* name, uint32 mapId); public: [[nodiscard]] bool isAfterLoadScript() const override { return true; } diff --git a/src/server/game/Scripting/ScriptDefines/BattlegroundScript.cpp b/src/server/game/Scripting/ScriptDefines/BattlegroundScript.cpp index b91d15939..2a644f852 100644 --- a/src/server/game/Scripting/ScriptDefines/BattlegroundScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/BattlegroundScript.cpp @@ -25,7 +25,7 @@ Battleground* ScriptMgr::CreateBattleground(BattlegroundTypeId /*typeId*/) return nullptr; } -BattlegroundScript::BattlegroundScript(const char* name) +BattlegroundScript::BattlegroundScript(char const* name) : ScriptObject(name) { ScriptRegistry::AddScript(this); diff --git a/src/server/game/Scripting/ScriptDefines/BattlegroundScript.h b/src/server/game/Scripting/ScriptDefines/BattlegroundScript.h index b91502e86..71402f9e5 100644 --- a/src/server/game/Scripting/ScriptDefines/BattlegroundScript.h +++ b/src/server/game/Scripting/ScriptDefines/BattlegroundScript.h @@ -23,7 +23,7 @@ class BattlegroundScript : public ScriptObject { protected: - BattlegroundScript(const char* name); + BattlegroundScript(char const* name); public: [[nodiscard]] bool IsDatabaseBound() const override { return true; } diff --git a/src/server/game/Scripting/ScriptDefines/CommandScript.cpp b/src/server/game/Scripting/ScriptDefines/CommandScript.cpp index e9e672d88..10273deb0 100644 --- a/src/server/game/Scripting/ScriptDefines/CommandScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/CommandScript.cpp @@ -32,7 +32,7 @@ Acore::ChatCommands::ChatCommandTable ScriptMgr::GetChatCommands() return table; } -CommandScript::CommandScript(const char* name) +CommandScript::CommandScript(char const* name) : ScriptObject(name) { ScriptRegistry::AddScript(this); diff --git a/src/server/game/Scripting/ScriptDefines/CommandScript.h b/src/server/game/Scripting/ScriptDefines/CommandScript.h index 7c89cdf5e..a524f32f4 100644 --- a/src/server/game/Scripting/ScriptDefines/CommandScript.h +++ b/src/server/game/Scripting/ScriptDefines/CommandScript.h @@ -24,7 +24,7 @@ class CommandScript : public ScriptObject { protected: - CommandScript(const char* name); + CommandScript(char const* name); public: // Should return a pointer to a valid command table (ChatCommand array) to be used by ChatHandler. diff --git a/src/server/game/Scripting/ScriptDefines/ConditionScript.cpp b/src/server/game/Scripting/ScriptDefines/ConditionScript.cpp index 64a73c3fd..b79c6e893 100644 --- a/src/server/game/Scripting/ScriptDefines/ConditionScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/ConditionScript.cpp @@ -26,7 +26,7 @@ bool ScriptMgr::OnConditionCheck(Condition* condition, ConditionSourceInfo& sour return tempScript ? tempScript->OnConditionCheck(condition, sourceInfo) : true; } -ConditionScript::ConditionScript(const char* name) +ConditionScript::ConditionScript(char const* name) : ScriptObject(name) { ScriptRegistry::AddScript(this); diff --git a/src/server/game/Scripting/ScriptDefines/ConditionScript.h b/src/server/game/Scripting/ScriptDefines/ConditionScript.h index c53045869..d4f3d80fe 100644 --- a/src/server/game/Scripting/ScriptDefines/ConditionScript.h +++ b/src/server/game/Scripting/ScriptDefines/ConditionScript.h @@ -23,7 +23,7 @@ class ConditionScript : public ScriptObject { protected: - ConditionScript(const char* name); + ConditionScript(char const* name); public: [[nodiscard]] bool IsDatabaseBound() const override { return true; } diff --git a/src/server/game/Scripting/ScriptDefines/CreatureScript.cpp b/src/server/game/Scripting/ScriptDefines/CreatureScript.cpp index 6e4f36927..3f5f3dfb1 100644 --- a/src/server/game/Scripting/ScriptDefines/CreatureScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/CreatureScript.cpp @@ -60,7 +60,7 @@ bool ScriptMgr::OnGossipSelect(Player* player, Creature* creature, uint32 sender return tempScript ? tempScript->OnGossipSelect(player, creature, sender, action) : false; } -bool ScriptMgr::OnGossipSelectCode(Player* player, Creature* creature, uint32 sender, uint32 action, const char* code) +bool ScriptMgr::OnGossipSelectCode(Player* player, Creature* creature, uint32 sender, uint32 action, char const* code) { ASSERT(player); ASSERT(creature); @@ -195,7 +195,7 @@ void ScriptMgr::OnCreatureUpdate(Creature* creature, uint32 diff) } } -CreatureScript::CreatureScript(const char* name) +CreatureScript::CreatureScript(char const* name) : ScriptObject(name) { ScriptRegistry::AddScript(this); diff --git a/src/server/game/Scripting/ScriptDefines/CreatureScript.h b/src/server/game/Scripting/ScriptDefines/CreatureScript.h index 508ba2b49..56286dc0d 100644 --- a/src/server/game/Scripting/ScriptDefines/CreatureScript.h +++ b/src/server/game/Scripting/ScriptDefines/CreatureScript.h @@ -24,7 +24,7 @@ class CreatureScript : public ScriptObject, public UpdatableScript { protected: - CreatureScript(const char* name); + CreatureScript(char const* name); public: [[nodiscard]] bool IsDatabaseBound() const override { return true; } @@ -36,7 +36,7 @@ public: [[nodiscard]] virtual bool OnGossipSelect(Player* /*player*/, Creature* /*creature*/, uint32 /*sender*/, uint32 /*action*/) { return false; } // Called when a player selects a gossip with a code in the creature's gossip menu. - [[nodiscard]] virtual bool OnGossipSelectCode(Player* /*player*/, Creature* /*creature*/, uint32 /*sender*/, uint32 /*action*/, const char* /*code*/) { return false; } + [[nodiscard]] virtual bool OnGossipSelectCode(Player* /*player*/, Creature* /*creature*/, uint32 /*sender*/, uint32 /*action*/, char const* /*code*/) { return false; } // Called when a player accepts a quest from the creature. [[nodiscard]] virtual bool OnQuestAccept(Player* /*player*/, Creature* /*creature*/, Quest const* /*quest*/) { return false; } diff --git a/src/server/game/Scripting/ScriptDefines/DatabaseScript.cpp b/src/server/game/Scripting/ScriptDefines/DatabaseScript.cpp index df84d2156..ebe4432a6 100644 --- a/src/server/game/Scripting/ScriptDefines/DatabaseScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/DatabaseScript.cpp @@ -29,7 +29,7 @@ void ScriptMgr::OnAfterDatabaseLoadCreatureTemplates(std::vectorOnAfterDatabaseLoadCreatureTemplates(creatureTemplates)); } -DatabaseScript::DatabaseScript(const char* name, std::vector enabledHooks) +DatabaseScript::DatabaseScript(char const* name, std::vector enabledHooks) : ScriptObject(name, DATABASEHOOK_END) { // If empty - enable all available hooks. diff --git a/src/server/game/Scripting/ScriptDefines/DatabaseScript.h b/src/server/game/Scripting/ScriptDefines/DatabaseScript.h index 708f0a986..c4d3408a2 100644 --- a/src/server/game/Scripting/ScriptDefines/DatabaseScript.h +++ b/src/server/game/Scripting/ScriptDefines/DatabaseScript.h @@ -32,7 +32,7 @@ class DatabaseScript : public ScriptObject { protected: - DatabaseScript(const char* name, std::vector enabledHooks = std::vector()); + DatabaseScript(char const* name, std::vector enabledHooks = std::vector()); public: diff --git a/src/server/game/Scripting/ScriptDefines/DynamicObjectScript.cpp b/src/server/game/Scripting/ScriptDefines/DynamicObjectScript.cpp index d2826b1c4..c4c505bef 100644 --- a/src/server/game/Scripting/ScriptDefines/DynamicObjectScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/DynamicObjectScript.cpp @@ -28,7 +28,7 @@ void ScriptMgr::OnDynamicObjectUpdate(DynamicObject* dynobj, uint32 diff) } } -DynamicObjectScript::DynamicObjectScript(const char* name) +DynamicObjectScript::DynamicObjectScript(char const* name) : ScriptObject(name) { ScriptRegistry::AddScript(this); diff --git a/src/server/game/Scripting/ScriptDefines/DynamicObjectScript.h b/src/server/game/Scripting/ScriptDefines/DynamicObjectScript.h index da51a86d5..e03cb500b 100644 --- a/src/server/game/Scripting/ScriptDefines/DynamicObjectScript.h +++ b/src/server/game/Scripting/ScriptDefines/DynamicObjectScript.h @@ -23,7 +23,7 @@ class DynamicObjectScript : public ScriptObject, public UpdatableScript { protected: - DynamicObjectScript(const char* name); + DynamicObjectScript(char const* name); }; #endif diff --git a/src/server/game/Scripting/ScriptDefines/FormulaScript.cpp b/src/server/game/Scripting/ScriptDefines/FormulaScript.cpp index da9fe26a0..6192ac59b 100644 --- a/src/server/game/Scripting/ScriptDefines/FormulaScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/FormulaScript.cpp @@ -67,7 +67,7 @@ void ScriptMgr::OnBeforeUpdatingPersonalRating(int32& mod, uint32 type) CALL_ENABLED_HOOKS(FormulaScript, FORMULAHOOK_ON_BEFORE_UPDATING_PERSONAL_RATING, script->OnBeforeUpdatingPersonalRating(mod, type)); } -FormulaScript::FormulaScript(const char* name, std::vector enabledHooks) +FormulaScript::FormulaScript(char const* name, std::vector enabledHooks) : ScriptObject(name, FORMULAHOOK_END) { // If empty - enable all available hooks. diff --git a/src/server/game/Scripting/ScriptDefines/FormulaScript.h b/src/server/game/Scripting/ScriptDefines/FormulaScript.h index a95a67603..561f2078f 100644 --- a/src/server/game/Scripting/ScriptDefines/FormulaScript.h +++ b/src/server/game/Scripting/ScriptDefines/FormulaScript.h @@ -40,7 +40,7 @@ enum XPColorChar : uint8; class FormulaScript : public ScriptObject { protected: - FormulaScript(const char* name, std::vector enabledHooks = std::vector()); + FormulaScript(char const* name, std::vector enabledHooks = std::vector()); public: // Called after calculating honor. diff --git a/src/server/game/Scripting/ScriptDefines/GameEventScript.cpp b/src/server/game/Scripting/ScriptDefines/GameEventScript.cpp index 75d713311..d19f24a9c 100644 --- a/src/server/game/Scripting/ScriptDefines/GameEventScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/GameEventScript.cpp @@ -34,7 +34,7 @@ void ScriptMgr::OnGameEventCheck(uint16 EventID) CALL_ENABLED_HOOKS(GameEventScript, GAMEEVENTHOOK_ON_EVENT_CHECK, script->OnEventCheck(EventID)); } -GameEventScript::GameEventScript(const char* name, std::vector enabledHooks) +GameEventScript::GameEventScript(char const* name, std::vector enabledHooks) : ScriptObject(name, GAMEEVENTHOOK_END) { // If empty - enable all available hooks. diff --git a/src/server/game/Scripting/ScriptDefines/GameEventScript.h b/src/server/game/Scripting/ScriptDefines/GameEventScript.h index 6829cd651..f717a7a95 100644 --- a/src/server/game/Scripting/ScriptDefines/GameEventScript.h +++ b/src/server/game/Scripting/ScriptDefines/GameEventScript.h @@ -32,7 +32,7 @@ enum GameEventHook class GameEventScript : public ScriptObject { protected: - GameEventScript(const char* name, std::vector enabledHooks = std::vector()); + GameEventScript(char const* name, std::vector enabledHooks = std::vector()); public: // Runs on start event diff --git a/src/server/game/Scripting/ScriptDefines/GameObjectScript.cpp b/src/server/game/Scripting/ScriptDefines/GameObjectScript.cpp index ddc5fdbaf..84f297389 100644 --- a/src/server/game/Scripting/ScriptDefines/GameObjectScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/GameObjectScript.cpp @@ -60,7 +60,7 @@ bool ScriptMgr::OnGossipSelect(Player* player, GameObject* go, uint32 sender, ui return tempScript ? tempScript->OnGossipSelect(player, go, sender, action) : false; } -bool ScriptMgr::OnGossipSelectCode(Player* player, GameObject* go, uint32 sender, uint32 action, const char* code) +bool ScriptMgr::OnGossipSelectCode(Player* player, GameObject* go, uint32 sender, uint32 action, char const* code) { ASSERT(player); ASSERT(go); @@ -239,7 +239,7 @@ GameObjectAI* ScriptMgr::GetGameObjectAI(GameObject* go) return tempScript ? tempScript->GetAI(go) : nullptr; } -GameObjectScript::GameObjectScript(const char* name) +GameObjectScript::GameObjectScript(char const* name) : ScriptObject(name) { ScriptRegistry::AddScript(this); diff --git a/src/server/game/Scripting/ScriptDefines/GameObjectScript.h b/src/server/game/Scripting/ScriptDefines/GameObjectScript.h index 174ca61ba..0a6507856 100644 --- a/src/server/game/Scripting/ScriptDefines/GameObjectScript.h +++ b/src/server/game/Scripting/ScriptDefines/GameObjectScript.h @@ -24,7 +24,7 @@ class GameObjectScript : public ScriptObject, public UpdatableScript { protected: - GameObjectScript(const char* name); + GameObjectScript(char const* name); public: [[nodiscard]] bool IsDatabaseBound() const override { return true; } @@ -36,7 +36,7 @@ public: [[nodiscard]] virtual bool OnGossipSelect(Player* /*player*/, GameObject* /*go*/, uint32 /*sender*/, uint32 /*action*/) { return false; } // Called when a player selects a gossip with a code in the gameobject's gossip menu. - [[nodiscard]] virtual bool OnGossipSelectCode(Player* /*player*/, GameObject* /*go*/, uint32 /*sender*/, uint32 /*action*/, const char* /*code*/) { return false; } + [[nodiscard]] virtual bool OnGossipSelectCode(Player* /*player*/, GameObject* /*go*/, uint32 /*sender*/, uint32 /*action*/, char const* /*code*/) { return false; } // Called when a player accepts a quest from the gameobject. [[nodiscard]] virtual bool OnQuestAccept(Player* /*player*/, GameObject* /*go*/, Quest const* /*quest*/) { return false; } diff --git a/src/server/game/Scripting/ScriptDefines/GlobalScript.cpp b/src/server/game/Scripting/ScriptDefines/GlobalScript.cpp index 28285e9c2..b995cb573 100644 --- a/src/server/game/Scripting/ScriptDefines/GlobalScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/GlobalScript.cpp @@ -144,7 +144,7 @@ void ScriptMgr::AfterInstanceGameObjectCreate(Map* instance, GameObject* go) CALL_ENABLED_HOOKS(GlobalScript, GLOBALHOOK_AFTER_INSTANCE_GAME_OBJECT_CREATE, script->AfterInstanceGameObjectCreate(instance, go)); } -GlobalScript::GlobalScript(const char* name, std::vector enabledHooks) +GlobalScript::GlobalScript(char const* name, std::vector enabledHooks) : ScriptObject(name, GLOBALHOOK_END) { // If empty - enable all available hooks. diff --git a/src/server/game/Scripting/ScriptDefines/GlobalScript.h b/src/server/game/Scripting/ScriptDefines/GlobalScript.h index b22a22fb9..cd3dc1406 100644 --- a/src/server/game/Scripting/ScriptDefines/GlobalScript.h +++ b/src/server/game/Scripting/ScriptDefines/GlobalScript.h @@ -54,7 +54,7 @@ enum GlobalHook class GlobalScript : public ScriptObject { protected: - GlobalScript(const char* name, std::vector enabledHooks = std::vector()); + GlobalScript(char const* name, std::vector enabledHooks = std::vector()); public: // items diff --git a/src/server/game/Scripting/ScriptDefines/GroupScript.cpp b/src/server/game/Scripting/ScriptDefines/GroupScript.cpp index 5e808a3b1..1ef1be0ea 100644 --- a/src/server/game/Scripting/ScriptDefines/GroupScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/GroupScript.cpp @@ -33,7 +33,7 @@ void ScriptMgr::OnGroupInviteMember(Group* group, ObjectGuid guid) CALL_ENABLED_HOOKS(GroupScript, GROUPHOOK_ON_INVITE_MEMBER, script->OnInviteMember(group, guid)); } -void ScriptMgr::OnGroupRemoveMember(Group* group, ObjectGuid guid, RemoveMethod method, ObjectGuid kicker, const char* reason) +void ScriptMgr::OnGroupRemoveMember(Group* group, ObjectGuid guid, RemoveMethod method, ObjectGuid kicker, char const* reason) { ASSERT(group); @@ -64,7 +64,7 @@ void ScriptMgr::OnCreate(Group* group, Player* leader) CALL_ENABLED_HOOKS(GroupScript, GROUPHOOK_ON_CREATE, script->OnCreate(group, leader)); } -GroupScript::GroupScript(const char* name, std::vector enabledHooks) +GroupScript::GroupScript(char const* name, std::vector enabledHooks) : ScriptObject(name, GROUPHOOK_END) { // If empty - enable all available hooks. diff --git a/src/server/game/Scripting/ScriptDefines/GroupScript.h b/src/server/game/Scripting/ScriptDefines/GroupScript.h index 0995e3e91..eb5909c12 100644 --- a/src/server/game/Scripting/ScriptDefines/GroupScript.h +++ b/src/server/game/Scripting/ScriptDefines/GroupScript.h @@ -39,7 +39,7 @@ enum RemoveMethod : uint8; class GroupScript : public ScriptObject { protected: - GroupScript(const char* name, std::vector enabledHooks = std::vector()); + GroupScript(char const* name, std::vector enabledHooks = std::vector()); public: [[nodiscard]] bool IsDatabaseBound() const override { return false; } @@ -51,7 +51,7 @@ public: virtual void OnInviteMember(Group* /*group*/, ObjectGuid /*guid*/) { } // Called when a member is removed from a group. - virtual void OnRemoveMember(Group* /*group*/, ObjectGuid /*guid*/, RemoveMethod /*method*/, ObjectGuid /*kicker*/, const char* /*reason*/) { } + virtual void OnRemoveMember(Group* /*group*/, ObjectGuid /*guid*/, RemoveMethod /*method*/, ObjectGuid /*kicker*/, char const* /*reason*/) { } // Called when the leader of a group is changed. virtual void OnChangeLeader(Group* /*group*/, ObjectGuid /*newLeaderGuid*/, ObjectGuid /*oldLeaderGuid*/) { } diff --git a/src/server/game/Scripting/ScriptDefines/GuildScript.cpp b/src/server/game/Scripting/ScriptDefines/GuildScript.cpp index ee141e598..94e337b3e 100644 --- a/src/server/game/Scripting/ScriptDefines/GuildScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/GuildScript.cpp @@ -29,17 +29,17 @@ void ScriptMgr::OnGuildRemoveMember(Guild* guild, Player* player, bool isDisband CALL_ENABLED_HOOKS(GuildScript, GUILDHOOK_ON_REMOVE_MEMBER, script->OnRemoveMember(guild, player, isDisbanding, isKicked)); } -void ScriptMgr::OnGuildMOTDChanged(Guild* guild, const std::string& newMotd) +void ScriptMgr::OnGuildMOTDChanged(Guild* guild, std::string const& newMotd) { CALL_ENABLED_HOOKS(GuildScript, GUILDHOOK_ON_MOTD_CHANGED, script->OnMOTDChanged(guild, newMotd)); } -void ScriptMgr::OnGuildInfoChanged(Guild* guild, const std::string& newInfo) +void ScriptMgr::OnGuildInfoChanged(Guild* guild, std::string const& newInfo) { CALL_ENABLED_HOOKS(GuildScript, GUILDHOOK_ON_INFO_CHANGED, script->OnInfoChanged(guild, newInfo)); } -void ScriptMgr::OnGuildCreate(Guild* guild, Player* leader, const std::string& name) +void ScriptMgr::OnGuildCreate(Guild* guild, Player* leader, std::string const& name) { CALL_ENABLED_HOOKS(GuildScript, GUILDHOOK_ON_CREATE, script->OnCreate(guild, leader, name)); } @@ -79,7 +79,7 @@ bool ScriptMgr::CanGuildSendBankList(Guild const* guild, WorldSession* session, CALL_ENABLED_BOOLEAN_HOOKS(GuildScript, GUILDHOOK_CAN_GUILD_SEND_BANK_LIST, !script->CanGuildSendBankList(guild, session, tabId, sendAllSlots)); } -GuildScript::GuildScript(const char* name, std::vector enabledHooks) +GuildScript::GuildScript(char const* name, std::vector enabledHooks) : ScriptObject(name, GUILDHOOK_END) { // If empty - enable all available hooks. diff --git a/src/server/game/Scripting/ScriptDefines/GuildScript.h b/src/server/game/Scripting/ScriptDefines/GuildScript.h index 206b3a882..614665b17 100644 --- a/src/server/game/Scripting/ScriptDefines/GuildScript.h +++ b/src/server/game/Scripting/ScriptDefines/GuildScript.h @@ -42,7 +42,7 @@ enum GuildHook class GuildScript : public ScriptObject { protected: - GuildScript(const char* name, std::vector enabledHooks = std::vector()); + GuildScript(char const* name, std::vector enabledHooks = std::vector()); public: [[nodiscard]] bool IsDatabaseBound() const override { return false; } @@ -54,13 +54,13 @@ public: virtual void OnRemoveMember(Guild* /*guild*/, Player* /*player*/, bool /*isDisbanding*/, bool /*isKicked*/) { } // Called when the guild MOTD (message of the day) changes. - virtual void OnMOTDChanged(Guild* /*guild*/, const std::string& /*newMotd*/) { } + virtual void OnMOTDChanged(Guild* /*guild*/, std::string const& /*newMotd*/) { } // Called when the guild info is altered. - virtual void OnInfoChanged(Guild* /*guild*/, const std::string& /*newInfo*/) { } + virtual void OnInfoChanged(Guild* /*guild*/, std::string const& /*newInfo*/) { } // Called when a guild is created. - virtual void OnCreate(Guild* /*guild*/, Player* /*leader*/, const std::string& /*name*/) { } + virtual void OnCreate(Guild* /*guild*/, Player* /*leader*/, std::string const& /*name*/) { } // Called when a guild is disbanded. virtual void OnDisband(Guild* /*guild*/) { } diff --git a/src/server/game/Scripting/ScriptDefines/InstanceMapScript.cpp b/src/server/game/Scripting/ScriptDefines/InstanceMapScript.cpp index ada552c0a..ab70df48e 100644 --- a/src/server/game/Scripting/ScriptDefines/InstanceMapScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/InstanceMapScript.cpp @@ -26,7 +26,7 @@ InstanceScript* ScriptMgr::CreateInstanceScript(InstanceMap* map) return tempScript ? tempScript->GetInstanceScript(map) : nullptr; } -InstanceMapScript::InstanceMapScript(const char* name, uint32 mapId) : +InstanceMapScript::InstanceMapScript(char const* name, uint32 mapId) : ScriptObject(name), MapScript(mapId) { ScriptRegistry::AddScript(this); diff --git a/src/server/game/Scripting/ScriptDefines/InstanceMapScript.h b/src/server/game/Scripting/ScriptDefines/InstanceMapScript.h index b4632e5d5..23151f94d 100644 --- a/src/server/game/Scripting/ScriptDefines/InstanceMapScript.h +++ b/src/server/game/Scripting/ScriptDefines/InstanceMapScript.h @@ -23,7 +23,7 @@ class InstanceMapScript : public ScriptObject, public MapScript { protected: - InstanceMapScript(const char* name, uint32 mapId); + InstanceMapScript(char const* name, uint32 mapId); public: [[nodiscard]] bool IsDatabaseBound() const override { return true; } diff --git a/src/server/game/Scripting/ScriptDefines/ItemScript.h b/src/server/game/Scripting/ScriptDefines/ItemScript.h index e29af4640..1d7ef269e 100644 --- a/src/server/game/Scripting/ScriptDefines/ItemScript.h +++ b/src/server/game/Scripting/ScriptDefines/ItemScript.h @@ -23,7 +23,7 @@ class ItemScript : public ScriptObject { protected: - ItemScript(const char* name); + ItemScript(char const* name); public: [[nodiscard]] bool IsDatabaseBound() const override { return true; } @@ -47,7 +47,7 @@ public: virtual void OnGossipSelect(Player* /*player*/, Item* /*item*/, uint32 /*sender*/, uint32 /*action*/) { } // Called when a player selects an option in an item gossip window - virtual void OnGossipSelectCode(Player* /*player*/, Item* /*item*/, uint32 /*sender*/, uint32 /*action*/, const char* /*code*/) { } + virtual void OnGossipSelectCode(Player* /*player*/, Item* /*item*/, uint32 /*sender*/, uint32 /*action*/, char const* /*code*/) { } }; #endif diff --git a/src/server/game/Scripting/ScriptDefines/LootScript.cpp b/src/server/game/Scripting/ScriptDefines/LootScript.cpp index c17ca9d2b..ab38c4c88 100644 --- a/src/server/game/Scripting/ScriptDefines/LootScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/LootScript.cpp @@ -26,7 +26,7 @@ void ScriptMgr::OnLootMoney(Player* player, uint32 gold) CALL_ENABLED_HOOKS(LootScript, LOOTHOOK_ON_LOOT_MONEY, script->OnLootMoney(player, gold)); } -LootScript::LootScript(const char* name, std::vector enabledHooks) +LootScript::LootScript(char const* name, std::vector enabledHooks) : ScriptObject(name, LOOTHOOK_END) { // If empty - enable all available hooks. diff --git a/src/server/game/Scripting/ScriptDefines/LootScript.h b/src/server/game/Scripting/ScriptDefines/LootScript.h index c501bedf0..6275401c5 100644 --- a/src/server/game/Scripting/ScriptDefines/LootScript.h +++ b/src/server/game/Scripting/ScriptDefines/LootScript.h @@ -30,7 +30,7 @@ enum LootHook class LootScript : public ScriptObject { protected: - LootScript(const char* name, std::vector enabledHooks = std::vector()); + LootScript(char const* name, std::vector enabledHooks = std::vector()); public: [[nodiscard]] bool IsDatabaseBound() const override { return false; } diff --git a/src/server/game/Scripting/ScriptDefines/MailScript.cpp b/src/server/game/Scripting/ScriptDefines/MailScript.cpp index 3191ad356..274dc7151 100644 --- a/src/server/game/Scripting/ScriptDefines/MailScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/MailScript.cpp @@ -24,7 +24,7 @@ void ScriptMgr::OnBeforeMailDraftSendMailTo(MailDraft* mailDraft, MailReceiver c CALL_ENABLED_HOOKS(MailScript, MAILHOOK_ON_BEFORE_MAIL_DRAFT_SEND_MAIL_TO, script->OnBeforeMailDraftSendMailTo(mailDraft, receiver, sender, checked, deliver_delay, custom_expiration, deleteMailItemsFromDB, sendMail)); } -MailScript::MailScript(const char* name, std::vector enabledHooks) +MailScript::MailScript(char const* name, std::vector enabledHooks) : ScriptObject(name, MAILHOOK_END) { // If empty - enable all available hooks. diff --git a/src/server/game/Scripting/ScriptDefines/MailScript.h b/src/server/game/Scripting/ScriptDefines/MailScript.h index 479ca8d3b..b9672df1b 100644 --- a/src/server/game/Scripting/ScriptDefines/MailScript.h +++ b/src/server/game/Scripting/ScriptDefines/MailScript.h @@ -30,7 +30,7 @@ enum MailHook class MailScript : public ScriptObject { protected: - MailScript(const char* name, std::vector enabledHooks = std::vector()); + MailScript(char const* name, std::vector enabledHooks = std::vector()); public: // Called before mail is sent diff --git a/src/server/game/Scripting/ScriptDefines/MiscScript.cpp b/src/server/game/Scripting/ScriptDefines/MiscScript.cpp index 1bc6d6faa..a41a3f0d9 100644 --- a/src/server/game/Scripting/ScriptDefines/MiscScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/MiscScript.cpp @@ -94,7 +94,7 @@ void ScriptMgr::OnAfterLootTemplateProcess(Loot* loot, LootTemplate const* tab, CALL_ENABLED_HOOKS(MiscScript, MISCHOOK_ON_AFTER_LOOT_TEMPLATE_PROCESS, script->OnAfterLootTemplateProcess(loot, tab, store, lootOwner, personal, noEmptyError, lootMode)); } -void ScriptMgr::OnPlayerSetPhase(const AuraEffect* auraEff, AuraApplication const* aurApp, uint8 mode, bool apply, uint32& newPhase) +void ScriptMgr::OnPlayerSetPhase(AuraEffect const* auraEff, AuraApplication const* aurApp, uint8 mode, bool apply, uint32& newPhase) { CALL_ENABLED_HOOKS(MiscScript, MISCHOOK_ON_PLAYER_SET_PHASE, script->OnPlayerSetPhase(auraEff, aurApp, mode, apply, newPhase)); } @@ -109,7 +109,7 @@ void ScriptMgr::GetDialogStatus(Player* player, Object* questgiver) CALL_ENABLED_HOOKS(MiscScript, MISCHOOK_GET_DIALOG_STATUS, script->GetDialogStatus(player, questgiver)); } -MiscScript::MiscScript(const char* name, std::vector enabledHooks) +MiscScript::MiscScript(char const* name, std::vector enabledHooks) : ScriptObject(name, MISCHOOK_END) { // If empty - enable all available hooks. diff --git a/src/server/game/Scripting/ScriptDefines/MiscScript.h b/src/server/game/Scripting/ScriptDefines/MiscScript.h index 17fe66d24..9ed20ab23 100644 --- a/src/server/game/Scripting/ScriptDefines/MiscScript.h +++ b/src/server/game/Scripting/ScriptDefines/MiscScript.h @@ -48,7 +48,7 @@ enum MiscHook class MiscScript : public ScriptObject { protected: - MiscScript(const char* name, std::vector enabledHooks = std::vector()); + MiscScript(char const* name, std::vector enabledHooks = std::vector()); public: [[nodiscard]] bool IsDatabaseBound() const override { return false; } @@ -83,7 +83,7 @@ public: virtual void OnAfterLootTemplateProcess(Loot* /*loot*/, LootTemplate const* /*tab*/, LootStore const& /*store*/, Player* /*lootOwner*/, bool /*personal*/, bool /*noEmptyError*/, uint16 /*lootMode*/) { } - virtual void OnPlayerSetPhase(const AuraEffect* /*auraEff*/, AuraApplication const* /*aurApp*/, uint8 /*mode*/, bool /*apply*/, uint32& /*newPhase*/) { } + virtual void OnPlayerSetPhase(AuraEffect const* /*auraEff*/, AuraApplication const* /*aurApp*/, uint8 /*mode*/, bool /*apply*/, uint32& /*newPhase*/) { } virtual void OnInstanceSave(InstanceSave* /*instanceSave*/) { } diff --git a/src/server/game/Scripting/ScriptDefines/ModuleScript.cpp b/src/server/game/Scripting/ScriptDefines/ModuleScript.cpp index 95256bfce..b9079a153 100644 --- a/src/server/game/Scripting/ScriptDefines/ModuleScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/ModuleScript.cpp @@ -18,7 +18,7 @@ #include "ModuleScript.h" #include "ScriptMgr.h" -ModuleScript::ModuleScript(const char* name) +ModuleScript::ModuleScript(char const* name) : ScriptObject(name) { ScriptRegistry::AddScript(this); diff --git a/src/server/game/Scripting/ScriptDefines/ModuleScript.h b/src/server/game/Scripting/ScriptDefines/ModuleScript.h index 2d0201e04..d450e4d60 100644 --- a/src/server/game/Scripting/ScriptDefines/ModuleScript.h +++ b/src/server/game/Scripting/ScriptDefines/ModuleScript.h @@ -25,7 +25,7 @@ class ModuleScript : public ScriptObject { protected: - ModuleScript(const char* name); + ModuleScript(char const* name); }; #endif diff --git a/src/server/game/Scripting/ScriptDefines/MovementHandlerScript.cpp b/src/server/game/Scripting/ScriptDefines/MovementHandlerScript.cpp index e55fdfb00..eb4f967f0 100644 --- a/src/server/game/Scripting/ScriptDefines/MovementHandlerScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/MovementHandlerScript.cpp @@ -24,7 +24,7 @@ void ScriptMgr::OnPlayerMove(Player* player, MovementInfo movementInfo, uint32 o CALL_ENABLED_HOOKS(MovementHandlerScript, MOVEMENTHOOK_ON_PLAYER_MOVE, script->OnPlayerMove(player, movementInfo, opcode)); } -MovementHandlerScript::MovementHandlerScript(const char* name, std::vector enabledHooks) : +MovementHandlerScript::MovementHandlerScript(char const* name, std::vector enabledHooks) : ScriptObject(name, MOVEMENTHOOK_END) { // If empty - enable all available hooks. diff --git a/src/server/game/Scripting/ScriptDefines/MovementHandlerScript.h b/src/server/game/Scripting/ScriptDefines/MovementHandlerScript.h index df45266ed..f31b4a41d 100644 --- a/src/server/game/Scripting/ScriptDefines/MovementHandlerScript.h +++ b/src/server/game/Scripting/ScriptDefines/MovementHandlerScript.h @@ -31,7 +31,7 @@ enum MovementHook class MovementHandlerScript : public ScriptObject { protected: - MovementHandlerScript(const char* name, std::vector enabledHooks = std::vector()); + MovementHandlerScript(char const* name, std::vector enabledHooks = std::vector()); public: //Called whenever a player moves diff --git a/src/server/game/Scripting/ScriptDefines/OutdoorPvPScript.cpp b/src/server/game/Scripting/ScriptDefines/OutdoorPvPScript.cpp index 49fadf77b..51e6f74df 100644 --- a/src/server/game/Scripting/ScriptDefines/OutdoorPvPScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/OutdoorPvPScript.cpp @@ -27,7 +27,7 @@ OutdoorPvP* ScriptMgr::CreateOutdoorPvP(OutdoorPvPData const* data) return tempScript ? tempScript->GetOutdoorPvP() : nullptr; } -OutdoorPvPScript::OutdoorPvPScript(const char* name) +OutdoorPvPScript::OutdoorPvPScript(char const* name) : ScriptObject(name) { ScriptRegistry::AddScript(this); diff --git a/src/server/game/Scripting/ScriptDefines/OutdoorPvPScript.h b/src/server/game/Scripting/ScriptDefines/OutdoorPvPScript.h index fc8d2dea4..7ad28ac9b 100644 --- a/src/server/game/Scripting/ScriptDefines/OutdoorPvPScript.h +++ b/src/server/game/Scripting/ScriptDefines/OutdoorPvPScript.h @@ -23,7 +23,7 @@ class OutdoorPvPScript : public ScriptObject { protected: - OutdoorPvPScript(const char* name); + OutdoorPvPScript(char const* name); public: [[nodiscard]] bool IsDatabaseBound() const override { return true; } diff --git a/src/server/game/Scripting/ScriptDefines/PetScript.cpp b/src/server/game/Scripting/ScriptDefines/PetScript.cpp index 7778c809b..b18073414 100644 --- a/src/server/game/Scripting/ScriptDefines/PetScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/PetScript.cpp @@ -51,7 +51,7 @@ void ScriptMgr::OnPetAddToWorld(Pet* pet) CALL_ENABLED_HOOKS(PetScript, PETHOOK_ON_PET_ADD_TO_WORLD, script->OnPetAddToWorld(pet)); } -PetScript::PetScript(const char* name, std::vector enabledHooks) +PetScript::PetScript(char const* name, std::vector enabledHooks) : ScriptObject(name, PETHOOK_END) { // If empty - enable all available hooks. diff --git a/src/server/game/Scripting/ScriptDefines/PetScript.h b/src/server/game/Scripting/ScriptDefines/PetScript.h index 12090149b..f1455f20c 100644 --- a/src/server/game/Scripting/ScriptDefines/PetScript.h +++ b/src/server/game/Scripting/ScriptDefines/PetScript.h @@ -35,7 +35,7 @@ enum PetHook class PetScript : public ScriptObject { protected: - PetScript(const char* name, std::vector enabledHooks = std::vector()); + PetScript(char const* name, std::vector enabledHooks = std::vector()); public: [[nodiscard]] bool IsDatabaseBound() const override { return false; } diff --git a/src/server/game/Scripting/ScriptDefines/PlayerScript.cpp b/src/server/game/Scripting/ScriptDefines/PlayerScript.cpp index d8bab4751..db26afea2 100644 --- a/src/server/game/Scripting/ScriptDefines/PlayerScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/PlayerScript.cpp @@ -32,7 +32,7 @@ void ScriptMgr::OnPlayerGossipSelect(Player* player, uint32 menu_id, uint32 send CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_GOSSIP_SELECT, script->OnPlayerGossipSelect(player, menu_id, sender, action)); } -void ScriptMgr::OnPlayerGossipSelectCode(Player* player, uint32 menu_id, uint32 sender, uint32 action, const char* code) +void ScriptMgr::OnPlayerGossipSelectCode(Player* player, uint32 menu_id, uint32 sender, uint32 action, char const* code) { CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_GOSSIP_SELECT_CODE, script->OnPlayerGossipSelectCode(player, menu_id, sender, action, code)); } @@ -772,7 +772,7 @@ bool ScriptMgr::OnPlayerNotSetArenaTeamInfoField(Player* player, uint8 slot, Are CALL_ENABLED_BOOLEAN_HOOKS(PlayerScript, PLAYERHOOK_NOT_SET_ARENA_TEAM_INFO_FIELD, !script->OnPlayerNotSetArenaTeamInfoField(player, slot, type, value)); } -bool ScriptMgr::OnPlayerCanJoinLfg(Player* player, uint8 roles, lfg::LfgDungeonSet& dungeons, const std::string& comment) +bool ScriptMgr::OnPlayerCanJoinLfg(Player* player, uint8 roles, lfg::LfgDungeonSet& dungeons, std::string const& comment) { CALL_ENABLED_BOOLEAN_HOOKS(PlayerScript, PLAYERHOOK_CAN_JOIN_LFG, !script->OnPlayerCanJoinLfg(player, roles, dungeons, comment)); } @@ -954,7 +954,7 @@ void ScriptMgr::OnPlayerBeforeGetLevelForXPGain(Player const* player, uint8& lev level = std::clamp(level, uint8(1), uint8(sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))); } -PlayerScript::PlayerScript(const char* name, std::vector enabledHooks) +PlayerScript::PlayerScript(char const* name, std::vector enabledHooks) : ScriptObject(name, PLAYERHOOK_END) { // If empty - enable all available hooks. diff --git a/src/server/game/Scripting/ScriptDefines/PlayerScript.h b/src/server/game/Scripting/ScriptDefines/PlayerScript.h index 87337a83c..113af5c73 100644 --- a/src/server/game/Scripting/ScriptDefines/PlayerScript.h +++ b/src/server/game/Scripting/ScriptDefines/PlayerScript.h @@ -221,7 +221,7 @@ enum PlayerHook class PlayerScript : public ScriptObject { protected: - PlayerScript(const char* name, std::vector enabledHooks = std::vector()); + PlayerScript(char const* name, std::vector enabledHooks = std::vector()); public: // Called when a player dies @@ -396,7 +396,7 @@ public: virtual void OnPlayerGossipSelect(Player* /*player*/, uint32 /*menu_id*/, uint32 /*sender*/, uint32 /*action*/) { } // Called when a player selects an option in a player gossip window - virtual void OnPlayerGossipSelectCode(Player* /*player*/, uint32 /*menu_id*/, uint32 /*sender*/, uint32 /*action*/, const char* /*code*/) { } + virtual void OnPlayerGossipSelectCode(Player* /*player*/, uint32 /*menu_id*/, uint32 /*sender*/, uint32 /*action*/, char const* /*code*/) { } // On player getting charmed virtual void OnPlayerBeingCharmed(Player* /*player*/, Unit* /*charmer*/, uint32 /*oldFactionId*/, uint32 /*newFactionId*/) { } @@ -614,7 +614,7 @@ public: [[nodiscard]] virtual bool OnPlayerNotSetArenaTeamInfoField(Player* /*player*/, uint8 /*slot*/, ArenaTeamInfoType /*type*/, uint32 /*value*/) { return true; } // Whats that? - [[nodiscard]] virtual bool OnPlayerCanJoinLfg(Player* /*player*/, uint8 /*roles*/, std::set& /*dungeons*/, const std::string& /*comment*/) { return true; } + [[nodiscard]] virtual bool OnPlayerCanJoinLfg(Player* /*player*/, uint8 /*roles*/, std::set& /*dungeons*/, std::string const& /*comment*/) { return true; } [[nodiscard]] virtual bool OnPlayerCanEnterMap(Player* /*player*/, MapEntry const* /*entry*/, InstanceTemplate const* /*instance*/, MapDifficulty const* /*mapDiff*/, bool /*loginCheck*/) { return true; } diff --git a/src/server/game/Scripting/ScriptDefines/ServerScript.cpp b/src/server/game/Scripting/ScriptDefines/ServerScript.cpp index faab0ca53..d2d01f6ff 100644 --- a/src/server/game/Scripting/ScriptDefines/ServerScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/ServerScript.cpp @@ -62,7 +62,7 @@ bool ScriptMgr::CanPacketReceive(WorldSession* session, WorldPacket const& packe CALL_ENABLED_BOOLEAN_HOOKS(ServerScript, SERVERHOOK_CAN_PACKET_RECEIVE, !script->CanPacketReceive(session, packet)); } -ServerScript::ServerScript(const char* name, std::vector enabledHooks) +ServerScript::ServerScript(char const* name, std::vector enabledHooks) : ScriptObject(name, SERVERHOOK_END) { // If empty - enable all available hooks. diff --git a/src/server/game/Scripting/ScriptDefines/ServerScript.h b/src/server/game/Scripting/ScriptDefines/ServerScript.h index c583856e2..8c98ab447 100644 --- a/src/server/game/Scripting/ScriptDefines/ServerScript.h +++ b/src/server/game/Scripting/ScriptDefines/ServerScript.h @@ -37,7 +37,7 @@ enum ServerHook class ServerScript : public ScriptObject { protected: - ServerScript(const char* name, std::vector enabledHooks = std::vector()); + ServerScript(char const* name, std::vector enabledHooks = std::vector()); public: // Called when reactive socket I/O is started (WorldSocketMgr). diff --git a/src/server/game/Scripting/ScriptDefines/SpellScriptLoader.cpp b/src/server/game/Scripting/ScriptDefines/SpellScriptLoader.cpp index b95c35700..e3fec2927 100644 --- a/src/server/game/Scripting/ScriptDefines/SpellScriptLoader.cpp +++ b/src/server/game/Scripting/ScriptDefines/SpellScriptLoader.cpp @@ -76,7 +76,7 @@ void ScriptMgr::CreateSpellScriptLoaders(uint32 spellId, std::vector::AddScript(this); diff --git a/src/server/game/Scripting/ScriptDefines/SpellScriptLoader.h b/src/server/game/Scripting/ScriptDefines/SpellScriptLoader.h index 841ccb5f2..2f62362ae 100644 --- a/src/server/game/Scripting/ScriptDefines/SpellScriptLoader.h +++ b/src/server/game/Scripting/ScriptDefines/SpellScriptLoader.h @@ -25,7 +25,7 @@ class SpellScriptLoader : public ScriptObject { protected: - SpellScriptLoader(const char* name); + SpellScriptLoader(char const* name); public: [[nodiscard]] bool IsDatabaseBound() const override { return true; } diff --git a/src/server/game/Scripting/ScriptDefines/TransportScript.cpp b/src/server/game/Scripting/ScriptDefines/TransportScript.cpp index d9a463957..a40d9a33b 100644 --- a/src/server/game/Scripting/ScriptDefines/TransportScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/TransportScript.cpp @@ -70,7 +70,7 @@ void ScriptMgr::OnRelocate(Transport* transport, uint32 waypointId, uint32 mapId } } -TransportScript::TransportScript(const char* name) +TransportScript::TransportScript(char const* name) : ScriptObject(name) { ScriptRegistry::AddScript(this); diff --git a/src/server/game/Scripting/ScriptDefines/TransportScript.h b/src/server/game/Scripting/ScriptDefines/TransportScript.h index 3a6fa6018..112101613 100644 --- a/src/server/game/Scripting/ScriptDefines/TransportScript.h +++ b/src/server/game/Scripting/ScriptDefines/TransportScript.h @@ -23,7 +23,7 @@ class TransportScript : public ScriptObject, public UpdatableScript { protected: - TransportScript(const char* name); + TransportScript(char const* name); public: [[nodiscard]] bool IsDatabaseBound() const override { return true; } diff --git a/src/server/game/Scripting/ScriptDefines/UnitScript.cpp b/src/server/game/Scripting/ScriptDefines/UnitScript.cpp index 71d5a2474..eb365fdcb 100644 --- a/src/server/game/Scripting/ScriptDefines/UnitScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/UnitScript.cpp @@ -139,7 +139,7 @@ void ScriptMgr::OnUnitSetShapeshiftForm(Unit* unit, uint8 form) CALL_ENABLED_HOOKS(UnitScript, UNITHOOK_ON_UNIT_SET_SHAPESHIFT_FORM, script->OnUnitSetShapeshiftForm(unit, form)); } -UnitScript::UnitScript(const char* name, bool addToScripts, std::vector enabledHooks) +UnitScript::UnitScript(char const* name, bool addToScripts, std::vector enabledHooks) : ScriptObject(name, UNITHOOK_END) { if (addToScripts) diff --git a/src/server/game/Scripting/ScriptDefines/UnitScript.h b/src/server/game/Scripting/ScriptDefines/UnitScript.h index b0cba45a3..8df6eea40 100644 --- a/src/server/game/Scripting/ScriptDefines/UnitScript.h +++ b/src/server/game/Scripting/ScriptDefines/UnitScript.h @@ -54,7 +54,7 @@ struct BuildValuesCachePosPointers; class UnitScript : public ScriptObject { protected: - UnitScript(const char* name, bool addToScripts = true, std::vector enabledHooks = std::vector()); + UnitScript(char const* name, bool addToScripts = true, std::vector enabledHooks = std::vector()); public: // Called when a unit deals healing to another unit diff --git a/src/server/game/Scripting/ScriptDefines/VehicleScript.cpp b/src/server/game/Scripting/ScriptDefines/VehicleScript.cpp index 35cc6fbeb..007bfcf33 100644 --- a/src/server/game/Scripting/ScriptDefines/VehicleScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/VehicleScript.cpp @@ -88,7 +88,7 @@ void ScriptMgr::OnRemovePassenger(Vehicle* veh, Unit* passenger) } } -VehicleScript::VehicleScript(const char* name) +VehicleScript::VehicleScript(char const* name) : ScriptObject(name) { ScriptRegistry::AddScript(this); diff --git a/src/server/game/Scripting/ScriptDefines/VehicleScript.h b/src/server/game/Scripting/ScriptDefines/VehicleScript.h index c1f6b7b87..8e13c7f0d 100644 --- a/src/server/game/Scripting/ScriptDefines/VehicleScript.h +++ b/src/server/game/Scripting/ScriptDefines/VehicleScript.h @@ -23,7 +23,7 @@ class VehicleScript : public ScriptObject { protected: - VehicleScript(const char* name); + VehicleScript(char const* name); public: // Called after a vehicle is installed. diff --git a/src/server/game/Scripting/ScriptDefines/WeatherScript.cpp b/src/server/game/Scripting/ScriptDefines/WeatherScript.cpp index 863b57622..b021d422f 100644 --- a/src/server/game/Scripting/ScriptDefines/WeatherScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/WeatherScript.cpp @@ -45,7 +45,7 @@ void ScriptMgr::OnWeatherUpdate(Weather* weather, uint32 diff) } } -WeatherScript::WeatherScript(const char* name) +WeatherScript::WeatherScript(char const* name) : ScriptObject(name) { ScriptRegistry::AddScript(this); diff --git a/src/server/game/Scripting/ScriptDefines/WeatherScript.h b/src/server/game/Scripting/ScriptDefines/WeatherScript.h index b85d15876..dd9233827 100644 --- a/src/server/game/Scripting/ScriptDefines/WeatherScript.h +++ b/src/server/game/Scripting/ScriptDefines/WeatherScript.h @@ -23,7 +23,7 @@ class WeatherScript : public ScriptObject, public UpdatableScript { protected: - WeatherScript(const char* name); + WeatherScript(char const* name); public: [[nodiscard]] bool IsDatabaseBound() const override { return true; } diff --git a/src/server/game/Scripting/ScriptDefines/WorldMapScript.cpp b/src/server/game/Scripting/ScriptDefines/WorldMapScript.cpp index da35cebc3..daffa9c9a 100644 --- a/src/server/game/Scripting/ScriptDefines/WorldMapScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/WorldMapScript.cpp @@ -19,7 +19,7 @@ #include "Log.h" #include "ScriptMgr.h" -WorldMapScript::WorldMapScript(const char* name, uint32 mapId) : +WorldMapScript::WorldMapScript(char const* name, uint32 mapId) : ScriptObject(name), MapScript(mapId) { ScriptRegistry::AddScript(this); diff --git a/src/server/game/Scripting/ScriptDefines/WorldMapScript.h b/src/server/game/Scripting/ScriptDefines/WorldMapScript.h index 40ff656c7..0df32246d 100644 --- a/src/server/game/Scripting/ScriptDefines/WorldMapScript.h +++ b/src/server/game/Scripting/ScriptDefines/WorldMapScript.h @@ -23,7 +23,7 @@ class WorldMapScript : public ScriptObject, public MapScript { protected: - WorldMapScript(const char* name, uint32 mapId); + WorldMapScript(char const* name, uint32 mapId); public: [[nodiscard]] bool isAfterLoadScript() const override { return true; } diff --git a/src/server/game/Scripting/ScriptDefines/WorldObjectScript.cpp b/src/server/game/Scripting/ScriptDefines/WorldObjectScript.cpp index 040465e65..a3ec17f35 100644 --- a/src/server/game/Scripting/ScriptDefines/WorldObjectScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/WorldObjectScript.cpp @@ -54,7 +54,7 @@ void ScriptMgr::OnWorldObjectUpdate(WorldObject* object, uint32 diff) CALL_ENABLED_HOOKS(WorldObjectScript, WORLDOBJECTHOOK_ON_WORLD_OBJECT_UPDATE, script->OnWorldObjectUpdate(object, diff)); } -WorldObjectScript::WorldObjectScript(const char* name, std::vector enabledHooks) +WorldObjectScript::WorldObjectScript(char const* name, std::vector enabledHooks) : ScriptObject(name, WORLDOBJECTHOOK_END) { // If empty - enable all available hooks. diff --git a/src/server/game/Scripting/ScriptDefines/WorldObjectScript.h b/src/server/game/Scripting/ScriptDefines/WorldObjectScript.h index e83bea37b..30c497114 100644 --- a/src/server/game/Scripting/ScriptDefines/WorldObjectScript.h +++ b/src/server/game/Scripting/ScriptDefines/WorldObjectScript.h @@ -34,7 +34,7 @@ enum WorldObjectHook class WorldObjectScript : public ScriptObject { protected: - WorldObjectScript(const char* name, std::vector enabledHooks = std::vector()); + WorldObjectScript(char const* name, std::vector enabledHooks = std::vector()); public: [[nodiscard]] bool IsDatabaseBound() const override { return false; } diff --git a/src/server/game/Scripting/ScriptDefines/WorldScript.cpp b/src/server/game/Scripting/ScriptDefines/WorldScript.cpp index e5eef4675..94c93ede4 100644 --- a/src/server/game/Scripting/ScriptDefines/WorldScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/WorldScript.cpp @@ -84,7 +84,7 @@ void ScriptMgr::OnBeforeWorldInitialized() CALL_ENABLED_HOOKS(WorldScript, WORLDHOOK_ON_BEFORE_WORLD_INITIALIZED, script->OnBeforeWorldInitialized()); } -WorldScript::WorldScript(const char* name, std::vector enabledHooks) +WorldScript::WorldScript(char const* name, std::vector enabledHooks) : ScriptObject(name, WORLDHOOK_END) { // If empty - enable all available hooks. diff --git a/src/server/game/Scripting/ScriptDefines/WorldScript.h b/src/server/game/Scripting/ScriptDefines/WorldScript.h index 75589426e..f5a51b82f 100644 --- a/src/server/game/Scripting/ScriptDefines/WorldScript.h +++ b/src/server/game/Scripting/ScriptDefines/WorldScript.h @@ -43,7 +43,7 @@ enum WorldHook class WorldScript : public ScriptObject { protected: - WorldScript(const char* name, std::vector enabledHooks = std::vector()); + WorldScript(char const* name, std::vector enabledHooks = std::vector()); public: // Called when the open/closed state of the world changes. diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h index cbc540866..411ca5a77 100644 --- a/src/server/game/Scripting/ScriptMgr.h +++ b/src/server/game/Scripting/ScriptMgr.h @@ -206,12 +206,12 @@ public: /* ItemScript */ bool OnItemRemove(Player* player, Item* item); bool OnCastItemCombatSpell(Player* player, Unit* victim, SpellInfo const* spellInfo, Item* item); void OnGossipSelect(Player* player, Item* item, uint32 sender, uint32 action); - void OnGossipSelectCode(Player* player, Item* item, uint32 sender, uint32 action, const char* code); + void OnGossipSelectCode(Player* player, Item* item, uint32 sender, uint32 action, char const* code); public: /* CreatureScript */ bool OnGossipHello(Player* player, Creature* creature); bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action); - bool OnGossipSelectCode(Player* player, Creature* creature, uint32 sender, uint32 action, const char* code); + bool OnGossipSelectCode(Player* player, Creature* creature, uint32 sender, uint32 action, char const* code); bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest); bool OnQuestSelect(Player* player, Creature* creature, Quest const* quest); bool OnQuestComplete(Player* player, Creature* creature, Quest const* quest); @@ -226,7 +226,7 @@ public: /* CreatureScript */ public: /* GameObjectScript */ bool OnGossipHello(Player* player, GameObject* go); bool OnGossipSelect(Player* player, GameObject* go, uint32 sender, uint32 action); - bool OnGossipSelectCode(Player* player, GameObject* go, uint32 sender, uint32 action, const char* code); + bool OnGossipSelectCode(Player* player, GameObject* go, uint32 sender, uint32 action, char const* code); bool OnQuestAccept(Player* player, GameObject* go, Quest const* quest); bool OnQuestReward(Player* player, GameObject* go, Quest const* quest, uint32 opt); uint32 GetDialogStatus(Player* player, GameObject* go); @@ -349,7 +349,7 @@ public: /* PlayerScript */ void OnPlayerAchievementSave(CharacterDatabaseTransaction trans, Player* player, uint16 achiId, CompletedAchievementData achiData); void OnPlayerCriteriaSave(CharacterDatabaseTransaction trans, Player* player, uint16 critId, CriteriaProgress criteriaData); void OnPlayerGossipSelect(Player* player, uint32 menu_id, uint32 sender, uint32 action); - void OnPlayerGossipSelectCode(Player* player, uint32 menu_id, uint32 sender, uint32 action, const char* code); + void OnPlayerGossipSelectCode(Player* player, uint32 menu_id, uint32 sender, uint32 action, char const* code); void OnPlayerBeingCharmed(Player* player, Unit* charmer, uint32 oldFactionId, uint32 newFactionId); void OnPlayerAfterSetVisibleItemSlot(Player* player, uint8 slot, Item* item); void OnPlayerAfterMoveItemFromInventory(Player* player, Item* it, uint8 bag, uint8 slot, bool update); @@ -438,7 +438,7 @@ public: /* PlayerScript */ void OnPlayerIsPvP(Player* player, bool& result); void OnPlayerGetMaxSkillValueForLevel(Player* player, uint16& result); bool OnPlayerNotSetArenaTeamInfoField(Player* player, uint8 slot, ArenaTeamInfoType type, uint32 value); - bool OnPlayerCanJoinLfg(Player* player, uint8 roles, lfg::LfgDungeonSet& dungeons, const std::string& comment); + bool OnPlayerCanJoinLfg(Player* player, uint8 roles, lfg::LfgDungeonSet& dungeons, std::string const& comment); bool OnPlayerCanEnterMap(Player* player, MapEntry const* entry, InstanceTemplate const* instance, MapDifficulty const* mapDiff, bool loginCheck); bool OnPlayerCanInitTrade(Player* player, Player* target); bool OnPlayerCanSetTradeItem(Player* player, Item* tradedItem, uint8 tradeSlot); @@ -495,9 +495,9 @@ public: /* AccountScript */ public: /* GuildScript */ void OnGuildAddMember(Guild* guild, Player* player, uint8& plRank); void OnGuildRemoveMember(Guild* guild, Player* player, bool isDisbanding, bool isKicked); - void OnGuildMOTDChanged(Guild* guild, const std::string& newMotd); - void OnGuildInfoChanged(Guild* guild, const std::string& newInfo); - void OnGuildCreate(Guild* guild, Player* leader, const std::string& name); + void OnGuildMOTDChanged(Guild* guild, std::string const& newMotd); + void OnGuildInfoChanged(Guild* guild, std::string const& newInfo); + void OnGuildCreate(Guild* guild, Player* leader, std::string const& name); void OnGuildDisband(Guild* guild); void OnGuildMemberWitdrawMoney(Guild* guild, Player* player, uint32& amount, bool isRepair); void OnGuildMemberDepositMoney(Guild* guild, Player* player, uint32& amount); @@ -510,7 +510,7 @@ public: /* GuildScript */ public: /* GroupScript */ void OnGroupAddMember(Group* group, ObjectGuid guid); void OnGroupInviteMember(Group* group, ObjectGuid guid); - void OnGroupRemoveMember(Group* group, ObjectGuid guid, RemoveMethod method, ObjectGuid kicker, const char* reason); + void OnGroupRemoveMember(Group* group, ObjectGuid guid, RemoveMethod method, ObjectGuid kicker, char const* reason); void OnGroupChangeLeader(Group* group, ObjectGuid newLeaderGuid, ObjectGuid oldLeaderGuid); void OnGroupDisband(Group* group); bool CanGroupJoinBattlegroundQueue(Group const* group, Player* member, Battleground const* bgTemplate, uint32 MinPlayerCount, bool isRated, uint32 arenaSlot); @@ -574,8 +574,8 @@ public: /* MovementHandlerScript */ public: /* AllCreatureScript */ //listener function (OnAllCreatureUpdate) is called by OnCreatureUpdate //void OnAllCreatureUpdate(Creature* creature, uint32 diff); - void OnBeforeCreatureSelectLevel(const CreatureTemplate* cinfo, Creature* creature, uint8& level); - void OnCreatureSelectLevel(const CreatureTemplate* cinfo, Creature* creature); + void OnBeforeCreatureSelectLevel(CreatureTemplate const* cinfo, Creature* creature, uint8& level); + void OnCreatureSelectLevel(CreatureTemplate const* cinfo, Creature* creature); void OnCreatureSaveToDB(Creature* creature); public: /* AllGameobjectScript */ @@ -689,7 +689,7 @@ public: /* MiscScript */ bool CanItemApplyEquipSpell(Player* player, Item* item); bool CanSendAuctionHello(WorldSession const* session, ObjectGuid guid, Creature* creature); void ValidateSpellAtCastSpell(Player* player, uint32& oldSpellId, uint32& spellId, uint8& castCount, uint8& castFlags); - void OnPlayerSetPhase(const AuraEffect* auraEff, AuraApplication const* aurApp, uint8 mode, bool apply, uint32& newPhase); + void OnPlayerSetPhase(AuraEffect const* auraEff, AuraApplication const* aurApp, uint8 mode, bool apply, uint32& newPhase); void ValidateSpellAtCastSpellResult(Player* player, Unit* mover, Spell* spell, uint32 oldSpellId, uint32 spellId); void OnAfterLootTemplateProcess(Loot* loot, LootTemplate const* tab, LootStore const& store, Player* lootOwner, bool personal, bool noEmptyError, uint16 lootMode); void OnInstanceSave(InstanceSave* instanceSave); diff --git a/src/server/game/Scripting/ScriptObject.h b/src/server/game/Scripting/ScriptObject.h index bd2021417..9f0b61b80 100644 --- a/src/server/game/Scripting/ScriptObject.h +++ b/src/server/game/Scripting/ScriptObject.h @@ -50,12 +50,12 @@ public: [[nodiscard]] virtual bool isAfterLoadScript() const { return IsDatabaseBound(); } virtual void checkValidity() { } - [[nodiscard]] const std::string& GetName() const { return _name; } + [[nodiscard]] std::string const& GetName() const { return _name; } [[nodiscard]] uint16 GetTotalAvailableHooks() { return _totalAvailableHooks; } protected: - ScriptObject(const char* name, uint16 totalAvailableHooks = 0) : _name(std::string(name)), _totalAvailableHooks(totalAvailableHooks) + ScriptObject(char const* name, uint16 totalAvailableHooks = 0) : _name(std::string(name)), _totalAvailableHooks(totalAvailableHooks) { } diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index ccdf9228a..dae5140f8 100644 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -340,7 +340,7 @@ void WorldSession::QueuePacket(WorldPacket* new_packet) } /// Logging helper for unexpected opcodes -void WorldSession::LogUnexpectedOpcode(WorldPacket* packet, char const* status, const char* reason) +void WorldSession::LogUnexpectedOpcode(WorldPacket* packet, char const* status, char const* reason) { LOG_ERROR("network.opcode", "Received unexpected opcode {} Status: {} Reason: {} from {}", GetOpcodeNameForLogging(static_cast(packet->GetOpcode())), status, reason, GetPlayerInfo()); diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index b588ad8f1..fa2bfd561 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -1223,7 +1223,7 @@ private: bool recoveryItem(Item* pItem); // logging helper - void LogUnexpectedOpcode(WorldPacket* packet, char const* status, const char* reason); + void LogUnexpectedOpcode(WorldPacket* packet, char const* status, char const* reason); void LogUnprocessedTail(WorldPacket* packet); // EnumData helpers diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 2ea95ae4b..8a4b34da5 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -1440,7 +1440,7 @@ void AuraEffect::HandleShapeshiftBoosts(Unit* target, bool apply) const if (player) { - const PlayerSpellMap& sp_list = player->GetSpellMap(); + PlayerSpellMap const& sp_list = player->GetSpellMap(); for (PlayerSpellMap::const_iterator itr = sp_list.begin(); itr != sp_list.end(); ++itr) { if (itr->second->State == PLAYERSPELL_REMOVED || !itr->second->IsInSpec(player->GetActiveSpec())) @@ -1458,7 +1458,7 @@ void AuraEffect::HandleShapeshiftBoosts(Unit* target, bool apply) const } // xinef: talent stance auras are not on m_spells map, so iterate talents - const PlayerTalentMap& tl_list = player->GetTalentMap(); + PlayerTalentMap const& tl_list = player->GetTalentMap(); for (PlayerTalentMap::const_iterator itr = tl_list.begin(); itr != tl_list.end(); ++itr) { if (itr->second->State == PLAYERSPELL_REMOVED || !itr->second->IsInSpec(player->GetActiveSpec())) @@ -1604,7 +1604,7 @@ void AuraEffect::HandleShapeshiftBoosts(Unit* target, bool apply) const } } - const Unit::AuraEffectList& shapeshifts = target->GetAuraEffectsByType(SPELL_AURA_MOD_SHAPESHIFT); + Unit::AuraEffectList const& shapeshifts = target->GetAuraEffectsByType(SPELL_AURA_MOD_SHAPESHIFT); AuraEffect* newAura = nullptr; // Iterate through all the shapeshift auras that the target has, if there is another aura with SPELL_AURA_MOD_SHAPESHIFT, then this aura is being removed due to that one being applied for (Unit::AuraEffectList::const_iterator itr = shapeshifts.begin(); itr != shapeshifts.end(); ++itr) diff --git a/src/server/game/Spells/Auras/SpellAuras.h b/src/server/game/Spells/Auras/SpellAuras.h index 0c6639584..d4dd5e0ec 100644 --- a/src/server/game/Spells/Auras/SpellAuras.h +++ b/src/server/game/Spells/Auras/SpellAuras.h @@ -181,7 +181,7 @@ public: // Helpers for targets ApplicationMap const& GetApplicationMap() {return m_applications;} void GetApplicationList(std::list& applicationList) const; - const AuraApplication* GetApplicationOfTarget (ObjectGuid guid) const { ApplicationMap::const_iterator itr = m_applications.find(guid); if (itr != m_applications.end()) return itr->second; return nullptr; } + AuraApplication const* GetApplicationOfTarget (ObjectGuid guid) const { ApplicationMap::const_iterator itr = m_applications.find(guid); if (itr != m_applications.end()) return itr->second; return nullptr; } AuraApplication* GetApplicationOfTarget (ObjectGuid guid) { ApplicationMap::iterator itr = m_applications.find(guid); if (itr != m_applications.end()) return itr->second; return nullptr; } bool IsAppliedOnTarget(ObjectGuid guid) const { return m_applications.find(guid) != m_applications.end(); } diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h index 40ebfaa6f..a956597a0 100644 --- a/src/server/game/Spells/Spell.h +++ b/src/server/game/Spells/Spell.h @@ -252,7 +252,7 @@ enum SpellEffectHandleMode // Xinef: special structure containing data for channel target spells struct ChannelTargetData { - ChannelTargetData(ObjectGuid cguid, const SpellDestination* dst) : channelGUID(cguid) + ChannelTargetData(ObjectGuid cguid, SpellDestination const* dst) : channelGUID(cguid) { if (dst) spellDst = *dst; diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 928e33659..0a441a881 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -3936,7 +3936,7 @@ void Spell::EffectScriptEffect(SpellEffIndex effIndex) case 47770: { char buf[128]; - const char* gender = "his"; + char const* gender = "his"; if (m_caster->getGender() > 0) gender = "her"; snprintf(buf, sizeof(buf), "%s rubs %s [Decahedral Dwarven Dice] between %s hands and rolls. One %u and one %u.", m_caster->GetName().c_str(), gender, gender, urand(1, 10), urand(1, 10)); diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index f2e5d803c..3494dc9c0 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -1628,7 +1628,7 @@ bool SpellInfo::IsAuraEffectEqual(SpellInfo const* otherSpellInfo) const return matchCount * 2 == auraCount; } -bool SpellInfo::ValidateAttribute6SpellDamageMods(Unit const* caster, const AuraEffect* auraEffect, bool isDot) const +bool SpellInfo::ValidateAttribute6SpellDamageMods(Unit const* caster, AuraEffect const* auraEffect, bool isDot) const { // Xinef: no attribute if (!(AttributesEx6 & SPELL_ATTR6_IGNORE_CASTER_DAMAGE_MODIFIERS)) diff --git a/src/server/game/Spells/SpellInfo.h b/src/server/game/Spells/SpellInfo.h index b87b5e37d..022a6d028 100644 --- a/src/server/game/Spells/SpellInfo.h +++ b/src/server/game/Spells/SpellInfo.h @@ -516,7 +516,7 @@ public: bool CheckTargetCreatureType(Unit const* target) const; bool IsAuraEffectEqual(SpellInfo const* otherSpellInfo) const; - bool ValidateAttribute6SpellDamageMods(Unit const* caster, const AuraEffect* auraEffect, bool isDot) const; + bool ValidateAttribute6SpellDamageMods(Unit const* caster, AuraEffect const* auraEffect, bool isDot) const; SpellSchoolMask GetSchoolMask() const; uint64 GetAllEffectsMechanicMask() const; diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index 987ffd1d0..1f23766ea 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -1011,7 +1011,7 @@ bool SpellMgr::IsArenaAllowedEnchancment(uint32 ench_id) const return mEnchantCustomAttr[ench_id]; } -const std::vector* SpellMgr::GetSpellLinked(int32 spell_id) const +std::vector const* SpellMgr::GetSpellLinked(int32 spell_id) const { SpellLinkedMap::const_iterator itr = mSpellLinkedMap.find(spell_id); return itr != mSpellLinkedMap.end() ? &(itr->second) : nullptr; diff --git a/src/server/game/Spells/SpellMgr.h b/src/server/game/Spells/SpellMgr.h index 27c049497..2d67f29b1 100644 --- a/src/server/game/Spells/SpellMgr.h +++ b/src/server/game/Spells/SpellMgr.h @@ -726,7 +726,7 @@ public: [[nodiscard]] SpellEnchantProcEntry const* GetSpellEnchantProcEvent(uint32 enchId) const; [[nodiscard]] bool IsArenaAllowedEnchancment(uint32 ench_id) const; - [[nodiscard]] const std::vector* GetSpellLinked(int32 spell_id) const; + [[nodiscard]] std::vector const* GetSpellLinked(int32 spell_id) const; [[nodiscard]] PetLevelupSpellSet const* GetPetLevelupSpellList(uint32 petFamily) const; [[nodiscard]] PetDefaultSpellsEntry const* GetPetDefaultSpellsEntry(int32 id) const; diff --git a/src/server/game/Tickets/TicketMgr.cpp b/src/server/game/Tickets/TicketMgr.cpp index 7c6337b30..e4bead52c 100644 --- a/src/server/game/Tickets/TicketMgr.cpp +++ b/src/server/game/Tickets/TicketMgr.cpp @@ -186,7 +186,7 @@ std::string GmTicket::FormatMessageString(ChatHandler& handler, bool detailed) c return ss.str(); } -std::string GmTicket::FormatMessageString(ChatHandler& handler, const char* szClosedName, const char* szAssignedToName, const char* szUnassignedName, const char* szDeletedName) const +std::string GmTicket::FormatMessageString(ChatHandler& handler, char const* szClosedName, char const* szAssignedToName, char const* szUnassignedName, char const* szDeletedName) const { std::stringstream ss; ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTGUID, _id); diff --git a/src/server/game/Tickets/TicketMgr.h b/src/server/game/Tickets/TicketMgr.h index 7293f23c3..ff31f940b 100644 --- a/src/server/game/Tickets/TicketMgr.h +++ b/src/server/game/Tickets/TicketMgr.h @@ -150,7 +150,7 @@ public: void TeleportTo(Player* player) const; std::string FormatMessageString(ChatHandler& handler, bool detailed = false) const; - std::string FormatMessageString(ChatHandler& handler, const char* szClosedName, const char* szAssignedToName, const char* szUnassignedName, const char* szDeletedName) const; + std::string FormatMessageString(ChatHandler& handler, char const* szClosedName, char const* szAssignedToName, char const* szUnassignedName, char const* szDeletedName) const; void SetChatLog(std::list time, std::string const& log); std::string const& GetChatLog() const { return _chatLog; } diff --git a/src/server/game/Tools/CharacterDatabaseCleaner.cpp b/src/server/game/Tools/CharacterDatabaseCleaner.cpp index 329a6283c..fc0ee330d 100644 --- a/src/server/game/Tools/CharacterDatabaseCleaner.cpp +++ b/src/server/game/Tools/CharacterDatabaseCleaner.cpp @@ -68,7 +68,7 @@ void CharacterDatabaseCleaner::CleanDatabase() LOG_INFO("server.loading", " "); } -void CharacterDatabaseCleaner::CheckUnique(const char* column, const char* table, bool (*check)(uint32)) +void CharacterDatabaseCleaner::CheckUnique(char const* column, char const* table, bool (*check)(uint32)) { QueryResult result = CharacterDatabase.Query("SELECT DISTINCT {} FROM {}", column, table); if (!result) diff --git a/src/server/game/Tools/CharacterDatabaseCleaner.h b/src/server/game/Tools/CharacterDatabaseCleaner.h index 382d5ccfb..acb95a5e1 100644 --- a/src/server/game/Tools/CharacterDatabaseCleaner.h +++ b/src/server/game/Tools/CharacterDatabaseCleaner.h @@ -33,7 +33,7 @@ namespace CharacterDatabaseCleaner void CleanDatabase(); - void CheckUnique(const char* column, const char* table, bool (*check)(uint32)); + void CheckUnique(char const* column, char const* table, bool (*check)(uint32)); bool AchievementProgressCheck(uint32 criteria); bool SkillCheck(uint32 skill); diff --git a/src/server/game/Warden/Warden.cpp b/src/server/game/Warden/Warden.cpp index ba9e6b3df..688bedc02 100644 --- a/src/server/game/Warden/Warden.cpp +++ b/src/server/game/Warden/Warden.cpp @@ -140,7 +140,7 @@ void Warden::EncryptData(uint8* buffer, uint32 length) _outputCrypto.UpdateData(buffer, length); } -bool Warden::IsValidCheckSum(uint32 checksum, const uint8* data, const uint16 length) +bool Warden::IsValidCheckSum(uint32 checksum, uint8 const* data, const uint16 length) { uint32 newChecksum = BuildChecksum(data, length); @@ -167,7 +167,7 @@ union keyData std::array ints; }; -uint32 Warden::BuildChecksum(const uint8* data, uint32 length) +uint32 Warden::BuildChecksum(uint8 const* data, uint32 length) { keyData hash{}; hash.bytes = Acore::Crypto::SHA1::GetDigestOf(data, std::size_t(length)); diff --git a/src/server/game/Warden/WardenPayloadMgr.cpp b/src/server/game/Warden/WardenPayloadMgr.cpp index e6ef106b1..5d03c1117 100644 --- a/src/server/game/Warden/WardenPayloadMgr.cpp +++ b/src/server/game/Warden/WardenPayloadMgr.cpp @@ -40,7 +40,7 @@ uint16 WardenPayloadMgr::GetFreePayloadId() return payloadId; } -uint16 WardenPayloadMgr::RegisterPayload(const std::string& payload) +uint16 WardenPayloadMgr::RegisterPayload(std::string const& payload) { uint16 payloadId = GetFreePayloadId(); diff --git a/src/server/game/Warden/WardenPayloadMgr.h b/src/server/game/Warden/WardenPayloadMgr.h index 8cc5bd4d8..a65a8f9d5 100644 --- a/src/server/game/Warden/WardenPayloadMgr.h +++ b/src/server/game/Warden/WardenPayloadMgr.h @@ -50,7 +50,7 @@ public: * @note * - Payloads are truncated to 512 bytes on the client, you may have to register your payloads in chunks if they are larger than this. */ - uint16 RegisterPayload(const std::string& payload); + uint16 RegisterPayload(std::string const& payload); /** * @brief Register a payload into cache with a custom id and returns the result. diff --git a/src/server/game/World/IWorld.h b/src/server/game/World/IWorld.h index b0c808785..81edb7675 100644 --- a/src/server/game/World/IWorld.h +++ b/src/server/game/World/IWorld.h @@ -80,9 +80,9 @@ public: virtual void LoadConfigSettings(bool reload = false) = 0; [[nodiscard]] virtual bool IsShuttingDown() const = 0; [[nodiscard]] virtual uint32 GetShutDownTimeLeft() const = 0; - virtual void ShutdownServ(uint32 time, uint32 options, uint8 exitcode, const std::string& reason = std::string()) = 0; + virtual void ShutdownServ(uint32 time, uint32 options, uint8 exitcode, std::string const& reason = std::string()) = 0; virtual void ShutdownCancel() = 0; - virtual void ShutdownMsg(bool show = false, Player* player = nullptr, const std::string& reason = std::string()) = 0; + virtual void ShutdownMsg(bool show = false, Player* player = nullptr, std::string const& reason = std::string()) = 0; virtual void Update(uint32 diff) = 0; virtual void setRate(ServerConfigs index, float value) = 0; [[nodiscard]] virtual float getRate(ServerConfigs index) const = 0; diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 2c302ba05..f2deafa83 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -265,7 +265,7 @@ void World::LoadConfigSettings(bool reload) #if AC_PLATFORM == AC_PLATFORM_UNIX || AC_PLATFORM == AC_PLATFORM_APPLE if (dataPath[0] == '~') { - const char* home = getenv("HOME"); + char const* home = getenv("HOME"); if (home) dataPath.replace(0, 1, home); } diff --git a/src/server/game/World/WorldState.cpp b/src/server/game/World/WorldState.cpp index 9613f8938..269e53cc7 100644 --- a/src/server/game/World/WorldState.cpp +++ b/src/server/game/World/WorldState.cpp @@ -1761,7 +1761,7 @@ enum PallidHorrorPaths PATH_UNDERCITY_ROYAL_QUARTER = 163944, }; -bool WorldState::SummonPallid(Map* map, ScourgeInvasionData::CityAttack& zone, const Position& position, uint32 spawnLoc) +bool WorldState::SummonPallid(Map* map, ScourgeInvasionData::CityAttack& zone, Position const& position, uint32 spawnLoc) { AddPendingPallid(zone.zoneId); // Remove old pallid if required. diff --git a/src/server/game/World/WorldState.h b/src/server/game/World/WorldState.h index 8a9142a0b..7f463e378 100644 --- a/src/server/game/World/WorldState.h +++ b/src/server/game/World/WorldState.h @@ -351,7 +351,7 @@ class WorldState void StartNewCityAttack(uint32 zoneId); bool ResumeInvasion(ScourgeInvasionData::InvasionZone& zone); bool SummonMouth(Map* map, ScourgeInvasionData::InvasionZone& zone, Position position, bool newInvasion); - bool SummonPallid(Map* map, ScourgeInvasionData::CityAttack& zone, const Position& position, uint32 spawnLoc); + bool SummonPallid(Map* map, ScourgeInvasionData::CityAttack& zone, Position const& position, uint32 spawnLoc); void HandleActiveZone(uint32 attackTimeVar, uint32 zoneId, uint32 remainingVar, TimePoint now); Map* GetMap(uint32 mapId, Position const& invZone); diff --git a/src/server/scripts/Commands/cs_inventory.cpp b/src/server/scripts/Commands/cs_inventory.cpp index 80ece0d0d..a861b2e9b 100644 --- a/src/server/scripts/Commands/cs_inventory.cpp +++ b/src/server/scripts/Commands/cs_inventory.cpp @@ -22,7 +22,7 @@ #include "RBAC.h" #include "WorldSession.h" -constexpr std::array bagSpecsToString = +constexpr std::array bagSpecsToString = { "normal", "soul", diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp index b795ebf19..6d8f75176 100644 --- a/src/server/scripts/Commands/cs_misc.cpp +++ b/src/server/scripts/Commands/cs_misc.cpp @@ -316,7 +316,7 @@ public: break; } - const Group* g = plr->GetGroup(); + Group const* g = plr->GetGroup(); if (hcnt > 1) { diff --git a/src/server/scripts/Commands/cs_wp.cpp b/src/server/scripts/Commands/cs_wp.cpp index 0c17fd633..395b63553 100644 --- a/src/server/scripts/Commands/cs_wp.cpp +++ b/src/server/scripts/Commands/cs_wp.cpp @@ -71,7 +71,7 @@ public: * * @return true - command did succeed, false - something went wrong */ - static bool HandleWpAddCommand(ChatHandler* handler, const char* args) + static bool HandleWpAddCommand(ChatHandler* handler, char const* args) { // optional char* path_number = nullptr; @@ -134,7 +134,7 @@ public: return true; } // HandleWpAddCommand - static bool HandleWpLoadCommand(ChatHandler* handler, const char* args) + static bool HandleWpLoadCommand(ChatHandler* handler, char const* args) { if (!*args) return false; @@ -213,7 +213,7 @@ public: return true; } - static bool HandleWpReloadCommand(ChatHandler* handler, const char* args) + static bool HandleWpReloadCommand(ChatHandler* handler, char const* args) { if (!*args) return false; @@ -228,7 +228,7 @@ public: return true; } - static bool HandleWpUnLoadCommand(ChatHandler* handler, const char* /*args*/) + static bool HandleWpUnLoadCommand(ChatHandler* handler, char const* /*args*/) { Creature* target = handler->getSelectedCreature(); @@ -269,7 +269,7 @@ public: return true; } - static bool HandleWpEventCommand(ChatHandler* handler, const char* args) + static bool HandleWpEventCommand(ChatHandler* handler, char const* args) { if (!*args) return false; @@ -541,7 +541,7 @@ public: return true; } - static bool HandleWpModifyCommand(ChatHandler* handler, const char* args) + static bool HandleWpModifyCommand(ChatHandler* handler, char const* args) { if (!*args) return false; @@ -718,7 +718,7 @@ public: return true; } // move - const char* text = arg_str; + char const* text = arg_str; if (text == 0) { @@ -737,7 +737,7 @@ public: return true; } - static bool HandleWpShowCommand(ChatHandler* handler, const char* args) + static bool HandleWpShowCommand(ChatHandler* handler, char const* args) { if (!*args) return false; diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp index c61388188..da015b8c4 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp @@ -140,7 +140,7 @@ class at_ring_of_law : public AreaTriggerScript public: at_ring_of_law() : AreaTriggerScript("at_ring_of_law") { } - bool OnTrigger(Player* player, const AreaTrigger* /*at*/) override + bool OnTrigger(Player* player, AreaTrigger const* /*at*/) override { if (InstanceScript* instance = player->GetInstanceScript()) { diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/instance_blackrock_depths.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/instance_blackrock_depths.cpp index 678885ce2..72c56ece5 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/instance_blackrock_depths.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/instance_blackrock_depths.cpp @@ -397,7 +397,7 @@ struct instance_blackrock_depths : public InstanceScript break; case NPC_SHADOWFORGE_SENATOR: deadSenators = 1; //hacky, but we cannot count the unit that just died through its state because OnUnitDeath() is called before the state is set. - for (const auto &senatorGUID: EmperorSenatorsVector) + for (auto const& senatorGUID: EmperorSenatorsVector) if (Creature* senator = instance->GetCreature(senatorGUID)) if (!senator->IsAlive() || senator->isDying()) deadSenators++; @@ -684,7 +684,7 @@ struct instance_blackrock_depths : public InstanceScript return str_data; } - void Load(const char* in) override + void Load(char const* in) override { if (!in) { diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/instance_blackrock_spire.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/instance_blackrock_spire.cpp index 62beba867..b4d19fc29 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/instance_blackrock_spire.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/instance_blackrock_spire.cpp @@ -661,7 +661,7 @@ class at_dragonspire_hall : public AreaTriggerScript public: at_dragonspire_hall() : AreaTriggerScript("at_dragonspire_hall") { } - bool OnTrigger(Player* player, const AreaTrigger* /*at*/) override + bool OnTrigger(Player* player, AreaTrigger const* /*at*/) override { if (player && player->IsAlive()) { @@ -685,7 +685,7 @@ class at_blackrock_stadium : public AreaTriggerScript public: at_blackrock_stadium() : AreaTriggerScript("at_blackrock_stadium") { } - bool OnTrigger(Player* player, const AreaTrigger* /*at*/) override + bool OnTrigger(Player* player, AreaTrigger const* /*at*/) override { if (player && player->IsAlive()) { @@ -733,7 +733,7 @@ class near_scarshield_infiltrator : public AreaTriggerScript public: near_scarshield_infiltrator() : AreaTriggerScript("near_scarshield_infiltrator") { } - bool OnTrigger(Player* player, const AreaTrigger* /*at*/) override + bool OnTrigger(Player* player, AreaTrigger const* /*at*/) override { if (player && player->IsAlive()) { @@ -764,7 +764,7 @@ class at_scarshield_infiltrator : public AreaTriggerScript public: at_scarshield_infiltrator() : AreaTriggerScript("at_scarshield_infiltrator") { } - bool OnTrigger(Player* player, const AreaTrigger* /*at*/) override + bool OnTrigger(Player* player, AreaTrigger const* /*at*/) override { if (player && player->IsAlive()) { diff --git a/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp b/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp index 39d2077b9..2cd8195ac 100644 --- a/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp +++ b/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp @@ -86,7 +86,7 @@ public: return saveStream.str(); } - void Load(const char* in) override + void Load(char const* in) override { if (!in) return; diff --git a/src/server/scripts/EasternKingdoms/Gnomeregan/instance_gnomeregan.cpp b/src/server/scripts/EasternKingdoms/Gnomeregan/instance_gnomeregan.cpp index a6289049a..c597aa0fd 100644 --- a/src/server/scripts/EasternKingdoms/Gnomeregan/instance_gnomeregan.cpp +++ b/src/server/scripts/EasternKingdoms/Gnomeregan/instance_gnomeregan.cpp @@ -110,7 +110,7 @@ public: return GetGnomereganAI(creature); } - bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override + bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override { if (quest->GetQuestId() == QUEST_A_FINE_MESS) { diff --git a/src/server/scripts/EasternKingdoms/ShadowfangKeep/boss_apothecary_hummel.cpp b/src/server/scripts/EasternKingdoms/ShadowfangKeep/boss_apothecary_hummel.cpp index 0efd989f1..456956e31 100644 --- a/src/server/scripts/EasternKingdoms/ShadowfangKeep/boss_apothecary_hummel.cpp +++ b/src/server/scripts/EasternKingdoms/ShadowfangKeep/boss_apothecary_hummel.cpp @@ -256,7 +256,7 @@ public: uint8 _phase; }; - bool OnQuestReward(Player* /*player*/, Creature* creature, const Quest* quest, uint32 /*slot*/) override + bool OnQuestReward(Player* /*player*/, Creature* creature, Quest const* quest, uint32 /*slot*/) override { if (quest->GetQuestId() == QUEST_YOUVE_BEEN_SERVED) { diff --git a/src/server/scripts/EasternKingdoms/SunkenTemple/instance_sunken_temple.cpp b/src/server/scripts/EasternKingdoms/SunkenTemple/instance_sunken_temple.cpp index 8ac630307..13a64692c 100644 --- a/src/server/scripts/EasternKingdoms/SunkenTemple/instance_sunken_temple.cpp +++ b/src/server/scripts/EasternKingdoms/SunkenTemple/instance_sunken_temple.cpp @@ -219,7 +219,7 @@ class at_malfurion_stormrage : public AreaTriggerScript public: at_malfurion_stormrage() : AreaTriggerScript("at_malfurion_stormrage") { } - bool OnTrigger(Player* player, const AreaTrigger* /*at*/) override + bool OnTrigger(Player* player, AreaTrigger const* /*at*/) override { if (player->GetInstanceScript() && !player->FindNearestCreature(NPC_MALFURION_STORMRAGE, 15.0f) && player->GetQuestStatus(QUEST_THE_CHARGE_OF_DRAGONFLIGHTS) == QUEST_STATUS_REWARDED && player->GetQuestStatus(QUEST_ERANIKUS_TYRANT_OF_DREAMS) != QUEST_STATUS_REWARDED) diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp index d3ce0fa71..0fabde290 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp @@ -189,7 +189,7 @@ struct boss_felmyst : public BossAI Talk(YELL_KILL, victim); } - void SpellHitTarget(Unit* target, const SpellInfo* spell) override + void SpellHitTarget(Unit* target, SpellInfo const* spell) override { if (spell->Id == SPELL_STRAFE_TOP || spell->Id == SPELL_STRAFE_MIDDLE || spell->Id == SPELL_STRAFE_BOTTOM) target->CastSpell(target, SPELL_FOG_OF_CORRUPTION, true); diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp index 6bbefa315..753d56790 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp @@ -223,7 +223,7 @@ class at_zulgurub_entrance_speech : public OnlyOnceAreaTriggerScript public: at_zulgurub_entrance_speech() : OnlyOnceAreaTriggerScript("at_zulgurub_entrance_speech") {} - bool _OnTrigger(Player* player, const AreaTrigger* /*at*/) override + bool _OnTrigger(Player* player, AreaTrigger const* /*at*/) override { if (InstanceScript* instance = player->GetInstanceScript()) { @@ -246,7 +246,7 @@ class at_zulgurub_bridge_speech : public OnlyOnceAreaTriggerScript public: at_zulgurub_bridge_speech() : OnlyOnceAreaTriggerScript("at_zulgurub_bridge_speech") {} - bool _OnTrigger(Player* player, const AreaTrigger* /*at*/) override + bool _OnTrigger(Player* player, AreaTrigger const* /*at*/) override { if (InstanceScript* instance = player->GetInstanceScript()) { @@ -268,7 +268,7 @@ class at_zulgurub_temple_speech : public OnlyOnceAreaTriggerScript public: at_zulgurub_temple_speech() : OnlyOnceAreaTriggerScript("at_zulgurub_temple_speech") {} - bool _OnTrigger(Player* player, const AreaTrigger* /*at*/) override + bool _OnTrigger(Player* player, AreaTrigger const* /*at*/) override { if (InstanceScript* instance = player->GetInstanceScript()) { @@ -290,7 +290,7 @@ class at_zulgurub_bloodfire_pit_speech : public OnlyOnceAreaTriggerScript public: at_zulgurub_bloodfire_pit_speech() : OnlyOnceAreaTriggerScript("at_zulgurub_bloodfire_pit_speech") {} - bool _OnTrigger(Player* player, const AreaTrigger* /*at*/) override + bool _OnTrigger(Player* player, AreaTrigger const* /*at*/) override { if (InstanceScript* instance = player->GetInstanceScript()) { @@ -312,7 +312,7 @@ class at_zulgurub_edge_of_madness_speech : public OnlyOnceAreaTriggerScript public: at_zulgurub_edge_of_madness_speech() : OnlyOnceAreaTriggerScript("at_zulgurub_edge_of_madness_speech") {} - bool _OnTrigger(Player* player, const AreaTrigger* /*at*/) override + bool _OnTrigger(Player* player, AreaTrigger const* /*at*/) override { if (InstanceScript* instance = player->GetInstanceScript()) { diff --git a/src/server/scripts/EasternKingdoms/zone_duskwood.cpp b/src/server/scripts/EasternKingdoms/zone_duskwood.cpp index 37e9ab224..87de14c03 100644 --- a/src/server/scripts/EasternKingdoms/zone_duskwood.cpp +++ b/src/server/scripts/EasternKingdoms/zone_duskwood.cpp @@ -134,7 +134,7 @@ class at_twilight_grove : public AreaTriggerScript public: at_twilight_grove() : AreaTriggerScript("at_twilight_grove") { } - bool OnTrigger(Player* player, const AreaTrigger* /*at*/) override + bool OnTrigger(Player* player, AreaTrigger const* /*at*/) override { if (player->HasQuestForItem(ITEM_FRAGMENT) && !player->HasItemCount(ITEM_FRAGMENT)) player->SummonCreature(NPC_TWILIGHT_CORRUPTER, -10328.16f, -489.57f, 49.95f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 240000); diff --git a/src/server/scripts/EasternKingdoms/zone_undercity.cpp b/src/server/scripts/EasternKingdoms/zone_undercity.cpp index cbc19b7c0..d972bc008 100644 --- a/src/server/scripts/EasternKingdoms/zone_undercity.cpp +++ b/src/server/scripts/EasternKingdoms/zone_undercity.cpp @@ -88,7 +88,7 @@ class npc_lady_sylvanas_windrunner : public CreatureScript public: npc_lady_sylvanas_windrunner() : CreatureScript("npc_lady_sylvanas_windrunner") { } - bool OnQuestReward(Player* player, Creature* creature, const Quest* _Quest, uint32 /*slot*/) override + bool OnQuestReward(Player* player, Creature* creature, Quest const* _Quest, uint32 /*slot*/) override { if (_Quest->GetQuestId() == QUEST_JOURNEY_TO_UNDERCITY) creature->AI()->SetGUID(player->GetGUID(), GUID_EVENT_INVOKER); diff --git a/src/server/scripts/EasternKingdoms/zone_westfall.cpp b/src/server/scripts/EasternKingdoms/zone_westfall.cpp index ab89105c8..40e602d04 100644 --- a/src/server/scripts/EasternKingdoms/zone_westfall.cpp +++ b/src/server/scripts/EasternKingdoms/zone_westfall.cpp @@ -51,7 +51,7 @@ class npc_daphne_stilwell : public CreatureScript public: npc_daphne_stilwell() : CreatureScript("npc_daphne_stilwell") { } - bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override + bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override { if (quest->GetQuestId() == QUEST_TOME_VALOR) { diff --git a/src/server/scripts/EasternKingdoms/zone_wetlands.cpp b/src/server/scripts/EasternKingdoms/zone_wetlands.cpp index 85749ea1c..03b71033a 100644 --- a/src/server/scripts/EasternKingdoms/zone_wetlands.cpp +++ b/src/server/scripts/EasternKingdoms/zone_wetlands.cpp @@ -126,7 +126,7 @@ class npc_mikhail : public CreatureScript public: npc_mikhail() : CreatureScript("npc_mikhail") { } - bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override + bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override { if (quest->GetQuestId() == QUEST_MISSING_DIPLO_PT11) { diff --git a/src/server/scripts/Events/midsummer.cpp b/src/server/scripts/Events/midsummer.cpp index cff91c99a..5f8c6f5c9 100644 --- a/src/server/scripts/Events/midsummer.cpp +++ b/src/server/scripts/Events/midsummer.cpp @@ -1018,7 +1018,7 @@ class spell_midsummer_fling_torch : public SpellScript if (GetSpellInfo()->Id != SPELL_FLING_TORCH_DUMMY) { if (!handled) - if (const WorldLocation* loc = GetExplTargetDest()) + if (WorldLocation const* loc = GetExplTargetDest()) { caster->CastSpell(loc->GetPositionX(), loc->GetPositionY(), loc->GetPositionZ(), SPELL_MISSED_TORCH, true); caster->RemoveAurasDueToSpell(SPELL_TORCH_COUNTER); @@ -1113,7 +1113,7 @@ class spell_midsummer_juggling_torch : public SpellScript if (!caster || !caster->IsPlayer()) return; - if (const WorldLocation* loc = GetExplTargetDest()) + if (WorldLocation const* loc = GetExplTargetDest()) { if (loc->GetExactDist(caster) < 3.0f) { diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp index 26721ebf3..844028f34 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp @@ -1430,7 +1430,7 @@ class npc_cos_chromie_start : public CreatureScript public: npc_cos_chromie_start() : CreatureScript("npc_cos_chromie_start") { } - bool OnQuestAccept(Player* /*player*/, Creature* creature, const Quest* quest) override + bool OnQuestAccept(Player* /*player*/, Creature* creature, Quest const* quest) override { if (quest->GetQuestId() == QUEST_DISPELLING_ILLUSIONS) if (InstanceScript* instance = creature->GetInstanceScript()) @@ -1488,7 +1488,7 @@ class npc_cos_chromie_middle : public CreatureScript public: npc_cos_chromie_middle() : CreatureScript("npc_cos_chromie_middle") { } - bool OnQuestAccept(Player*, Creature* creature, const Quest* pQuest) override + bool OnQuestAccept(Player*, Creature* creature, Quest const* pQuest) override { if (pQuest->GetQuestId() == QUEST_A_ROYAL_ESCORT) if (InstanceScript* pInstance = creature->GetInstanceScript()) diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/instance_culling_of_stratholme.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/instance_culling_of_stratholme.cpp index bd1c7ba2e..0bddcbdca 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/instance_culling_of_stratholme.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/instance_culling_of_stratholme.cpp @@ -365,7 +365,7 @@ public: return saveStream.str(); } - void Load(const char* in) override + void Load(char const* in) override { if (!in) { diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp index 6b6fe638b..9aaff7fd9 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp @@ -409,7 +409,7 @@ class at_twin_emperors : public OnlyOnceAreaTriggerScript public: at_twin_emperors() : OnlyOnceAreaTriggerScript("at_twin_emperors") { } - bool _OnTrigger(Player* player, const AreaTrigger* /*at*/) override + bool _OnTrigger(Player* player, AreaTrigger const* /*at*/) override { if (InstanceScript* instance = player->GetInstanceScript()) { diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/temple_of_ahnqiraj.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/temple_of_ahnqiraj.cpp index 866c89a81..a81850520 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/temple_of_ahnqiraj.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/temple_of_ahnqiraj.cpp @@ -547,7 +547,7 @@ class at_battleguard_sartura : public AreaTriggerScript public: at_battleguard_sartura() : AreaTriggerScript("at_battleguard_sartura") { } - bool OnTrigger(Player* player, const AreaTrigger* /*at*/) override + bool OnTrigger(Player* player, AreaTrigger const* /*at*/) override { if (InstanceScript* instance = player->GetInstanceScript()) { diff --git a/src/server/scripts/Kalimdor/zone_darkshore.cpp b/src/server/scripts/Kalimdor/zone_darkshore.cpp index 7b40eac34..f21987954 100644 --- a/src/server/scripts/Kalimdor/zone_darkshore.cpp +++ b/src/server/scripts/Kalimdor/zone_darkshore.cpp @@ -260,7 +260,7 @@ public: } }; - bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override + bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override { if (quest->GetQuestId() == QUEST_SLEEPER_AWAKENED) { @@ -393,7 +393,7 @@ public: } }; - bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override + bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override { if (quest->GetQuestId() == QUEST_ABSENT_MINDED_PT2) { @@ -616,7 +616,7 @@ public: float _facing; }; - bool OnQuestReward(Player* player, Creature* creature, const Quest* _Quest, uint32 /*slot*/) override + bool OnQuestReward(Player* player, Creature* creature, Quest const* _Quest, uint32 /*slot*/) override { if (_Quest->GetQuestId() == QUEST_PLAGUED_LANDS) { diff --git a/src/server/scripts/Kalimdor/zone_tanaris.cpp b/src/server/scripts/Kalimdor/zone_tanaris.cpp index cd5d007b3..188db122f 100644 --- a/src/server/scripts/Kalimdor/zone_tanaris.cpp +++ b/src/server/scripts/Kalimdor/zone_tanaris.cpp @@ -323,7 +323,7 @@ class npc_tooga : public CreatureScript public: npc_tooga() : CreatureScript("npc_tooga") { } - bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override + bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override { if (quest->GetQuestId() == QUEST_TOOGA) { diff --git a/src/server/scripts/Kalimdor/zone_the_barrens.cpp b/src/server/scripts/Kalimdor/zone_the_barrens.cpp index 8fe236fe5..ead7a0dce 100644 --- a/src/server/scripts/Kalimdor/zone_the_barrens.cpp +++ b/src/server/scripts/Kalimdor/zone_the_barrens.cpp @@ -45,7 +45,7 @@ class npc_gilthares : public CreatureScript public: npc_gilthares() : CreatureScript("npc_gilthares") { } - bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override + bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override { if (quest->GetQuestId() == QUEST_FREE_FROM_HOLD) { diff --git a/src/server/scripts/Kalimdor/zone_thousand_needles.cpp b/src/server/scripts/Kalimdor/zone_thousand_needles.cpp index c76108dac..3ec5cfead 100644 --- a/src/server/scripts/Kalimdor/zone_thousand_needles.cpp +++ b/src/server/scripts/Kalimdor/zone_thousand_needles.cpp @@ -58,7 +58,7 @@ class npc_lakota_windsong : public CreatureScript public: npc_lakota_windsong() : CreatureScript("npc_lakota_windsong") { } - bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override + bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override { if (quest->GetQuestId() == QUEST_FREE_AT_LAST) { @@ -144,7 +144,7 @@ class npc_paoka_swiftmountain : public CreatureScript public: npc_paoka_swiftmountain() : CreatureScript("npc_paoka_swiftmountain") { } - bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override + bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override { if (quest->GetQuestId() == QUEST_HOMEWARD) { diff --git a/src/server/scripts/Kalimdor/zone_ungoro_crater.cpp b/src/server/scripts/Kalimdor/zone_ungoro_crater.cpp index ff4845c7e..cc7d3d628 100644 --- a/src/server/scripts/Kalimdor/zone_ungoro_crater.cpp +++ b/src/server/scripts/Kalimdor/zone_ungoro_crater.cpp @@ -168,7 +168,7 @@ class npc_ringo : public CreatureScript public: npc_ringo() : CreatureScript("npc_ringo") { } - bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override + bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override { if (quest->GetQuestId() == QUEST_A_LITTLE_HELP) { diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/instance_trial_of_the_champion.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/instance_trial_of_the_champion.cpp index 02851fcfe..ff06b5956 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/instance_trial_of_the_champion.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/instance_trial_of_the_champion.cpp @@ -182,7 +182,7 @@ public: break; } if (creature->GetUInt32Value(UNIT_FIELD_MOUNTDISPLAYID)) - if (const CreatureAddon* ca = creature->GetCreatureAddon()) + if (CreatureAddon const* ca = creature->GetCreatureAddon()) if (ca->mount != creature->GetUInt32Value(UNIT_FIELD_MOUNTDISPLAYID)) creature->SetUInt32Value(UNIT_FIELD_MOUNTDISPLAYID, ca->mount); } @@ -216,7 +216,7 @@ public: return str_data; } - void Load(const char* in) override + void Load(char const* in) override { CLEANED = false; events.Reset(); @@ -269,7 +269,7 @@ public: bool DoNeedCleanup(Player* ignoredPlayer = nullptr) { uint8 aliveCount = 0; - for (const auto &itr: instance->GetPlayers()) + for (auto const& itr: instance->GetPlayers()) { if (Player* plr = itr.GetSource()) { diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp index e99b6cbc7..2e9b013e2 100644 --- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp @@ -1458,7 +1458,7 @@ class at_hor_shadow_throne : public AreaTriggerScript public: at_hor_shadow_throne() : AreaTriggerScript("at_hor_shadow_throne") { } - bool OnTrigger(Player* player, const AreaTrigger* /*at*/) override + bool OnTrigger(Player* player, AreaTrigger const* /*at*/) override { InstanceScript* inst = player->GetInstanceScript(); if (!inst) diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp index 7dc0906a1..e1f4191b7 100644 --- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp @@ -219,7 +219,7 @@ public: EnterEvadeMode(EVADE_REASON_OTHER); if (CreatureGroup* f = me->GetFormation()) { - const CreatureGroup::CreatureGroupMemberType& m = f->GetMembers(); + CreatureGroup::CreatureGroupMemberType const& m = f->GetMembers(); for (CreatureGroup::CreatureGroupMemberType::const_iterator itr = m.begin(); itr != m.end(); ++itr) if (itr->first->IsAlive() && itr->first->IsInCombat() && !itr->first->IsInEvadeMode() && itr->first->IsAIEnabled) itr->first->AI()->EnterEvadeMode(); diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp index 837460b79..b582177a8 100644 --- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp @@ -1464,7 +1464,7 @@ class at_tyrannus_event_starter : public AreaTriggerScript public: at_tyrannus_event_starter() : AreaTriggerScript("at_tyrannus_event_starter") { } - bool OnTrigger(Player* player, const AreaTrigger* /*at*/) override + bool OnTrigger(Player* player, AreaTrigger const* /*at*/) override { InstanceScript* inst = player->GetInstanceScript(); if (!inst) diff --git a/src/server/scripts/Northrend/Gundrak/boss_drakkari_colossus.cpp b/src/server/scripts/Northrend/Gundrak/boss_drakkari_colossus.cpp index 70cea6381..4d906b138 100644 --- a/src/server/scripts/Northrend/Gundrak/boss_drakkari_colossus.cpp +++ b/src/server/scripts/Northrend/Gundrak/boss_drakkari_colossus.cpp @@ -129,7 +129,7 @@ public: { me->CastSpell(me, SPELL_FREEZE_ANIM, true); me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE); - for (const auto & i : mojoPosition) + for (auto const& i : mojoPosition) me->SummonCreature(NPC_LIVING_MOJO, i.GetPositionX(), i.GetPositionY(), i.GetPositionZ(), 0, TEMPSUMMON_MANUAL_DESPAWN, 0); } else diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp index c392f324f..3456652ca 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp @@ -359,7 +359,7 @@ public: if (me->GetVictim()) { std::list myList; - const Map::PlayerList& pl = me->GetMap()->GetPlayers(); + Map::PlayerList const& pl = me->GetMap()->GetPlayers(); for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr) if (Player* p = itr->GetSource()) if (p->IsAlive() && p != me->GetVictim() && !p->IsGameMaster() && !p->HasAura(SPELL_UNCONTROLLABLE_FRENZY)) @@ -429,7 +429,7 @@ public: if (!me->HasReactState(REACT_PASSIVE)) { std::list myList; - const Map::PlayerList& pl = me->GetMap()->GetPlayers(); + Map::PlayerList const& pl = me->GetMap()->GetPlayers(); for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr) if (Player* p = itr->GetSource()) if (p->IsAlive() && p != me->GetVictim() && p->GetGUID() != _offtankGUID && !p->IsGameMaster() && p->GetDistance(me) < 100.0f && !p->HasAura(SPELL_UNCONTROLLABLE_FRENZY)) @@ -452,7 +452,7 @@ public: if (!me->HasReactState(REACT_PASSIVE)) { std::list myList; - const Map::PlayerList& pl = me->GetMap()->GetPlayers(); + Map::PlayerList const& pl = me->GetMap()->GetPlayers(); for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr) if (Player* p = itr->GetSource()) if (p->IsAlive() && p != me->GetVictim() && p->GetGUID() != _offtankGUID && !p->IsGameMaster() && !p->HasAura(SPELL_PACT_OF_THE_DARKFALLEN) && !p->HasAura(SPELL_UNCONTROLLABLE_FRENZY)) @@ -476,7 +476,7 @@ public: if (!me->HasReactState(REACT_PASSIVE)) { std::list myList; - const Map::PlayerList& pl = me->GetMap()->GetPlayers(); + Map::PlayerList const& pl = me->GetMap()->GetPlayers(); for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr) if (Player* p = itr->GetSource()) if (p->IsAlive() && p != me->GetVictim() && p->GetGUID() != _offtankGUID && !p->IsGameMaster() && !p->HasAura(SPELL_PACT_OF_THE_DARKFALLEN) && !p->HasAura(SPELL_UNCONTROLLABLE_FRENZY)) @@ -555,7 +555,7 @@ public: void EnterEvadeMode(EvadeReason why) override { - const Map::PlayerList& pl = me->GetMap()->GetPlayers(); + Map::PlayerList const& pl = me->GetMap()->GetPlayers(); for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr) if (Player* p = itr->GetSource()) if (p->IsAlive() && p->HasAura(SPELL_UNCONTROLLABLE_FRENZY)) @@ -903,7 +903,7 @@ class spell_blood_queen_presence_of_the_darkfallen : public SpellScript class achievement_once_bitten_twice_shy : public AchievementCriteriaScript { public: - achievement_once_bitten_twice_shy(const char* name, uint8 spawnMode, bool wasVampire) : AchievementCriteriaScript(name), _spawnMode(spawnMode), _wasVampire(wasVampire) { } + achievement_once_bitten_twice_shy(char const* name, uint8 spawnMode, bool wasVampire) : AchievementCriteriaScript(name), _spawnMode(spawnMode), _wasVampire(wasVampire) { } bool OnCheck(Player* source, Unit* target, uint32 /*criteria_id*/) override { diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp index 9b6926c96..03bb42e21 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp @@ -607,7 +607,7 @@ public: } // helper for summoning wave mobs - void Summon(uint32 entry, const Position& pos) + void Summon(uint32 entry, Position const& pos) { if (me->SummonCreature(entry, pos, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000)) if (TempSummon* trigger = me->SummonCreature(WORLD_TRIGGER, pos, TEMPSUMMON_TIMED_DESPAWN, 2000)) diff --git a/src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp b/src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp index ce6c18f11..6d3361b38 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp @@ -177,7 +177,7 @@ public: { if (candidates.empty()) break; - const Position &randomPos = PosWrap[positions[i]]; + Position const& randomPos = PosWrap[positions[i]]; auto itr = candidates.begin(); diff --git a/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp b/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp index c1dd286dc..c2b7542c3 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp @@ -700,7 +700,7 @@ class at_thaddius_entrance : public OnlyOnceAreaTriggerScript public: at_thaddius_entrance() : OnlyOnceAreaTriggerScript("at_thaddius_entrance") { } - bool _OnTrigger(Player* player, const AreaTrigger* /*trigger*/) override + bool _OnTrigger(Player* player, AreaTrigger const* /*trigger*/) override { if (InstanceScript* instance = player->GetInstanceScript()) if (instance->GetBossState(BOSS_THADDIUS) != DONE) diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp index 6f733bd1c..e9305585b 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp @@ -95,7 +95,7 @@ class at_hol_hall_of_watchers : public OnlyOnceAreaTriggerScript public: at_hol_hall_of_watchers() : OnlyOnceAreaTriggerScript("at_hol_hall_of_watchers") {} - bool _OnTrigger(Player* player, const AreaTrigger* /*at*/) override + bool _OnTrigger(Player* player, AreaTrigger const* /*at*/) override { std::list creatures; player->GetCreatureListWithEntryInGrid(creatures, { NPC_TITANIUM_SIEGEBREAKER, NPC_TITANIUM_THUNDERER }, 50.0f); diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/brann_bronzebeard.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/brann_bronzebeard.cpp index 41f9cf1f0..b48037354 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/brann_bronzebeard.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/brann_bronzebeard.cpp @@ -92,7 +92,7 @@ enum events struct Yells { uint32 sound; - const char* text; + char const* text; uint32 creature, timer; }; diff --git a/src/server/scripts/Northrend/zone_icecrown.cpp b/src/server/scripts/Northrend/zone_icecrown.cpp index 00987f8eb..7137573ee 100644 --- a/src/server/scripts/Northrend/zone_icecrown.cpp +++ b/src/server/scripts/Northrend/zone_icecrown.cpp @@ -1211,7 +1211,7 @@ class spell_anti_air_rocket_bomber : public SpellScript void HandleDummy(SpellEffIndex effIndex) { PreventHitDefaultEffect(effIndex); - const WorldLocation* loc = GetExplTargetDest(); + WorldLocation const* loc = GetExplTargetDest(); GetCaster()->CastSpell(loc->GetPositionX(), loc->GetPositionY(), loc->GetPositionZ(), GetSpellInfo()->Effects[effIndex].CalcValue(), true); } diff --git a/src/server/scripts/Northrend/zone_sholazar_basin.cpp b/src/server/scripts/Northrend/zone_sholazar_basin.cpp index 9a289c098..e661cb068 100644 --- a/src/server/scripts/Northrend/zone_sholazar_basin.cpp +++ b/src/server/scripts/Northrend/zone_sholazar_basin.cpp @@ -538,7 +538,7 @@ public: return new npc_engineer_heliceAI(creature); } - bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override + bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override { if (quest->GetQuestId() == QUEST_DISASTER) { diff --git a/src/server/scripts/Northrend/zone_wintergrasp.cpp b/src/server/scripts/Northrend/zone_wintergrasp.cpp index 6c2317fb5..7b5c672d3 100644 --- a/src/server/scripts/Northrend/zone_wintergrasp.cpp +++ b/src/server/scripts/Northrend/zone_wintergrasp.cpp @@ -829,7 +829,7 @@ public: checkTimer = 0; if (me->GetVehicleKit()) for (SeatMap::iterator itr = me->GetVehicleKit()->Seats.begin(); itr != me->GetVehicleKit()->Seats.end(); ++itr) - if (const VehicleSeatEntry* seatInfo = itr->second.SeatInfo) + if (VehicleSeatEntry const* seatInfo = itr->second.SeatInfo) if (seatInfo->m_flags & VEHICLE_SEAT_FLAG_CAN_CONTROL) if (Unit* passenger = ObjectAccessor::GetUnit(*me, itr->second.Passenger.Guid)) if (!CanControlVehicle(passenger)) diff --git a/src/server/scripts/Northrend/zone_zuldrak.cpp b/src/server/scripts/Northrend/zone_zuldrak.cpp index 71c7fb42b..bc84d3938 100644 --- a/src/server/scripts/Northrend/zone_zuldrak.cpp +++ b/src/server/scripts/Northrend/zone_zuldrak.cpp @@ -37,7 +37,7 @@ enum AlchemistItemRequirements const uint32 AA_ITEM_ENTRY[24] = {38336, 39669, 38342, 38340, 38344, 38369, 38396, 38398, 38338, 38386, 38341, 38384, 38397, 38381, 38337, 38393, 38339, 39668, 39670, 38346, 38379, 38345, 38343, 38370}; const uint32 AA_AURA_ID[24] = {51095, 53153, 51100, 51087, 51091, 51081, 51072, 51079, 51018, 51067, 51055, 51064, 51077, 51062, 51057, 51069, 51059, 53150, 53158, 51093, 51097, 51102, 51083, 51085}; -const char* AA_ITEM_NAME[24] = {"Crystallized Hogsnot", "Ghoul Drool", "Trollbane", "Amberseed", "Shrunken Dragon's Claw", +char const* AA_ITEM_NAME[24] = {"Crystallized Hogsnot", "Ghoul Drool", "Trollbane", "Amberseed", "Shrunken Dragon's Claw", "Wasp's Wings", "Hairy Herring Head", "Icecrown Bottled Water", "Knotroot", "Muddy Mire Maggot", "Pickled Eagle Egg", "Pulverized Gargoyle Teeth", "Putrid Pirate Perspiration", "Seasoned Slider Cider", "Speckled Guano", "Spiky Spider Egg", "Withered Batwing", "Abomination Guts", "Blight Crystal", "Chilled Serpent Mucus", "Crushed Basilisk Crystals", @@ -129,7 +129,7 @@ public: // Decode Item Entry, Get Item Name, Generate Emotes //uint32 itemEntry = GetTaskItemEntry(itemCode); uint32 auraId = GetTaskAura(itemCode); - const char* itemName = GetTaskItemName(itemCode); + char const* itemName = GetTaskItemName(itemCode); switch (counter) { @@ -171,7 +171,7 @@ public: uint32 GetTaskCounter(uint32 itemcode) { return itemcode / 100; } uint32 GetTaskAura(uint32 itemcode) { return AA_AURA_ID[itemcode % 100]; } uint32 GetTaskItemEntry(uint32 itemcode) { return AA_ITEM_ENTRY[itemcode % 100]; } - const char* GetTaskItemName(uint32 itemcode) { return AA_ITEM_NAME[itemcode % 100]; } + char const* GetTaskItemName(uint32 itemcode) { return AA_ITEM_NAME[itemcode % 100]; } }; bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override diff --git a/src/server/scripts/OutdoorPvP/OutdoorPvPEP.cpp b/src/server/scripts/OutdoorPvP/OutdoorPvPEP.cpp index ff4fe37dd..7db78a86a 100644 --- a/src/server/scripts/OutdoorPvP/OutdoorPvPEP.cpp +++ b/src/server/scripts/OutdoorPvP/OutdoorPvPEP.cpp @@ -155,7 +155,7 @@ void OPvPCapturePointEP_EWT::SummonSupportUnitAtNorthpassTower(TeamId teamId) if (m_UnitsSummonedSideId != teamId) { m_UnitsSummonedSideId = teamId; - const creature_type* ct = teamId == TEAM_ALLIANCE ? EP_EWT_Summons_A : EP_EWT_Summons_H; + creature_type const* ct = teamId == TEAM_ALLIANCE ? EP_EWT_Summons_A : EP_EWT_Summons_H; for (uint8 i = 0; i < EP_EWT_NUM_CREATURES; ++i) { diff --git a/src/server/scripts/OutdoorPvP/OutdoorPvPNA.cpp b/src/server/scripts/OutdoorPvP/OutdoorPvPNA.cpp index 1fe133ef0..94f8bf44f 100644 --- a/src/server/scripts/OutdoorPvP/OutdoorPvPNA.cpp +++ b/src/server/scripts/OutdoorPvP/OutdoorPvPNA.cpp @@ -150,7 +150,7 @@ void OPvPCapturePointNA::SpawnNPCsForTeam(HalaaNPCS teamNPC) for (int i = 0; i < NA_HALAA_CREATURE_TEAM_SPAWN; i++) { ObjectGuid::LowType spawnId = teamNPC[i]; - const CreatureData* data = sObjectMgr->GetCreatureData(spawnId); + CreatureData const* data = sObjectMgr->GetCreatureData(spawnId); if (data) { UpdateCreatureHalaa(spawnId, _pvp->GetMap(), data->posX, data->posY); @@ -162,7 +162,7 @@ void OPvPCapturePointNA::SpawnNPCsForTeam(HalaaNPCS teamNPC) void OPvPCapturePointNA::SpawnGOsForTeam(TeamId teamId) { - const go_type* gos = nullptr; + go_type const* gos = nullptr; if (teamId == TEAM_ALLIANCE) gos = AllianceControlGOs; else if (teamId == TEAM_HORDE) @@ -470,7 +470,7 @@ int32 OPvPCapturePointNA::HandleOpenGo(Player* player, GameObject* go) int32 retval = OPvPCapturePoint::HandleOpenGo(player, go); if (retval >= 0) { - const go_type* gos = nullptr; + go_type const* gos = nullptr; if (m_ControllingFaction == TEAM_ALLIANCE) gos = AllianceControlGOs; else if (m_ControllingFaction == TEAM_HORDE) diff --git a/src/server/scripts/Outland/CoilfangReservoir/underbog/boss_ghazan.cpp b/src/server/scripts/Outland/CoilfangReservoir/underbog/boss_ghazan.cpp index 5b660a1d1..0e239e448 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/underbog/boss_ghazan.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/underbog/boss_ghazan.cpp @@ -134,7 +134,7 @@ class at_underbog_ghazan : public OnlyOnceAreaTriggerScript public: at_underbog_ghazan() : OnlyOnceAreaTriggerScript("at_underbog_ghazan") {} - bool _OnTrigger(Player* player, const AreaTrigger* /*at*/) override + bool _OnTrigger(Player* player, AreaTrigger const* /*at*/) override { if (InstanceScript* instance = player->GetInstanceScript()) { diff --git a/src/server/scripts/Outland/zone_nagrand.cpp b/src/server/scripts/Outland/zone_nagrand.cpp index fbef4231c..16cc8ac8e 100644 --- a/src/server/scripts/Outland/zone_nagrand.cpp +++ b/src/server/scripts/Outland/zone_nagrand.cpp @@ -57,7 +57,7 @@ class npc_maghar_captive : public CreatureScript public: npc_maghar_captive() : CreatureScript("npc_maghar_captive") { } - bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override + bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override { if (quest->GetQuestId() == QUEST_TOTEM_KARDASH_H) { @@ -284,7 +284,7 @@ class npc_kurenai_captive : public CreatureScript public: npc_kurenai_captive() : CreatureScript("npc_kurenai_captive") { } - bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override + bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override { if (quest->GetQuestId() == QUEST_TOTEM_KARDASH_A) creature->AI()->SetGUID(player->GetGUID(), quest->GetQuestId()); diff --git a/src/server/scripts/Outland/zone_netherstorm.cpp b/src/server/scripts/Outland/zone_netherstorm.cpp index 9c3cf495e..465b5f083 100644 --- a/src/server/scripts/Outland/zone_netherstorm.cpp +++ b/src/server/scripts/Outland/zone_netherstorm.cpp @@ -560,7 +560,7 @@ class at_commander_dawnforge : public AreaTriggerScript public: at_commander_dawnforge() : AreaTriggerScript("at_commander_dawnforge") { } - bool OnTrigger(Player* player, const AreaTrigger* /*at*/) override + bool OnTrigger(Player* player, AreaTrigger const* /*at*/) override { //if player lost aura or not have at all, we should not try start event. if (!player->HasAura(SPELL_SUNFURY_DISGUISE)) @@ -768,7 +768,7 @@ public: } }; - bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override + bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override { if (quest->GetQuestId() == QUEST_MARK_V_IS_ALIVE) { diff --git a/src/server/scripts/Pet/pet_generic.cpp b/src/server/scripts/Pet/pet_generic.cpp index cafc40f25..e7ca2c8bb 100644 --- a/src/server/scripts/Pet/pet_generic.cpp +++ b/src/server/scripts/Pet/pet_generic.cpp @@ -128,7 +128,7 @@ struct argentPonyBanner { uint32 achievement; uint32 spell; - const char* text; + char const* text; }; static std::unordered_map argentBanners = { diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp index 969ab4b24..a9038eeba 100644 --- a/src/server/scripts/Spells/spell_generic.cpp +++ b/src/server/scripts/Spells/spell_generic.cpp @@ -2539,7 +2539,7 @@ class spell_gen_vehicle_scaling : public SpellScript SpellCastResult CheckSeat() { if (Vehicle* veh = GetCaster()->GetVehicle()) - if (const VehicleSeatEntry* seatEntry = veh->GetSeatForPassenger(GetCaster())) + if (VehicleSeatEntry const* seatEntry = veh->GetSeatForPassenger(GetCaster())) if (seatEntry->m_flags & VEHICLE_SEAT_FLAG_CAN_CONTROL) return SPELL_CAST_OK; diff --git a/src/server/scripts/Spells/spell_mage.cpp b/src/server/scripts/Spells/spell_mage.cpp index ef3b49e36..b5f1a6ac7 100644 --- a/src/server/scripts/Spells/spell_mage.cpp +++ b/src/server/scripts/Spells/spell_mage.cpp @@ -621,7 +621,7 @@ class spell_mage_ice_barrier_aura : public spell_mage_incanters_absorbtion_base_ PrepareAuraScript(spell_mage_ice_barrier_aura); /// @todo: Rework - static int32 CalculateSpellAmount(Unit* caster, int32 amount, SpellInfo const* spellInfo, const AuraEffect* aurEff) + static int32 CalculateSpellAmount(Unit* caster, int32 amount, SpellInfo const* spellInfo, AuraEffect const* aurEff) { // +80.68% from sp bonus float bonus = 0.8068f; @@ -657,7 +657,7 @@ class spell_mage_ice_barrier : public SpellScript PrepareSpellScript(spell_mage_ice_barrier); /// @todo: Rework - static int32 CalculateSpellAmount(Unit* caster, int32 amount, SpellInfo const* spellInfo, const AuraEffect* aurEff) + static int32 CalculateSpellAmount(Unit* caster, int32 amount, SpellInfo const* spellInfo, AuraEffect const* aurEff) { // +80.68% from sp bonus float bonus = 0.8068f; diff --git a/src/server/scripts/Spells/spell_priest.cpp b/src/server/scripts/Spells/spell_priest.cpp index 93b6f807f..7e99622f1 100644 --- a/src/server/scripts/Spells/spell_priest.cpp +++ b/src/server/scripts/Spells/spell_priest.cpp @@ -631,7 +631,7 @@ class spell_pri_penance : public SpellScript }; // -17 - Power Word: Shield -static int32 CalculateSpellAmount(Unit* caster, int32 amount, SpellInfo const* spellInfo, const AuraEffect* aurEff) +static int32 CalculateSpellAmount(Unit* caster, int32 amount, SpellInfo const* spellInfo, AuraEffect const* aurEff) { // +80.68% from sp bonus float bonus = 0.8068f; diff --git a/src/server/scripts/Spells/spell_warrior.cpp b/src/server/scripts/Spells/spell_warrior.cpp index 5462102d4..bd34567d8 100644 --- a/src/server/scripts/Spells/spell_warrior.cpp +++ b/src/server/scripts/Spells/spell_warrior.cpp @@ -927,7 +927,7 @@ class spell_warr_heroic_strike : public SpellScript bool bonusDamage = false; for (AuraEffect* eff : AuraEffectList) { - const SpellInfo* spellInfo = eff->GetSpellInfo(); + SpellInfo const* spellInfo = eff->GetSpellInfo(); if (!spellInfo) continue; diff --git a/src/server/scripts/World/item_scripts.cpp b/src/server/scripts/World/item_scripts.cpp index 6a0be8f5d..61df215af 100644 --- a/src/server/scripts/World/item_scripts.cpp +++ b/src/server/scripts/World/item_scripts.cpp @@ -150,7 +150,7 @@ class item_petrov_cluster_bombs : public ItemScript public: item_petrov_cluster_bombs() : ItemScript("item_petrov_cluster_bombs") { } - bool OnUse(Player* player, Item* item, const SpellCastTargets& /*targets*/) override + bool OnUse(Player* player, Item* item, SpellCastTargets const& /*targets*/) override { if (player->GetZoneId() != AREA_HOWLING_FJORD) return false; diff --git a/src/server/scripts/World/scourge_invasion.cpp b/src/server/scripts/World/scourge_invasion.cpp index eb7565780..1428688e6 100644 --- a/src/server/scripts/World/scourge_invasion.cpp +++ b/src/server/scripts/World/scourge_invasion.cpp @@ -378,7 +378,7 @@ struct npc_necrotic_shard : public ScriptedAI if (shard != me) shard->DespawnOnEvade(); - scheduler.Schedule(10s, [this](const TaskContext& /*context*/) // Check if Doodads are spawned 5 seconds after spawn. If not: spawn them + scheduler.Schedule(10s, [this](TaskContext const& /*context*/) // Check if Doodads are spawned 5 seconds after spawn. If not: spawn them { std::list objectList; me->GetGameObjectListWithEntryInGrid( @@ -842,7 +842,7 @@ struct npc_pallid_horror : public ScriptedAI void ScheduleTasks() { - scheduler.Schedule(0s, [this](const TaskContext& /*context*/) + scheduler.Schedule(0s, [this](TaskContext const& /*context*/) { SummonFlameshockers(); }).Schedule(1s, [this](TaskContext context) diff --git a/src/server/scripts/World/suns_reach_reclamation.cpp b/src/server/scripts/World/suns_reach_reclamation.cpp index 1a4cf4b14..055d90a35 100644 --- a/src/server/scripts/World/suns_reach_reclamation.cpp +++ b/src/server/scripts/World/suns_reach_reclamation.cpp @@ -23,7 +23,7 @@ class npc_suns_reach_reclamation : public CreatureScript public: npc_suns_reach_reclamation() : CreatureScript("npc_suns_reach_reclamation") { } - bool OnQuestReward(Player* /*player*/, Creature* /*creature*/, const Quest* quest, uint32 /*slot*/) override + bool OnQuestReward(Player* /*player*/, Creature* /*creature*/, Quest const* quest, uint32 /*slot*/) override { sWorldState->AddSunsReachProgress(quest->GetQuestId()); return true; @@ -35,7 +35,7 @@ class npc_sunwell_gate : public CreatureScript public: npc_sunwell_gate() : CreatureScript("npc_sunwell_gate") { } - bool OnQuestReward(Player* /*player*/, Creature* /*creature*/, const Quest* quest, uint32 /*slot*/) override + bool OnQuestReward(Player* /*player*/, Creature* /*creature*/, Quest const* quest, uint32 /*slot*/) override { sWorldState->AddSunwellGateProgress(quest->GetQuestId()); return true; diff --git a/src/server/shared/Packets/ByteBuffer.h b/src/server/shared/Packets/ByteBuffer.h index 56966e815..56b4da5de 100644 --- a/src/server/shared/Packets/ByteBuffer.h +++ b/src/server/shared/Packets/ByteBuffer.h @@ -469,7 +469,7 @@ public: return append((uint8 const*)src, cnt); } - template void append(const T* src, std::size_t cnt) + template void append(T const* src, std::size_t cnt) { return append((uint8 const*)src, cnt * sizeof(T)); } diff --git a/src/test/common/Configuration/Config.cpp b/src/test/common/Configuration/Config.cpp index ab6654060..9136701b2 100644 --- a/src/test/common/Configuration/Config.cpp +++ b/src/test/common/Configuration/Config.cpp @@ -25,7 +25,7 @@ #include #if WIN32 - void inline setenv(const char* name, const char* value, int overwrite) + void inline setenv(char const* name, char const* value, int overwrite) { _putenv_s(name, value); } diff --git a/src/test/mocks/WorldMock.h b/src/test/mocks/WorldMock.h index e96e38b47..23cc89982 100644 --- a/src/test/mocks/WorldMock.h +++ b/src/test/mocks/WorldMock.h @@ -49,9 +49,9 @@ public: MOCK_METHOD(void, LoadConfigSettings, (bool reload), ()); MOCK_METHOD(bool, IsShuttingDown, (), (const)); MOCK_METHOD(uint32, GetShutDownTimeLeft, (), (const)); - MOCK_METHOD(void, ShutdownServ, (uint32 time, uint32 options, uint8 exitcode, const std::string& reason), ()); + MOCK_METHOD(void, ShutdownServ, (uint32 time, uint32 options, uint8 exitcode, std::string const& reason), ()); MOCK_METHOD(void, ShutdownCancel, ()); - MOCK_METHOD(void, ShutdownMsg, (bool show, Player* player, const std::string& reason), ()); + MOCK_METHOD(void, ShutdownMsg, (bool show, Player* player, std::string const& reason), ()); MOCK_METHOD(void, Update, (uint32 diff), ()); MOCK_METHOD(void, setRate, (ServerConfigs index, float value), ()); MOCK_METHOD(float, getRate, (ServerConfigs index), (const)); diff --git a/src/test/server/game/Events/HolidayDateCalculatorTest.cpp b/src/test/server/game/Events/HolidayDateCalculatorTest.cpp index fb16fce9f..e05fc1dc0 100644 --- a/src/test/server/game/Events/HolidayDateCalculatorTest.cpp +++ b/src/test/server/game/Events/HolidayDateCalculatorTest.cpp @@ -21,7 +21,7 @@ class HolidayDateCalculatorTest : public ::testing::Test { protected: - void ExpectDate(const std::tm& date, int year, int month, int day) + void ExpectDate(std::tm const& date, int year, int month, int day) { EXPECT_EQ(date.tm_year + 1900, year); EXPECT_EQ(date.tm_mon + 1, month); @@ -409,7 +409,7 @@ TEST_F(HolidayDateCalculatorTest, FixedDateHolidays_ConsistentAcrossYears_1900_2 { // Fixed date holidays should have same month/day every year // Note: Brewfest, Harvest Festival, and Winter Veil are now dynamic (not fixed date) - struct FixedHolidayTestCase { uint32_t holidayId; int month; int day; const char* name; }; + struct FixedHolidayTestCase { uint32_t holidayId; int month; int day; char const* name; }; std::vector testCases = { { 341, 6, 21, "Midsummer Fire Festival" }, { 62, 7, 4, "Fireworks Spectacular" }, @@ -687,7 +687,7 @@ TEST_F(HolidayDateCalculatorTest, WeekdayOnOrAfter_MonthBoundary_RollsIntoNextMo TEST_F(HolidayDateCalculatorTest, StressTest_AllCalculations_1900_2200) { // Run all holiday calculations for entire range to ensure no crashes - const std::vector& rules = HolidayDateCalculator::GetHolidayRules(); + std::vector const& rules = HolidayDateCalculator::GetHolidayRules(); int totalCalculations = 0; diff --git a/src/test/server/game/Spells/CascadeProcSuppressionTest.cpp b/src/test/server/game/Spells/CascadeProcSuppressionTest.cpp index a04edbf2e..26c43b7b3 100644 --- a/src/test/server/game/Spells/CascadeProcSuppressionTest.cpp +++ b/src/test/server/game/Spells/CascadeProcSuppressionTest.cpp @@ -134,7 +134,7 @@ TEST_F(CascadeProcSuppressionTest, SpellInfo_WithMixedBits_HasAttributeReturnsTr struct RealSpellTestCase { - const char* name; + char const* name; uint32 spellId; bool hasAttr; // Whether the spell has SPELL_ATTR3_INSTANT_TARGET_PROCS }; diff --git a/src/test/server/game/Spells/SpellProcDBCValidationTest.cpp b/src/test/server/game/Spells/SpellProcDBCValidationTest.cpp index 99eae3673..0a3f0faef 100644 --- a/src/test/server/game/Spells/SpellProcDBCValidationTest.cpp +++ b/src/test/server/game/Spells/SpellProcDBCValidationTest.cpp @@ -91,7 +91,7 @@ INSTANTIATE_TEST_SUITE_P( AllSpellProcEntries, SpellProcDBCValidationParamTest, ::testing::ValuesIn(GetAllSpellProcTestEntries()), - [](const testing::TestParamInfo& info) { + [](testing::TestParamInfo const& info) { // Create unique test name from SpellId (handle negative IDs) int32_t id = info.param.SpellId; if (id < 0) diff --git a/src/test/server/game/Spells/SpellProcDataDrivenTest.cpp b/src/test/server/game/Spells/SpellProcDataDrivenTest.cpp index 56a9e4437..dce53a3f4 100644 --- a/src/test/server/game/Spells/SpellProcDataDrivenTest.cpp +++ b/src/test/server/game/Spells/SpellProcDataDrivenTest.cpp @@ -42,7 +42,7 @@ using namespace testing; struct ProcFlagScenario { uint32 procFlag; - const char* name; + char const* name; uint32 defaultHitMask; uint32 defaultSpellTypeMask; uint32 defaultSpellPhaseMask; @@ -77,7 +77,7 @@ static const std::vector PROC_FLAG_SCENARIOS = { { PROC_FLAG_DONE_TRAP_ACTIVATION, "TrapActivation", PROC_HIT_NORMAL, 0, PROC_SPELL_PHASE_HIT, true }, }; -static const std::vector> HIT_MASK_SCENARIOS = { +static const std::vector> HIT_MASK_SCENARIOS = { { PROC_HIT_NORMAL, "Normal" }, { PROC_HIT_CRITICAL, "Critical" }, { PROC_HIT_MISS, "Miss" }, diff --git a/src/test/server/game/Spells/SpellProcFullCoverageTest.cpp b/src/test/server/game/Spells/SpellProcFullCoverageTest.cpp index f4a46d59f..2d10fbe32 100644 --- a/src/test/server/game/Spells/SpellProcFullCoverageTest.cpp +++ b/src/test/server/game/Spells/SpellProcFullCoverageTest.cpp @@ -353,7 +353,7 @@ INSTANTIATE_TEST_SUITE_P( AllSpellProcEntries, SpellProcFullCoverageTest, ::testing::ValuesIn(GetAllSpellProcTestEntries()), - [](const ::testing::TestParamInfo& info) { + [](::testing::TestParamInfo const& info) { // Generate unique test name from spell ID int32_t id = info.param.SpellId; if (id < 0) diff --git a/src/test/server/game/Spells/SpellProcPPMTest.cpp b/src/test/server/game/Spells/SpellProcPPMTest.cpp index b58df9a0e..28ce42989 100644 --- a/src/test/server/game/Spells/SpellProcPPMTest.cpp +++ b/src/test/server/game/Spells/SpellProcPPMTest.cpp @@ -352,7 +352,7 @@ TEST_F(SpellProcPPMTest, ShapeshiftBug_ItemSpellPath_AlreadyCorrect) struct FormScenario { - const char* name; + char const* name; uint32 formSpeed; }; diff --git a/src/tools/map_extractor/System.cpp b/src/tools/map_extractor/System.cpp index 4fef9164e..635f55b0d 100644 --- a/src/tools/map_extractor/System.cpp +++ b/src/tools/map_extractor/System.cpp @@ -100,7 +100,7 @@ float CONF_flat_height_delta_limit = 0.005f; // If max - min less this value - s float CONF_flat_liquid_delta_limit = 0.001f; // If max - min less this value - liquid surface is flat // List MPQ for extract from -const char* CONF_mpq_list[] = +char const* CONF_mpq_list[] = { "common.MPQ", "common-2.MPQ", @@ -113,10 +113,10 @@ const char* CONF_mpq_list[] = "patch-5.MPQ", }; -static const char* const langs[] = {"enGB", "enUS", "deDE", "esES", "frFR", "koKR", "zhCN", "zhTW", "enCN", "enTW", "esMX", "ruRU" }; +static char const* const langs[] = {"enGB", "enUS", "deDE", "esES", "frFR", "koKR", "zhCN", "zhTW", "enCN", "enTW", "esMX", "ruRU" }; #define LANG_COUNT 12 -void CreateDir( const std::string& Path ) +void CreateDir( std::string const& Path ) { if (chdir(Path.c_str()) == 0) { @@ -141,7 +141,7 @@ void CreateDir( const std::string& Path ) } } -bool FileExists( const char* FileName ) +bool FileExists( char const* FileName ) { int fp = _open(FileName, OPEN_FLAGS); if (fp != -1) @@ -1071,7 +1071,7 @@ void ExtractDBCFiles(int locale, bool basicLocale) // extract DBCs uint32 count = 0; - for (const auto & dbcfile : dbcfiles) + for (auto const& dbcfile : dbcfiles) { string filename = path; filename += (dbcfile.c_str() + strlen("DBFilesClient\\")); diff --git a/src/tools/map_extractor/dbcfile.h b/src/tools/map_extractor/dbcfile.h index 0fb6298fc..160b8afc5 100644 --- a/src/tools/map_extractor/dbcfile.h +++ b/src/tools/map_extractor/dbcfile.h @@ -37,7 +37,7 @@ public: Exception(std::string message): message(std::move(message)) { } virtual ~Exception() = default; - const std::string& getMessage() {return message;} + std::string const& getMessage() {return message;} private: std::string message; }; @@ -67,7 +67,7 @@ public: assert(field < file.fieldCount); return *reinterpret_cast(offset + field * 4); } - [[nodiscard]] const char* getString(std::size_t field) const + [[nodiscard]] char const* getString(std::size_t field) const { assert(field < file.fieldCount); std::size_t stringOffset = getUInt(field); @@ -97,16 +97,16 @@ public: } /// Return address of current instance Record const& operator*() const { return record; } - const Record* operator->() const + Record const* operator->() const { return &record; } /// Comparison - bool operator==(const Iterator& b) const + bool operator==(Iterator const& b) const { return record.offset == b.record.offset; } - bool operator!=(const Iterator& b) const + bool operator!=(Iterator const& b) const { return record.offset != b.record.offset; } diff --git a/src/tools/map_extractor/mpq_libmpq.cpp b/src/tools/map_extractor/mpq_libmpq.cpp index f9101027e..1b2fd6efa 100644 --- a/src/tools/map_extractor/mpq_libmpq.cpp +++ b/src/tools/map_extractor/mpq_libmpq.cpp @@ -21,7 +21,7 @@ ArchiveSet gOpenArchives; -MPQArchive::MPQArchive(const char* filename) +MPQArchive::MPQArchive(char const* filename) { int result = libmpq__archive_open(&mpq_a, filename, -1); printf("Opening %s\n", filename); @@ -59,7 +59,7 @@ void MPQArchive::close() libmpq__archive_close(mpq_a); } -MPQFile::MPQFile(const char* filename): +MPQFile::MPQFile(char const* filename): eof(false), buffer(nullptr), pointer(0), diff --git a/src/tools/map_extractor/mpq_libmpq04.h b/src/tools/map_extractor/mpq_libmpq04.h index 657611139..25f15855c 100644 --- a/src/tools/map_extractor/mpq_libmpq04.h +++ b/src/tools/map_extractor/mpq_libmpq04.h @@ -33,7 +33,7 @@ class MPQArchive public: mpq_archive_s* mpq_a; - MPQArchive(const char* filename); + MPQArchive(char const* filename); ~MPQArchive() { close(); } void close(); @@ -78,11 +78,11 @@ class MPQFile libmpq__off_t pointer, size; // disable copying - MPQFile(const MPQFile& /*f*/) {} - void operator=(const MPQFile& /*f*/) {} + MPQFile(MPQFile const& /*f*/) {} + void operator=(MPQFile const& /*f*/) {} public: - MPQFile(const char* filename); // filenames are not case sensitive + MPQFile(char const* filename); // filenames are not case sensitive ~MPQFile() { close(); } std::size_t read(void* dest, std::size_t bytes); std::size_t getSize() { return size; } diff --git a/src/tools/mmaps_generator/Config.cpp b/src/tools/mmaps_generator/Config.cpp index 6dacd579f..6411758ff 100644 --- a/src/tools/mmaps_generator/Config.cpp +++ b/src/tools/mmaps_generator/Config.cpp @@ -33,12 +33,12 @@ namespace MMAP return {x, y}; } - bool isCurrentDirectory(const std::string& pathStr) { + bool isCurrentDirectory(std::string const& pathStr) { try { const std::filesystem::path givenPath = std::filesystem::canonical(std::filesystem::absolute(pathStr)); const std::filesystem::path currentPath = std::filesystem::canonical(std::filesystem::current_path()); return givenPath == currentPath; - } catch (const std::filesystem::filesystem_error& e) { + } catch (std::filesystem::filesystem_error const& e) { std::cerr << "Filesystem error: " << e.what() << "\n"; return false; } @@ -74,8 +74,8 @@ namespace MMAP ResolvedMeshConfig Config::GetConfigForTile(uint32 mapID, uint32 tileX, uint32 tileY) const { - const MapOverride* mapOverride = nullptr; - const TileOverride* tileOverride = nullptr; + MapOverride const* mapOverride = nullptr; + TileOverride const* tileOverride = nullptr; // Lookup map and tile overrides if (auto mapIt = _maps.find(mapID); mapIt != _maps.end()) @@ -102,39 +102,39 @@ namespace MMAP // Resolve vertex settings int vertexPerMap = resolveInt( - [](const TileOverride*) { return std::optional{}; }, - [](const MapOverride* m) { return m->vertexPerMapEdge; }, + [](TileOverride const*) { return std::optional{}; }, + [](MapOverride const* m) { return m->vertexPerMapEdge; }, _global.vertexPerMapEdge ); int vertexPerTile = resolveInt( - [](const TileOverride*) { return std::optional{}; }, - [](const MapOverride* m) { return m->vertexPerTileEdge; }, + [](TileOverride const*) { return std::optional{}; }, + [](MapOverride const* m) { return m->vertexPerTileEdge; }, _global.vertexPerTileEdge ); ResolvedMeshConfig config; config.walkableSlopeAngle = resolveFloat( - [](const TileOverride* t) { return t->walkableSlopeAngle; }, - [](const MapOverride* m) { return m->walkableSlopeAngle; }, + [](TileOverride const* t) { return t->walkableSlopeAngle; }, + [](MapOverride const* m) { return m->walkableSlopeAngle; }, _global.walkableSlopeAngle ); config.walkableRadius = resolveInt( - [](const TileOverride* t) { return t->walkableRadius; }, - [](const MapOverride* m) { return m->walkableRadius; }, + [](TileOverride const* t) { return t->walkableRadius; }, + [](MapOverride const* m) { return m->walkableRadius; }, _global.walkableRadius ); config.walkableHeight = resolveInt( - [](const TileOverride* t) { return t->walkableHeight; }, - [](const MapOverride* m) { return m->walkableHeight; }, + [](TileOverride const* t) { return t->walkableHeight; }, + [](MapOverride const* m) { return m->walkableHeight; }, _global.walkableHeight ); config.walkableClimb = resolveInt( - [](const TileOverride* t) { return t->walkableClimb; }, - [](const MapOverride* m) { return m->walkableClimb; }, + [](TileOverride const* t) { return t->walkableClimb; }, + [](MapOverride const* m) { return m->walkableClimb; }, _global.walkableClimb ); @@ -168,19 +168,19 @@ namespace MMAP fkyaml::node mmapsNode = root["mmapsConfig"]; - auto tryFloat = [](const fkyaml::node& n, const char* key, float& out) + auto tryFloat = [](fkyaml::node const& n, char const* key, float& out) { if (n.contains(key)) out = n[key].get_value(); }; - auto tryInt = [](const fkyaml::node& n, const char* key, int& out) + auto tryInt = [](fkyaml::node const& n, char const* key, int& out) { if (n.contains(key)) out = n[key].get_value(); }; - auto tryBoolean = [](const fkyaml::node& n, const char* key, bool& out) + auto tryBoolean = [](fkyaml::node const& n, char const* key, bool& out) { if (n.contains(key)) out = n[key].get_value(); }; - auto tryString = [](const fkyaml::node& n, const char* key, std::string& out) + auto tryString = [](fkyaml::node const& n, char const* key, std::string& out) { if (n.contains(key)) out = n[key].get_value(); }; diff --git a/src/tools/mmaps_generator/Config.h b/src/tools/mmaps_generator/Config.h index d214450cc..a6e7f9db3 100644 --- a/src/tools/mmaps_generator/Config.h +++ b/src/tools/mmaps_generator/Config.h @@ -32,7 +32,7 @@ namespace std template <> struct hash> { - std::size_t operator()(const std::pair& p) const noexcept + std::size_t operator()(std::pair const& p) const noexcept { return std::hash()((static_cast(p.first) << 32) | p.second); } diff --git a/src/tools/mmaps_generator/IntermediateValues.cpp b/src/tools/mmaps_generator/IntermediateValues.cpp index 584d14c02..417bfe536 100644 --- a/src/tools/mmaps_generator/IntermediateValues.cpp +++ b/src/tools/mmaps_generator/IntermediateValues.cpp @@ -30,7 +30,7 @@ namespace MMAP rcFreePolyMeshDetail(polyMeshDetail); } - void IntermediateValues::writeIV(const std::string& dataPath, uint32 mapID, uint32 tileX, uint32 tileY) + void IntermediateValues::writeIV(std::string const& dataPath, uint32 mapID, uint32 tileX, uint32 tileY) { char fileName[512]; char tileString[25]; @@ -70,7 +70,7 @@ namespace MMAP #undef DEBUG_WRITE } - void IntermediateValues::debugWrite(FILE* file, const rcHeightfield* mesh) + void IntermediateValues::debugWrite(FILE* file, rcHeightfield const* mesh) { if (!file || !mesh) return; @@ -108,7 +108,7 @@ namespace MMAP } } - void IntermediateValues::debugWrite(FILE* file, const rcCompactHeightfield* chf) + void IntermediateValues::debugWrite(FILE* file, rcCompactHeightfield const* chf) { if (!file | !chf) return; @@ -147,7 +147,7 @@ namespace MMAP fwrite(chf->areas, sizeof(unsigned char), chf->spanCount, file); } - void IntermediateValues::debugWrite(FILE* file, const rcContourSet* cs) + void IntermediateValues::debugWrite(FILE* file, rcContourSet const* cs) { if (!file || !cs) return; @@ -168,7 +168,7 @@ namespace MMAP } } - void IntermediateValues::debugWrite(FILE* file, const rcPolyMesh* mesh) + void IntermediateValues::debugWrite(FILE* file, rcPolyMesh const* mesh) { if (!file || !mesh) return; @@ -187,7 +187,7 @@ namespace MMAP fwrite(mesh->regs, sizeof(unsigned short), mesh->npolys, file); } - void IntermediateValues::debugWrite(FILE* file, const rcPolyMeshDetail* mesh) + void IntermediateValues::debugWrite(FILE* file, rcPolyMeshDetail const* mesh) { if (!file || !mesh) return; @@ -200,7 +200,7 @@ namespace MMAP fwrite(mesh->meshes, sizeof(int), mesh->nmeshes * 4, file); } - void IntermediateValues::generateObjFile(const std::string& dataPath, uint32 mapID, uint32 tileX, uint32 tileY, MeshData& meshData) + void IntermediateValues::generateObjFile(std::string const& dataPath, uint32 mapID, uint32 tileX, uint32 tileY, MeshData& meshData) { std::string objFileName = Acore::StringFormat( "{}/meshes/map{:03}{:02}{:02}.obj", diff --git a/src/tools/mmaps_generator/IntermediateValues.h b/src/tools/mmaps_generator/IntermediateValues.h index 2894e5b58..0bebf32da 100644 --- a/src/tools/mmaps_generator/IntermediateValues.h +++ b/src/tools/mmaps_generator/IntermediateValues.h @@ -35,15 +35,15 @@ namespace MMAP IntermediateValues() {} ~IntermediateValues(); - void writeIV(const std::string& dataPath, uint32 mapID, uint32 tileX, uint32 tileY); + void writeIV(std::string const& dataPath, uint32 mapID, uint32 tileX, uint32 tileY); - void debugWrite(FILE* file, const rcHeightfield* mesh); - void debugWrite(FILE* file, const rcCompactHeightfield* chf); - void debugWrite(FILE* file, const rcContourSet* cs); - void debugWrite(FILE* file, const rcPolyMesh* mesh); - void debugWrite(FILE* file, const rcPolyMeshDetail* mesh); + void debugWrite(FILE* file, rcHeightfield const* mesh); + void debugWrite(FILE* file, rcCompactHeightfield const* chf); + void debugWrite(FILE* file, rcContourSet const* cs); + void debugWrite(FILE* file, rcPolyMesh const* mesh); + void debugWrite(FILE* file, rcPolyMeshDetail const* mesh); - void generateObjFile(const std::string& dataPath, uint32 mapID, uint32 tileX, uint32 tileY, MeshData& meshData); + void generateObjFile(std::string const& dataPath, uint32 mapID, uint32 tileX, uint32 tileY, MeshData& meshData); }; } #endif diff --git a/src/tools/mmaps_generator/MapBuilder.cpp b/src/tools/mmaps_generator/MapBuilder.cpp index bd02d235c..2c1a0aed6 100644 --- a/src/tools/mmaps_generator/MapBuilder.cpp +++ b/src/tools/mmaps_generator/MapBuilder.cpp @@ -1058,7 +1058,7 @@ namespace MMAP return header.recastConfig == desiredRecastConfig; } - rcConfig MapBuilder::getRecastConfig(const ResolvedMeshConfig &cfg, float bmin[3], float bmax[3]) const + rcConfig MapBuilder::getRecastConfig(ResolvedMeshConfig const& cfg, float bmin[3], float bmax[3]) const { rcConfig config; memset(&config, 0, sizeof(rcConfig)); diff --git a/src/tools/mmaps_generator/MapBuilder.h b/src/tools/mmaps_generator/MapBuilder.h index 12ffab06b..319125326 100644 --- a/src/tools/mmaps_generator/MapBuilder.h +++ b/src/tools/mmaps_generator/MapBuilder.h @@ -137,7 +137,7 @@ namespace MMAP // builds list of maps, then builds all of mmap tiles (based on the skip settings) void buildMaps(Optional mapID); - const Config& getConfig() const { return *m_config; } + Config const& getConfig() const { return *m_config; } private: // builds all mmap tiles for the specified map id (ignores skip settings) void buildMap(uint32 mapID); @@ -156,7 +156,7 @@ namespace MMAP bool isTransportMap(uint32 mapID) const; bool isContinentMap(uint32 mapID) const; - rcConfig getRecastConfig(const ResolvedMeshConfig &cfg, float bmin[3], float bmax[3]) const; + rcConfig getRecastConfig(ResolvedMeshConfig const& cfg, float bmin[3], float bmax[3]) const; uint32 percentageDone(uint32 totalTiles, uint32 totalTilesDone) const; uint32 currentPercentageDone() const; diff --git a/src/tools/mmaps_generator/PathCommon.h b/src/tools/mmaps_generator/PathCommon.h index 6dc6dd608..dfb008998 100644 --- a/src/tools/mmaps_generator/PathCommon.h +++ b/src/tools/mmaps_generator/PathCommon.h @@ -41,7 +41,7 @@ namespace MMAP return boost::dll::program_location().parent_path().string(); } - inline bool matchWildcardFilter(const char* filter, const char* str) + inline bool matchWildcardFilter(char const* filter, char const* str) { if (!filter || !str) return false; @@ -101,7 +101,7 @@ namespace MMAP FindClose(hFind); #else - const char* p = dirpath.c_str(); + char const* p = dirpath.c_str(); DIR* dirp = opendir(p); struct dirent* dp; diff --git a/src/tools/mmaps_generator/PathGenerator.cpp b/src/tools/mmaps_generator/PathGenerator.cpp index 581bb153b..2ecb50c47 100644 --- a/src/tools/mmaps_generator/PathGenerator.cpp +++ b/src/tools/mmaps_generator/PathGenerator.cpp @@ -24,7 +24,7 @@ using namespace MMAP; -bool checkDirectories(const std::string &dataDirPath, bool debugOutput) +bool checkDirectories(std::string const& dataDirPath, bool debugOutput) { std::vector dirFiles; @@ -152,7 +152,7 @@ bool handleArgs(int argc, char** argv, return true; } -int finish(const char* message, int returnValue) +int finish(char const* message, int returnValue) { printf("%s", message); getchar(); // Wait for user input diff --git a/src/tools/mmaps_generator/TerrainBuilder.cpp b/src/tools/mmaps_generator/TerrainBuilder.cpp index 5b27f40ce..d05d3cdc1 100644 --- a/src/tools/mmaps_generator/TerrainBuilder.cpp +++ b/src/tools/mmaps_generator/TerrainBuilder.cpp @@ -86,7 +86,7 @@ namespace MMAP uint32 const MAP_VERSION_MAGIC = 9; - TerrainBuilder::TerrainBuilder(const std::string &dataDirPath, bool skipLiquid) : + TerrainBuilder::TerrainBuilder(std::string const& dataDirPath, bool skipLiquid) : m_skipLiquid (skipLiquid), m_mapsPath((std::filesystem::path(dataDirPath) / "maps").string()), m_vmapsPath((std::filesystem::path(dataDirPath) / "vmaps").string()) @@ -929,12 +929,12 @@ namespace MMAP /**************************************************************************/ void TerrainBuilder::loadOffMeshConnections(uint32 mapID, uint32 tileX, uint32 tileY, MeshData& meshData, - const std::vector& offMeshLines) + std::vector const& offMeshLines) { if (offMeshLines.empty()) return; - for (const std::string& line : offMeshLines) + for (std::string const& line : offMeshLines) { float p0[3], p1[3]; uint32 mid, tx, ty; diff --git a/src/tools/mmaps_generator/TerrainBuilder.h b/src/tools/mmaps_generator/TerrainBuilder.h index 04d0e78a5..86dc4823b 100644 --- a/src/tools/mmaps_generator/TerrainBuilder.h +++ b/src/tools/mmaps_generator/TerrainBuilder.h @@ -76,14 +76,14 @@ namespace MMAP class TerrainBuilder { public: - TerrainBuilder(const std::string &mapsPath, bool skipLiquid); + TerrainBuilder(std::string const& mapsPath, bool skipLiquid); ~TerrainBuilder(); - TerrainBuilder(const TerrainBuilder& tb) = delete; + TerrainBuilder(TerrainBuilder const& tb) = delete; void loadMap(uint32 mapID, uint32 tileX, uint32 tileY, MeshData& meshData); bool loadVMap(uint32 mapID, uint32 tileX, uint32 tileY, MeshData& meshData); - void loadOffMeshConnections(uint32 mapID, uint32 tileX, uint32 tileY, MeshData& meshData, const std::vector& offMeshLines); + void loadOffMeshConnections(uint32 mapID, uint32 tileX, uint32 tileY, MeshData& meshData, std::vector const& offMeshLines); [[nodiscard]] bool usesLiquids() const { return !m_skipLiquid; } diff --git a/src/tools/vmap4_extractor/adtfile.cpp b/src/tools/vmap4_extractor/adtfile.cpp index 98513c93d..2d4d31458 100644 --- a/src/tools/vmap4_extractor/adtfile.cpp +++ b/src/tools/vmap4_extractor/adtfile.cpp @@ -25,7 +25,7 @@ char const* GetPlainName(char const* FileName) { - const char* szTemp; + char const* szTemp; if ((szTemp = strrchr(FileName, '\\')) != nullptr) FileName = szTemp + 1; diff --git a/src/tools/vmap4_extractor/adtfile.h b/src/tools/vmap4_extractor/adtfile.h index 7ddd412d7..11c81d4b1 100644 --- a/src/tools/vmap4_extractor/adtfile.h +++ b/src/tools/vmap4_extractor/adtfile.h @@ -72,7 +72,7 @@ public: */ }; -const char* GetPlainName(const char* FileName); +char const* GetPlainName(char const* FileName); char* GetPlainName(char* FileName); char* GetExtension(char* FileName); void fixnamen(char* name, std::size_t len); diff --git a/src/tools/vmap4_extractor/dbcfile.h b/src/tools/vmap4_extractor/dbcfile.h index 49535cff9..c73b488bb 100644 --- a/src/tools/vmap4_extractor/dbcfile.h +++ b/src/tools/vmap4_extractor/dbcfile.h @@ -39,7 +39,7 @@ public: Exception(std::string message): message(std::move(message)) { } virtual ~Exception() = default; - const std::string& getMessage() {return message;} + std::string const& getMessage() {return message;} private: std::string message; }; @@ -57,7 +57,7 @@ public: class Record { public: - Record& operator= (const Record& r) + Record& operator= (Record const& r) { file = r.file; offset = r.offset; @@ -83,7 +83,7 @@ public: assert(ofs < file.recordSize); return *reinterpret_cast(offset + ofs); } - [[nodiscard]] const char* getString(std::size_t field) const + [[nodiscard]] char const* getString(std::size_t field) const { assert(field < file.fieldCount); std::size_t stringOffset = getUInt(field); @@ -115,16 +115,16 @@ public: } /// Return address of current instance Record const& operator*() const { return record; } - const Record* operator->() const + Record const* operator->() const { return &record; } /// Comparison - bool operator==(const Iterator& b) const + bool operator==(Iterator const& b) const { return record.offset == b.record.offset; } - bool operator!=(const Iterator& b) const + bool operator!=(Iterator const& b) const { return record.offset != b.record.offset; } diff --git a/src/tools/vmap4_extractor/gameobject_extract.cpp b/src/tools/vmap4_extractor/gameobject_extract.cpp index b1470497e..28a0ba593 100644 --- a/src/tools/vmap4_extractor/gameobject_extract.cpp +++ b/src/tools/vmap4_extractor/gameobject_extract.cpp @@ -80,7 +80,7 @@ void ExtractGameobjectModels() fwrite(VMAP::RAW_VMAP_MAGIC, 1, 8, model_list); - for (const auto & it : dbc) + for (auto const& it : dbc) { path = it.getString(1); diff --git a/src/tools/vmap4_extractor/model.cpp b/src/tools/vmap4_extractor/model.cpp index ed006fbad..f75453a17 100644 --- a/src/tools/vmap4_extractor/model.cpp +++ b/src/tools/vmap4_extractor/model.cpp @@ -67,7 +67,7 @@ bool Model::open() return true; } -bool Model::ConvertToVMAPModel(const char* outfilename) +bool Model::ConvertToVMAPModel(char const* outfilename) { int N[12] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; FILE* output = fopen(outfilename, "wb"); diff --git a/src/tools/vmap4_extractor/mpq_libmpq.cpp b/src/tools/vmap4_extractor/mpq_libmpq.cpp index d699c7829..ccbdfd4bc 100644 --- a/src/tools/vmap4_extractor/mpq_libmpq.cpp +++ b/src/tools/vmap4_extractor/mpq_libmpq.cpp @@ -22,7 +22,7 @@ ArchiveSet gOpenArchives; -MPQArchive::MPQArchive(const char* filename) +MPQArchive::MPQArchive(char const* filename) { int result = libmpq__archive_open(&mpq_a, filename, -1); printf("Opening %s\n", filename); @@ -65,7 +65,7 @@ void MPQArchive::close() libmpq__archive_close(mpq_a); } -MPQFile::MPQFile(const char* filename): +MPQFile::MPQFile(char const* filename): eof(false), buffer(nullptr), pointer(0), diff --git a/src/tools/vmap4_extractor/mpq_libmpq04.h b/src/tools/vmap4_extractor/mpq_libmpq04.h index 605ca54a8..e417d44e5 100644 --- a/src/tools/vmap4_extractor/mpq_libmpq04.h +++ b/src/tools/vmap4_extractor/mpq_libmpq04.h @@ -32,7 +32,7 @@ class MPQArchive public: mpq_archive_s* mpq_a; - MPQArchive(const char* filename); + MPQArchive(char const* filename); ~MPQArchive() { if (isOpened()) close(); } void GetFileListTo(vector& filelist) @@ -79,11 +79,11 @@ class MPQFile libmpq__off_t pointer, size; // disable copying - MPQFile(const MPQFile& /*f*/) {} - void operator=(const MPQFile& /*f*/) {} + MPQFile(MPQFile const& /*f*/) {} + void operator=(MPQFile const& /*f*/) {} public: - MPQFile(const char* filename); // filenames are not case sensitive + MPQFile(char const* filename); // filenames are not case sensitive ~MPQFile() { close(); } std::size_t read(void* dest, std::size_t bytes); std::size_t getSize() { return size; } diff --git a/src/tools/vmap4_extractor/vec3d.h b/src/tools/vmap4_extractor/vec3d.h index fb07d0d47..bb9063059 100644 --- a/src/tools/vmap4_extractor/vec3d.h +++ b/src/tools/vmap4_extractor/vec3d.h @@ -28,9 +28,9 @@ public: Vec3D(float x0 = 0.0f, float y0 = 0.0f, float z0 = 0.0f) : x(x0), y(y0), z(z0) {} - Vec3D(const Vec3D& v) : x(v.x), y(v.y), z(v.z) {} + Vec3D(Vec3D const& v) : x(v.x), y(v.y), z(v.z) {} - Vec3D& operator= (const Vec3D& v) + Vec3D& operator= (Vec3D const& v) { x = v.x; y = v.y; @@ -38,19 +38,19 @@ public: return *this; } - Vec3D operator+ (const Vec3D& v) const + Vec3D operator+ (Vec3D const& v) const { Vec3D r(x + v.x, y + v.y, z + v.z); return r; } - Vec3D operator- (const Vec3D& v) const + Vec3D operator- (Vec3D const& v) const { Vec3D r(x - v.x, y - v.y, z - v.z); return r; } - float operator* (const Vec3D& v) const + float operator* (Vec3D const& v) const { return x * v.x + y * v.y + z * v.z; } @@ -61,18 +61,18 @@ public: return r; } - friend Vec3D operator* (float d, const Vec3D& v) + friend Vec3D operator* (float d, Vec3D const& v) { return v * d; } - Vec3D operator% (const Vec3D& v) const + Vec3D operator% (Vec3D const& v) const { Vec3D r(y * v.z - z * v.y, z * v.x - x * v.z, x * v.y - y * v.x); return r; } - Vec3D& operator+= (const Vec3D& v) + Vec3D& operator+= (Vec3D const& v) { x += v.x; y += v.y; @@ -80,7 +80,7 @@ public: return *this; } - Vec3D& operator-= (const Vec3D& v) + Vec3D& operator-= (Vec3D const& v) { x -= v.x; y -= v.y; @@ -125,7 +125,7 @@ public: return in; } - friend std::ostream& operator<<(std::ostream& out, const Vec3D& v) + friend std::ostream& operator<<(std::ostream& out, Vec3D const& v) { out << v.x << " " << v.y << " " << v.z; return out; @@ -151,28 +151,28 @@ public: Vec2D(float x0 = 0.0f, float y0 = 0.0f) : x(x0), y(y0) {} - Vec2D(const Vec2D& v) : x(v.x), y(v.y) {} + Vec2D(Vec2D const& v) : x(v.x), y(v.y) {} - Vec2D& operator= (const Vec2D& v) + Vec2D& operator= (Vec2D const& v) { x = v.x; y = v.y; return *this; } - Vec2D operator+ (const Vec2D& v) const + Vec2D operator+ (Vec2D const& v) const { Vec2D r(x + v.x, y + v.y); return r; } - Vec2D operator- (const Vec2D& v) const + Vec2D operator- (Vec2D const& v) const { Vec2D r(x - v.x, y - v.y); return r; } - float operator* (const Vec2D& v) const + float operator* (Vec2D const& v) const { return x * v.x + y * v.y; } @@ -183,19 +183,19 @@ public: return r; } - friend Vec2D operator* (float d, const Vec2D& v) + friend Vec2D operator* (float d, Vec2D const& v) { return v * d; } - Vec2D& operator+= (const Vec2D& v) + Vec2D& operator+= (Vec2D const& v) { x += v.x; y += v.y; return *this; } - Vec2D& operator-= (const Vec2D& v) + Vec2D& operator-= (Vec2D const& v) { x -= v.x; y -= v.y; diff --git a/src/tools/vmap4_extractor/vmapexport.cpp b/src/tools/vmap4_extractor/vmapexport.cpp index 2b00673a3..3bd12de96 100644 --- a/src/tools/vmap4_extractor/vmapexport.cpp +++ b/src/tools/vmap4_extractor/vmapexport.cpp @@ -76,7 +76,7 @@ uint32 GenerateUniqueObjectId(uint32 clientId, uint16 clientDoodadId) // Local testing functions -bool FileExists(const char* file) +bool FileExists(char const* file) { if (FILE* n = fopen(file, "rb")) { @@ -362,7 +362,7 @@ bool fillArchiveNameVector(std::vector& pArchiveNames) return true; } -bool processArgv(int argc, char** argv, const char* versionString) +bool processArgv(int argc, char** argv, char const* versionString) { bool result = true; hasInputPathParam = false; @@ -427,7 +427,7 @@ bool processArgv(int argc, char** argv, const char* versionString) int main(int argc, char** argv) { bool success = true; - const char* versionString = "V4.00 2012_02"; + char const* versionString = "V4.00 2012_02"; // Use command line arguments, when some if (!processArgv(argc, argv, versionString)) diff --git a/src/tools/vmap4_extractor/vmapexport.h b/src/tools/vmap4_extractor/vmapexport.h index fc8433996..0a35c295d 100644 --- a/src/tools/vmap4_extractor/vmapexport.h +++ b/src/tools/vmap4_extractor/vmapexport.h @@ -37,12 +37,12 @@ enum ModelFlags struct WMODoodadData; -extern const char * szWorkDirWmo; +extern char const* szWorkDirWmo; extern std::unordered_map WmoDoodads; uint32 GenerateUniqueObjectId(uint32 clientId, uint16 clientDoodadId); -bool FileExists(const char* file); +bool FileExists(char const* file); void strToLower(char* str); bool ExtractSingleWmo(std::string& fname); diff --git a/src/tools/vmap4_extractor/wmo.h b/src/tools/vmap4_extractor/wmo.h index 4d00b11ce..1017d33eb 100644 --- a/src/tools/vmap4_extractor/wmo.h +++ b/src/tools/vmap4_extractor/wmo.h @@ -65,7 +65,7 @@ namespace WMO } /* for whatever reason a certain company just can't stick to one coordinate system... */ -static inline Vec3D fixCoords(const Vec3D& v) { return Vec3D(v.z, v.x, v.y); } +static inline Vec3D fixCoords(Vec3D const& v) { return Vec3D(v.z, v.x, v.y); } struct WMODoodadData { From 1eb3749b3b376391c20f31377467aa858b2b9a99 Mon Sep 17 00:00:00 2001 From: Rocco Silipo <108557877+Rorschach91@users.noreply.github.com> Date: Tue, 21 Jul 2026 08:24:18 +0200 Subject: [PATCH 053/134] fix(Core/Script): Creatures will not interrupt channeling spells anymore on engage if the spell has attribute "Allow Actions During Channeling". (#26710) Co-authored-by: sogladev <46423958+sogladev@users.noreply.github.com> --- src/server/game/AI/SmartScripts/SmartAI.cpp | 9 ++++++++- src/server/game/Entities/Unit/Unit.cpp | 4 +++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/server/game/AI/SmartScripts/SmartAI.cpp b/src/server/game/AI/SmartScripts/SmartAI.cpp index b1dafb95c..18e3cbcfa 100644 --- a/src/server/game/AI/SmartScripts/SmartAI.cpp +++ b/src/server/game/AI/SmartScripts/SmartAI.cpp @@ -876,7 +876,14 @@ void SmartAI::JustEngagedWith(Unit* enemy) { // Xinef: Interrupt channeled spells if (IsAIControlled()) - me->InterruptSpell(CURRENT_CHANNELED_SPELL, true, true); + { + if (Spell* spell = me->GetCurrentSpell(CURRENT_CHANNELED_SPELL)) + { + if (!spell->GetSpellInfo()->IsActionAllowedChannel()) + me->InterruptSpell(CURRENT_CHANNELED_SPELL, true, true); + } + } + GetScript()->ProcessEventsFor(SMART_EVENT_AGGRO, enemy); } diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 614632961..9af94cbb5 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -4191,7 +4191,9 @@ void Unit::SetCurrentCastedSpell(Spell* pSpell) if (m_currentSpells[CURRENT_AUTOREPEAT_SPELL] && m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_spellInfo->Id != 75) InterruptSpell(CURRENT_AUTOREPEAT_SPELL); - AddUnitState(UNIT_STATE_CASTING); + + if (!pSpell->GetSpellInfo()->IsActionAllowedChannel()) + AddUnitState(UNIT_STATE_CASTING); break; } From 044d900bd79eac67e1fdb9c253bad06a0939ba70 Mon Sep 17 00:00:00 2001 From: Kitzunu <24550914+Kitzunu@users.noreply.github.com> Date: Tue, 21 Jul 2026 09:43:17 +0200 Subject: [PATCH 054/134] feat(Core/Account): Implement ACCOUNT_FLAG_COLLECTOR (#26342) Co-authored-by: Ludwig Co-authored-by: Claude Opus 4.8 (1M context) --- .../rev_1781860213893615800.sql | 53 +++++++++++++++++++ src/common/Common.h | 2 +- src/server/game/Entities/Player/Player.cpp | 46 ++++++++++++++++ 3 files changed, 100 insertions(+), 1 deletion(-) create mode 100644 data/sql/updates/pending_db_characters/rev_1781860213893615800.sql diff --git a/data/sql/updates/pending_db_characters/rev_1781860213893615800.sql b/data/sql/updates/pending_db_characters/rev_1781860213893615800.sql new file mode 100644 index 000000000..151857799 --- /dev/null +++ b/data/sql/updates/pending_db_characters/rev_1781860213893615800.sql @@ -0,0 +1,53 @@ +DELETE FROM `mail_server_template` WHERE `id` IN (14646, 14647, 14648, 14649, 14650, 14651, 20938, 22888, 39713); +INSERT INTO `mail_server_template` (`id`, `senderEntry`, `moneyA`, `moneyH`, `subject`, `body`, `active`) VALUES +(14646, 19506, 0, 0, 'A Very Special Delivery', 'Thank you for your purchase of the World of Warcraft Collector''s Edition! As a special gift of appreciation, we would like to present you with this gift voucher. Turn it in to receive a little companion to join you on your quest for adventure and glory!', 1), +(14647, 19506, 0, 0, 'A Very Special Delivery', 'Thank you for your purchase of the World of Warcraft Collector''s Edition! As a special gift of appreciation, we would like to present you with this gift voucher. Turn it in to receive a little companion to join you on your quest for adventure and glory!', 1), +(14648, 19506, 0, 0, 'A Very Special Delivery', 'Thank you for your purchase of the World of Warcraft Collector''s Edition! As a special gift of appreciation, we would like to present you with this gift voucher. Turn it in to receive a little companion to join you on your quest for adventure and glory!', 1), +(14649, 19506, 0, 0, 'A Very Special Delivery', 'Thank you for your purchase of the World of Warcraft Collector''s Edition! As a special gift of appreciation, we would like to present you with this gift voucher. Turn it in to receive a little companion to join you on your quest for adventure and glory!', 1), +(14650, 19506, 0, 0, 'A Very Special Delivery', 'Thank you for your purchase of the World of Warcraft Collector''s Edition! As a special gift of appreciation, we would like to present you with this gift voucher. Turn it in to receive a little companion to join you on your quest for adventure and glory!', 1), +(14651, 19506, 0, 0, 'A Very Special Delivery', 'Thank you for your purchase of the World of Warcraft Collector''s Edition! As a special gift of appreciation, we would like to present you with this gift voucher. Turn it in to receive a little companion to join you on your quest for adventure and glory!', 1), +(20938, 19506, 0, 0, 'A Very Special Delivery', 'Thank you for your purchase of the World of Warcraft Collector''s Edition! As a special gift of appreciation, we would like to present you with this gift voucher. Turn it in to receive a little companion to join you on your quest for adventure and glory!', 1), +(22888, 19506, 0, 0, 'A Very Special Delivery', 'Thank you for your purchase of the World of Warcraft Collector''s Edition! As a special gift of appreciation, we would like to present you with this gift voucher. Turn it in to receive a little companion to join you on your quest for adventure and glory!', 1), +(39713, 19506, 0, 0, 'A Very Special Delivery', 'Thank you for your purchase of the World of Warcraft Collector''s Edition! As a special gift of appreciation, we would like to present you with this gift voucher. Turn it in to receive a little companion to join you on your quest for adventure and glory!', 1); + +DELETE FROM `mail_server_template_items` WHERE `templateID` IN (14646, 14647, 14648, 14649, 14650, 14651, 20938, 22888, 39713); +INSERT INTO `mail_server_template_items` (`templateID`, `faction`, `item`, `itemCount`) VALUES +(14646, 'Alliance', 14646, 1), -- Goldshire Gift Voucher (Human) +(14647, 'Alliance', 14647, 1), -- Kharanos Gift Voucher (Dwarf, Gnome) +(14648, 'Alliance', 14648, 1), -- Dolanaar Gift Voucher (Night Elf) +(14649, 'Horde', 14649, 1), -- Razor Hill Gift Voucher (Orc, Troll) +(14650, 'Horde', 14650, 1), -- Bloodhoof Village Gift Voucher (Tauren) +(14651, 'Horde', 14651, 1), -- Brill Gift Voucher (Undead) +(20938, 'Horde', 20938, 1), -- Falconwing Square Gift Voucher (Blood Elf) +(22888, 'Alliance', 22888, 1), -- Azure Watch Gift Voucher (Draenei) +(39713, 'Alliance', 39713, 1), -- Ebon Hold Gift Voucher (Death Knight, Alliance) +(39713, 'Horde', 39713, 1); -- Ebon Hold Gift Voucher (Death Knight, Horde) + +DELETE FROM `mail_server_template_conditions` WHERE `templateID` IN (14646, 14647, 14648, 14649, 14650, 14651, 20938, 22888, 39713); +INSERT INTO `mail_server_template_conditions` (`templateID`, `conditionType`, `conditionValue`) VALUES +(14646, 'Race', 1), +(14646, 'Class', 1503), +(14646, 'AccountFlags', 4), +(14647, 'Race', 68), +(14647, 'Class', 1503), +(14647, 'AccountFlags', 4), +(14648, 'Race', 8), +(14648, 'Class', 1503), +(14648, 'AccountFlags', 4), +(14649, 'Race', 130), +(14649, 'Class', 1503), +(14649, 'AccountFlags', 4), +(14650, 'Race', 32), +(14650, 'Class', 1503), +(14650, 'AccountFlags', 4), +(14651, 'Race', 16), +(14651, 'Class', 1503), +(14651, 'AccountFlags', 4), +(20938, 'Race', 512), +(20938, 'Class', 1503), +(20938, 'AccountFlags', 4), +(22888, 'Race', 1024), +(22888, 'Class', 1503), +(22888, 'AccountFlags', 4), +(39713, 'Class', 32), +(39713, 'AccountFlags', 4); diff --git a/src/common/Common.h b/src/common/Common.h index 264b06ca9..e551dbacd 100644 --- a/src/common/Common.h +++ b/src/common/Common.h @@ -66,7 +66,7 @@ enum AccountFlag { ACCOUNT_FLAG_GM = 0x1, // Account is GM ACCOUNT_FLAG_NOKICK = 0x2, // Will not be logged out while AFK - ACCOUNT_FLAG_COLLECTOR = 0x4, // NYI Collector's Edition + ACCOUNT_FLAG_COLLECTOR = 0x4, // Collector's Edition ACCOUNT_FLAG_TRIAL = 0x8, // Trial account ACCOUNT_FLAG_CANCELLED = 0x10, // NYI UNK ACCOUNT_FLAG_IGR = 0x20, // NYI Internet Game Room (Internet cafe?) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 49ab2e722..daa4ba995 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -666,6 +666,52 @@ bool Player::Create(ObjectGuid::LowType guidlow, CharacterCreateInfo* createInfo for (PlayerCreateInfoItems::const_iterator item_id_itr = info->item.begin(); item_id_itr != info->item.end(); ++item_id_itr) StoreNewItemInBestSlots(item_id_itr->item_id, item_id_itr->item_amount); + // Collector's Edition starter gift voucher + if (GetSession()->HasAccountFlag(ACCOUNT_FLAG_COLLECTOR)) + { + uint32 voucherId = 0; + if (IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_INIT)) + voucherId = 39713; // Ebon Hold Gift Voucher + else + { + switch (createInfo->Race) + { + case RACE_HUMAN: + voucherId = 14646; break; // Goldshire Gift Voucher + case RACE_DWARF: + case RACE_GNOME: + voucherId = 14647; break; // Kharanos Gift Voucher + case RACE_NIGHTELF: + voucherId = 14648; break; // Dolanaar Gift Voucher + case RACE_ORC: + case RACE_TROLL: + voucherId = 14649; break; // Razor Hill Gift Voucher + case RACE_TAUREN: + voucherId = 14650; break; // Bloodhoof Village Gift Voucher + case RACE_UNDEAD_PLAYER: + voucherId = 14651; break; // Brill Gift Voucher + case RACE_BLOODELF: + voucherId = 20938; break; // Falconwing Square Gift Voucher + case RACE_DRAENEI: + voucherId = 22888; break; // Azure Watch Gift Voucher + default: + break; + } + } + + // Only guard against mail delivery if the item was actually stored, otherwise + // a full bag would suppress the mail fallback and lose the voucher permanently. + if (voucherId && StoreNewItemInBestSlots(voucherId, 1)) + { + // Prevent characters from receiving duplicate vouchers through the mail system. + // voucherId doubles as the mail template id (item == templateID in the SQL data). + CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_MAIL_SERVER_CHARACTER); + stmt->SetData(0, guidlow); + stmt->SetData(1, voucherId); + CharacterDatabase.Execute(stmt); + } + } + // bags and main-hand weapon must equipped at this moment // now second pass for not equipped (offhand weapon/shield if it attempt equipped before main-hand weapon) // or ammo not equipped in special bag From 6875a9e577390980d2250be15e985303d80df34e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 21 Jul 2026 07:44:33 +0000 Subject: [PATCH 055/134] chore(DB): import pending files Referenced commit(s): 044d900bd79eac67e1fdb9c253bad06a0939ba70 --- .../2026_07_21_00.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_characters/rev_1781860213893615800.sql => db_characters/2026_07_21_00.sql} (99%) diff --git a/data/sql/updates/pending_db_characters/rev_1781860213893615800.sql b/data/sql/updates/db_characters/2026_07_21_00.sql similarity index 99% rename from data/sql/updates/pending_db_characters/rev_1781860213893615800.sql rename to data/sql/updates/db_characters/2026_07_21_00.sql index 151857799..dd88c9b68 100644 --- a/data/sql/updates/pending_db_characters/rev_1781860213893615800.sql +++ b/data/sql/updates/db_characters/2026_07_21_00.sql @@ -1,3 +1,4 @@ +-- DB update 2026_07_18_00 -> 2026_07_21_00 DELETE FROM `mail_server_template` WHERE `id` IN (14646, 14647, 14648, 14649, 14650, 14651, 20938, 22888, 39713); INSERT INTO `mail_server_template` (`id`, `senderEntry`, `moneyA`, `moneyH`, `subject`, `body`, `active`) VALUES (14646, 19506, 0, 0, 'A Very Special Delivery', 'Thank you for your purchase of the World of Warcraft Collector''s Edition! As a special gift of appreciation, we would like to present you with this gift voucher. Turn it in to receive a little companion to join you on your quest for adventure and glory!', 1), From 034c908f5ee1adc8b78564ae467156604da6ab71 Mon Sep 17 00:00:00 2001 From: Rocco Silipo <108557877+Rorschach91@users.noreply.github.com> Date: Tue, 21 Jul 2026 11:15:31 +0200 Subject: [PATCH 056/134] fix(DB/Script): Update Scarlet Miners and Mine Car spawn points and behavior based on sniffs. (#26707) --- .../pending_db_world/rev_1784536849.sql | 170 ++++++++++++++++++ .../game/Spells/SpellInfoCorrections.cpp | 6 + 2 files changed, 176 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1784536849.sql diff --git a/data/sql/updates/pending_db_world/rev_1784536849.sql b/data/sql/updates/pending_db_world/rev_1784536849.sql new file mode 100644 index 000000000..14fe91732 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1784536849.sql @@ -0,0 +1,170 @@ + +-- Add Missing Waypoint (Sniffed). +DELETE FROM `waypoint_data` WHERE `id` = 12889700; +INSERT INTO `waypoint_data` VALUES +(12889700, 1, 2387.85, -5902.72, 109.01, NULL, 0, 0, 0, 0, 0, 100, 0), +(12889700, 2, 2375.1, -5907.97, 108.48, NULL, 0, 0, 0, 0, 0, 100, 0), +(12889700, 3, 2368.94, -5909.22, 107.61, NULL, 0, 0, 0, 0, 0, 100, 0), +(12889700, 4, 2356.44, -5906.22, 105.61, NULL, 0, 0, 0, 0, 0, 100, 0), +(12889700, 5, 2346.94, -5904.22, 104.11, NULL, 0, 0, 0, 0, 0, 100, 0), +(12889700, 6, 2336.87, -5901.97, 101.55, NULL, 0, 0, 0, 0, 0, 100, 0), +(12889700, 7, 2327.17, -5902.61, 98.16, NULL, 0, 0, 0, 0, 0, 100, 0), +(12889700, 8, 2319.57, -5904.3, 95.21, NULL, 0, 0, 0, 0, 0, 100, 0), +(12889700, 9, 2311.32, -5907.05, 91.71, NULL, 0, 0, 0, 0, 0, 100, 0), +(12889700, 10, 2303.66, -5910.16, 87.98, NULL, 0, 0, 0, 0, 0, 100, 0), +(12889700, 11, 2298.06, -5920.62, 81.04, NULL, 0, 0, 0, 0, 0, 100, 0), +(12889700, 12, 2291.1, -5932.64, 71.66, NULL, 0, 0, 0, 0, 0, 100, 0), +(12889700, 13, 2286.46, -5943.81, 64.32, NULL, 0, 0, 0, 0, 0, 100, 0), +(12889700, 14, 2281.71, -5955.31, 57.32, NULL, 0, 0, 0, 0, 0, 100, 0), +(12889700, 15, 2276.51, -5967.19, 51.39, NULL, 0, 0, 0, 0, 0, 100, 0), +(12889700, 16, 2266.45, -5971.84, 46.41, NULL, 0, 0, 0, 0, 0, 100, 0), +(12889700, 17, 2255.95, -5976.84, 40.41, NULL, 0, 0, 0, 0, 0, 100, 0), +(12889700, 18, 2247.58, -5980.87, 35.15, NULL, 0, 0, 0, 0, 0, 100, 0), +(12889700, 19, 2240.51, -5992.78, 29.5, NULL, 0, 0, 0, 0, 0, 100, 0), +(12889700, 20, 2233.01, -6005.53, 20.25, NULL, 0, 0, 0, 0, 0, 100, 0), +(12889700, 21, 2228.16, -6015.24, 12.25, NULL, 0, 0, 0, 0, 0, 100, 0), +(12889700, 22, 2218.33, -6037.6, 6.9, NULL, 0, 0, 0, 0, 0, 100, 0), +(12889700, 23, 2212.45, -6062.62, 6.18, NULL, 0, 0, 0, 0, 0, 100, 0), +(12889700, 24, 2207.75, -6082.03, 3.81, NULL, 0, 0, 0, 0, 0, 100, 0), +(12889700, 25, 2198.39, -6112.08, 1.61, NULL, 0, 0, 0, 0, 0, 100, 0), +(12889700, 26, 2189.55, -6127.57, 2.66, NULL, 0, 0, 0, 0, 0, 100, 0), +(12889700, 27, 2184.3, -6137.07, 3.41, NULL, 0, 0, 0, 0, 0, 100, 0), +(12889700, 28, 2179.45, -6145.61, 1.72, NULL, 0, 0, 0, 0, 0, 100, 0), +(12889700, 29, 2178.81, -6168.32, 0.89, NULL, 0, 0, 0, 0, 0, 100, 0); + +-- Set Verified Build for all Scarlet Miners. +UPDATE `creature` SET `VerifiedBuild` = 50664 WHERE (`id` = 28822); + +-- Add New Scarlet Miner Spawn Point (Sniffed). +DELETE FROM `creature` WHERE (`id` = 28822) AND (`guid` IN (128897)); +INSERT INTO `creature` (`guid`, `id`, `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 +(128897, 28822, 609, 0, 0, 1, 1, 0, 2389.6025, -5901.942, 109.09488, 4.520403, 360, 0, 0, 891, 0, 0, 0, 0, 0, '', 'has guid specific SAI', 50664); + +-- Add Mine Car Spawn Points (Sniffed) +DELETE FROM `creature` WHERE (`id` = 28821); +INSERT INTO `creature` (`guid`, `id`, `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 +(128902, 28821, 609, 0, 0, 1, 1, 0, 2392.9, -5932.47, 110.954, 2.25148, 600, 0, 0, 42, 0, 0, 0, 0, 0, '', 50664, 0, ''), +(128903, 28821, 609, 0, 0, 1, 1, 0, 2477.86, -5930.89, 116.103, 3.89208, 600, 0, 0, 42, 0, 0, 0, 0, 0, '', 50664, 0, ''), +(128904, 28821, 609, 0, 0, 1, 1, 0, 2431.82, -5884.38, 104.739, 1.43117, 600, 0, 0, 42, 0, 0, 0, 0, 0, '', 50664, 0, ''), +(128905, 28821, 609, 0, 0, 1, 1, 0, 2450.51, -5956.79, 96.0638, 6.17846, 600, 0, 0, 42, 0, 0, 0, 0, 0, '', 50664, 0, ''), +(128906, 28821, 609, 0, 0, 1, 1, 0, 2393.37, -5912.72, 110.304, 2.44346, 600, 0, 0, 42, 0, 0, 0, 0, 0, '', 50664, 0, ''), +(128907, 28821, 609, 0, 0, 1, 1, 0, 2410.78, -5930.6, 113.883, 6.14356, 600, 0, 0, 42, 0, 0, 0, 0, 0, '', 50664, 0, ''), +(128908, 28821, 609, 0, 0, 1, 1, 0, 2418.08, -5919.31, 111.58, 5.77704, 600, 0, 0, 42, 0, 0, 0, 0, 0, '', 50664, 0, ''), +(128909, 28821, 609, 0, 0, 1, 1, 0, 2393.29, -5900.68, 109.435, 1.93731, 600, 0, 0, 42, 0, 0, 0, 0, 0, '', 50664, 0, ''), +(128921, 28821, 609, 0, 0, 1, 1, 0, 2538.37, -5995.51, 103.085, 6.10865, 600, 0, 0, 42, 0, 0, 0, 0, 0, '', 50664, 0, ''); + +-- Move Row 6 to row 0. +UPDATE `smart_scripts` SET `id` = 0 WHERE (`entryorguid` = 28822) AND (`source_type` = 0) AND (`id` IN (6)); + +-- Update Personal SAI (Scarlet Miner). +DELETE FROM `smart_scripts` WHERE (`source_type` = 0) AND (`entryorguid` IN (-128892, -128893, -128894, -128895, -128896, -128897, -128898, -128899, -128901)); +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 +(-128892, 0, 1000, 1001, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 70, 0, 0, 0, 0, 0, 0, 10, 128902, 28821, 0, 0, 0, 0, 0, 0, 'Scarlet Miner - On Respawn - Respawn Closest Creature \'Mine Car\''), +(-128892, 0, 1001, 1002, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 11, 52414, 0, 0, 0, 0, 0, 10, 128902, 28821, 0, 0, 0, 0, 0, 0, 'Scarlet Miner - On Respawn - Cast \'Drag Mine Cart\''), +(-128892, 0, 1002, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, 12889200, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Scarlet Miner - On Respawn - Start Path 12889200'), +(-128892, 0, 1003, 1004, 109, 0, 100, 0, 0, 12889200, 0, 0, 0, 0, 41, 2000, 0, 0, 0, 0, 0, 10, 128902, 28821, 0, 0, 0, 0, 0, 0, 'Scarlet Miner - On Path 12889200 Finished - Despawn In 2000 ms'), +(-128892, 0, 1004, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 41, 2000, 10, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Scarlet Miner - On Path 12889200 Finished - Despawn In 2000 ms'), +(-128892, 0, 1005, 0, 6, 0, 100, 0, 0, 0, 0, 0, 0, 0, 41, 1000, 0, 0, 0, 0, 0, 10, 128902, 28821, 0, 0, 0, 0, 0, 0, 'Scarlet Miner - On Just Died - Despawn In 1000 ms'), +(-128892, 0, 1006, 0, 7, 0, 100, 0, 0, 0, 0, 0, 0, 0, 11, 52414, 0, 0, 0, 0, 0, 10, 128902, 28821, 0, 0, 0, 0, 0, 0, 'Scarlet Miner - On Evade - Cast \'Drag Mine Cart\''), +(-128893, 0, 1000, 1001, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 70, 0, 0, 0, 0, 0, 0, 10, 128903, 28821, 0, 0, 0, 0, 0, 0, 'Scarlet Miner - On Respawn - Respawn Closest Creature \'Mine Car\''), +(-128893, 0, 1001, 1002, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 11, 52414, 0, 0, 0, 0, 0, 10, 128903, 28821, 0, 0, 0, 0, 0, 0, 'Scarlet Miner - On Respawn - Cast \'Drag Mine Cart\''), +(-128893, 0, 1002, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, 12889300, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Scarlet Miner - On Respawn - Start Path 12889200'), +(-128893, 0, 1003, 1004, 109, 0, 100, 0, 0, 12889300, 0, 0, 0, 0, 41, 2000, 0, 0, 0, 0, 0, 10, 128903, 28821, 0, 0, 0, 0, 0, 0, 'Scarlet Miner - On Path 12889200 Finished - Despawn In 2000 ms'), +(-128893, 0, 1004, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 41, 2000, 10, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Scarlet Miner - On Path 12889200 Finished - Despawn In 2000 ms'), +(-128893, 0, 1005, 0, 6, 0, 100, 0, 0, 0, 0, 0, 0, 0, 41, 1000, 0, 0, 0, 0, 0, 10, 128903, 28821, 0, 0, 0, 0, 0, 0, 'Scarlet Miner - On Just Died - Despawn In 1000 ms'), +(-128893, 0, 1006, 0, 7, 0, 100, 0, 0, 0, 0, 0, 0, 0, 11, 52414, 0, 0, 0, 0, 0, 10, 128903, 28821, 0, 0, 0, 0, 0, 0, 'Scarlet Miner - On Evade - Cast \'Drag Mine Cart\''), +(-128894, 0, 1000, 1001, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 70, 0, 0, 0, 0, 0, 0, 10, 128904, 28821, 0, 0, 0, 0, 0, 0, 'Scarlet Miner - On Respawn - Respawn Closest Creature \'Mine Car\''), +(-128894, 0, 1001, 1002, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 11, 52414, 0, 0, 0, 0, 0, 10, 128904, 28821, 0, 0, 0, 0, 0, 0, 'Scarlet Miner - On Respawn - Cast \'Drag Mine Cart\''), +(-128894, 0, 1002, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, 12889400, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Scarlet Miner - On Respawn - Start Path 12889200'), +(-128894, 0, 1003, 1004, 109, 0, 100, 0, 0, 12889400, 0, 0, 0, 0, 41, 2000, 0, 0, 0, 0, 0, 10, 128904, 28821, 0, 0, 0, 0, 0, 0, 'Scarlet Miner - On Path 12889200 Finished - Despawn In 2000 ms'), +(-128894, 0, 1004, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 41, 2000, 10, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Scarlet Miner - On Path 12889200 Finished - Despawn In 2000 ms'), +(-128894, 0, 1005, 0, 6, 0, 100, 0, 0, 0, 0, 0, 0, 0, 41, 1000, 0, 0, 0, 0, 0, 10, 128904, 28821, 0, 0, 0, 0, 0, 0, 'Scarlet Miner - On Just Died - Despawn In 1000 ms'), +(-128894, 0, 1006, 0, 7, 0, 100, 0, 0, 0, 0, 0, 0, 0, 11, 52414, 0, 0, 0, 0, 0, 10, 128904, 28821, 0, 0, 0, 0, 0, 0, 'Scarlet Miner - On Evade - Cast \'Drag Mine Cart\''), +(-128895, 0, 1000, 1001, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 70, 0, 0, 0, 0, 0, 0, 10, 128905, 28821, 0, 0, 0, 0, 0, 0, 'Scarlet Miner - On Respawn - Respawn Closest Creature \'Mine Car\''), +(-128895, 0, 1001, 1002, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 11, 52414, 0, 0, 0, 0, 0, 10, 128905, 28821, 0, 0, 0, 0, 0, 0, 'Scarlet Miner - On Respawn - Cast \'Drag Mine Cart\''), +(-128895, 0, 1002, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, 12889500, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Scarlet Miner - On Respawn - Start Path 12889200'), +(-128895, 0, 1003, 1004, 109, 0, 100, 0, 0, 12889500, 0, 0, 0, 0, 41, 2000, 0, 0, 0, 0, 0, 10, 128905, 28821, 0, 0, 0, 0, 0, 0, 'Scarlet Miner - On Path 12889200 Finished - Despawn In 2000 ms'), +(-128895, 0, 1004, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 41, 2000, 10, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Scarlet Miner - On Path 12889200 Finished - Despawn In 2000 ms'), +(-128895, 0, 1005, 0, 6, 0, 100, 0, 0, 0, 0, 0, 0, 0, 41, 1000, 0, 0, 0, 0, 0, 10, 128905, 28821, 0, 0, 0, 0, 0, 0, 'Scarlet Miner - On Just Died - Despawn In 1000 ms'), +(-128895, 0, 1006, 0, 7, 0, 100, 0, 0, 0, 0, 0, 0, 0, 11, 52414, 0, 0, 0, 0, 0, 10, 128905, 28821, 0, 0, 0, 0, 0, 0, 'Scarlet Miner - On Evade - Cast \'Drag Mine Cart\''), +(-128896, 0, 1000, 1001, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 70, 0, 0, 0, 0, 0, 0, 10, 128906, 28821, 0, 0, 0, 0, 0, 0, 'Scarlet Miner - On Respawn - Respawn Closest Creature \'Mine Car\''), +(-128896, 0, 1001, 1002, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 11, 52414, 0, 0, 0, 0, 0, 10, 128906, 28821, 0, 0, 0, 0, 0, 0, 'Scarlet Miner - On Respawn - Cast \'Drag Mine Cart\''), +(-128896, 0, 1002, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, 12889600, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Scarlet Miner - On Respawn - Start Path 12889200'), +(-128896, 0, 1003, 1004, 109, 0, 100, 0, 0, 12889600, 0, 0, 0, 0, 41, 2000, 0, 0, 0, 0, 0, 10, 128906, 28821, 0, 0, 0, 0, 0, 0, 'Scarlet Miner - On Path 12889200 Finished - Despawn In 2000 ms'), +(-128896, 0, 1004, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 41, 2000, 10, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Scarlet Miner - On Path 12889200 Finished - Despawn In 2000 ms'), +(-128896, 0, 1005, 0, 6, 0, 100, 0, 0, 0, 0, 0, 0, 0, 41, 1000, 0, 0, 0, 0, 0, 10, 128906, 28821, 0, 0, 0, 0, 0, 0, 'Scarlet Miner - On Just Died - Despawn In 1000 ms'), +(-128896, 0, 1006, 0, 7, 0, 100, 0, 0, 0, 0, 0, 0, 0, 11, 52414, 0, 0, 0, 0, 0, 10, 128906, 28821, 0, 0, 0, 0, 0, 0, 'Scarlet Miner - On Evade - Cast \'Drag Mine Cart\''), +(-128897, 0, 1000, 1001, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 70, 0, 0, 0, 0, 0, 0, 10, 128909, 28821, 0, 0, 0, 0, 0, 0, 'Scarlet Miner - On Respawn - Respawn Closest Creature \'Mine Car\''), +(-128897, 0, 1001, 1002, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 11, 52414, 0, 0, 0, 0, 0, 10, 128909, 28821, 0, 0, 0, 0, 0, 0, 'Scarlet Miner - On Respawn - Cast \'Drag Mine Cart\''), +(-128897, 0, 1002, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, 12889700, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Scarlet Miner - On Respawn - Start Path 12889200'), +(-128897, 0, 1003, 1004, 109, 0, 100, 0, 0, 12889700, 0, 0, 0, 0, 41, 2000, 0, 0, 0, 0, 0, 10, 128909, 28821, 0, 0, 0, 0, 0, 0, 'Scarlet Miner - On Path 12889200 Finished - Despawn In 2000 ms'), +(-128897, 0, 1004, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 41, 2000, 10, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Scarlet Miner - On Path 12889200 Finished - Despawn In 2000 ms'), +(-128897, 0, 1005, 0, 6, 0, 100, 0, 0, 0, 0, 0, 0, 0, 41, 1000, 0, 0, 0, 0, 0, 10, 128909, 28821, 0, 0, 0, 0, 0, 0, 'Scarlet Miner - On Just Died - Despawn In 1000 ms'), +(-128897, 0, 1006, 0, 7, 0, 100, 0, 0, 0, 0, 0, 0, 0, 11, 52414, 0, 0, 0, 0, 0, 10, 128909, 28821, 0, 0, 0, 0, 0, 0, 'Scarlet Miner - On Evade - Cast \'Drag Mine Cart\''), +(-128898, 0, 1000, 1001, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 70, 0, 0, 0, 0, 0, 0, 10, 128907, 28821, 0, 0, 0, 0, 0, 0, 'Scarlet Miner - On Respawn - Respawn Closest Creature \'Mine Car\''), +(-128898, 0, 1001, 1002, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 11, 52414, 0, 0, 0, 0, 0, 10, 128907, 28821, 0, 0, 0, 0, 0, 0, 'Scarlet Miner - On Respawn - Cast \'Drag Mine Cart\''), +(-128898, 0, 1002, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, 12889800, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Scarlet Miner - On Respawn - Start Path 12889200'), +(-128898, 0, 1003, 1004, 109, 0, 100, 0, 0, 12889800, 0, 0, 0, 0, 41, 2000, 0, 0, 0, 0, 0, 10, 128907, 28821, 0, 0, 0, 0, 0, 0, 'Scarlet Miner - On Path 12889200 Finished - Despawn In 2000 ms'), +(-128898, 0, 1004, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 41, 2000, 10, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Scarlet Miner - On Path 12889200 Finished - Despawn In 2000 ms'), +(-128898, 0, 1005, 0, 6, 0, 100, 0, 0, 0, 0, 0, 0, 0, 41, 1000, 0, 0, 0, 0, 0, 10, 128907, 28821, 0, 0, 0, 0, 0, 0, 'Scarlet Miner - On Just Died - Despawn In 1000 ms'), +(-128898, 0, 1006, 0, 7, 0, 100, 0, 0, 0, 0, 0, 0, 0, 11, 52414, 0, 0, 0, 0, 0, 10, 128907, 28821, 0, 0, 0, 0, 0, 0, 'Scarlet Miner - On Evade - Cast \'Drag Mine Cart\''), +(-128899, 0, 1000, 1001, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 70, 0, 0, 0, 0, 0, 0, 10, 128908, 28821, 0, 0, 0, 0, 0, 0, 'Scarlet Miner - On Respawn - Respawn Closest Creature \'Mine Car\''), +(-128899, 0, 1001, 1002, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 11, 52414, 0, 0, 0, 0, 0, 10, 128908, 28821, 0, 0, 0, 0, 0, 0, 'Scarlet Miner - On Respawn - Cast \'Drag Mine Cart\''), +(-128899, 0, 1002, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, 12889900, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Scarlet Miner - On Respawn - Start Path 12889200'), +(-128899, 0, 1003, 1004, 109, 0, 100, 0, 0, 12889900, 0, 0, 0, 0, 41, 2000, 0, 0, 0, 0, 0, 10, 128908, 28821, 0, 0, 0, 0, 0, 0, 'Scarlet Miner - On Path 12889200 Finished - Despawn In 2000 ms'), +(-128899, 0, 1004, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 41, 2000, 10, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Scarlet Miner - On Path 12889200 Finished - Despawn In 2000 ms'), +(-128899, 0, 1005, 0, 6, 0, 100, 0, 0, 0, 0, 0, 0, 0, 41, 1000, 0, 0, 0, 0, 0, 10, 128908, 28821, 0, 0, 0, 0, 0, 0, 'Scarlet Miner - On Just Died - Despawn In 1000 ms'), +(-128899, 0, 1006, 0, 7, 0, 100, 0, 0, 0, 0, 0, 0, 0, 11, 52414, 0, 0, 0, 0, 0, 10, 128908, 28821, 0, 0, 0, 0, 0, 0, 'Scarlet Miner - On Evade - Cast \'Drag Mine Cart\''), +(-128901, 0, 1000, 1001, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 70, 0, 0, 0, 0, 0, 0, 10, 128921, 28821, 0, 0, 0, 0, 0, 0, 'Scarlet Miner - On Respawn - Respawn Closest Creature \'Mine Car\''), +(-128901, 0, 1001, 1002, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 11, 52414, 0, 0, 0, 0, 0, 10, 128921, 28821, 0, 0, 0, 0, 0, 0, 'Scarlet Miner - On Respawn - Cast \'Drag Mine Cart\''), +(-128901, 0, 1002, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, 12890100, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Scarlet Miner - On Respawn - Start Path 12889200'), +(-128901, 0, 1003, 1004, 109, 0, 100, 0, 0, 12890100, 0, 0, 0, 0, 41, 2000, 0, 0, 0, 0, 0, 10, 128921, 28821, 0, 0, 0, 0, 0, 0, 'Scarlet Miner - On Path 12889200 Finished - Despawn In 2000 ms'), +(-128901, 0, 1004, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 41, 2000, 10, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Scarlet Miner - On Path 12889200 Finished - Despawn In 2000 ms'), +(-128901, 0, 1005, 0, 6, 0, 100, 0, 0, 0, 0, 0, 0, 0, 41, 1000, 0, 0, 0, 0, 0, 10, 128921, 28821, 0, 0, 0, 0, 0, 0, 'Scarlet Miner - On Just Died - Despawn In 1000 ms'), +(-128901, 0, 1006, 0, 7, 0, 100, 0, 0, 0, 0, 0, 0, 0, 11, 52414, 0, 0, 0, 0, 0, 10, 128921, 28821, 0, 0, 0, 0, 0, 0, 'Scarlet Miner - On Evade - Cast \'Drag Mine Cart\''); + +-- Update Mine Car SAI. +UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry` = 28821; + +DELETE FROM `smart_scripts` WHERE (`entryorguid` = 28821) AND (`source_type` = 0) AND (`id` IN (0)); +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 +(28821, 0, 0, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 11, 54173, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Mine Car - On Respawn - Cast \'Drag Mine Cart Check\''); + +-- Set Legacy spawn for Mine Cars +DELETE FROM `spawn_group_template` WHERE `groupId` = 104; +INSERT INTO `spawn_group_template` (`groupId`, `groupName`, `groupFlags`) VALUES +(104, 'Scarlet Mine - Miner & Mine Car pairs (compatibility respawn)', 2); + +DELETE FROM `spawn_group` WHERE `groupId` = 104; +INSERT INTO `spawn_group` (`groupId`, `spawnType`, `spawnId`) VALUES +(104, 0, 128902), +(104, 0, 128903), +(104, 0, 128904), +(104, 0, 128905), +(104, 0, 128906), +(104, 0, 128907), +(104, 0, 128908), +(104, 0, 128909), +(104, 0, 128921); + +-- Set Creature Formations (Scarlet Miner/Mine Car) +DELETE FROM `creature_formations` WHERE (`LeaderGUID` IN (128892, 128893, 128894, 128895, 128896, 128897, 128898, 128899, 128901)); +INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES +(128892, 128892, 0, 0, 512, 0, 0), +(128892, 128902, 3, 180, 512, 0, 0), +(128893, 128893, 0, 0, 512, 0, 0), +(128893, 128903, 3, 180, 512, 0, 0), +(128894, 128894, 0, 0, 512, 0, 0), +(128894, 128904, 3, 180, 512, 0, 0), +(128895, 128895, 0, 0, 512, 0, 0), +(128895, 128905, 3, 180, 512, 0, 0), +(128896, 128896, 0, 0, 512, 0, 0), +(128896, 128906, 3, 180, 512, 0, 0), +(128897, 128897, 0, 0, 512, 0, 0), +(128897, 128909, 3, 180, 512, 0, 0), +(128898, 128898, 0, 0, 512, 0, 0), +(128898, 128907, 3, 180, 512, 0, 0), +(128899, 128899, 0, 0, 512, 0, 0), +(128899, 128908, 3, 180, 512, 0, 0), +(128901, 128901, 0, 0, 512, 0, 0), +(128901, 128921, 3, 180, 512, 0, 0); diff --git a/src/server/game/Spells/SpellInfoCorrections.cpp b/src/server/game/Spells/SpellInfoCorrections.cpp index 2451f16a5..0c44900dc 100644 --- a/src/server/game/Spells/SpellInfoCorrections.cpp +++ b/src/server/game/Spells/SpellInfoCorrections.cpp @@ -5242,6 +5242,12 @@ void SpellMgr::LoadSpellInfoCorrections() spellInfo->AttributesEx3 |= SPELL_ATTR3_SUPPRESS_CASTER_PROCS; }); + // Drag Mine Cart + ApplySpellFix({ 52414 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ANY); + }); + for (uint32 i = 0; i < GetSpellInfoStoreSize(); ++i) { SpellInfo* spellInfo = mSpellInfoMap[i]; From 3ce6864c6ef3451365d7249d17b4af9094d2a14b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 21 Jul 2026 09:16:48 +0000 Subject: [PATCH 057/134] chore(DB): import pending files Referenced commit(s): 034c908f5ee1adc8b78564ae467156604da6ab71 --- .../rev_1784536849.sql => db_world/2026_07_21_00.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1784536849.sql => db_world/2026_07_21_00.sql} (99%) diff --git a/data/sql/updates/pending_db_world/rev_1784536849.sql b/data/sql/updates/db_world/2026_07_21_00.sql similarity index 99% rename from data/sql/updates/pending_db_world/rev_1784536849.sql rename to data/sql/updates/db_world/2026_07_21_00.sql index 14fe91732..220a6c17d 100644 --- a/data/sql/updates/pending_db_world/rev_1784536849.sql +++ b/data/sql/updates/db_world/2026_07_21_00.sql @@ -1,3 +1,4 @@ +-- DB update 2026_07_20_01 -> 2026_07_21_00 -- Add Missing Waypoint (Sniffed). DELETE FROM `waypoint_data` WHERE `id` = 12889700; From 3b60a2aa5de35d3427a26ecdd4acafbc60859d35 Mon Sep 17 00:00:00 2001 From: sogladev Date: Tue, 21 Jul 2026 11:18:29 +0200 Subject: [PATCH 058/134] fix(Scripts/Ulduar): Razorscale rework harpoon turrets, timers, phases (#26602) Co-authored-by: Keader --- .../rev_1783105226719520414.sql | 102 + .../Ulduar/Ulduar/boss_razorscale.cpp | 2088 ++++++++++------- .../scripts/Northrend/Ulduar/Ulduar/ulduar.h | 20 + 3 files changed, 1372 insertions(+), 838 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1783105226719520414.sql diff --git a/data/sql/updates/pending_db_world/rev_1783105226719520414.sql b/data/sql/updates/pending_db_world/rev_1783105226719520414.sql new file mode 100644 index 000000000..fc7c25010 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1783105226719520414.sql @@ -0,0 +1,102 @@ +-- Razorscale encounter rework: spell-based spawning via creature_summon_groups + +-- Remove static spawns for creatures now managed by creature_summon_groups +DELETE FROM `creature` WHERE `id` IN (33210, 33287, 33816, 33259, 33233) AND `map` = 603; + +-- Remove harpoon fire state static spawns (now in summon groups) +DELETE FROM `creature` WHERE `id` = 33282 AND `map` = 603; + +DELETE FROM `creature_summon_groups` WHERE `summonerId` = 33186; +INSERT INTO `creature_summon_groups` (`summonerId`, `summonerType`, `groupId`, `entry`, `position_x`, `position_y`, `position_z`, `orientation`, `summonType`, `summonTime`, `Comment`) VALUES +-- Group 1: Expedition NPCs (Commander, Engineers, Defenders, Trappers, Controllers) +(33186, 0, 1, 33210, 585.6672, -104.4477, 391.6004, 1.518436, 8, 0, 'Expedition Commander'), +(33186, 0, 1, 33287, 592.5033, -98.55198, 391.6004, 5.742133, 8, 0, 'Expedition Engineer'), +(33186, 0, 1, 33287, 589.5328, -95.32281, 391.6004, 5.51524, 8, 0, 'Expedition Engineer'), +(33186, 0, 1, 33287, 594.3019, -94.38184, 391.6004, 4.817109, 8, 0, 'Expedition Engineer'), +(33186, 0, 1, 33816, 600.7484, -104.8482, 391.6082, 4.852015, 8, 0, 'Expedition Defender'), +(33186, 0, 1, 33816, 596.3798, -110.2639, 391.6004, 4.852015, 8, 0, 'Expedition Defender'), +(33186, 0, 1, 33816, 576.5787, -113.1111, 391.6004, 4.29351, 8, 0, 'Expedition Defender'), +(33186, 0, 1, 33816, 570.4106, -108.7936, 391.6004, 4.13643, 8, 0, 'Expedition Defender'), +(33186, 0, 1, 33816, 588.7609, -114.8663, 391.6004, 4.852015, 8, 0, 'Expedition Defender'), +(33186, 0, 1, 33816, 566.4739, -103.6336, 391.6004, 4.363323, 8, 0, 'Expedition Defender'), +(33186, 0, 1, 33259, 583.61, -110.9356, 391.6004, 4.939282, 8, 0, 'Expedition Trapper'), +(33186, 0, 1, 33259, 578.1771, -107.6289, 391.6004, 4.852015, 8, 0, 'Expedition Trapper'), +(33186, 0, 1, 33259, 588.2538, -108.7151, 391.6004, 4.991642, 8, 0, 'Expedition Trapper'), +(33186, 0, 1, 33233, 630.2436, -276.2591, 392.3122, 1.797689, 8, 0, 'Razorscale Controller'), +(33186, 0, 1, 33233, 638.2416, -272.1735, 392.1351, 1.815142, 8, 0, 'Razorscale Controller'), +(33186, 0, 1, 33233, 633.6514, -287.3748, 391.8054, 1.797689, 8, 0, 'Razorscale Controller'), +(33186, 0, 1, 33233, 605.9334, -140.0912, 391.6004, 4.485496, 8, 0, 'Razorscale Controller'), +(33186, 0, 1, 33233, 572.4106, -138.6564, 393.9044, 4.764749, 8, 0, 'Razorscale Controller'), +(33186, 0, 1, 33233, 558.9486, -142.9874, 391.6004, 4.764749, 8, 0, 'Razorscale Controller'), +(33186, 0, 1, 33233, 589.7287, -137.1148, 393.9011, 4.485496, 8, 0, 'Razorscale Controller'), +-- Group 2: Harpoon Fire States (10-man) +(33186, 0, 2, 33282, 589.6996, -134.6657, 391.6004, 4.555309, 8, 0, 'Razorscale Harpoon Fire State (10M)'), +(33186, 0, 2, 33282, 572.0398, -136.2224, 391.2637, 4.642576, 8, 0, 'Razorscale Harpoon Fire State (10M)'), +-- Group 3: Harpoon Fire States (25-man) +(33186, 0, 3, 33282, 559.5352, -140.9866, 391.6004, 4.642576, 8, 0, 'Razorscale Harpoon Fire State (25M)'), +(33186, 0, 3, 33282, 606.2806, -137.2628, 391.6004, 4.537856, 8, 0, 'Razorscale Harpoon Fire State (25M)'); + +-- Update creature_template ScriptNames +UPDATE `creature_template` SET `ScriptName` = 'npc_razorscale_spawner' WHERE `entry` = 33245; +UPDATE `creature_template` SET `AIName` = 'NullCreatureAI' WHERE (`entry` = 33233); +UPDATE `creature_template` SET `ScriptName` = 'npc_expedition_commander' WHERE `entry` = 33210; +UPDATE `creature_template` SET `ScriptName` = 'npc_expedition_defender' WHERE `entry` = 33816; +UPDATE `creature_template` SET `ScriptName` = 'npc_expedition_trapper' WHERE `entry` = 33259; +UPDATE `creature_template` SET `ScriptName` = 'npc_expedition_engineer' WHERE `entry` = 33287; +UPDATE `creature_template` SET `ScriptName` = 'npc_razorscale_harpoon_fire_state' WHERE `entry` = 33282; +UPDATE `creature_template` SET `ScriptName` = 'npc_razorscale_dark_rune_guardian' WHERE `entry` = 33388; +UPDATE `creature_template` SET `ScriptName` = 'npc_razorscale_dark_rune_watcher' WHERE `entry` = 33453; +UPDATE `creature_template` SET `ScriptName` = 'npc_razorscale_dark_rune_sentinel' WHERE `entry` = 33846; +UPDATE `creature_template` SET `ScriptName` = 'npc_razorscale_devouring_flame' WHERE `entry` = 34188; + +-- Razorscale Controller: set faction to friendly so it doesn't aggro players but can still cast +UPDATE `creature_template` SET `faction` = 35, `unit_flags` = 33554432 WHERE `entry` = 33233; + +-- Update gameobject_template ScriptNames +UPDATE `gameobject_template` SET `ScriptName` = 'go_razorscale_harpoon' WHERE `entry` IN (194519, 194541, 194542, 194543); +UPDATE `gameobject_template` SET `ScriptName` = 'go_razorscale_mole_machine' WHERE `entry` = 194316; + +-- Devouring Flame Stalker: cast aura on spawn +DELETE FROM `creature_template_addon` WHERE `entry` IN (34188, 34189); +INSERT INTO `creature_template_addon` (`entry`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES +(34188, 0, 0, 33554688, 0, 0, '64709'), +(34189, 0, 0, 33554688, 0, 0, '64709'); + +DELETE FROM `spell_script_names` WHERE `ScriptName` IN ( 'spell_razorscale_summon_iron_dwarves', 'spell_razorscale_fuse_armor', 'spell_razorscale_firebolt', 'spell_razorscale_flame_breath'); +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(63968, 'spell_razorscale_summon_iron_dwarves'), +(63969, 'spell_razorscale_summon_iron_dwarves'), +(63970, 'spell_razorscale_summon_iron_dwarves'), +(64821, 'spell_razorscale_fuse_armor'), +(62669, 'spell_razorscale_firebolt'), +(63317, 'spell_razorscale_flame_breath'), +(64021, 'spell_razorscale_flame_breath'); + +-- Spell difficulty entries (core auto-resolves 10/25 man versions) +DELETE FROM `spelldifficulty_dbc` WHERE `ID` IN (63317, 64709, 64758, 63809); +INSERT INTO `spelldifficulty_dbc` (`ID`, `DifficultySpellID_1`, `DifficultySpellID_2`, `DifficultySpellID_3`, `DifficultySpellID_4`) VALUES +(63317, 63317, 64021, 0, 0), -- Flame Breath +(64709, 64709, 64734, 0, 0), -- Devouring Flame (Ground) +(64758, 64758, 64759, 0, 0), -- Chain Lightning +(63809, 63809, 64696, 0, 0); -- Lightning Bolt + +-- Conditions for Expedition Trapper Shackle (62646) to only hit Razorscale (33186) +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` = 13 AND `SourceEntry` = 62646; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(13, 1, 62646, 0, 0, 31, 0, 3, 33186, 0, 0, 0, 0, '', 'Effect_0 hits Razorscale'); +DELETE FROM `conditions` WHERE (`SourceTypeOrReferenceId` = 13) AND (`SourceGroup` = 1) AND (`SourceEntry` = 62646) AND (`SourceId` = 0) AND (`ElseGroup` = 1) AND (`ConditionTypeOrReference` = 31) AND (`ConditionTarget` = 0) AND (`ConditionValue1` = 3) AND (`ConditionValue2` = 33724) AND (`ConditionValue3` = 0); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(13, 1, 62646, 0, 1, 31, 0, 3, 33724, 0, 0, 0, 0, '', 'Effect_0 hits Razorscale (1)'); + +-- Conditions: only show gossip option when Razorscale encounter is not in progress +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` = 15 AND `SourceGroup` = 10314 AND `SourceEntry` = 0; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(15, 10314, 0, 0, 0, 13, 0, 2, 3, 2, 1, 0, 0, '', 'Show gossip only when Razorscale is NOT done (BossState != DONE)'); + +-- Add Dark Rune Guardian (1) to 25-man Flame Breath 'TARGET_UNIT_CONE_ENTRY' +DELETE FROM `conditions` WHERE (`SourceTypeOrReferenceId` = 13) AND (`SourceGroup` = 3) AND (`SourceEntry` = 64021) AND (`SourceId` = 0) AND (`ElseGroup` = 2) AND (`ConditionTypeOrReference` = 31) AND (`ConditionTarget` = 0) AND (`ConditionValue1` = 3) AND (`ConditionValue2` = 33850) AND (`ConditionValue3` = 0); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(13, 3, 64021, 0, 2, 31, 0, 3, 33850, 0, 0, 0, 0, '', 'Flame Breath - Dark Rune Guardian (1)'); + +-- Remove extra 25-man Broken Harpoon without a Razorscale Controller +DELETE FROM `gameobject` WHERE `id` = 194565 AND `guid` IN (268564, 268565); diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp index 02e774ce5..d4246f6a0 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp @@ -17,6 +17,7 @@ #include "AchievementCriteriaScript.h" #include "CreatureScript.h" +#include "GameObjectAI.h" #include "GameObjectScript.h" #include "PassiveAI.h" #include "Player.h" @@ -24,283 +25,409 @@ #include "ScriptedGossip.h" #include "SpellAuras.h" #include "SpellScript.h" -#include "WaypointMgr.h" +#include "SpellScriptLoader.h" +#include "TaskScheduler.h" #include "ulduar.h" -enum Spells +enum RazorscaleSpells { // Razorscale - SPELL_FLAMEBUFFET = 64016, - SPELL_FIREBALL = 63815, - SPELL_WINGBUFFET = 62666, - SPELL_FLAMEBREATH = 63317, - SPELL_FUSEARMOR = 64771, - SPELL_FUSED_ARMOR = 64774, // Applied on 5th stack of SPELL_FUSEARMOR - SPELL_DEVOURINGFLAME = 63236, - SPELL_BERSERK = 47008, + SPELL_FLAME_BUFFET = 64016, + SPELL_FLAME_BREATH = 63317, + SPELL_FLAME_BREATH_25 = 64021, + SPELL_WING_BUFFET = 62666, + SPELL_FIREBALL = 63815, + SPELL_FIREBOLT = 62669, + SPELL_DEVOURING_FLAME = 63236, + SPELL_DEVOURING_FLAME_GROUND = 64709, + SPELL_DEVOURING_FLAME_GROUND_25 = 64734, + SPELL_FUSE_ARMOR = 64821, + SPELL_FUSED_ARMOR = 64774, + SPELL_BERSERK = 47008, + SPELL_STUN_SELF = 62794, - // Haproons - SPELL_CHAIN_1 = 49679, - SPELL_CHAIN_2 = 49682, - SPELL_CHAIN_3 = 49683, - SPELL_CHAIN_4 = 49684, + // Harpoon Fire State + SPELL_HARPOON_FIRE_STATE = 62696, + + // Harpoon Shots + SPELL_HARPOON_SHOT_1 = 63658, + SPELL_HARPOON_SHOT_2 = 63657, + SPELL_HARPOON_SHOT_3 = 63659, + SPELL_HARPOON_SHOT_4 = 63524, + SPELL_HARPOON_TRIGGER = 62505, + + // Spawner + SPELL_SUMMON_MOLE_MACHINE = 62899, + SPELL_SUMMON_IRON_DWARF_GUARDIAN = 62926, + SPELL_SUMMON_IRON_DWARF_WATCHER = 63135, + SPELL_TRIGGER_SUMMON_IRON_DWARVES = 63968, + SPELL_TRIGGER_SUMMON_IRON_DWARVES_2 = 63970, + SPELL_TRIGGER_SUMMON_IRON_DWARVES_3 = 63969, + SPELL_TRIGGER_SUMMON_IRON_VRYKUL = 63798, // Dark Rune Sentinel - SPELL_WHIRLWIND = 63808, - SPELL_BATTLE_SHOUT = 46763, + SPELL_BATTLE_SHOUT = 46763, + SPELL_WHIRLWIND = 63808, + SPELL_HEROIC_STRIKE = 45026, // Dark Rune Guardian - SPELL_STORMSTRIKE_DMG = 65971, - SPELL_STORMSTRIKE_DEBUFF = 64757, + SPELL_STORMSTRIKE = 64757, // Dark Rune Watcher - SPELL_LIGHTINGBOLT = 63809, - SPELL_CHAINLIGHTNING = 64758, + SPELL_LIGHTNING_BOLT = 63809, + SPELL_LIGHTNING_BOLT_25 = 64696, + SPELL_CHAIN_LIGHTNING = 64758, + SPELL_CHAIN_LIGHTNING_25 = 64759, + + // Trapper + SPELL_SHACKLE = 62646, + + // Defender + SPELL_THREAT = 65146, }; -#define REQ_CHAIN_COUNT RAID_MODE(2, 4) - -enum NPCs +enum RazorscaleEvents { - NPC_DARK_RUNE_SENTINEL = 33846, - NPC_DARK_RUNE_GUARDIAN = 33388, - NPC_DARK_RUNE_WATCHER = 33453, - NPC_EXPEDITION_ENGINEER = 33287, - NPC_EXPEDITION_COMMANDER = 33210, - NPC_RAZORSCALE_CONTROLLER = 33233, // Trigger Creature + EVENT_BERSERK = 1, + EVENT_FIREBALL_AIR, + EVENT_DEVOURING_FLAME, + EVENT_SUMMON_MINIONS, + EVENT_SUMMON_MINIONS_DELAYED, + EVENT_FLAME_BREATH_GROUNDED, + EVENT_WING_BUFFET, + EVENT_RESUME_AIR, + EVENT_FLAME_BREATH, + EVENT_FIREBOLT, + EVENT_FUSE_ARMOR, + EVENT_RESUME_CHASE, + + EVENT_BUILD_HARPOON_1, + EVENT_BUILD_HARPOON_2, + EVENT_BUILD_HARPOON_3, + EVENT_BUILD_HARPOON_4, + EVENT_DESTROY_HARPOONS, + + EVENT_START_COMBAT, + EVENT_HEROIC_STRIKE, + EVENT_BATTLE_SHOUT, + EVENT_WHIRLWIND, + EVENT_LIGHTNING_BOLT, + EVENT_CHAIN_LIGHTNING, + EVENT_STORMSTRIKE, }; -enum GOs +enum RazorscaleActions { - GO_DRILL = 195305, - GO_HARPOON_GUN_1 = 194519, - GO_HARPOON_GUN_2 = 194541, - GO_HARPOON_GUN_3 = 194542, - GO_HARPOON_GUN_4 = 194543, - GO_BROKEN_HARPOON = 194565, + ACTION_START_FIGHT = 1, + ACTION_GROUND_PHASE, + ACTION_START_PERMA_GROUND, + ACTION_BUILD_HARPOON_1, + ACTION_BUILD_HARPOON_2, + ACTION_BUILD_HARPOON_3, + ACTION_BUILD_HARPOON_4, + ACTION_DESTROY_HARPOONS, + ACTION_STOP_CONTROLLERS, + ACTION_ENGINEER_DEAD, + + // Harpoon fire state actions + ACTION_FIRE_STATE_RESET, + ACTION_FIRE_STATE_REPAIR, }; -enum eEvents +enum RazorscalePhases { - EVENT_NONE = 0, - EVENT_COMMANDER_SAY_AGGRO, - EVENT_EE_SAY_MOVE_OUT, - EVENT_ENRAGE, - EVENT_SPELL_FIREBALL, - EVENT_SPELL_DEVOURING_FLAME, - EVENT_SUMMON_MOLE_MACHINES, - EVENT_SUMMON_ADDS, - EVENT_WARN_DEEP_BREATH, - EVENT_PHASE2_FLAME_BREATH, - EVENT_FLY_UP, - EVENT_RESUME_FIXING, - EVENT_SPELL_FLAME_BREATH, - EVENT_SPELL_DEVOURING_FLAME_GROUND, - EVENT_SPELL_FUSE_ARMOR, - EVENT_SPELL_FLAME_BUFFET, + PHASE_NONE = 0, + PHASE_AIR, + PHASE_GROUND, + PHASE_PERMA_GROUND, }; -enum Texts +enum RazorscaleMisc { - // Razorscale - EMOTE_PERMA_GROUND = 0, - EMOTE_BREATH = 1, - EMOTE_BERSERK = 2, + DATA_QUICK_SHAVE_ID = 29192921, + DATA_IRON_DWARF_ID = 29232924, + GOSSIP_START_ENCOUNTER = 0, + GROUP_EXPEDITION = 1, + GROUP_FIRE_STATE_10 = 2, + GROUP_FIRE_STATE_25 = 3, + POINT_RAZORSCALE_FLIGHT = 1, + POINT_RAZORSCALE_LAND = 2, + POINT_RAZORSCALE_GROUND = 3, + POINT_RAZORSCALE_TAKEOFF = 4, + POINT_RAZORSCALE_FLIGHT_2 = 5, + POINT_DEFENDER_ATTACK = 10, - // Expedition Commander - SAY_COMMANDER_AGGRO = 0, - SAY_COMMANDER_GROUND_PHASE = 1, - SAY_COMMANDER_ENGINEERS_DEAD = 2, // Should be called when all engineers are dead, currently unused + WORLD_STATE_RAZORSCALE_MUSIC = 4162, - // Expedition Engineer - SAY_EE_AGGRO = 0, - SAY_EE_START_REPAIR = 1, - SAY_EE_REBUILD_TURRETS = 2, - - // Harpoon - EMOTE_HARPOON = 0, + // Harpoon fire state data + FIRE_STATE_REPAIR = 2, + FIRE_STATE_MAX_PROGRESS = 25 }; -enum Misc +enum RazorscaleSays { - POINT_RAZORSCALE_INIT = 1, - REPAIR_POINTS = 25, - - // Expedition Commander Gossip - GOSSIP_MENU_START_ENCOUNTER = 10314, - NPC_TEXT_COMMANDER = 40100, + EMOTE_PERMA_GROUND = 0, + EMOTE_BREATH = 1, + EMOTE_BERSERK = 2, }; -const Position CORDS_GROUND = {588.0f, -166.0f, 391.1f}; -const Position CORDS_AIR = {588.0f, -178.0f, 490.0f}; +static Position const RazorFlightPos = {585.3610f, -173.5592f, 456.8430f, 1.526665f}; +static Position const RazorFlightPos2 = {619.1450f, -238.0780f, 475.1800f, 1.423917f}; +static Position const RazorLandPos = {585.4010f, -173.5430f, 408.5080f, 1.570796f}; +static Position const RazorGroundPos = {585.4010f, -173.5430f, 391.6421f, 1.570796f}; + +static Position const BrokenHarpoonPos[4] = { + {571.9465f, -136.0118f, 391.5171f, 2.286379f}, + {589.9233f, -133.6223f, 391.8968f, 3.298687f}, + {559.1199f, -140.5058f, 391.1803f, 4.049168f}, + {606.2297f, -136.7212f, 391.1803f, 5.131269f} +}; + +static Position const HarpoonPositions[4] = { + {571.9012f, -136.5541f, 391.5171f, 4.921829f}, + {589.9233f, -133.6223f, 391.8968f, 4.81711f }, + {559.1199f, -140.5058f, 391.1803f, 5.061456f}, + {606.2297f, -136.7212f, 391.1803f, 4.537859f} +}; + +static Position const DefenderPositions[6] = { + {624.3065f, -154.4163f, 391.6442f, 0.0f}, + {611.6274f, -170.9375f, 391.8087f, 0.0f}, + {572.1548f, -167.4471f, 391.8087f, 0.0f}, + {558.4640f, -165.0114f, 391.8087f, 0.0f}, + {603.3345f, -164.4297f, 391.8087f, 0.0f}, + {549.1727f, -159.1180f, 391.8087f, 0.0f} +}; + +static Position const TrapperPositions[3] = { + {574.9293f, -184.5150f, 391.8921f, 0.0f}, + {539.7838f, -178.5337f, 391.3053f, 0.0f}, + {627.1754f, -177.9638f, 391.5553f, 0.0f} +}; + +static uint32 const DwarfSummonSpells[3] = {SPELL_TRIGGER_SUMMON_IRON_DWARVES, SPELL_TRIGGER_SUMMON_IRON_DWARVES_2, SPELL_TRIGGER_SUMMON_IRON_DWARVES_3}; struct boss_razorscale : public BossAI { - boss_razorscale(Creature* creature) : BossAI(creature, BOSS_RAZORSCALE) + explicit boss_razorscale(Creature* creature) : BossAI(creature, BOSS_RAZORSCALE) { - startPath = true; + Initialize(); } - ObjectGuid ExpeditionEngineerGUIDs[3]; - ObjectGuid CommanderGUID; - float cords[4][2]; - bool bGroundPhase; - bool startPath; - uint8 flyTimes; - - void InitializeAI() override + void Initialize() { + _engineersAlive = 3; + _defenderCnt = 0; + _trapperCnt = 0; + _harpoonHits = 0; + _flyCount = 0; + _permaGround = false; me->SetDisableGravity(true); - me->setActive(true); - Reset(); } void Reset() override { _Reset(); - - for (uint8 i = 0; i < 3; ++i) - ExpeditionEngineerGUIDs[i].Clear(); - - // Show gossip icon if previously hidden - if (Creature* commander = ObjectAccessor::GetCreature(*me, CommanderGUID)) - if (!commander->HasNpcFlag(UNIT_NPC_FLAG_GOSSIP)) - commander->SetNpcFlag(UNIT_NPC_FLAG_GOSSIP); - - CommanderGUID.Clear(); - bGroundPhase = false; - flyTimes = 0; + Initialize(); + events.SetPhase(PHASE_NONE); + me->SummonCreatureGroup(GROUP_EXPEDITION); + me->SummonCreatureGroup(GROUP_FIRE_STATE_10); + if (Is25ManRaid()) + me->SummonCreatureGroup(GROUP_FIRE_STATE_25); me->SetImmuneToPC(true); + me->SetCombatMovement(false); me->SetAnimTier(AnimTier::Fly); } - void AttackStart(Unit* who) override - { - if (who && me->Attack(who, true) && bGroundPhase) - me->GetMotionMaster()->MoveChase(who); - } - void JustEngagedWith(Unit* who) override { - me->SetImmuneToPC(false); BossAI::JustEngagedWith(who); - events.ScheduleEvent(EVENT_COMMANDER_SAY_AGGRO, 5s); - events.ScheduleEvent(EVENT_EE_SAY_MOVE_OUT, 10s); - events.ScheduleEvent(EVENT_ENRAGE, 10min); - events.ScheduleEvent(EVENT_SPELL_FIREBALL, 6s); - events.ScheduleEvent(EVENT_SPELL_DEVOURING_FLAME, 13s); - events.ScheduleEvent(EVENT_SUMMON_MOLE_MACHINES, 11s); - - std::list eeList; - me->GetCreaturesWithEntryInRange(eeList, 300.0f, NPC_EXPEDITION_ENGINEER); - uint8 i = 0; - for( std::list::iterator itr = eeList.begin(); itr != eeList.end(); ++itr ) - { - if (i > 2) - break; - ExpeditionEngineerGUIDs[i] = (*itr)->GetGUID(); - if (!i) - (*itr)->AI()->Talk(SAY_EE_AGGRO); - ++i; - } - if (Creature* c = me->FindNearestCreature(NPC_EXPEDITION_COMMANDER, 300.0f, true)) - CommanderGUID = c->GetGUID(); + me->SetImmuneToPC(false); + instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me); + ScheduleAirEvents(); + summons.DoAction(ACTION_START_FIGHT); + events.ScheduleEvent(EVENT_BERSERK, 10min); + HandleMusic(true); } - void SpellHit(Unit* caster, SpellInfo const* spell) override + void ScheduleAirEvents() { - if (!caster) + events.SetPhase(PHASE_AIR); + events.ScheduleEvent(EVENT_FIREBALL_AIR, 3s, 0, PHASE_AIR); + events.ScheduleEvent(EVENT_DEVOURING_FLAME, 9s, 0, PHASE_AIR); + events.ScheduleEvent(EVENT_SUMMON_MINIONS, 1s, 0, PHASE_AIR); + } + + void ScheduleGroundEvents() + { + events.SetPhase(PHASE_PERMA_GROUND); + events.ScheduleEvent(EVENT_FIREBOLT, 3s, 0, PHASE_PERMA_GROUND); + events.ScheduleEvent(EVENT_FUSE_ARMOR, 15s, 0, PHASE_PERMA_GROUND); + events.ScheduleEvent(EVENT_FLAME_BREATH_GROUNDED, 21s, 0, PHASE_PERMA_GROUND); + events.ScheduleEvent(EVENT_DEVOURING_FLAME, 22s, 0, PHASE_PERMA_GROUND); + } + + void DoAction(int32 action) override + { + switch (action) + { + case ACTION_START_FIGHT: + me->SetImmuneToPC(false); + me->SetSpeedRate(MOVE_RUN, 3.0f); + me->StopMoving(); + me->GetMotionMaster()->MovePoint(POINT_RAZORSCALE_FLIGHT, RazorFlightPos, FORCED_MOVEMENT_NONE, 0.0f, false, false, AnimTier::Fly); + break; + case ACTION_GROUND_PHASE: + me->InterruptNonMeleeSpells(false); + events.SetPhase(PHASE_GROUND); + _harpoonHits = 0; + me->SetSpeedRate(MOVE_RUN, 3.0f); + me->GetMotionMaster()->MovePoint(POINT_RAZORSCALE_LAND, RazorLandPos, FORCED_MOVEMENT_NONE, 0.0f, false, false, AnimTier::Fly); + break; + case ACTION_START_PERMA_GROUND: + me->SetDisableGravity(false); + me->RemoveAura(SPELL_STUN_SELF); + Talk(EMOTE_PERMA_GROUND); + DoCastSelf(SPELL_WING_BUFFET); + events.ScheduleEvent(EVENT_RESUME_CHASE, 1s); + ScheduleGroundEvents(); + break; + default: + break; + } + } + + void MovementInform(uint32 type, uint32 pointId) override + { + if (type != POINT_MOTION_TYPE && type != EFFECT_MOTION_TYPE) return; - switch (spell->Id) + switch (pointId) { - case SPELL_CHAIN_1: - case SPELL_CHAIN_2: - case SPELL_CHAIN_3: - case SPELL_CHAIN_4: + case POINT_RAZORSCALE_FLIGHT: + me->SetFacingTo(RazorFlightPos.GetOrientation()); + DoZoneInCombat(); + break; + case POINT_RAZORSCALE_LAND: + me->SetFacingTo(RazorLandPos.GetOrientation()); + me->GetMotionMaster()->MoveLand(POINT_RAZORSCALE_GROUND, RazorGroundPos); + break; + case POINT_RAZORSCALE_GROUND: + me->SetDisableGravity(false); + if (!_permaGround) { - uint8 count = 0; - if (me->HasAura(SPELL_CHAIN_1)) - count++; - if (me->HasAura(SPELL_CHAIN_3)) - count++; - if (RAID_MODE(0, 1)) - { - if (me->HasAura(SPELL_CHAIN_2)) - count++; - if (me->HasAura(SPELL_CHAIN_4)) - count++; - } - if (count >= REQ_CHAIN_COUNT) - { - if (Creature* commander = ObjectAccessor::GetCreature(*me, CommanderGUID)) - commander->AI()->Talk(SAY_COMMANDER_GROUND_PHASE); - - me->InterruptNonMeleeSpells(true); - events.CancelEvent(EVENT_SPELL_FIREBALL); - events.CancelEvent(EVENT_SPELL_DEVOURING_FLAME); - events.CancelEvent(EVENT_SUMMON_MOLE_MACHINES); - me->SetTarget(); - me->SendMeleeAttackStop(me->GetVictim()); - me->GetMotionMaster()->MoveLand(0, CORDS_GROUND, 25.0f); - } + DoCastSelf(SPELL_STUN_SELF, true); + EntryCheckPredicate trapperPred(NPC_EXPEDITION_TRAPPER); + summons.DoAction(ACTION_GROUND_PHASE, trapperPred); + EntryCheckPredicate commanderPred(NPC_EXPEDITION_COMMANDER); + summons.DoAction(ACTION_GROUND_PHASE, commanderPred); + events.ScheduleEvent(EVENT_FLAME_BREATH, 30s, 0, PHASE_GROUND); } break; + case POINT_RAZORSCALE_TAKEOFF: + me->SetSpeedRate(MOVE_RUN, 3.0f); + me->GetMotionMaster()->MovePoint(POINT_RAZORSCALE_FLIGHT_2, RazorFlightPos2); + break; + case POINT_RAZORSCALE_FLIGHT_2: + me->SetFacingTo(RazorFlightPos2.GetOrientation()); + me->SetReactState(REACT_AGGRESSIVE); + ScheduleAirEvents(); + ++_flyCount; + break; + default: + break; } } - void DamageTaken(Unit* attacker, uint32& damage, DamageEffectType damagetype, SpellSchoolMask damageSchoolMask) override + void SpellHit(Unit* /*caster*/, SpellInfo const* spellInfo) override { - if (me->GetPositionZ() > 440.0f) // protection, razorscale is attackable (so harpoons can hit him, etc.), but should not receive dmg while in air - damage = 0; - else if (!bGroundPhase && ((me->GetHealth() * 100) / me->GetMaxHealth() < 50) && me->HasAura(62794)) // already below 50%, but still in chains and stunned - events.RescheduleEvent(EVENT_WARN_DEEP_BREATH, 0ms); - - BossAI::DamageTaken(attacker, damage, damagetype, damageSchoolMask); + if (spellInfo->Id == SPELL_HARPOON_TRIGGER) + { + _harpoonHits++; + if (_harpoonHits >= RAID_MODE(2, 4)) + DoAction(ACTION_GROUND_PHASE); + } } - void MovementInform(uint32 type, uint32 id) override + void SummonMinions() { - if (type == POINT_MOTION_TYPE && id == POINT_RAZORSCALE_INIT) + float x = frand(540.0f, 640.0f); + float y = frand(-230.0f, -195.0f); + float z = 391.517f; + me->SummonCreature(NPC_RAZORSCALE_SPAWNER, x, y, z, 0, TEMPSUMMON_TIMED_DESPAWN, 15000); + } + + void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellSchoolMask /*school*/) override + { + if (!_permaGround && me->HealthBelowPctDamaged(50, damage) && events.IsInPhase(PHASE_GROUND)) { - me->SetFacingTo(1.6f); - return; + _permaGround = true; + me->SetReactState(REACT_AGGRESSIVE); + DoAction(ACTION_START_PERMA_GROUND); } - else if (type == ESCORT_MOTION_TYPE && me->movespline->Finalized() && !me->IsInCombat()) + } + + void JustSummoned(Creature* summon) override + { + BossAI::JustSummoned(summon); + if (summon->GetEntry() == NPC_EXPEDITION_DEFENDER) + summon->AI()->SetData(0, _defenderCnt++); + else if (summon->GetEntry() == NPC_EXPEDITION_TRAPPER) + summon->AI()->SetData(0, _trapperCnt++); + } + + void SummonedCreatureDies(Creature* summon, Unit* /*killer*/) override + { + if (summon->GetEntry() == NPC_EXPEDITION_ENGINEER) { - startPath = true; + _engineersAlive--; + if (_engineersAlive == 0) + { + EntryCheckPredicate pred(NPC_EXPEDITION_COMMANDER); + summons.DoAction(ACTION_ENGINEER_DEAD, pred); + } + } + } + + uint32 GetData(uint32 id) const override + { + return (id == DATA_QUICK_SHAVE_ID && _flyCount <= 1) ? 1 : 0; + } + + void HandleMusic(bool active) + { + instance->DoUpdateWorldState(WORLD_STATE_RAZORSCALE_MUSIC, active ? 1 : 0); + } + + void EnterEvadeMode(EvadeReason why) override + { + if (why == EVADE_REASON_BOUNDARY && !events.IsInPhase(PHASE_PERMA_GROUND)) return; + instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); + + // Despawn dark rune minions summoned by spawner spells (not tracked by BossAI summons) + for (uint32 entry : {NPC_DARK_RUNE_GUARDIAN, NPC_DARK_RUNE_WATCHER, NPC_DARK_RUNE_SENTINEL}) + { + std::list minions; + me->GetCreatureListWithEntryInGrid(minions, entry, 200.0f); + for (Creature* creature : minions) + creature->DespawnOrUnsummon(); } - if (type != EFFECT_MOTION_TYPE) - return; - if (id == 0) // landed - { - me->SetControlled(true, UNIT_STATE_ROOT); - me->DisableRotate(true); - me->SetOrientation((float)(M_PI + 0.01) / 2); - me->SetFacingTo(M_PI / 2); - me->SetDisableGravity(false); - me->CastSpell(me, 62794, true); - events.ScheduleEvent(EVENT_WARN_DEEP_BREATH, 30s); - } - else if (id == 1) // flied up - { - events.ScheduleEvent(EVENT_SPELL_FIREBALL, 2s); - events.ScheduleEvent(EVENT_SPELL_DEVOURING_FLAME, 4s); - events.ScheduleEvent(EVENT_SUMMON_MOLE_MACHINES, 5s); - } + summons.DespawnAll(); + _EnterEvadeMode(); + HandleMusic(false); + } + + void JustDied(Unit* /*killer*/) override + { + _JustDied(); + instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); + HandleMusic(false); } void UpdateAI(uint32 diff) override { - if (startPath) - { - me->StopMoving(); - startPath = false; - me->GetMotionMaster()->MovePath(me->GetWaypointPath(), FORCED_MOVEMENT_NONE, PathSource::WAYPOINT_MGR); - } - if (!UpdateVictim()) return; @@ -309,735 +436,1020 @@ struct boss_razorscale : public BossAI if (me->HasUnitState(UNIT_STATE_CASTING)) return; - switch (events.ExecuteEvent()) + while (uint32 eventId = events.ExecuteEvent()) { - case 0: - break; - case EVENT_ENRAGE: - Talk(EMOTE_BERSERK); - me->CastSpell(me, SPELL_BERSERK, true); - break; - case EVENT_COMMANDER_SAY_AGGRO: - if (Creature* commander = ObjectAccessor::GetCreature(*me, CommanderGUID)) - commander->AI()->Talk(SAY_COMMANDER_AGGRO); - break; - case EVENT_EE_SAY_MOVE_OUT: - for (uint8 i = 0; i < 3; ++i) - if (Creature* c = ObjectAccessor::GetCreature(*me, ExpeditionEngineerGUIDs[i])) + switch (eventId) + { + case EVENT_BERSERK: + Talk(EMOTE_BERSERK); + DoCastSelf(SPELL_BERSERK, true); + break; + case EVENT_FIREBALL_AIR: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 200.0f, true)) + DoCast(target, SPELL_FIREBALL); + events.Repeat(3s, 4s); + break; + case EVENT_DEVOURING_FLAME: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 200.0f, true)) + DoCast(target, SPELL_DEVOURING_FLAME); + events.Repeat(_permaGround ? Seconds(10) : Seconds(6), _permaGround ? Seconds(12) : Seconds(12)); + break; + case EVENT_SUMMON_MINIONS: + { + uint8 count = RAID_MODE(2, urand(2, 4)); + uint32 delay = 5; + for (uint8 i = 0; i < count; ++i) { - if (!i) - c->AI()->Talk(SAY_EE_START_REPAIR); - c->AI()->SetData(1, 0); // start repairing + events.ScheduleEvent(EVENT_SUMMON_MINIONS_DELAYED, Milliseconds(delay * 1000), 0, PHASE_AIR); + delay += urand(2, 5); } - break; - case EVENT_SPELL_FIREBALL: - if (Unit* pTarget = SelectTarget(SelectTargetMethod::Random, 0, 200.0f, true)) - me->CastSpell(pTarget, SPELL_FIREBALL, false); - events.Repeat(4s); - break; - case EVENT_SPELL_DEVOURING_FLAME: - if (Unit* pTarget = SelectTarget(SelectTargetMethod::Random, 0, 200.0f, true)) - me->CastSpell(pTarget, SPELL_DEVOURINGFLAME, false); - events.Repeat(13s); - break; - case EVENT_SUMMON_MOLE_MACHINES: - { - memset(cords, '\0', sizeof(cords)); - uint8 num = RAID_MODE( urand(2, 3), urand(2, 4)); - for( int i = 0; i < num; ++i ) - { - // X: (550, 625) Y: (-185, -230) - cords[i][0] = urand(550, 625); - cords[i][1] = -230 + rand() % 45; - if (GameObject* drill = me->SummonGameObject(GO_DRILL, cords[i][0], cords[i][1], 391.1f, M_PI / 4, 0.0f, 0.0f, 0.0f, 0.0f, 8)) - { - //drill->SetGoAnimProgress(0); - //drill->SetLootState(GO_READY); - //drill->UseDoorOrButton(8); - //drill->SetGoState(GO_STATE_READY); - drill->SetGoState(GO_STATE_ACTIVE); - drill->SetGoAnimProgress(0); - } - } - events.Repeat(45s); - events.RescheduleEvent(EVENT_SUMMON_ADDS, 4s); - } - break; - case EVENT_SUMMON_ADDS: - for( int i = 0; i < 4; ++i ) - { - if (!cords[i][0]) - break; - - uint8 opt; - uint8 r = urand(1, 100); - if (r <= 30) opt = 1; - else if (r <= 65) opt = 2; - else opt = 3; - - for( int j = 0; j < 4; ++j ) - { - float x = cords[i][0] + 4.0f * cos(j * M_PI / 2); - float y = cords[i][1] + 4.0f * std::sin(j * M_PI / 2); - - uint32 npc_entry = 0; - switch (opt) - { - case 1: - if (j == 1) npc_entry = NPC_DARK_RUNE_SENTINEL; - break; - case 2: - switch (j) - { - case 1: - npc_entry = NPC_DARK_RUNE_WATCHER; - break; - case 2: - npc_entry = NPC_DARK_RUNE_GUARDIAN; - break; - } - break; - default: // case 3: - switch (j) - { - case 1: - npc_entry = NPC_DARK_RUNE_WATCHER; - break; - case 2: - npc_entry = NPC_DARK_RUNE_GUARDIAN; - break; - case 3: - npc_entry = NPC_DARK_RUNE_GUARDIAN; - break; - } - break; - } - - if (npc_entry) - if (Creature* c = me->SummonCreature(npc_entry, x, y, 391.1f, j * M_PI / 2, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000)) - DoZoneInCombat(c); - } - } - break; - case EVENT_WARN_DEEP_BREATH: - Talk(EMOTE_BREATH); - me->RemoveAura(62794); - events.ScheduleEvent(EVENT_PHASE2_FLAME_BREATH, 2500ms); - break; - case EVENT_PHASE2_FLAME_BREATH: - me->CastSpell(me, SPELL_FLAMEBREATH, true); - events.ScheduleEvent(EVENT_FLY_UP, 2s); - break; - case EVENT_FLY_UP: - { - me->SetInCombatWithZone(); // just in case - std::list hfsList; - me->GetCreaturesWithEntryInRange(hfsList, 300.0f, NPC_HARPOON_FIRE_STATE); - for (Creature* hfs : hfsList) - { - me->SummonCreature(34188, hfs->GetPositionX(), hfs->GetPositionY(), hfs->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 22000); - hfs->AI()->SetData(1, 0); - } - - me->RemoveAura(SPELL_CHAIN_1); - me->RemoveAura(SPELL_CHAIN_3); - if (RAID_MODE(0, 1)) - { - me->RemoveAura(SPELL_CHAIN_2); - me->RemoveAura(SPELL_CHAIN_4); - } - me->CastSpell(me, SPELL_WINGBUFFET, true); - - if ((me->GetHealth() * 100) / me->GetMaxHealth() < 50 ) // start phase 3 - { - Talk(EMOTE_PERMA_GROUND); - me->SetControlled(false, UNIT_STATE_ROOT); - me->DisableRotate(false); - DoResetThreatList(); - Unit* target = SelectTarget(SelectTargetMethod::MaxDistance, 0, 0.0, true); - if (!target) - target = me->SelectNearestPlayer(200.0f); - if (target) - { - AttackStart(target); - me->GetMotionMaster()->MoveChase(target); - } - bGroundPhase = true; - events.CancelEvent(EVENT_SPELL_FIREBALL); - events.CancelEvent(EVENT_SPELL_DEVOURING_FLAME); - events.CancelEvent(EVENT_SUMMON_MOLE_MACHINES); - - events.ScheduleEvent(EVENT_SPELL_FLAME_BREATH, 20s); - events.ScheduleEvent(EVENT_SPELL_DEVOURING_FLAME_GROUND, 5s); - events.ScheduleEvent(EVENT_SPELL_FUSE_ARMOR, 10s); - events.ScheduleEvent(EVENT_SPELL_FLAME_BUFFET, 3s); - + events.Repeat(48s); break; } - else + case EVENT_SUMMON_MINIONS_DELAYED: + SummonMinions(); + break; + case EVENT_FLAME_BREATH: + me->RemoveAura(SPELL_STUN_SELF); + Talk(EMOTE_BREATH); + if (Unit* victim = me->GetVictim()) + DoCast(victim, SPELL_FLAME_BREATH); + events.ScheduleEvent(EVENT_WING_BUFFET, 2s, 0, PHASE_GROUND); + break; + case EVENT_FLAME_BREATH_GROUNDED: + Talk(EMOTE_BREATH); + if (Unit* victim = me->GetVictim()) + DoCast(victim, SPELL_FLAME_BREATH); + events.Repeat(21s); + break; + case EVENT_WING_BUFFET: + DoCastSelf(SPELL_WING_BUFFET); + { + EntryCheckPredicate trapperPred(NPC_EXPEDITION_TRAPPER); + summons.DoAction(ACTION_STOP_CONTROLLERS, trapperPred); + EntryCheckPredicate commanderPred(NPC_EXPEDITION_COMMANDER); + summons.DoAction(ACTION_STOP_CONTROLLERS, commanderPred); + } + events.ScheduleEvent(EVENT_FIREBOLT, 2s, 0, PHASE_GROUND); + events.ScheduleEvent(EVENT_RESUME_AIR, 4s, 0, PHASE_GROUND); + break; + case EVENT_RESUME_AIR: { - ++flyTimes; - me->SetControlled(false, UNIT_STATE_ROOT); - me->DisableRotate(false); - me->SendMeleeAttackStop(me->GetVictim()); - me->GetMotionMaster()->MoveIdle(); - me->StopMoving(); me->SetDisableGravity(true); - me->GetMotionMaster()->MoveTakeoff(1, CORDS_AIR, 25.0f); - events.ScheduleEvent(EVENT_RESUME_FIXING, 22s); + events.SetPhase(PHASE_AIR); + me->SetReactState(REACT_PASSIVE); + me->GetMotionMaster()->MovePoint(POINT_RAZORSCALE_FLIGHT_2, RazorFlightPos2, FORCED_MOVEMENT_NONE, 0.0f, false, false, AnimTier::Fly); + EntryCheckPredicate pred(NPC_EXPEDITION_ENGINEER); + summons.DoAction(ACTION_START_FIGHT, pred); + break; } + case EVENT_FIREBOLT: + DoCastSelf(SPELL_FIREBOLT); + break; + case EVENT_FUSE_ARMOR: + if (Unit* victim = me->GetVictim()) + if (!victim->HasAura(SPELL_FUSED_ARMOR)) + DoCast(victim, SPELL_FUSE_ARMOR); + events.Repeat(12s); + break; + case EVENT_RESUME_CHASE: + me->SetCombatMovement(true); + if (Unit* victim = me->GetVictim()) + me->GetMotionMaster()->MoveChase(victim); + break; + default: + break; + } - break; - } - case EVENT_RESUME_FIXING: - for (uint8 i = 0; i < 3; ++i) - if (Creature* c = ObjectAccessor::GetCreature(*me, ExpeditionEngineerGUIDs[i])) - { - if (!i) - c->AI()->Talk(SAY_EE_REBUILD_TURRETS); - c->AI()->SetData(1, 0); // start repairing - } - break; - case EVENT_SPELL_FLAME_BREATH: - me->CastSpell(me->GetVictim(), SPELL_FLAMEBREATH, false); - events.Repeat(20s); - break; - case EVENT_SPELL_DEVOURING_FLAME_GROUND: - me->CastSpell(me->GetVictim(), SPELL_DEVOURINGFLAME, false); - events.Repeat(13s); - break; - case EVENT_SPELL_FUSE_ARMOR: - if (Unit* victim = me->GetVictim()) - if (me->IsWithinMeleeRange(victim)) - { - me->CastSpell(victim, SPELL_FUSEARMOR, false); - if (Aura* aur = victim->GetAura(SPELL_FUSEARMOR)) - if (aur->GetStackAmount() == 5) - victim->CastSpell(victim, SPELL_FUSED_ARMOR, true); - events.Repeat(10s); - break; - } - events.Repeat(2s); - break; - case EVENT_SPELL_FLAME_BUFFET: - me->CastSpell(me->GetVictim(), SPELL_FLAMEBUFFET, false); - events.Repeat(7s); - break; + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; } - if (bGroundPhase) + if (events.IsInPhase(PHASE_PERMA_GROUND)) DoMeleeAttackIfReady(); } - void MoveInLineOfSight(Unit* /*who*/) override {} +private: + uint8 _engineersAlive{}; + uint8 _defenderCnt{}; + uint8 _trapperCnt{}; + uint8 _harpoonHits{}; + uint32 _flyCount{}; + bool _permaGround{}; +}; - void JustReachedHome() override +struct npc_expedition_commander : public ScriptedAI +{ + explicit npc_expedition_commander(Creature* creature) : + ScriptedAI(creature), + _instance(creature->GetInstanceScript()), + _is25(Is25ManRaid()), + _building(false), + _destroyCd(false), + _stopCtrl(false), + _started(false) + { } + + void Reset() override { - _JustReachedHome(); - startPath = true; + _events.Reset(); + _started = false; + me->SetNpcFlag(UNIT_NPC_FLAG_GOSSIP); + BuildBrokenHarpoons(); + } + + void BuildBrokenHarpoons() + { + uint8 n = _is25 ? 4 : 2; + for (uint8 i = 0; i < n; ++i) + me->SummonGameObject(GO_RAZOR_BROKEN_HARPOON, BrokenHarpoonPos[i].GetPositionX(), BrokenHarpoonPos[i].GetPositionY(), BrokenHarpoonPos[i].GetPositionZ(), + BrokenHarpoonPos[i].GetOrientation(), 0.0f, 0.0f, -0.8987932f, 0.4383728f, 0); + } + + void DoAction(int32 action) override + { + if (_building && action != ACTION_ENGINEER_DEAD) + return; + + switch (action) + { + case ACTION_START_FIGHT: + _started = true; + break; + case ACTION_GROUND_PHASE: + Talk(1); + break; + case ACTION_ENGINEER_DEAD: + Talk(2); + _events.Reset(); + _building = false; + break; + case ACTION_BUILD_HARPOON_1: + _building = true; + BuildHarpoon(0); + _building = false; + break; + case ACTION_BUILD_HARPOON_2: + _building = true; + BuildHarpoon(1); + _building = false; + break; + case ACTION_BUILD_HARPOON_3: + _building = true; + BuildHarpoon(2); + _building = false; + break; + case ACTION_BUILD_HARPOON_4: + _building = true; + BuildHarpoon(3); + _building = false; + break; + case ACTION_DESTROY_HARPOONS: + if (_destroyCd) + return; + _destroyCd = true; + DestroyHarpoons(); + break; + case ACTION_STOP_CONTROLLERS: + if (_stopCtrl) + return; + _stopCtrl = true; + StopControllers(); + break; + default: + break; + } + } + + void DestroyHarpoons() + { + for (ObjectGuid guid : _harpoonGUIDs) + if (GameObject* harpoon = ObjectAccessor::GetGameObject(*me, guid)) + harpoon->RemoveFromWorld(); + + _harpoonGUIDs.clear(); + BuildBrokenHarpoons(); + _events.ScheduleEvent(EVENT_DESTROY_HARPOONS, 10s); + } + + void StopControllers() + { + std::list creatureList; + me->GetCreatureListWithEntryInGrid(creatureList, NPC_RAZORSCALE_CONTROLLER, 100.0f); + for (Creature* controller : creatureList) + controller->InterruptNonMeleeSpells(false); + _stopCtrl = false; + } + + void BuildHarpoon(uint8 index) + { + if (GameObject* harpoon = me->SummonGameObject(HarpoonEntry(index), HarpoonPositions[index].GetPositionX(), HarpoonPositions[index].GetPositionY(), + HarpoonPositions[index].GetPositionZ(), HarpoonPositions[index].GetOrientation(), 0.0f, 0.0f, -0.573576f, 0.8191524f, 0)) + _harpoonGUIDs.push_back(harpoon->GetGUID()); + } + + uint32 HarpoonEntry(uint8 index) const + { + if (_is25) + { + switch (index) + { + case 0: + return GO_RAZOR_HARPOON_3; + case 1: + return GO_RAZOR_HARPOON_1; + case 2: + return GO_RAZOR_HARPOON_2; + case 3: + return GO_RAZOR_HARPOON_4; + default: + break; + } + } + switch (index) + { + case 0: + return GO_RAZOR_HARPOON_1; + case 1: + return GO_RAZOR_HARPOON_2; + default: + break; + } + return 0; + } + + void UpdateAI(uint32 diff) override + { + if (!_started) + return; + _events.Update(diff); + while (uint32 eventId = _events.ExecuteEvent()) + { + if (eventId == EVENT_DESTROY_HARPOONS) + _destroyCd = false; + } + } + + void sGossipSelect(Player* player, uint32 /*sender*/, uint32 /*action*/) override + { + CloseGossipMenuFor(player); + + InstanceScript* instance = me->GetInstanceScript(); + if (!instance) + return; + + Creature* razorscale = instance->GetCreature(BOSS_RAZORSCALE); + if (!razorscale || razorscale->IsInCombat()) + return; + + Talk(0); + + razorscale->SetImmuneToPC(false); + razorscale->AI()->DoAction(ACTION_START_FIGHT); + me->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP); + } + +private: + InstanceScript* _instance; + GuidVector _harpoonGUIDs; + EventMap _events; + bool _is25, _building, _destroyCd, _stopCtrl, _started; +}; + +struct npc_expedition_defender : public ScriptedAI +{ + explicit npc_expedition_defender(Creature* creature) : ScriptedAI(creature), _idx(0) + { + me->SetRegeneratingHealth(false); + } + + void Reset() override + { + DoCastSelf(SPELL_THREAT); + } + + bool CanAIAttack(Unit const* target) const override + { + return target && target->GetEntry() != NPC_RAZORSCALE && target->GetEntry() != NPC_RAZORSCALE_SPAWNER; + } + + void SetData(uint32 /*type*/, uint32 value) override + { + _idx = value; + } + + void DoAction(int32 action) override + { + if (action == ACTION_START_FIGHT) + me->GetMotionMaster()->MovePoint(POINT_DEFENDER_ATTACK, DefenderPositions[_idx]); + } + + void MovementInform(uint32 type, uint32 pointId) override + { + if (type == POINT_MOTION_TYPE && pointId == POINT_DEFENDER_ATTACK) + { + me->SetHomePosition(DefenderPositions[_idx]); + me->RemoveUnitFlag(UNIT_FLAG_IMMUNE_TO_NPC); + } + } + +private: + uint8 _idx; +}; + +struct npc_expedition_trapper : public ScriptedAI +{ + explicit npc_expedition_trapper(Creature* creature) : ScriptedAI(creature), _idx(0) + { + me->SetCombatMovement(false); + me->SetReactState(REACT_PASSIVE); + } + + void SetData(uint32 /*type*/, uint32 value) override + { + _idx = value; + } + + void DoAction(int32 action) override + { + if (!me->IsAlive()) + return; + + switch (action) + { + case ACTION_GROUND_PHASE: + me->GetMotionMaster()->MovePoint(1, TrapperPositions[_idx]); + break; + case ACTION_START_FIGHT: + me->RemoveUnitFlag(UNIT_FLAG_IMMUNE_TO_NPC); + break; + case ACTION_STOP_CONTROLLERS: + me->InterruptNonMeleeSpells(false); + scheduler.Schedule(2s, [this](TaskContext const&) { me->GetMotionMaster()->MoveTargetedHome(); }); + break; + default: + break; + } + } + + void MovementInform(uint32 type, uint32 pointId) override + { + if (type == POINT_MOTION_TYPE && pointId == 1) + DoCastSelf(SPELL_SHACKLE); + } + + void UpdateAI(uint32 diff) override + { + scheduler.Update(diff); + } + +private: + uint8 _idx; +}; + +struct npc_expedition_engineer : public NullCreatureAI +{ + explicit npc_expedition_engineer(Creature* creature) : NullCreatureAI(creature), _instance(creature->GetInstanceScript()), _state(0), _timer(0), _harpoonGUID() + { } + + void Reset() override + { + _state = 0; + _timer = 0; + _harpoonGUID.Clear(); + me->SetReactState(REACT_PASSIVE); + } + + void DoAction(int32 action) override + { + if (!me->IsAlive()) + return; + if (action == ACTION_START_FIGHT) + { + if (IsEast()) + Talk(0); + _state = 1; + _timer = 0; + _harpoonGUID.Clear(); + me->RemoveUnitFlag(UNIT_FLAG_IMMUNE_TO_NPC); + } + } + + [[nodiscard]] bool IsEast() const + { + return me->GetHomePosition().GetPositionX() > 594.0f; + } + + void UpdateAI(uint32 diff) override + { + if (_state == 0) + return; + + if (_timer <= diff) + { + _timer = 3000; + if (_harpoonGUID) + { + if (Creature* fireState = ObjectAccessor::GetCreature(*me, _harpoonGUID)) + { + if (me->GetExactDist2dSq(fireState) <= 25.0f) + { + if (me->GetUInt32Value(UNIT_NPC_EMOTESTATE) != EMOTE_STATE_WORK) + me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_WORK); + + if (std::fabs(me->GetOrientation() - me->GetAngle(fireState)) > M_PI / 4) + me->SetFacingToObject(fireState); + + fireState->AI()->DoAction(ACTION_FIRE_STATE_REPAIR); + if (fireState->AI()->GetData(FIRE_STATE_REPAIR)) + _harpoonGUID.Clear(); + } + } + } + if (!_harpoonGUID) + { + Creature* razorscale = _instance->GetCreature(BOSS_RAZORSCALE); + if (!razorscale || !razorscale->IsInCombat()) + { + _state = 0; + me->GetMotionMaster()->MoveTargetedHome(); + return; + } + std::list fireStates; + me->GetCreaturesWithEntryInRange(fireStates, 300.0f, NPC_HARPOON_FIRE_STATE); + fireStates.sort([](Creature const* first, Creature const* second) { return first->GetPositionX() < second->GetPositionX(); }); + for (Creature* fireState : fireStates) + { + if (!fireState->AI()->GetData(FIRE_STATE_REPAIR)) + { + float ang = rand_norm() * M_PI; + me->GetMotionMaster()->MovePoint(0, fireState->GetPositionX() + 3.0f * cos(ang), fireState->GetPositionY() + 3.0f * std::sin(ang), fireState->GetPositionZ()); + _harpoonGUID = fireState->GetGUID(); + return; + } + } + _state = 0; + me->GetMotionMaster()->MoveTargetedHome(); + } + } + else + _timer -= diff; + if (_state == 0 && me->GetUInt32Value(UNIT_NPC_EMOTESTATE) == EMOTE_STATE_WORK) + me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_STAND); + } + +private: + InstanceScript* _instance; + uint8 _state; + uint16 _timer; + ObjectGuid _harpoonGUID; +}; + +struct npc_razorscale_spawner : public ScriptedAI +{ + explicit npc_razorscale_spawner(Creature* creature) : ScriptedAI(creature) + { } + + void Reset() override + { + me->setActive(true); + me->SetReactState(REACT_PASSIVE); + scheduler.Schedule(1s, [this](TaskContext) { DoCastSelf(SPELL_SUMMON_MOLE_MACHINE); }) + .Schedule(6s, [this](TaskContext) + { + DoCastSelf(DwarfSummonSpells[urand(0, 2)]); + // Vrykul: RNG-based, independent chance per spawner + if (roll_chance_i(30)) + DoCastSelf(SPELL_TRIGGER_SUMMON_IRON_VRYKUL); + }); + } + + void UpdateAI(uint32 diff) override + { + scheduler.Update(diff); + } +}; + +struct npc_razorscale_harpoon_fire_state : public NullCreatureAI +{ + explicit npc_razorscale_harpoon_fire_state(Creature* creature) : NullCreatureAI(creature), _repairProgress(0) + { } + + void Reset() override + { + _repairProgress = 0; + } + + void SpellHit(Unit* /*caster*/, SpellInfo const* spellInfo) override + { + if (spellInfo->Id == SPELL_FIREBOLT) + { + DoCastSelf(SPELL_HARPOON_FIRE_STATE); + _repairProgress = 0; + if (Creature* commander = me->FindNearestCreature(NPC_EXPEDITION_COMMANDER, 200.0f)) + commander->AI()->DoAction(ACTION_DESTROY_HARPOONS); + } + } + + void DoAction(int32 action) override + { + if (action == ACTION_FIRE_STATE_RESET) + { + _repairProgress = 0; + return; + } + if (action == ACTION_FIRE_STATE_REPAIR && _repairProgress < FIRE_STATE_MAX_PROGRESS) + { + if (++_repairProgress >= FIRE_STATE_MAX_PROGRESS) + { + if (GameObject* brokenHarpoon = me->FindNearestGameObject(GO_RAZOR_BROKEN_HARPOON, 5.0f)) + { + int32 buildAction = 0; + for (uint8 i = 0; i < 4; ++i) + if (brokenHarpoon->GetExactDist2dSq(BrokenHarpoonPos[i].GetPositionX(), BrokenHarpoonPos[i].GetPositionY()) < 1.0f) + { + buildAction = ACTION_BUILD_HARPOON_1 + i; + break; + } + + brokenHarpoon->RemoveFromWorld(); + + if (Creature* commander = me->FindNearestCreature(NPC_EXPEDITION_COMMANDER, 200.0f)) + if (buildAction) + commander->AI()->DoAction(buildAction); + } + } + } + } + + [[nodiscard]] uint32 GetData(uint32 id) const override + { + return (id == FIRE_STATE_REPAIR && _repairProgress >= FIRE_STATE_MAX_PROGRESS) ? 1 : 0; + } + +private: + uint8 _repairProgress; +}; + +struct npc_razorscale_devouring_flame : public NullCreatureAI +{ + explicit npc_razorscale_devouring_flame(Creature* creature) : NullCreatureAI(creature) + { } + + void Reset() override + { + me->SetReactState(REACT_PASSIVE); + DoCastSelf(SPELL_DEVOURING_FLAME_GROUND, true); + } + + void EnterEvadeMode(EvadeReason /*why*/) override + { } +}; + +struct npc_razorscale_dark_rune_watcher : public ScriptedAI +{ + explicit npc_razorscale_dark_rune_watcher(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) + { } + + void Reset() override + { + _events.Reset(); + me->SetReactState(REACT_PASSIVE); + _events.ScheduleEvent(EVENT_START_COMBAT, 2s); + if (Creature* razorscale = _instance->GetCreature(BOSS_RAZORSCALE)) + razorscale->AI()->JustSummoned(me); + } + + bool CanAIAttack(Unit const* target) const override + { + return target && target->GetEntry() != NPC_RAZORSCALE && target->GetEntry() != NPC_RAZORSCALE_SPAWNER; + } + + void JustEngagedWith(Unit* /*who*/) override + { + _events.ScheduleEvent(EVENT_LIGHTNING_BOLT, 5s); + _events.ScheduleEvent(EVENT_CHAIN_LIGHTNING, 34s); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + { + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 80.0f, true)) + AttackStart(target); + + return; + } + _events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_START_COMBAT: + me->SetReactState(REACT_AGGRESSIVE); + DoZoneInCombat(); + break; + case EVENT_LIGHTNING_BOLT: + DoCastVictim(SPELL_LIGHTNING_BOLT); + _events.Repeat(3s); + break; + case EVENT_CHAIN_LIGHTNING: + DoCastVictim(SPELL_CHAIN_LIGHTNING); + _events.Repeat(9s, 15s); + break; + default: + break; + } + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + } + DoMeleeAttackIfReady(); + } + +private: + InstanceScript* _instance; + EventMap _events; +}; + +struct npc_razorscale_dark_rune_guardian : public ScriptedAI +{ + explicit npc_razorscale_dark_rune_guardian(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()), _killed(false) + { } + + void Reset() override + { + _events.Reset(); + me->SetReactState(REACT_PASSIVE); + _events.ScheduleEvent(EVENT_START_COMBAT, 2s); + if (Creature* razorscale = _instance->GetCreature(BOSS_RAZORSCALE)) + razorscale->AI()->JustSummoned(me); + } + + bool CanAIAttack(Unit const* target) const override + { + return target && target->GetEntry() != NPC_RAZORSCALE && target->GetEntry() != NPC_RAZORSCALE_SPAWNER; + } + + void JustEngagedWith(Unit* /*who*/) override + { + _events.ScheduleEvent(EVENT_STORMSTRIKE, 23s); } uint32 GetData(uint32 id) const override { - if (id == 1) - return (flyTimes <= 1 ? 1 : 0); - return 0; - } - - void KilledUnit(Unit* victim) override - { - if (victim && victim->GetEntry() == NPC_DARK_RUNE_GUARDIAN) - if (instance) - instance->DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE, NPC_DARK_RUNE_GUARDIAN, 1, me); - } - - void EnterEvadeMode(EvadeReason why) override - { - me->SetDisableGravity(true); - me->SetControlled(false, UNIT_STATE_ROOT); - me->DisableRotate(false); - BossAI::EnterEvadeMode(why); - } -}; - -class npc_ulduar_expedition_commander : public CreatureScript -{ -public: - npc_ulduar_expedition_commander() : CreatureScript("npc_ulduar_expedition_commander") { } - - bool OnGossipHello(Player* player, Creature* creature) override - { - if (!player || !creature) - return true; - - InstanceScript* instance = creature->GetInstanceScript(); - if (!instance) - return true; - - if (instance->GetBossState(BOSS_RAZORSCALE) == DONE) - return true; - - Creature* razorscale = instance->GetCreature(BOSS_RAZORSCALE); - if (!razorscale || razorscale->IsInCombat()) - return true; - - AddGossipItemFor(player, GOSSIP_MENU_START_ENCOUNTER, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - SendGossipMenuFor(player, NPC_TEXT_COMMANDER, creature); - return true; - } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) override - { - if (!player || !creature) - return true; - - if (uiAction == GOSSIP_ACTION_INFO_DEF + 1) - { - InstanceScript* instance = creature->GetInstanceScript(); - if (!instance || instance->GetBossState(BOSS_RAZORSCALE) == DONE) - return true; - - Creature* razorscale = instance->GetCreature(BOSS_RAZORSCALE); - if (razorscale && !razorscale->IsInCombat()) - { - // Do not show gossip icon if encounter is in progress - creature->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP); - - // reset npcs NPC_HARPOON_FIRE_STATE - std::list hfsList; - razorscale->GetCreaturesWithEntryInRange(hfsList, 300.0f, NPC_HARPOON_FIRE_STATE); - for (Creature* hfs : hfsList) - hfs->AI()->SetData(1, 0); - - if (razorscale->AI()) - { - razorscale->SetImmuneToPC(false); - razorscale->AI()->AttackStart(player); - razorscale->GetMotionMaster()->MoveIdle(); - razorscale->GetMotionMaster()->MovePoint(POINT_RAZORSCALE_INIT, CORDS_AIR.GetPositionX(), CORDS_AIR.GetPositionY(), CORDS_AIR.GetPositionZ(), FORCED_MOVEMENT_NONE, 0.f, 0.f, false, false, MOTION_SLOT_ACTIVE, AnimTier::Fly); - } - } - } - - player->PlayerTalkClass->SendCloseGossip(); - return true; - } - - CreatureAI* GetAI(Creature* creature) const override - { - return GetUlduarAI(creature); - } - - struct npc_ulduar_expedition_commanderAI : public NullCreatureAI - { - npc_ulduar_expedition_commanderAI(Creature* creature) : NullCreatureAI(creature) - { - _instance = creature->GetInstanceScript(); - _introSpoken = _instance->GetBossState(BOSS_RAZORSCALE) == DONE; - me->SetReactState(REACT_AGGRESSIVE); - } - - void MoveInLineOfSight(Unit* who) override - { - if (_introSpoken) - return; - - if (!who->IsPlayer() || me->GetExactDist2d(who) > 15.0f) - return; - - _introSpoken = true; - //Talk(SAY_COMMANDER_INTRO); // No source leads to showing any text messages, perhaps only SOUND ID 15647 is played? - } - - private: - InstanceScript* _instance; - bool _introSpoken; - }; -}; - -struct npc_ulduar_harpoonfirestate : public NullCreatureAI -{ - npc_ulduar_harpoonfirestate(Creature* pCreature) : NullCreatureAI(pCreature) - { - pInstance = me->GetInstanceScript(); - } - - InstanceScript* pInstance; - uint8 repairPoints; - - void Reset() override - { - repairPoints = 0; - } - - uint32 GetHarpoonGunIdForThisHFS() - { - static uint32 const harpoonEntries[] = { GO_HARPOON_GUN_1, GO_HARPOON_GUN_2, GO_HARPOON_GUN_3, GO_HARPOON_GUN_4 }; - for (uint32 entry : harpoonEntries) - if (me->FindNearestGameObject(entry, 5.0f)) - return entry; - - // Fallback: determine by X position - if (me->GetPositionX() > 595) - return GO_HARPOON_GUN_4; - else if (me->GetPositionX() > 585) - return GO_HARPOON_GUN_3; - else if (me->GetPositionX() > 575) - return GO_HARPOON_GUN_2; - return GO_HARPOON_GUN_1; + return (id == DATA_IRON_DWARF_ID && _killed) ? 1 : 0; } void SetData(uint32 id, uint32 value) override { - switch (id) - { - case 1: // cleanup at the start of the fight - { - uint32 h_entry = GetHarpoonGunIdForThisHFS(); - if (GameObject* wh = me->FindNearestGameObject(h_entry, 5.0f)) - { - wh->SetRespawnTime(0); - wh->Delete(); - } - if (GameObject* bh = me->FindNearestGameObject(GO_BROKEN_HARPOON, 5.0f)) - if (bh->GetPhaseMask() != 1) - bh->SetPhaseMask(1, true); - } - Reset(); - break; - case 2: // repairing - if (repairPoints < REPAIR_POINTS) - { - if (++repairPoints >= REPAIR_POINTS) - { - if (GameObject* bh = me->FindNearestGameObject(GO_BROKEN_HARPOON, 4.0f)) - bh->SetPhaseMask(2, true); - if (GameObject* wh = me->SummonGameObject(GetHarpoonGunIdForThisHFS(), me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 3 * M_PI / 2, 0.0f, 0.0f, 0.0f, 0.0f, 0)) - { - me->RemoveGameObject(wh, false); - if (Creature* cr = me->SummonCreature(NPC_RAZORSCALE_CONTROLLER, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 5000)) - cr->AI()->Talk(EMOTE_HARPOON); - } - } - } - break; - case 3: // shoot - if (pInstance) - { - Creature* razorscale = pInstance->GetCreature(BOSS_RAZORSCALE); - if (!razorscale) - return; - if (!razorscale->HasAura(value)) - me->CastSpell(razorscale, value, true); - } - break; - } - } - - uint32 GetData(uint32 id) const override - { - switch (id) - { - case 2: - return (repairPoints >= REPAIR_POINTS ? 1 : 0); - } - return 0; - } -}; - -struct npc_ulduar_expedition_engineer : public NullCreatureAI -{ - npc_ulduar_expedition_engineer(Creature* pCreature) : NullCreatureAI(pCreature) - { - pInstance = me->GetInstanceScript(); - } - - InstanceScript* pInstance; - bool working; - uint16 timer; - ObjectGuid fixingGUID; - - void Reset() override - { - working = false; - timer = 0; - fixingGUID.Clear(); - } - - void SetData(uint32 id, uint32 /*value*/) override - { - switch (id) - { - case 1: // start/resume repairing - working = true; - timer = 0; - fixingGUID.Clear(); - break; - case 2: // stop repairing - Reset(); - me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_STAND); - me->GetMotionMaster()->MoveTargetedHome(); - break; - } + if (id == DATA_IRON_DWARF_ID) + _killed = (value != 0); } void UpdateAI(uint32 diff) override { - if (working) + if (!UpdateVictim()) { - if (timer <= diff) - { - timer = 3000; - - if (fixingGUID) - { - if (Creature* c = ObjectAccessor::GetCreature(*me, fixingGUID)) - if (me->GetExactDist2dSq(c) <= 25.0f) - { - if (me->GetUInt32Value(UNIT_NPC_EMOTESTATE) != EMOTE_STATE_WORK ) - me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_WORK); - - if (std::fabs(me->GetOrientation() - me->GetAngle(c)) > M_PI / 4) - me->SetFacingToObject(c); - - c->AI()->SetData(2, 0); - if (c->AI()->GetData(2)) - fixingGUID.Clear(); - } - } - - if (!fixingGUID) - { - Creature* razorscale = pInstance->GetCreature(BOSS_RAZORSCALE); - - if (!razorscale || !razorscale->IsInCombat()) - { - Reset(); - me->GetMotionMaster()->MoveTargetedHome(); - return; - } - - std::list hfsList; - me->GetCreaturesWithEntryInRange(hfsList, 300.0f, NPC_HARPOON_FIRE_STATE); - // Rebuild the turrets left-to-right (1 -> 4) instead of in grid/spawn order - hfsList.sort([](Creature const* a, Creature const* b) { return a->GetPositionX() < b->GetPositionX(); }); - for (Creature* fs : hfsList) - if (!fs->AI()->GetData(2)) - { - float a = rand_norm() * M_PI; - me->GetMotionMaster()->MovePoint(0, fs->GetPositionX() + 3.0f * cos(a), fs->GetPositionY() + 3.0f * std::sin(a), fs->GetPositionZ()); - fixingGUID = fs->GetGUID(); - return; - } - - Reset(); // all harpoons repaired - me->GetMotionMaster()->MoveTargetedHome(); - } - } - else - timer -= diff; + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 80.0f, true)) + AttackStart(target); + return; } - else if (me->GetUInt32Value(UNIT_NPC_EMOTESTATE) == EMOTE_STATE_WORK) - me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_STAND); + _events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = _events.ExecuteEvent()) + { + if (eventId == EVENT_START_COMBAT) + { + me->SetReactState(REACT_AGGRESSIVE); + DoZoneInCombat(); + } + else if (eventId == EVENT_STORMSTRIKE) + { + DoCastVictim(SPELL_STORMSTRIKE); + _events.Repeat(13s, 25s); + } + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + } + DoMeleeAttackIfReady(); } + +private: + InstanceScript* _instance; + EventMap _events; + bool _killed; }; -class go_ulduar_working_harpoon : public GameObjectScript +struct npc_razorscale_dark_rune_sentinel : public ScriptedAI +{ + explicit npc_razorscale_dark_rune_sentinel(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) + { } + void Reset() override + { + _events.Reset(); + me->SetReactState(REACT_PASSIVE); + _events.ScheduleEvent(EVENT_START_COMBAT, 2s); + if (Creature* razorscale = _instance->GetCreature(BOSS_RAZORSCALE)) + razorscale->AI()->JustSummoned(me); + } + + bool CanAIAttack(Unit const* target) const override + { + return target && target->GetEntry() != NPC_RAZORSCALE && target->GetEntry() != NPC_RAZORSCALE_SPAWNER; + } + + void JustEngagedWith(Unit* /*who*/) override + { + _events.ScheduleEvent(EVENT_HEROIC_STRIKE, 9s); + _events.ScheduleEvent(EVENT_BATTLE_SHOUT, 15s); + _events.ScheduleEvent(EVENT_WHIRLWIND, 17s); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + { + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 80.0f, true)) + AttackStart(target); + return; + } + _events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_START_COMBAT: + me->SetReactState(REACT_AGGRESSIVE); + DoZoneInCombat(); + break; + case EVENT_HEROIC_STRIKE: + DoCastVictim(SPELL_HEROIC_STRIKE); + _events.Repeat(5s, 9s); + break; + case EVENT_BATTLE_SHOUT: + DoCastSelf(SPELL_BATTLE_SHOUT); + _events.Repeat(25s); + break; + case EVENT_WHIRLWIND: + DoCastSelf(SPELL_WHIRLWIND); + _events.Repeat(10s, 13s); + break; + default: + break; + } + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + } + DoMeleeAttackIfReady(); + } + +private: + InstanceScript* _instance; + EventMap _events; +}; + +class go_razorscale_harpoon : public GameObjectScript { public: - go_ulduar_working_harpoon() : GameObjectScript("go_ulduar_working_harpoon") { } + explicit go_razorscale_harpoon() : GameObjectScript("go_razorscale_harpoon") + { } - bool OnGossipHello(Player* user, GameObject* go) override + bool OnGossipHello(Player* /*player*/, GameObject* go) override { - if (!user || !go) - return true; - - InstanceScript* pInstance = go->GetInstanceScript(); - if (!pInstance) - return true; - - Creature* rs = pInstance->GetCreature(BOSS_RAZORSCALE); - - if (!rs || !rs->IsInCombat()) + go->SetGameObjectFlag(GO_FLAG_NOT_SELECTABLE); + if (Creature* controller = go->FindNearestCreature(NPC_RAZORSCALE_CONTROLLER, 10.0f)) { - go->SetRespawnTime(0); - go->Delete(); - return true; + if (controller->HasUnitState(UNIT_STATE_CASTING)) + return true; + + uint32 spell = 0; + switch (go->GetEntry()) + { + case GO_RAZOR_HARPOON_1: + spell = SPELL_HARPOON_SHOT_1; + break; + case GO_RAZOR_HARPOON_2: + spell = SPELL_HARPOON_SHOT_2; + break; + case GO_RAZOR_HARPOON_3: + spell = SPELL_HARPOON_SHOT_3; + break; + case GO_RAZOR_HARPOON_4: + spell = SPELL_HARPOON_SHOT_4; + break; + } + if (spell) + controller->CastSpell(controller, spell, true); } - - uint32 spell = 0; - switch (go->GetEntry()) - { - case GO_HARPOON_GUN_1: spell = SPELL_CHAIN_1; break; - case GO_HARPOON_GUN_2: spell = SPELL_CHAIN_2; break; - case GO_HARPOON_GUN_3: spell = SPELL_CHAIN_3; break; - case GO_HARPOON_GUN_4: spell = SPELL_CHAIN_4; break; - } - - if (Creature* hfs = go->FindNearestCreature(NPC_HARPOON_FIRE_STATE, 5.0f)) - hfs->AI()->SetData(3, spell); - - go->SetLootState(GO_JUST_DEACTIVATED); return true; } -}; -struct npc_ulduar_dark_rune_guardian : public ScriptedAI -{ - npc_ulduar_dark_rune_guardian(Creature* pCreature) : ScriptedAI(pCreature) { } - - uint32 timer2; - - void Reset() override + struct go_razorscale_harpoonAI : public GameObjectAI { - timer2 = 6000; - } + explicit go_razorscale_harpoonAI(GameObject* go) : GameObjectAI(go) + { } - bool CanAIAttack(Unit const* target) const override - { - return target && target->GetEntry() != NPC_RAZORSCALE; - } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - if (timer2 <= diff) timer2 = 0; - else timer2 -= diff; - if (timer2 == 0 && me->GetVictim() && me->IsWithinMeleeRange(me->GetVictim())) + void Reset() override { - me->CastSpell(me->GetVictim(), SPELL_STORMSTRIKE_DMG, true); - me->CastSpell(me->GetVictim(), SPELL_STORMSTRIKE_DMG, true); // cast the same twice cus second one requires setting offhand damage - me->CastSpell(me->GetVictim(), SPELL_STORMSTRIKE_DEBUFF, true); - timer2 = urand(8000, 10000); - return; + _scheduler.Schedule(1s, [this](TaskContext) + { + if (Creature* controller = me->FindNearestCreature(NPC_RAZORSCALE_CONTROLLER, 10.0f)) + controller->AI()->Talk(0); + + if (GameObject* brokenHarpoon = me->FindNearestGameObject(GO_RAZOR_BROKEN_HARPOON, 5.0f)) + brokenHarpoon->RemoveFromWorld(); + }); } - DoMeleeAttackIfReady(); + void UpdateAI(uint32 diff) override + { + _scheduler.Update(diff); + } + + private: + TaskScheduler _scheduler; + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return GetUlduarAI(go); } }; -struct npc_ulduar_dark_rune_watcher : public ScriptedAI +class go_razorscale_mole_machine : public GameObjectScript { - npc_ulduar_dark_rune_watcher(Creature* pCreature) : ScriptedAI(pCreature) { } +public: + go_razorscale_mole_machine() : GameObjectScript("go_razorscale_mole_machine") + { } - uint32 timer1; - uint32 timer2; - - void Reset() override + struct go_razorscale_mole_machineAI : public GameObjectAI { - timer1 = 6000; - timer2 = 2000; - } + explicit go_razorscale_mole_machineAI(GameObject* go) : GameObjectAI(go) + { } - bool CanAIAttack(Unit const* target) const override - { - return target && target->GetEntry() != NPC_RAZORSCALE; - } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - if (timer1 <= diff) + void Reset() override { - me->CastSpell(me->GetVictim(), SPELL_CHAINLIGHTNING, false); - timer1 = urand(10000, 12000); - return; + me->SetGameObjectFlag(GO_FLAG_NOT_SELECTABLE); + _scheduler.Schedule(1s, [this](TaskContext) { me->UseDoorOrButton(); }).Schedule(10s, [this](TaskContext) { me->Delete(); }); } - else - timer1 -= diff; - if (timer2 <= diff) + void UpdateAI(uint32 diff) override { - me->CastSpell(me->GetVictim(), SPELL_LIGHTINGBOLT, false); - timer2 = 4000; - return; + _scheduler.Update(diff); } - else - timer2 -= diff; - DoMeleeAttackIfReady(); + private: + TaskScheduler _scheduler; + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return GetUlduarAI(go); } }; -struct npc_ulduar_dark_rune_sentinel : public ScriptedAI +class spell_razorscale_flame_breath : public SpellScript { - npc_ulduar_dark_rune_sentinel(Creature* pCreature) : ScriptedAI(pCreature) { } + PrepareSpellScript(spell_razorscale_flame_breath); - uint32 timer1; - uint32 timer2; - - void Reset() override + void HandleHit() { - timer1 = urand(1000, 2000); - timer2 = 6000; - } - - bool CanAIAttack(Unit const* target) const override - { - return target && target->GetEntry() != NPC_RAZORSCALE; - } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) + Creature* target = GetHitCreature(); + if (!target || target->GetEntry() != NPC_DARK_RUNE_GUARDIAN || !target->IsAlive()) return; - if (timer1 <= diff) - { - me->CastSpell(me, SPELL_BATTLE_SHOUT, false); - timer1 = urand(15000, 20000); - } - else - timer1 -= diff; + if (GetHitDamage() >= int32(target->GetHealth())) + target->AI()->SetData(DATA_IRON_DWARF_ID, 1); + } - if (timer2 <= diff) timer2 = 0; - else timer2 -= diff; - if (timer2 == 0 && me->GetVictim() && me->IsWithinMeleeRange(me->GetVictim())) - { - me->CastSpell(me, SPELL_WHIRLWIND, false); - timer2 = urand(10000, 12000); - } + void Register() override + { + OnHit += SpellHitFn(spell_razorscale_flame_breath::HandleHit); + } +}; - DoMeleeAttackIfReady(); +class spell_razorscale_summon_iron_dwarves : public SpellScript +{ + PrepareSpellScript(spell_razorscale_summon_iron_dwarves); + + bool Validate(SpellInfo const*) override + { + return ValidateSpellInfo({SPELL_SUMMON_IRON_DWARF_GUARDIAN, SPELL_SUMMON_IRON_DWARF_WATCHER}); + } + + void HandleScript(SpellEffIndex) + { + Unit* caster = GetCaster(); + switch (GetSpellInfo()->Id) + { + case SPELL_TRIGGER_SUMMON_IRON_DWARVES: + caster->CastSpell(caster, SPELL_SUMMON_IRON_DWARF_GUARDIAN, true); + caster->CastSpell(caster, SPELL_SUMMON_IRON_DWARF_GUARDIAN, true); + caster->CastSpell(caster, SPELL_SUMMON_IRON_DWARF_WATCHER, true); + break; + case SPELL_TRIGGER_SUMMON_IRON_DWARVES_2: + case SPELL_TRIGGER_SUMMON_IRON_DWARVES_3: + caster->CastSpell(caster, SPELL_SUMMON_IRON_DWARF_GUARDIAN, true); + caster->CastSpell(caster, SPELL_SUMMON_IRON_DWARF_WATCHER, true); + caster->CastSpell(caster, SPELL_SUMMON_IRON_DWARF_WATCHER, true); + break; + } + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_razorscale_summon_iron_dwarves::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +class spell_razorscale_fuse_armor : public AuraScript +{ + PrepareAuraScript(spell_razorscale_fuse_armor); + + bool Validate(SpellInfo const*) override + { + return ValidateSpellInfo({SPELL_FUSED_ARMOR}); + } + + void HandleFused(AuraEffect const* /*aurEff*/) + { + if (GetStackAmount() != GetSpellInfo()->StackAmount) + return; + GetTarget()->CastSpell(GetTarget(), SPELL_FUSED_ARMOR, true); + Remove(); + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_razorscale_fuse_armor::HandleFused, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + } +}; + +class spell_razorscale_firebolt : public SpellScript +{ + PrepareSpellScript(spell_razorscale_firebolt); + + void FilterTargets(std::list& targets) + { + targets.remove_if([](WorldObject* obj) { return obj->GetEntry() != NPC_HARPOON_FIRE_STATE; }); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_razorscale_firebolt::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); } }; class achievement_quick_shave : public AchievementCriteriaScript { public: - achievement_quick_shave() : AchievementCriteriaScript("achievement_quick_shave") {} + achievement_quick_shave() : AchievementCriteriaScript("achievement_quick_shave") + { } - bool OnCheck(Player* /*player*/, Unit* target, uint32 /*criteria_id*/) override + bool OnCheck(Player* /*player*/, Unit* target, uint32) override { - return target && target->IsCreature() && target->GetEntry() == NPC_RAZORSCALE && target->ToCreature()->AI()->GetData(1); + return target && target->IsCreature() && target->ToCreature()->AI()->GetData(DATA_QUICK_SHAVE_ID); } }; class achievement_iron_dwarf_medium_rare : public AchievementCriteriaScript { public: - achievement_iron_dwarf_medium_rare() : AchievementCriteriaScript("achievement_iron_dwarf_medium_rare") {} + achievement_iron_dwarf_medium_rare() : AchievementCriteriaScript("achievement_iron_dwarf_medium_rare") + { } - bool OnCheck(Player* /*player*/, Unit* target, uint32 /*criteria_id*/) override + bool OnCheck(Player* /*player*/, Unit* target, uint32) override { - return target && target->GetEntry() == NPC_RAZORSCALE; + return target && target->GetAI() && target->GetAI()->GetData(DATA_IRON_DWARF_ID); } }; void AddSC_boss_razorscale() { RegisterUlduarCreatureAI(boss_razorscale); - new npc_ulduar_expedition_commander(); - RegisterUlduarCreatureAI(npc_ulduar_harpoonfirestate); - RegisterUlduarCreatureAI(npc_ulduar_expedition_engineer); - new go_ulduar_working_harpoon(); - RegisterUlduarCreatureAI(npc_ulduar_dark_rune_guardian); - RegisterUlduarCreatureAI(npc_ulduar_dark_rune_watcher); - RegisterUlduarCreatureAI(npc_ulduar_dark_rune_sentinel); + RegisterUlduarCreatureAI(npc_expedition_commander); + RegisterUlduarCreatureAI(npc_expedition_defender); + RegisterUlduarCreatureAI(npc_expedition_trapper); + RegisterUlduarCreatureAI(npc_expedition_engineer); + RegisterUlduarCreatureAI(npc_razorscale_spawner); + RegisterUlduarCreatureAI(npc_razorscale_harpoon_fire_state); + RegisterUlduarCreatureAI(npc_razorscale_devouring_flame); + RegisterUlduarCreatureAI(npc_razorscale_dark_rune_watcher); + RegisterUlduarCreatureAI(npc_razorscale_dark_rune_guardian); + RegisterUlduarCreatureAI(npc_razorscale_dark_rune_sentinel); + new go_razorscale_harpoon(); + new go_razorscale_mole_machine(); + RegisterSpellScript(spell_razorscale_flame_breath); + RegisterSpellScript(spell_razorscale_summon_iron_dwarves); + RegisterSpellAndAuraScriptPair(spell_razorscale_fuse_armor, spell_razorscale_fuse_armor); + RegisterSpellScript(spell_razorscale_firebolt); new achievement_quick_shave(); new achievement_iron_dwarf_medium_rare(); } diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.h b/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.h index 8d0fca9d8..5dbb434cb 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.h +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.h @@ -114,6 +114,8 @@ enum UlduarData // Achievements DATA_DWARFAGEDDON = 700, + DATA_QUICK_SHAVE = 701, + DATA_IRON_DWARF_MEDIUM_RARE = 702, // Tram DATA_CALL_TRAM = 710, @@ -180,6 +182,16 @@ enum UlduarNPCs // Razorscale NPC_HARPOON_FIRE_STATE = 33282, + NPC_RAZORSCALE_SPAWNER = 33245, + NPC_RAZORSCALE_CONTROLLER = 33233, + NPC_EXPEDITION_COMMANDER = 33210, + NPC_EXPEDITION_ENGINEER = 33287, + NPC_EXPEDITION_DEFENDER = 33816, + NPC_EXPEDITION_TRAPPER = 33259, + NPC_DARK_RUNE_GUARDIAN = 33388, + NPC_DARK_RUNE_WATCHER = 33453, + NPC_DARK_RUNE_SENTINEL = 33846, + NPC_RAZORSCALE_DEVOURING_FLAME = 34188, // Mimiron NPC_MIMIRON_LEVIATHAN_MKII = 33432, @@ -285,6 +297,14 @@ enum UlduarGameObjects GO_SNOW_MOUND = 194907, + // Razorscale + GO_RAZOR_HARPOON_1 = 194519, + GO_RAZOR_HARPOON_2 = 194541, + GO_RAZOR_HARPOON_3 = 194542, + GO_RAZOR_HARPOON_4 = 194543, + GO_RAZOR_BROKEN_HARPOON = 194565, + GO_RAZOR_MOLE_MACHINE = 194316, + // Thorim GO_ARENA_LEVER_GATE = 194560, GO_ARENA_LEVER = 194264, From 2adaf94e13aed23d007a43b3813c13b4399ec56a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 21 Jul 2026 09:20:11 +0000 Subject: [PATCH 059/134] chore(DB): import pending files Referenced commit(s): 3ce6864c6ef3451365d7249d17b4af9094d2a14b --- .../rev_1783105226719520414.sql => db_world/2026_07_21_01.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1783105226719520414.sql => db_world/2026_07_21_01.sql} (99%) diff --git a/data/sql/updates/pending_db_world/rev_1783105226719520414.sql b/data/sql/updates/db_world/2026_07_21_01.sql similarity index 99% rename from data/sql/updates/pending_db_world/rev_1783105226719520414.sql rename to data/sql/updates/db_world/2026_07_21_01.sql index fc7c25010..8e1eee541 100644 --- a/data/sql/updates/pending_db_world/rev_1783105226719520414.sql +++ b/data/sql/updates/db_world/2026_07_21_01.sql @@ -1,3 +1,4 @@ +-- DB update 2026_07_21_00 -> 2026_07_21_01 -- Razorscale encounter rework: spell-based spawning via creature_summon_groups -- Remove static spawns for creatures now managed by creature_summon_groups From a16ef90f282452006a99f25985b54f5568cf507d Mon Sep 17 00:00:00 2001 From: Benjamin Jackson <38561765+heyitsbench@users.noreply.github.com> Date: Tue, 21 Jul 2026 06:40:37 -0400 Subject: [PATCH 060/134] feat(Core): Implement account play time restrictions (CAIS) (#24576) Co-authored-by: ratkosrb <35845488+ratkosrb@users.noreply.github.com> Co-authored-by: sudlud Co-authored-by: Claude Opus 4.8 (1M context) Co-authored-by: DDuarte <530940+DDuarte@users.noreply.github.com> --- .../apps/worldserver/worldserver.conf.dist | 18 ++++ src/server/game/DungeonFinding/LFGMgr.cpp | 4 + src/server/game/Entities/Player/Player.cpp | 15 +--- src/server/game/Entities/Player/Player.h | 4 +- .../game/Entities/Player/PlayerQuest.cpp | 23 +++++ .../game/Entities/Player/PlayerStorage.cpp | 14 +++ src/server/game/Groups/Group.cpp | 9 +- src/server/game/Handlers/AuthHandler.cpp | 13 ++- .../game/Handlers/BattleGroundHandler.cpp | 10 +-- src/server/game/Handlers/GroupHandler.cpp | 6 ++ src/server/game/Handlers/LootHandler.cpp | 89 +++++++++++++++---- .../game/Server/Packets/MiscPackets.cpp | 8 ++ src/server/game/Server/Packets/MiscPackets.h | 11 +++ src/server/game/Server/WorldSession.cpp | 62 +++++++++++++ src/server/game/Server/WorldSession.h | 29 ++++++ src/server/game/Server/WorldSessionMgr.cpp | 59 +++++++++++- src/server/game/Server/WorldSessionMgr.h | 10 +++ src/server/game/World/World.h | 2 +- src/server/game/World/WorldConfig.cpp | 2 + src/server/game/World/WorldConfig.h | 2 + 20 files changed, 344 insertions(+), 46 deletions(-) diff --git a/src/server/apps/worldserver/worldserver.conf.dist b/src/server/apps/worldserver/worldserver.conf.dist index da7a62806..713dbf5fb 100644 --- a/src/server/apps/worldserver/worldserver.conf.dist +++ b/src/server/apps/worldserver/worldserver.conf.dist @@ -3421,6 +3421,24 @@ DungeonAccessRequirements.OptionalStringID = 0 # ################################################################################################### +################################################################################################### +# PLAY TIME LIMIT (CAIS) +# +# CAIS.Enable +# Description: Enable the Chinese realm consecutive play time restrictions. After 3 +# hours of consecutive play, XP and looted money are halved; after 5 +# hours, the character can no longer gain XP, loot, or turn in quests. +# Staying offline for 5 hours resets the accumulated time. The 3h/5h +# thresholds are hardcoded client-side. +# Note: A worldserver restart resets the accumulated time for every account. +# Default: 0 - Disabled +# 1 - Enabled + +CAIS.Enable = 0 + +# +################################################################################################### + ################################################################################################### # DUNGEON AND BATTLEGROUND FINDER # diff --git a/src/server/game/DungeonFinding/LFGMgr.cpp b/src/server/game/DungeonFinding/LFGMgr.cpp index b823c7bcb..0fa79ac64 100644 --- a/src/server/game/DungeonFinding/LFGMgr.cpp +++ b/src/server/game/DungeonFinding/LFGMgr.cpp @@ -2393,6 +2393,10 @@ namespace lfg if (!reward) continue; + // CAIS full restriction: grant no dungeon reward and leave the daily available for later + if (player->HasPlayerFlag(PLAYER_FLAGS_NO_PLAY_TIME)) + continue; + bool done = false; Quest const* quest = sObjectMgr->GetQuestTemplate(reward->firstQuest); if (!quest) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index daa4ba995..635a65f12 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -2402,24 +2402,16 @@ void Player::SendLogXPGain(uint32 GivenXP, Unit* victim, uint32 BonusXP, bool re void Player::GiveXP(uint32 xp, Unit* victim, float group_rate, bool isLFGReward) { if (xp < 1) - { return; - } if (!IsAlive() && !GetBattlegroundId() && !isLFGReward) - { return; - } - if (HasPlayerFlag(PLAYER_FLAGS_NO_XP_GAIN)) - { + if (HasPlayerFlag(PLAYER_FLAGS_NO_XP_GAIN) || HasPlayerFlag(PLAYER_FLAGS_NO_PLAY_TIME)) return; - } if (victim && victim->IsCreature() && !victim->ToCreature()->hasLootRecipient()) - { return; - } uint8 level = GetLevel(); sScriptMgr->OnPlayerBeforeGetLevelForXPGain(this, level); @@ -2444,6 +2436,9 @@ void Player::GiveXP(uint32 xp, Unit* victim, float group_rate, bool isLFGReward) if (level >= maxLevel) return; + if (HasPlayerFlag(PLAYER_FLAGS_PARTIAL_PLAY_TIME)) + xp = std::max(1u, xp / 2); + uint32 bonus_xp = 0; bool recruitAFriend = GetsRecruitAFriendBonus(true); @@ -2456,9 +2451,7 @@ void Player::GiveXP(uint32 xp, Unit* victim, float group_rate, bool isLFGReward) // hooks and multipliers can modify the xp with a zero or negative value // check again before sending invalid xp to the client if (xp < 1) - { return; - } SendLogXPGain(xp, victim, bonus_xp, recruitAFriend, group_rate); diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index c4da190fb..20bf49b19 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -468,8 +468,8 @@ enum PlayerFlags : uint32 PLAYER_FLAGS_IN_PVP = 0x00000200, PLAYER_FLAGS_HIDE_HELM = 0x00000400, PLAYER_FLAGS_HIDE_CLOAK = 0x00000800, - PLAYER_FLAGS_PLAYED_LONG_TIME = 0x00001000, // played long time - PLAYER_FLAGS_PLAYED_TOO_LONG = 0x00002000, // played too long time + PLAYER_FLAGS_PARTIAL_PLAY_TIME = 0x00001000, // played long time + PLAYER_FLAGS_NO_PLAY_TIME = 0x00002000, // played too long time PLAYER_FLAGS_IS_OUT_OF_BOUNDS = 0x00004000, PLAYER_FLAGS_DEVELOPER = 0x00008000, // prefix for something? PLAYER_FLAGS_UNK16 = 0x00010000, // pre-3.0.3 PLAYER_FLAGS_SANCTUARY flag for player entered sanctuary diff --git a/src/server/game/Entities/Player/PlayerQuest.cpp b/src/server/game/Entities/Player/PlayerQuest.cpp index 58476621b..7361ac62d 100644 --- a/src/server/game/Entities/Player/PlayerQuest.cpp +++ b/src/server/game/Entities/Player/PlayerQuest.cpp @@ -474,6 +474,16 @@ bool Player::CanRewardQuest(Quest const* quest, uint32 reward, bool msg) if (!CanRewardQuest(quest, msg)) return false; + // gate the actual turn-in here rather than in the overload above, which LFG also uses + // as a "already did today's random" probe + if (HasPlayerFlag(PLAYER_FLAGS_NO_PLAY_TIME)) + { + if (msg) + GetSession()->SendPlayTimeWarning(PTF_UNHEALTHY_TIME, 0); + + return false; + } + ItemPosCountVec dest; if (quest->GetRewChoiceItemsCount() > 0) { @@ -621,6 +631,9 @@ void Player::CompleteQuest(uint32 quest_id) Quest const* qInfo = sObjectMgr->GetQuestTemplate(quest_id); if (qInfo && qInfo->HasFlag(QUEST_FLAGS_TRACKING)) { + // auto-rewarded, so CAIS cannot gate it here: the status is already COMPLETE above and + // nothing re-triggers the quest, which would destroy the reward rather than defer it. + // RewardQuest still zeroes the money and GiveXP still blocks the XP. RewardQuest(qInfo, 0, this, false); } @@ -766,6 +779,16 @@ void Player::RewardQuest(Quest const* quest, uint32 reward, Object* questGiver, moneyRew += rewOrReqMoney; } + // CAIS reduces quest money, mirroring looted money and XP. Applied here as well as at the + // turn-in gate because LFG and auto-complete quests reach RewardQuest without CanRewardQuest. + if (moneyRew > 0) + { + if (HasPlayerFlag(PLAYER_FLAGS_NO_PLAY_TIME)) + moneyRew = 0; + else if (HasPlayerFlag(PLAYER_FLAGS_PARTIAL_PLAY_TIME)) + moneyRew /= 2; + } + if (moneyRew) { ModifyMoney(moneyRew); diff --git a/src/server/game/Entities/Player/PlayerStorage.cpp b/src/server/game/Entities/Player/PlayerStorage.cpp index 2c4ddf10c..0bc0ad0fe 100644 --- a/src/server/game/Entities/Player/PlayerStorage.cpp +++ b/src/server/game/Entities/Player/PlayerStorage.cpp @@ -5098,6 +5098,20 @@ bool Player::LoadFromDB(ObjectGuid playerGuid, CharacterDatabaseQueryHolder cons SetByteValue(PLAYER_BYTES_3, 0, fields[5].Get()); SetByteValue(PLAYER_BYTES_3, 1, fields[54].Get()); ReplaceAllPlayerFlags((PlayerFlags)fields[16].Get()); + + RemovePlayerFlag(PLAYER_FLAGS_NO_PLAY_TIME); + RemovePlayerFlag(PLAYER_FLAGS_PARTIAL_PLAY_TIME); + + if (GetSession()->IsAffectedByCAIS()) + { + Seconds const accountPlayedTime = GetSession()->GetConsecutivePlayTime(GameTime::GetGameTime()); + + if (accountPlayedTime >= PLAY_TIME_LIMIT_FULL) + SetPlayerFlag(PLAYER_FLAGS_NO_PLAY_TIME); + else if (accountPlayedTime >= PLAY_TIME_LIMIT_PARTIAL) + SetPlayerFlag(PLAYER_FLAGS_PARTIAL_PLAY_TIME); + } + SetInt32Value(PLAYER_FIELD_WATCHED_FACTION_INDEX, fields[53].Get()); SetUInt64Value(PLAYER_FIELD_KNOWN_CURRENCIES, fields[52].Get()); diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp index 8d960a56f..a194f57de 100644 --- a/src/server/game/Groups/Group.cpp +++ b/src/server/game/Groups/Group.cpp @@ -2115,9 +2115,7 @@ GroupJoinBattlegroundResult Group::CanJoinBattlegroundQueue(Battleground const* // check if someone in party is using dungeon system lfg::LfgState lfgState = sLFGMgr->GetState(member->GetGUID()); if (lfgState > lfg::LFG_STATE_NONE && (lfgState != lfg::LFG_STATE_QUEUED || !sWorld->getBoolConfig(CONFIG_ALLOW_JOIN_BG_AND_LFG))) - { return ERR_LFG_CANT_USE_BATTLEGROUND; - } // pussywizard: prevent joining when any member is in bg/arena if (member->InBattleground()) @@ -2129,9 +2127,7 @@ GroupJoinBattlegroundResult Group::CanJoinBattlegroundQueue(Battleground const* // don't let join if someone from the group is already in that bg queue if (member->InBattlegroundQueueForBattlegroundQueueType(bgQueueTypeId)) - { return ERR_BATTLEGROUND_JOIN_FAILED; - } // don't let join if someone from the group is in bg queue random if (member->InBattlegroundQueueForBattlegroundQueueType(bgQueueTypeIdRandom)) @@ -2146,9 +2142,10 @@ GroupJoinBattlegroundResult Group::CanJoinBattlegroundQueue(Battleground const* return ERR_GROUP_JOIN_BATTLEGROUND_FAIL; if (!member->GetBGAccessByLevel(bgTemplate->GetBgTypeID())) - { return ERR_BATTLEGROUND_JOIN_TIMED_OUT; - } + + if (member->HasPlayerFlag(PLAYER_FLAGS_NO_PLAY_TIME)) // Assumed to only apply to full restriction rather than partial + return ERR_GROUP_JOIN_BATTLEGROUND_FAIL; // ERR_ARENA_EXPIRED_CAIS does not seem to be a result, so using this error instead } // for arenas: check party size is proper diff --git a/src/server/game/Handlers/AuthHandler.cpp b/src/server/game/Handlers/AuthHandler.cpp index 99506a786..bf530173e 100644 --- a/src/server/game/Handlers/AuthHandler.cpp +++ b/src/server/game/Handlers/AuthHandler.cpp @@ -15,17 +15,28 @@ * with this program. If not, see . */ +#include "GameTime.h" #include "Opcodes.h" #include "WorldPacket.h" #include "WorldSession.h" void WorldSession::SendAuthResponse(uint8 code, bool shortForm, uint32 queuePos) { + // BillingTimeRested: seconds of "healthy" play left before CAIS halves XP/loot from creatures + // and quests (read by the client's GetBillingTimeRested()); 0 unless the CAIS flag is set. + uint32 billingTimeRested = 0; + if (IsAffectedByCAIS()) + { + Seconds const played = GetConsecutivePlayTime(GameTime::GetGameTime()); + if (played < PLAY_TIME_LIMIT_PARTIAL) + billingTimeRested = uint32((PLAY_TIME_LIMIT_PARTIAL - played).count()); + } + WorldPacket packet(SMSG_AUTH_RESPONSE, 1 + 4 + 1 + 4 + 1 + (shortForm ? 0 : (4 + 1))); packet << uint8(code); packet << uint32(0); // BillingTimeRemaining packet << GetBillingPlanFlags(); - packet << uint32(0); // BillingTimeRested + packet << billingTimeRested; uint8 exp = Expansion(); // 0 - normal, 1 - TBC, 2 - WotLK, must be set in database manually for each account if (exp >= MAX_EXPANSIONS) diff --git a/src/server/game/Handlers/BattleGroundHandler.cpp b/src/server/game/Handlers/BattleGroundHandler.cpp index 07e2863ad..a981349fe 100644 --- a/src/server/game/Handlers/BattleGroundHandler.cpp +++ b/src/server/game/Handlers/BattleGroundHandler.cpp @@ -192,6 +192,8 @@ void WorldSession::HandleBattlemasterJoinOpcode(WorldPacket& recvData) { err = ERR_BATTLEGROUND_NONE; } + else if (_player->HasPlayerFlag(PLAYER_FLAGS_NO_PLAY_TIME)) // Assumed to only apply to full restriction rather than partial + err = ERR_GROUP_JOIN_BATTLEGROUND_FAIL; // ERR_ARENA_EXPIRED_CAIS does not seem to be a result, so using this error instead if (err <= 0) { @@ -791,13 +793,11 @@ void WorldSession::HandleBattlemasterJoinArena(WorldPacket& recvData) { lfg::LfgState lfgState = sLFGMgr->GetState(GetPlayer()->GetGUID()); if (GetPlayer()->InBattleground()) // currently in battleground - { err = ERR_BATTLEGROUND_NOT_IN_BATTLEGROUND; - } else if (lfgState > lfg::LFG_STATE_NONE && (lfgState != lfg::LFG_STATE_QUEUED || !sWorld->getBoolConfig(CONFIG_ALLOW_JOIN_BG_AND_LFG))) // using lfg system - { err = ERR_LFG_CANT_USE_BATTLEGROUND; - } + else if (GetPlayer()->HasPlayerFlag(PLAYER_FLAGS_NO_PLAY_TIME)) // Assumed to only apply to full restriction rather than partial + err = ERR_GROUP_JOIN_BATTLEGROUND_FAIL; // ERR_ARENA_EXPIRED_CAIS does not seem to be a result, so using this error instead if (err <= 0) { @@ -870,9 +870,7 @@ void WorldSession::HandleBattlemasterJoinArena(WorldPacket& recvData) grp->DoForAllMembers([&bgQueue, &err](Player* member) { if (bgQueue.IsPlayerInvitedToRatedArena(member->GetGUID())) - { err = ERR_BATTLEGROUND_JOIN_FAILED; - } }); } diff --git a/src/server/game/Handlers/GroupHandler.cpp b/src/server/game/Handlers/GroupHandler.cpp index ad09e714e..b2f2f9173 100644 --- a/src/server/game/Handlers/GroupHandler.cpp +++ b/src/server/game/Handlers/GroupHandler.cpp @@ -559,6 +559,12 @@ void WorldSession::HandleLootRoll(WorldPacket& recvData) if (!group) return; + if (GetPlayer()->HasPlayerFlag(PLAYER_FLAGS_NO_PLAY_TIME)) + { + SendPlayTimeWarning(PTF_UNHEALTHY_TIME, 0); + rollType = ROLL_PASS; + } + group->CountRollVote(GetPlayer()->GetGUID(), guid, rollType); switch (rollType) diff --git a/src/server/game/Handlers/LootHandler.cpp b/src/server/game/Handlers/LootHandler.cpp index 50636f27c..a18781f0e 100644 --- a/src/server/game/Handlers/LootHandler.cpp +++ b/src/server/game/Handlers/LootHandler.cpp @@ -40,6 +40,14 @@ void WorldSession::HandleAutostoreLootItemOpcode(WorldPacket& recvData) recvData >> lootSlot; + // full CAIS restriction blocks item pickup from every loot source (GO/gather/item/corpse), + // not just the creature-corpse window guarded in HandleLootOpcode + if (player->HasPlayerFlag(PLAYER_FLAGS_NO_PLAY_TIME)) + { + player->SendLootError(lguid, LOOT_ERROR_PLAY_TIME_EXCEEDED); + return; + } + if (lguid.IsGameObject()) { GameObject* go = player->GetMap()->GetGameObject(lguid); @@ -179,6 +187,15 @@ void WorldSession::HandleLootMoneyOpcode(WorldPacket& /*recvData*/) if (loot) { + // the money is zeroed and dropped from storage below no matter who is paid, so a fully + // restricted looter would destroy it rather than receive it. Bail before that teardown; + // reachable for windows not opened through HandleLootOpcode, e.g. chests and lockboxes. + if (player->HasPlayerFlag(PLAYER_FLAGS_NO_PLAY_TIME)) + { + player->SendLootError(guid, LOOT_ERROR_PLAY_TIME_EXCEEDED); + return; + } + sScriptMgr->OnPlayerBeforeLootMoney(player, loot); loot->NotifyMoneyRemoved(); if (shareMoney && player->GetGroup()) //item, pickpocket and players can be looted only single player @@ -200,27 +217,59 @@ void WorldSession::HandleLootMoneyOpcode(WorldPacket& /*recvData*/) for (std::vector::const_iterator i = playersNear.begin(); i != playersNear.end(); ++i) { - (*i)->ModifyMoney(goldPerPlayer); - (*i)->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_MONEY, goldPerPlayer); + uint32 finalGold = goldPerPlayer; + + if ((*i)->HasPlayerFlag(PLAYER_FLAGS_NO_PLAY_TIME)) + continue; + + if ((*i)->HasPlayerFlag(PLAYER_FLAGS_PARTIAL_PLAY_TIME)) + { + finalGold /= 2; + + // a halved share that rounds down to nothing is not worth announcing + if (!finalGold) + continue; + } + + (*i)->ModifyMoney(finalGold); + (*i)->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_MONEY, finalGold); WorldPacket data(SMSG_LOOT_MONEY_NOTIFY, 4 + 1); - data << uint32(goldPerPlayer); + data << uint32(finalGold); data << uint8(playersNear.size() > 1 ? 0 : 1); // Controls the text displayed in chat. 0 is "Your share is..." and 1 is "You loot..." (*i)->SendDirectMessage(&data); } } else { - sScriptMgr->OnPlayerAfterCreatureLootMoney(player); - player->ModifyMoney(loot->gold); - player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_MONEY, loot->gold); + uint32 finalGold = loot->gold; + bool award = true; // full restriction already returned above - WorldPacket data(SMSG_LOOT_MONEY_NOTIFY, 4 + 1); - data << uint32(loot->gold); - data << uint8(1); // "You loot..." - SendPacket(&data); + if (player->HasPlayerFlag(PLAYER_FLAGS_PARTIAL_PLAY_TIME)) + { + finalGold /= 2; + + // a halved amount that rounds down to nothing is not worth announcing + award = finalGold != 0; + } + + // fire the hook regardless of the CAIS reduction, matching OnLootMoney below + sScriptMgr->OnPlayerAfterCreatureLootMoney(player); + + if (award) + { + player->ModifyMoney(finalGold); + player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_MONEY, finalGold); + + WorldPacket data(SMSG_LOOT_MONEY_NOTIFY, 4 + 1); + data << uint32(finalGold); + data << uint8(1); // "You loot..." + SendPacket(&data); + } } + // reports the amount that dropped, not the CAIS-reduced amount actually awarded; + // a script that grants money from this hook bypasses the play time restriction sScriptMgr->OnLootMoney(player, loot->gold); loot->gold = 0; @@ -242,15 +291,23 @@ void WorldSession::HandleLootOpcode(WorldPacket& recvData) ObjectGuid guid; recvData >> guid; + Player* player = GetPlayer(); + // Check possible cheat - if (!GetPlayer()->IsAlive() || !guid.IsCreatureOrVehicle()) + if (!player->IsAlive() || !guid.IsCreatureOrVehicle()) return; - // interrupt cast - if (GetPlayer()->IsNonMeleeSpellCast(false)) - GetPlayer()->InterruptNonMeleeSpells(false); + if (player->HasPlayerFlag(PLAYER_FLAGS_NO_PLAY_TIME)) + { + player->SendLootError(guid, LOOT_ERROR_PLAY_TIME_EXCEEDED); + return; + } - GetPlayer()->SendLoot(guid, LOOT_CORPSE); + // interrupt cast + if (player->IsNonMeleeSpellCast(false)) + player->InterruptNonMeleeSpells(false); + + player->SendLoot(guid, LOOT_CORPSE); } void WorldSession::HandleLootReleaseOpcode(WorldPacket& recvData) @@ -446,7 +503,7 @@ void WorldSession::HandleLootMasterGiveOpcode(WorldPacket& recvData) return; } - if (!_player->IsInRaidWith(target)) + if (!_player->IsInRaidWith(target) || target->HasPlayerFlag(PLAYER_FLAGS_NO_PLAY_TIME)) { _player->SendLootError(lootguid, LOOT_ERROR_MASTER_OTHER); //LOG_DEBUG("network", "MasterLootItem: Player {} tried to give an item to ineligible player {} !", GetPlayer()->GetName(), target->GetName()); diff --git a/src/server/game/Server/Packets/MiscPackets.cpp b/src/server/game/Server/Packets/MiscPackets.cpp index e20d422b9..5c2d1740c 100644 --- a/src/server/game/Server/Packets/MiscPackets.cpp +++ b/src/server/game/Server/Packets/MiscPackets.cpp @@ -168,3 +168,11 @@ WorldPacket const* WorldPackets::Misc::ComplainResult::Write() return &_worldPacket; } + +WorldPacket const* WorldPackets::Misc::PlayTimeWarning::Write() +{ + _worldPacket << Flag; + _worldPacket << PlayTimeRemaining; + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/MiscPackets.h b/src/server/game/Server/Packets/MiscPackets.h index df2f70973..e86d775ef 100644 --- a/src/server/game/Server/Packets/MiscPackets.h +++ b/src/server/game/Server/Packets/MiscPackets.h @@ -236,6 +236,17 @@ namespace WorldPackets uint8 Unk = 0; }; + + class PlayTimeWarning final : public ServerPacket + { + public: + PlayTimeWarning() : ServerPacket(SMSG_PLAY_TIME_WARNING, 4 + 4) {} + + WorldPacket const* Write() override; + + uint32 Flag = 0; // PlayTimeFlag mask, set by WorldSession::SendPlayTimeWarning + int32 PlayTimeRemaining = 0; + }; } } diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index dae5140f8..b144d483f 100644 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -34,6 +34,7 @@ #include "Log.h" #include "MapMgr.h" #include "Metric.h" +#include "MiscPackets.h" #include "ObjectAccessor.h" #include "ObjectMgr.h" #include "Opcodes.h" @@ -121,6 +122,9 @@ WorldSession::WorldSession(uint32 id, std::string&& name, uint32 accountFlags, s _accountFlags(accountFlags), m_expansion(expansion), m_total_time(TotalTime), + _lastUpdateTime(GameTime::GetGameTime()), + _createTime(GameTime::GetGameTime()), + _previousPlayTime(0), _logoutTime(0), m_inQueue(false), m_playerLoading(false), @@ -227,6 +231,14 @@ bool WorldSession::IsRecurringBillingAccount() const return HasAccountFlag(ACCOUNT_FLAG_RECURRING_BILLING); } +bool WorldSession::IsAffectedByCAIS() const +{ + // China realm system for restricting consecutive play time (anti-addiction). + // There is no known per-account flag for it, so a realm-wide config gate is used; + // swap this out if a per-account/realm-region source is found later. + return sWorld->getBoolConfig(CONFIG_CAIS_ENABLED); +} + uint8 WorldSession::GetBillingPlanFlags() const { uint8 flags = SESSION_NONE; @@ -240,6 +252,9 @@ uint8 WorldSession::GetBillingPlanFlags() const if (IsInternetGameRoomAccount()) flags |= SESSION_IGR; + if (IsAffectedByCAIS()) + flags |= SESSION_ENABLE_CAIS; + return flags; } @@ -380,6 +395,12 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater) uint32 processedPackets = 0; time_t currentTime = GameTime::GetGameTime().count(); + if (GetPlayer() && GetPlayer()->IsInWorld() && IsAffectedByCAIS()) + { + CheckPlayedTimeLimit(Seconds(currentTime)); + _lastUpdateTime = Seconds(currentTime); + } + constexpr uint32 MAX_PROCESSED_PACKETS_IN_SAME_WORLDSESSION_UPDATE = 150; while (m_Socket && _recvQueue.next(packet, updater)) @@ -610,6 +631,47 @@ bool WorldSession::IsSocketClosed() const return !m_Socket || !m_Socket->IsOpen(); } +void WorldSession::CheckPlayedTimeLimit(Seconds now) +{ + Seconds const previousPlayed = GetConsecutivePlayTime(_lastUpdateTime); + Seconds const currentPlayed = GetConsecutivePlayTime(now); + + if ((previousPlayed < PLAY_TIME_LIMIT_FULL) && + (currentPlayed >= PLAY_TIME_LIMIT_FULL)) + { + SendPlayTimeWarning(PTF_UNHEALTHY_TIME, 0); + GetPlayer()->SetPlayerFlag(PLAYER_FLAGS_NO_PLAY_TIME); + GetPlayer()->RemovePlayerFlag(PLAYER_FLAGS_PARTIAL_PLAY_TIME); + } + else if ((previousPlayed < PLAY_TIME_LIMIT_APPROACHING_FULL) && + (currentPlayed >= PLAY_TIME_LIMIT_APPROACHING_FULL)) + { + SendPlayTimeWarning(PTF_APPROACHING_NO_PLAY_TIME, int32((PLAY_TIME_LIMIT_FULL - currentPlayed).count())); + GetPlayer()->SetPlayerFlag(PLAYER_FLAGS_PARTIAL_PLAY_TIME); + GetPlayer()->RemovePlayerFlag(PLAYER_FLAGS_NO_PLAY_TIME); + } + else if ((previousPlayed < PLAY_TIME_LIMIT_PARTIAL) && + (currentPlayed >= PLAY_TIME_LIMIT_PARTIAL)) + { + SendPlayTimeWarning(PTF_APPROACHING_NO_PLAY_TIME, int32((PLAY_TIME_LIMIT_FULL - currentPlayed).count())); + GetPlayer()->SetPlayerFlag(PLAYER_FLAGS_PARTIAL_PLAY_TIME); + GetPlayer()->RemovePlayerFlag(PLAYER_FLAGS_NO_PLAY_TIME); + } + else if ((previousPlayed < PLAY_TIME_LIMIT_APPROACHING_PARTIAL) && + (currentPlayed >= PLAY_TIME_LIMIT_APPROACHING_PARTIAL)) + { + SendPlayTimeWarning(PTF_APPROACHING_PARTIAL_PLAY_TIME, int32((PLAY_TIME_LIMIT_PARTIAL - currentPlayed).count())); + } +} + +void WorldSession::SendPlayTimeWarning(PlayTimeFlag flag, int32 playTimeRemaining) +{ + WorldPackets::Misc::PlayTimeWarning playTimeWarning; + playTimeWarning.Flag = flag; + playTimeWarning.PlayTimeRemaining = playTimeRemaining; + SendPacket(playTimeWarning.Write()); +} + /// %Log the player out void WorldSession::LogoutPlayer(bool save) { diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index fa2bfd561..bea564076 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -28,6 +28,7 @@ #include "CircularBuffer.h" #include "Common.h" #include "DatabaseEnv.h" +#include "Duration.h" #include "GossipDef.h" #include "Packet.h" #include "SharedDefines.h" @@ -289,6 +290,20 @@ enum CharterTypes ARENA_TEAM_CHARTER_5v5_TYPE = 5 }; +constexpr Seconds PLAY_TIME_LIMIT_APPROACHING_PARTIAL = Hours(2) + Minutes(30); +constexpr Seconds PLAY_TIME_LIMIT_PARTIAL = Hours(3); +constexpr Seconds PLAY_TIME_LIMIT_APPROACHING_FULL = Hours(4) + Minutes(30); +constexpr Seconds PLAY_TIME_LIMIT_FULL = Hours(5); + +enum PlayTimeFlag : uint32 +{ + PTF_APPROACHING_PARTIAL_PLAY_TIME = 0x1000, + PTF_APPROACHING_NO_PLAY_TIME = 0x2000, + PTF_UNK_1 = 0x20000000, + PTF_UNK_2 = 0x40000000, + PTF_UNHEALTHY_TIME = 0x80000000, +}; + //class to deal with packet processing //allows to determine if next packet is safe to be processed class PacketFilter @@ -405,6 +420,7 @@ public: bool IsTrialAccount() const; bool IsInternetGameRoomAccount() const; bool IsRecurringBillingAccount() const; + bool IsAffectedByCAIS() const; uint8 GetBillingPlanFlags() const; @@ -483,6 +499,16 @@ public: /// Session in auth.queue currently void SetInQueue(bool state) { m_inQueue = state; } + // Playtime limit + Seconds GetCreateTime() const { return _createTime; } + // Measured from session creation (authentication), so login queue and character select count + // toward the limits. Matches the VMaNGOS behaviour this is ported from. + Seconds GetConsecutivePlayTime(Seconds now) const { return (now - _createTime) + _previousPlayTime; } + Seconds GetPreviousPlayedTime() const { return _previousPlayTime; } + void SetPreviousPlayedTime(Seconds playedTime) { _previousPlayTime = playedTime; } + void CheckPlayedTimeLimit(Seconds now); + void SendPlayTimeWarning(PlayTimeFlag flag, int32 playTimeRemaining); + /// Is the user engaged in a log out process? bool isLogingOut() const { return _logoutTime || m_playerLogout; } @@ -1255,6 +1281,9 @@ private: // Warden std::unique_ptr _warden; // Remains nullptr if Warden system is not enabled by config + Seconds _lastUpdateTime; // last time session was updated by world + Seconds _createTime; // when session was created + Seconds _previousPlayTime; // play time from previous session less than 5 hours ago time_t _logoutTime; bool m_inQueue; // session wait in auth.queue bool m_playerLoading; // code processed in LoginPlayer diff --git a/src/server/game/Server/WorldSessionMgr.cpp b/src/server/game/Server/WorldSessionMgr.cpp index b22726d5a..50598d391 100644 --- a/src/server/game/Server/WorldSessionMgr.cpp +++ b/src/server/game/Server/WorldSessionMgr.cpp @@ -38,6 +38,7 @@ WorldSessionMgr::WorldSessionMgr() _maxQueuedSessionCount = 0; _playerCount = 0; _maxPlayerCount = 0; + _accountsPlayHistoryPruneTimer = 0; } WorldSessionMgr::~WorldSessionMgr() @@ -91,6 +92,22 @@ WorldSession* WorldSessionMgr::FindOfflineSessionForCharacterGUID(ObjectGuid::Lo void WorldSessionMgr::UpdateSessions(uint32 const diff) { + // Drop play-history entries past the reset window so the map stays bounded even for + // accounts that disconnect and never reconnect (login only erases their own entry). + _accountsPlayHistoryPruneTimer += diff; + if (_accountsPlayHistoryPruneTimer >= 10 * MINUTE * IN_MILLISECONDS) + { + _accountsPlayHistoryPruneTimer = 0; + Seconds const now = GameTime::GetGameTime(); + for (auto itr = _accountsPlayHistory.begin(); itr != _accountsPlayHistory.end();) + { + if ((now - itr->second.logoutTime) >= PLAY_TIME_LIMIT_FULL) + itr = _accountsPlayHistory.erase(itr); + else + ++itr; + } + } + { METRIC_DETAILED_NO_THRESHOLD_TIMER("world_update_time", METRIC_TAG("type", "Add sessions"), @@ -117,8 +134,19 @@ void WorldSessionMgr::UpdateSessions(uint32 const diff) // pussywizard: if (pSession->HandleSocketClosed()) { + Seconds const now = GameTime::GetGameTime(); + + if (pSession->IsAffectedByCAIS()) + { + // a reconnect builds a fresh session and carries time from _accountsPlayHistory, so persist it + // here at socket-close time rather than during offline cleanup (which runs ~60s later) + AccountPlayHistory& history = _accountsPlayHistory[pSession->GetAccountId()]; + history.playedTime = pSession->GetConsecutivePlayTime(now); + history.logoutTime = now; + } + if (!RemoveQueuedPlayer(pSession) && sWorld->getIntConfig(CONFIG_INTERVAL_DISCONNECT_TOLERANCE)) - _disconnects[pSession->GetAccountId()] = GameTime::GetGameTime().count(); + _disconnects[pSession->GetAccountId()] = now.count(); _sessions.erase(itr); // there should be no offline session if current one is logged onto a character SessionMap::iterator iter; @@ -128,7 +156,7 @@ void WorldSessionMgr::UpdateSessions(uint32 const diff) _offlineSessions.erase(iter); delete tmp; } - pSession->SetOfflineTime(GameTime::GetGameTime().count()); + pSession->SetOfflineTime(now.count()); _offlineSessions[pSession->GetAccountId()] = pSession; continue; } @@ -138,8 +166,17 @@ void WorldSessionMgr::UpdateSessions(uint32 const diff) if (!pSession->Update(diff, updater)) { + Seconds const now = GameTime::GetGameTime(); + + if (pSession->IsAffectedByCAIS()) + { + AccountPlayHistory& history = _accountsPlayHistory[pSession->GetAccountId()]; + history.playedTime = pSession->GetConsecutivePlayTime(now); + history.logoutTime = now; + } + if (!RemoveQueuedPlayer(pSession) && sWorld->getIntConfig(CONFIG_INTERVAL_DISCONNECT_TOLERANCE)) - _disconnects[pSession->GetAccountId()] = GameTime::GetGameTime().count(); + _disconnects[pSession->GetAccountId()] = now.count(); _sessions.erase(itr); delete pSession; } @@ -296,6 +333,9 @@ void WorldSessionMgr::AddSession_(WorldSession* session) if (!RemoveQueuedPlayer(oldSession) && sWorld->getIntConfig(CONFIG_INTERVAL_DISCONNECT_TOLERANCE)) _disconnects[session->GetAccountId()] = GameTime::GetGameTime().count(); + // don't allow resetting consecutive play time on double login to same account + session->SetPreviousPlayedTime(old->second->GetConsecutivePlayTime(GameTime::GetGameTime())); + // pussywizard: if (oldSession->HandleSocketClosed()) { @@ -315,6 +355,19 @@ void WorldSessionMgr::AddSession_(WorldSession* session) delete oldSession; } } + else + { + auto itr = _accountsPlayHistory.find(session->GetAccountId()); + if (itr != _accountsPlayHistory.end()) + { + // carry consecutive play time only if the offline gap was under the reset window + if ((GameTime::GetGameTime() - itr->second.logoutTime) < PLAY_TIME_LIMIT_FULL) + session->SetPreviousPlayedTime(itr->second.playedTime); + + // entry consumed on login; erase so _accountsPlayHistory cannot grow unbounded + _accountsPlayHistory.erase(itr); + } + } _sessions[session->GetAccountId()] = session; diff --git a/src/server/game/Server/WorldSessionMgr.h b/src/server/game/Server/WorldSessionMgr.h index af85ed7a0..933000379 100644 --- a/src/server/game/Server/WorldSessionMgr.h +++ b/src/server/game/Server/WorldSessionMgr.h @@ -19,16 +19,24 @@ #define __WORLDSESSIONMGR_H #include "Common.h" +#include "Duration.h" #include "IWorld.h" #include "LockedQueue.h" #include "ObjectGuid.h" #include +#include #include class Player; class WorldPacket; class WorldSession; +struct AccountPlayHistory +{ + Seconds logoutTime = Seconds::zero(); + Seconds playedTime = Seconds::zero(); // reset after 5 hours offline time +}; + class WorldSessionMgr { public: @@ -91,6 +99,7 @@ private: SessionMap _sessions; SessionMap _offlineSessions; + std::map _accountsPlayHistory; typedef std::unordered_map DisconnectMap; DisconnectMap _disconnects; @@ -103,6 +112,7 @@ private: uint32 _maxQueuedSessionCount; uint32 _playerCount; uint32 _maxPlayerCount; + uint32 _accountsPlayHistoryPruneTimer; }; #define sWorldSessionMgr WorldSessionMgr::Instance() diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h index 0f2eb0e80..df877be35 100644 --- a/src/server/game/World/World.h +++ b/src/server/game/World/World.h @@ -80,7 +80,7 @@ enum BillingPlanFlags SESSION_USAGE = 0x10, // Unk, NYI SESSION_TIME_MIXTURE = 0x20, // Unk, NYI SESSION_RESTRICTED = 0x40, // Unk, NYI - SESSION_ENABLE_CAIS = 0x80, // Unk, NYI, possibly account play time limit related for China? + SESSION_ENABLE_CAIS = 0x80, // Account play time limit related for China }; enum RealmZone diff --git a/src/server/game/World/WorldConfig.cpp b/src/server/game/World/WorldConfig.cpp index 26ca792c0..bd6f0a300 100644 --- a/src/server/game/World/WorldConfig.cpp +++ b/src/server/game/World/WorldConfig.cpp @@ -359,6 +359,8 @@ void WorldConfig::BuildConfigCache() SetConfigValue(CONFIG_TRIAL_MONEY_CAP, "Trial.MoneyCap", 100000); // copper, 10 gold SetConfigValue(CONFIG_TRIAL_TRADE_SKILL_CAP, "Trial.TradeSkillCap", 100); + SetConfigValue(CONFIG_CAIS_ENABLED, "CAIS.Enable", false); + SetConfigValue(CONFIG_EVENT_ANNOUNCE, "Event.Announce", 0); SetConfigValue(CONFIG_CREATURE_LEASH_RADIUS, "CreatureLeashRadius", 30.0f); diff --git a/src/server/game/World/WorldConfig.h b/src/server/game/World/WorldConfig.h index e869d8b3b..d4e3c79fa 100644 --- a/src/server/game/World/WorldConfig.h +++ b/src/server/game/World/WorldConfig.h @@ -518,6 +518,8 @@ enum ServerConfigs CONFIG_TRIAL_MONEY_CAP, CONFIG_TRIAL_TRADE_SKILL_CAP, + CONFIG_CAIS_ENABLED, + MAX_NUM_SERVER_CONFIGS }; From 91ad3ec47805d8019f7c6e692a2db9b710d7de39 Mon Sep 17 00:00:00 2001 From: sudlud Date: Tue, 21 Jul 2026 13:47:22 +0200 Subject: [PATCH 061/134] feat(CI): skip pch/nopch core builds on DB-only pull requests (#26716) Co-authored-by: Claude Opus 4.8 (1M context) --- .github/workflows/core-build-nopch.yml | 6 ++++++ .github/workflows/core-build-pch.yml | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/.github/workflows/core-build-nopch.yml b/.github/workflows/core-build-nopch.yml index 3cfcc6254..0e8a26b66 100644 --- a/.github/workflows/core-build-nopch.yml +++ b/.github/workflows/core-build-nopch.yml @@ -8,6 +8,12 @@ on: - opened - reopened - synchronize + # A PR that only touches data/ (SQL) leaves the C++ untouched, so there is + # nothing to compile. Dashboard CI runs on every PR unfiltered and already + # imports the SQL and starts a real worldserver, so coverage is unaffected. + # Pushes to master are not filtered and always build. + paths-ignore: + - 'data/**' concurrency: # One concurrency group per workflow + ref. diff --git a/.github/workflows/core-build-pch.yml b/.github/workflows/core-build-pch.yml index b50d4f4b8..2a8d27a01 100644 --- a/.github/workflows/core-build-pch.yml +++ b/.github/workflows/core-build-pch.yml @@ -8,6 +8,12 @@ on: - opened - reopened - synchronize + # A PR that only touches data/ (SQL) leaves the C++ untouched, so there is + # nothing to compile. Dashboard CI runs on every PR unfiltered and already + # imports the SQL and starts a real worldserver, so coverage is unaffected. + # Pushes to master are not filtered and always build. + paths-ignore: + - 'data/**' concurrency: # One concurrency group per workflow + ref. From 09d8066aa43f2753610827e323c69c9a21e242d9 Mon Sep 17 00:00:00 2001 From: Kitzunu <24550914+Kitzunu@users.noreply.github.com> Date: Tue, 21 Jul 2026 13:59:16 +0200 Subject: [PATCH 062/134] fix(CI): stop ccache from freezing after the first run on a branch (#26481) Co-authored-by: Ludwig Co-authored-by: Claude Opus 4.8 (1M context) --- .github/actions/docker-tag-and-build/action.yml | 2 +- .github/actions/linux-build/action.yml | 15 ++++++++++++--- .github/workflows/codestyle.yml | 6 ++++++ .github/workflows/docker_build.yml | 4 ++-- .github/workflows/macos_build.yml | 10 +++++++--- .github/workflows/sql-codestyle.yml | 6 ++++++ 6 files changed, 34 insertions(+), 9 deletions(-) diff --git a/.github/actions/docker-tag-and-build/action.yml b/.github/actions/docker-tag-and-build/action.yml index 436bf8fd4..fac0ce565 100644 --- a/.github/actions/docker-tag-and-build/action.yml +++ b/.github/actions/docker-tag-and-build/action.yml @@ -30,7 +30,7 @@ runs: type=ref,event=branch - name: Build and push - uses: docker/build-push-action@v5 + uses: docker/build-push-action@v6 with: context: ${{ github.workspace }} file: ${{ inputs.dockerfile }} diff --git a/.github/actions/linux-build/action.yml b/.github/actions/linux-build/action.yml index 20bc9d1f5..2900e40d6 100644 --- a/.github/actions/linux-build/action.yml +++ b/.github/actions/linux-build/action.yml @@ -41,14 +41,21 @@ runs: steps: - name: echo cache key shell: bash - run: echo "Cache key -> ccache:${{ runner.os }}:${{ inputs.CC }}_${{ inputs.CXX }}:${{ inputs.modules }}:pch=${{ inputs.pch }}:${{ github.ref_name }}" + run: echo "Cache key -> ccache:${{ runner.os }}:${{ inputs.CC }}_${{ inputs.CXX }}:${{ inputs.modules }}:pch=${{ inputs.pch }}:${{ github.ref_name }}-${{ github.run_id }}" + # The primary key is unique per run (`-${{ github.run_id }}`) so every run + # saves a fresh cache. A static key would hit on itself on the second run + # and `actions/cache` would then skip the upload, freezing the cache after + # the first commit on a branch (and permanently on master). The restore-keys + # walk back from the most-recent cache on this branch to progressively + # broader fallbacks (branch -> pch variant -> modules variant -> compiler). - name: Cache uses: actions/cache@v4 with: path: ${{ github.workspace }}/var/ccache - key: ccache:${{ runner.os }}:${{ inputs.CC }}_${{ inputs.CXX }}:${{ inputs.modules }}:pch=${{ inputs.pch }}:${{ github.ref_name }} + key: ccache:${{ runner.os }}:${{ inputs.CC }}_${{ inputs.CXX }}:${{ inputs.modules }}:pch=${{ inputs.pch }}:${{ github.ref_name }}-${{ github.run_id }} restore-keys: | + ccache:${{ runner.os }}:${{ inputs.CC }}_${{ inputs.CXX }}:${{ inputs.modules }}:pch=${{ inputs.pch }}:${{ github.ref_name }}- ccache:${{ runner.os }}:${{ inputs.CC }}_${{ inputs.CXX }}:${{ inputs.modules }}:pch=${{ inputs.pch }} ccache:${{ runner.os }}:${{ inputs.CC }}_${{ inputs.CXX }}:${{ inputs.modules }} ccache:${{ runner.os }}:${{ inputs.CC }}_${{ inputs.CXX }} @@ -78,6 +85,8 @@ runs: shell: bash env: CCACHE_DIR: $GITHUB_WORKSPACE/var/ccache + # CCACHE_COMPRESSLEVEL=3: level 9 burns CPU for marginal size gains on a + # cache that never approaches max_size. run: | mkdir -p "$CCACHE_DIR" cat <> "$GITHUB_ENV" @@ -87,7 +96,7 @@ runs: CCACHE_MAXSIZE=5G CCACHE_SLOPPINESS=pch_defines,time_macros,include_file_mtime CCACHE_COMPRESS=1 - CCACHE_COMPRESSLEVEL=9 + CCACHE_COMPRESSLEVEL=3 CCACHE_COMPILERCHECK=content CCACHE_LOGFILE=${{ env.CCACHE_DIR }}/cache.debug CC=${{ inputs.CC }} diff --git a/.github/workflows/codestyle.yml b/.github/workflows/codestyle.yml index 643593a0c..640d2d7b0 100644 --- a/.github/workflows/codestyle.yml +++ b/.github/workflows/codestyle.yml @@ -10,6 +10,12 @@ on: - "!README.md" - "!docs/**" +concurrency: + # New commits on a PR cancel the still-running codestyle check on the old + # commit. github.ref is refs/pull//merge, so the group is stable per PR. + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: triage: runs-on: ubuntu-latest diff --git a/.github/workflows/docker_build.yml b/.github/workflows/docker_build.yml index e770e0eae..7263820e3 100644 --- a/.github/workflows/docker_build.yml +++ b/.github/workflows/docker_build.yml @@ -56,7 +56,7 @@ jobs: - name: Login to Docker Hub if: github.repository == 'azerothcore/azerothcore-wotlk' && github.ref_name == 'master' - uses: docker/login-action@v1 + uses: docker/login-action@v3 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} @@ -115,7 +115,7 @@ jobs: - name: Trigger acore-docker CI if: github.repository == 'azerothcore/azerothcore-wotlk' && github.ref_name == 'master' - uses: peter-evans/repository-dispatch@v2 + uses: peter-evans/repository-dispatch@v3 with: token: ${{ secrets.ACORE_DOCKER_REPO_ACCESS_TOKEN }} repository: azerothcore/acore-docker diff --git a/.github/workflows/macos_build.yml b/.github/workflows/macos_build.yml index 09ae976a2..cb0efefe8 100644 --- a/.github/workflows/macos_build.yml +++ b/.github/workflows/macos_build.yml @@ -9,7 +9,9 @@ on: - synchronize concurrency: - group: ${{ github.head_ref }} || concat(${{ github.ref_name }}, ${{ github.workflow }}) + # One concurrency group per workflow + ref (matches the other build workflows). + # PRs cancel superseded runs; branch pushes are isolated by ref. + group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true permissions: @@ -35,9 +37,11 @@ jobs: uses: actions/cache@v4 with: path: ~/Library/Caches/ccache - key: ccache:${{ matrix.os }}:${{ github.ref_name }} + # Unique per run so the cache is re-saved every run instead of + # freezing on the first (a static key hits itself and skips upload). + key: ccache:${{ matrix.os }}:${{ github.ref_name }}-${{ github.run_id }} restore-keys: | - ccache:${{ matrix.os }}:${{ github.ref_name }} + ccache:${{ matrix.os }}:${{ github.ref_name }}- ccache:${{ matrix.os }} - name: reset ccache stats shell: bash diff --git a/.github/workflows/sql-codestyle.yml b/.github/workflows/sql-codestyle.yml index 4c21a8c9b..809a58d12 100644 --- a/.github/workflows/sql-codestyle.yml +++ b/.github/workflows/sql-codestyle.yml @@ -10,6 +10,12 @@ on: - "!README.md" - "!docs/**" +concurrency: + # New commits on a PR cancel the still-running codestyle check on the old + # commit. github.ref is refs/pull//merge, so the group is stable per PR. + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: triage: runs-on: ubuntu-latest From e4dc2817463a326ea8a32441dbd5ba41866dac19 Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Tue, 21 Jul 2026 09:39:15 -0300 Subject: [PATCH 063/134] fix(Scripts/Ulduar): apply Yogg-Saron keeper buffs on pull again (#26713) Co-authored-by: horn --- .../rev_1784596450250937900.sql | 4 ++ .../Ulduar/Ulduar/boss_yoggsaron.cpp | 68 +++++++++++++++---- .../Ulduar/Ulduar/instance_ulduar.cpp | 1 + .../scripts/Northrend/Ulduar/Ulduar/ulduar.h | 2 + 4 files changed, 60 insertions(+), 15 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1784596450250937900.sql diff --git a/data/sql/updates/pending_db_world/rev_1784596450250937900.sql b/data/sql/updates/pending_db_world/rev_1784596450250937900.sql new file mode 100644 index 000000000..e02131746 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1784596450250937900.sql @@ -0,0 +1,4 @@ +-- Spawn Voice of Yogg-Saron in Ulduar (spawn data from TrinityCore) +DELETE FROM `creature` WHERE `id` = 33280 AND `map` = 603; +INSERT INTO `creature` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `wander_distance`, `MovementType`, `ScriptName`, `Comment`, `VerifiedBuild`) VALUES +(62015, 33280, 603, 0, 0, 3, 1, 0, 1980.14, -25.7438, 326.467, 0, 604800, 0, 0, '', 'Voice of Yogg-Saron', 0); diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yoggsaron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yoggsaron.cpp index 05a4f45b0..0ef98e42a 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yoggsaron.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yoggsaron.cpp @@ -183,7 +183,6 @@ enum NPCsGOs NPC_GUARDIAN_OF_YS = 33136, NPC_SANITY_WELL = 33991, NPC_YOGG_SARON = 33288, - NPC_VOICE_OF_YOGG_SARON = 33280, NPC_YOGG_SARON_VISION = 33552, NPC_CRUSHER_TENTACLE = 33966, // 50 secs ? @@ -230,6 +229,9 @@ enum NPCsGOs enum Misc { + ACTION_ACTIVATE_KEEPER = -19, + ACTION_VOICE_STOP = -18, + ACTION_VOICE_START = -17, ACTION_UNSUMMON_CLOUDS = -16, ACTION_DESPAWN_ADDS = -15, ACTION_START_SUMMONING = -14, @@ -382,7 +384,7 @@ struct boss_yoggsaron_sara : public ScriptedAI uint32 _initFight; uint8 _summonedGuardiansCount; uint32 _p2TalkTimer; - bool _secondPhase; + bool _secondPhase = false; float _summonSpeed; uint8 _currentIllusion; bool _isIllusionReversed; @@ -437,15 +439,16 @@ struct boss_yoggsaron_sara : public ScriptedAI void Reset() override { - if (!_secondPhase) // Phase 1 wipe + // Whisper only on a real phase 1 wipe, not on the initial reset + if (!_secondPhase && _instance && _instance->GetBossState(BOSS_YOGGSARON) == IN_PROGRESS) { - me->GetMap()->DoForAllPlayers([&](Player* player) + if (Creature* voice = _instance->GetCreature(DATA_VOICE_OF_YOGG_SARON)) { - if (Creature* voice = me->FindNearestCreature(NPC_VOICE_OF_YOGG_SARON, 10.0f)) + me->GetMap()->DoForAllPlayers([&](Player* player) { voice->AI()->Talk(WHISPER_VOICE_PHASE_1_WIPE, player); - } - }); + }); + } } summons.DoAction(ACTION_DESPAWN_ADDS); @@ -474,6 +477,8 @@ struct boss_yoggsaron_sara : public ScriptedAI { _instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, CRITERIA_NOT_GETTING_OLDER); _instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_SANITY); + if (Creature* voice = _instance->GetCreature(DATA_VOICE_OF_YOGG_SARON)) + voice->AI()->DoAction(ACTION_VOICE_STOP); _instance->SetBossState(BOSS_YOGGSARON, NOT_STARTED); if (GameObject* go = _instance->GetGameObject(DATA_YOGG_SARON_DOORS)) go->SetGoState(GO_STATE_ACTIVE); @@ -494,9 +499,14 @@ struct boss_yoggsaron_sara : public ScriptedAI AttackStart(target); DespawnGossipKeepers(); - // Engage Keepers summons.DoZoneInCombat(); + if (Creature* voice = _instance->GetCreature(DATA_VOICE_OF_YOGG_SARON)) + voice->AI()->DoAction(ACTION_VOICE_START); + + // Keepers are friendly to players and never enter combat, activate them directly + ActivateKeepers(); + events.ScheduleEvent(EVENT_SARA_P1_DOORS_CLOSE, 15s, 0, EVENT_PHASE_ONE); events.ScheduleEvent(EVENT_SARA_P1_BERSERK, 15min, 0, 0); events.ScheduleEvent(EVENT_SARA_P1_SUMMON, 0ms, 0, EVENT_PHASE_ONE); @@ -535,6 +545,20 @@ struct boss_yoggsaron_sara : public ScriptedAI } } + void ActivateKeepers() + { + for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr) + { + Creature* summon = ObjectAccessor::GetCreature(*me, *itr); + if (!summon) + continue; + + for (uint8 i = KEEPER_FREYA; i <= KEEPER_THORIM; i++) + if (summon->GetEntry() == TABLE_KEEPER_ENTRY[i]) + summon->AI()->DoAction(ACTION_ACTIVATE_KEEPER); + } + } + void InformCloud() { Creature* cloud = nullptr; @@ -634,6 +658,7 @@ struct boss_yoggsaron_sara : public ScriptedAI if (param == ACTION_SARA_UPDATE_SUMMON_KEEPERS) { UpdateKeeperSpawns(); + return; } else if (param == ACTION_BRAIN_DAMAGED) { @@ -662,7 +687,6 @@ struct boss_yoggsaron_sara : public ScriptedAI summons.DespawnEntry(NPC_CRUSHER_TENTACLE); summons.DespawnEntry(NPC_CONSTRICTOR_TENTACLE); summons.DespawnEntry(NPC_CORRUPTOR_TENTACLE); - summons.DespawnEntry(NPC_VOICE_OF_YOGG_SARON); summons.DespawnEntry(NPC_BRAIN_OF_YOGG_SARON); summons.DespawnEntry(NPC_MIMIRON_GOSSIP); summons.DespawnEntry(NPC_HODIR_GOSSIP); @@ -673,6 +697,8 @@ struct boss_yoggsaron_sara : public ScriptedAI summons.DespawnEntry(NPC_FREYA_KEEPER); summons.DespawnEntry(NPC_THORIM_KEEPER); summons.DespawnEntry(NPC_SANITY_WELL); + if (Creature* voice = _instance ? _instance->GetCreature(DATA_VOICE_OF_YOGG_SARON) : nullptr) + voice->AI()->DoAction(ACTION_VOICE_STOP); me->KillSelf(); return; } @@ -804,9 +830,6 @@ struct boss_yoggsaron_sara : public ScriptedAI switch (events.ExecuteEvent()) { case EVENT_SARA_P1_DOORS_CLOSE: - // Whispers of YS - me->SummonCreature(NPC_VOICE_OF_YOGG_SARON, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()); - if (_instance) if (GameObject* go = _instance->GetGameObject(DATA_YOGG_SARON_DOORS)) go->SetGoState(GO_STATE_READY); @@ -1673,6 +1696,8 @@ struct boss_yoggsaron_keeper : public NullCreatureAI me->CastSpell(me, SPELL_TITANIC_STORM_PASSIVE, false); else if (param == ACTION_DESPAWN_ADDS) _summons.DespawnAll(); + else if (param == ACTION_ACTIVATE_KEEPER) + Activate(); } void JustSummoned(Creature* summon) override @@ -1680,7 +1705,7 @@ struct boss_yoggsaron_keeper : public NullCreatureAI _summons.Summon(summon); } - void JustEngagedWith(Unit* /*who*/) override + void Activate() { switch (me->GetEntry()) { @@ -2092,8 +2117,21 @@ struct boss_yoggsaron_voice : public NullCreatureAI void Reset() override { - DoCastSelf(SPELL_INSANE_PERIODIC, true); - DoCastSelf(SPELL_SANITY_BASE, true); + events.Reset(); + _targets.clear(); + _current = 0; + me->RemoveAllAuras(); + } + + void DoAction(int32 param) override + { + if (param == ACTION_VOICE_START) + { + DoCastSelf(SPELL_INSANE_PERIODIC, true); + DoCastSelf(SPELL_SANITY_BASE, true); + } + else if (param == ACTION_VOICE_STOP) + Reset(); } void SpellHitTarget(Unit* target, SpellInfo const* spellInfo) override diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp index c2d28b23d..c3e04ed89 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp @@ -114,6 +114,7 @@ ObjectData const creatureData[] = // Yogg-Saron helpers { NPC_SARA, DATA_SARA }, { NPC_BRAIN_OF_YOGG_SARON, DATA_BRAIN_OF_YOGG_SARON }, + { NPC_VOICE_OF_YOGG_SARON, DATA_VOICE_OF_YOGG_SARON }, // Observation Ring Keepers { NPC_FREYA_GOSSIP, DATA_FREYA_GOSSIP }, { NPC_HODIR_GOSSIP, DATA_HODIR_GOSSIP }, diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.h b/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.h index 5dbb434cb..2ec9ba83c 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.h +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.h @@ -129,6 +129,7 @@ enum UlduarData DATA_SARA = 760, DATA_BRAIN_OF_YOGG_SARON = 761, DATA_YOGG_SARON_DOORS = 762, + DATA_VOICE_OF_YOGG_SARON = 763, // Middle section DATA_ASSEMBLY_DOORS = 770, @@ -204,6 +205,7 @@ enum UlduarNPCs NPC_ELDER_IRONBRANCH = 32913, // Yogg-Saron + NPC_VOICE_OF_YOGG_SARON = 33280, NPC_FREYA_GOSSIP = 33241, NPC_HODIR_GOSSIP = 33213, NPC_THORIM_GOSSIP = 33242, From c290be2e5febd13f389f3da1c4b36e3a0be1c6c1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 21 Jul 2026 12:40:53 +0000 Subject: [PATCH 064/134] chore(DB): import pending files Referenced commit(s): 09d8066aa43f2753610827e323c69c9a21e242d9 --- .../rev_1784596450250937900.sql => db_world/2026_07_21_02.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1784596450250937900.sql => db_world/2026_07_21_02.sql} (91%) diff --git a/data/sql/updates/pending_db_world/rev_1784596450250937900.sql b/data/sql/updates/db_world/2026_07_21_02.sql similarity index 91% rename from data/sql/updates/pending_db_world/rev_1784596450250937900.sql rename to data/sql/updates/db_world/2026_07_21_02.sql index e02131746..b37b4591c 100644 --- a/data/sql/updates/pending_db_world/rev_1784596450250937900.sql +++ b/data/sql/updates/db_world/2026_07_21_02.sql @@ -1,3 +1,4 @@ +-- DB update 2026_07_21_01 -> 2026_07_21_02 -- Spawn Voice of Yogg-Saron in Ulduar (spawn data from TrinityCore) DELETE FROM `creature` WHERE `id` = 33280 AND `map` = 603; INSERT INTO `creature` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `wander_distance`, `MovementType`, `ScriptName`, `Comment`, `VerifiedBuild`) VALUES From 86e8abce1a32e4db6a7b19da4124b2bbbf23ef4f Mon Sep 17 00:00:00 2001 From: sudlud Date: Tue, 21 Jul 2026 14:58:57 +0200 Subject: [PATCH 065/134] feat(CI): delete Actions caches when a PR closes (#26717) Co-authored-by: Claude Opus 4.8 (1M context) --- .github/workflows/cleanup-pr-caches.yml | 29 +++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 .github/workflows/cleanup-pr-caches.yml diff --git a/.github/workflows/cleanup-pr-caches.yml b/.github/workflows/cleanup-pr-caches.yml new file mode 100644 index 000000000..8bfa23855 --- /dev/null +++ b/.github/workflows/cleanup-pr-caches.yml @@ -0,0 +1,29 @@ +name: cleanup-pr-caches +on: + # pull_request_target, not pull_request: for a PR from a fork the GITHUB_TOKEN + # of a pull_request run is read-only, so the delete would 403. This workflow + # never checks out or runs PR code, so the elevated token is not exposed to it. + pull_request_target: + types: + - closed + +permissions: + actions: write + +jobs: + cleanup: + runs-on: ubuntu-latest + name: delete caches of the closed PR + if: github.repository == 'azerothcore/azerothcore-wotlk' + steps: + - name: Delete caches created by this PR + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GH_REPO: ${{ github.repository }} + # Caches written during a PR run are scoped to the merge ref and are + # unreachable from any other branch, so once the PR is closed they can + # only occupy space. Deleting by this ref cannot touch master's caches. + PR_REF: refs/pull/${{ github.event.pull_request.number }}/merge + # --succeed-on-no-caches: without it gh exits 1 when the PR has no + # caches, which is the normal case for a PR that never ran CI. + run: gh cache delete --all --ref "$PR_REF" --succeed-on-no-caches From db8a92b8b72be1e4f4db51140ca5e4667d65648e Mon Sep 17 00:00:00 2001 From: sudlud Date: Tue, 21 Jul 2026 14:59:34 +0200 Subject: [PATCH 066/134] fix(CI): cancel a PR's CI when the PR closes (#26719) Co-authored-by: Claude Opus 4.8 (1M context) Co-authored-by: CodeRabbit --- .github/workflows/cancel-pr-runs-on-close.yml | 48 +++++++++++++++++++ .github/workflows/core-build-nopch.yml | 5 +- .github/workflows/core-build-pch.yml | 5 +- .github/workflows/core_modules_build.yml | 5 +- .github/workflows/docker_build.yml | 5 +- .github/workflows/tools_build.yml | 5 +- .github/workflows/windows_build.yml | 5 +- 7 files changed, 66 insertions(+), 12 deletions(-) create mode 100644 .github/workflows/cancel-pr-runs-on-close.yml diff --git a/.github/workflows/cancel-pr-runs-on-close.yml b/.github/workflows/cancel-pr-runs-on-close.yml new file mode 100644 index 000000000..0416af439 --- /dev/null +++ b/.github/workflows/cancel-pr-runs-on-close.yml @@ -0,0 +1,48 @@ +name: cancel-pr-runs-on-close +on: + # pull_request_target, not pull_request: for a PR from a fork the GITHUB_TOKEN + # of a pull_request run is read-only, so the cancel would 403. This workflow + # never checks out or runs PR code, so the elevated token is not exposed to it. + pull_request_target: + types: + - closed + +permissions: + actions: write + +jobs: + cancel: + runs-on: ubuntu-latest + name: cancel CI still running for the closed PR + if: github.repository == 'azerothcore/azerothcore-wotlk' + steps: + - name: Cancel workflow runs for this PR + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GH_REPO: ${{ github.repository }} + PR_SHA: ${{ github.event.pull_request.head.sha }} + PR_REPO: ${{ github.event.pull_request.head.repo.full_name }} + run: | + set -euo pipefail + + # head_sha alone would let anyone cancel another PR's CI: push that + # PR's head commit to your own fork, open a PR and close it, and every + # run for the commit matches. So the run must also come from this PR's + # head repository. `gh run list` exposes neither head_repository nor + # the (fork-empty) pull_requests field, hence the raw API call. + gh api "repos/${GH_REPO}/actions/runs?event=pull_request&head_sha=${PR_SHA}&per_page=100" \ + --jq '.workflow_runs[] + | select(.head_repository.full_name == env.PR_REPO and .status != "completed") + | .id' \ + | while read -r id; do + # gh has no bulk cancel. A run that finishes between the listing + # and the cancel returns 409, which is not worth failing over. + if ! err=$(gh run cancel "$id" 2>&1); then + if echo "$err" | grep -Fq "HTTP 409"; then + echo "::warning::run $id was already finished" + else + echo "::error::Failed to cancel run $id: $err" + exit 1 + fi + fi + done diff --git a/.github/workflows/core-build-nopch.yml b/.github/workflows/core-build-nopch.yml index 0e8a26b66..68a4515e6 100644 --- a/.github/workflows/core-build-nopch.yml +++ b/.github/workflows/core-build-nopch.yml @@ -20,8 +20,9 @@ concurrency: # # - PRs use `refs/pull//merge`, so new commits cancel older # in-progress runs for the same PR. - # - When a PR is merged, a push to the target branch starts a new group, - # canceling any still-running PR CI. + # - A merge does NOT cancel the PR's own runs: this group is keyed on + # refs/pull//merge and the master push on refs/heads/master, so they + # never share a group. See the cancel-pr-runs-on-close workflow. # - Branch pushes are isolated by ref. group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true diff --git a/.github/workflows/core-build-pch.yml b/.github/workflows/core-build-pch.yml index 2a8d27a01..e5a2af071 100644 --- a/.github/workflows/core-build-pch.yml +++ b/.github/workflows/core-build-pch.yml @@ -20,8 +20,9 @@ concurrency: # # - PRs use `refs/pull//merge`, so new commits cancel older # in-progress runs for the same PR. - # - When a PR is merged, a push to the target branch starts a new group, - # canceling any still-running PR CI. + # - A merge does NOT cancel the PR's own runs: this group is keyed on + # refs/pull//merge and the master push on refs/heads/master, so they + # never share a group. See the cancel-pr-runs-on-close workflow. # - Branch pushes are isolated by ref. group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true diff --git a/.github/workflows/core_modules_build.yml b/.github/workflows/core_modules_build.yml index 322c06385..d3f02d615 100644 --- a/.github/workflows/core_modules_build.yml +++ b/.github/workflows/core_modules_build.yml @@ -28,8 +28,9 @@ concurrency: # # - PRs use `refs/pull//merge`, so new commits cancel older # in-progress runs for the same PR. - # - When a PR is merged, a push to the target branch starts a new group, - # canceling any still-running PR CI. + # - A merge does NOT cancel the PR's own runs: this group is keyed on + # refs/pull//merge and the master push on refs/heads/master, so they + # never share a group. See the cancel-pr-runs-on-close workflow. # - Branch pushes are isolated by ref. group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true diff --git a/.github/workflows/docker_build.yml b/.github/workflows/docker_build.yml index 7263820e3..27334bf75 100644 --- a/.github/workflows/docker_build.yml +++ b/.github/workflows/docker_build.yml @@ -13,8 +13,9 @@ concurrency: # # - PRs use `refs/pull//merge`, so new commits cancel older # in-progress runs for the same PR. - # - When a PR is merged, a push to the target branch starts a new group, - # canceling any still-running PR CI. + # - A merge does NOT cancel the PR's own runs: this group is keyed on + # refs/pull//merge and the master push on refs/heads/master, so they + # never share a group. See the cancel-pr-runs-on-close workflow. # - Branch pushes are isolated by ref. group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true diff --git a/.github/workflows/tools_build.yml b/.github/workflows/tools_build.yml index dbd8eba50..75cb5fe2f 100644 --- a/.github/workflows/tools_build.yml +++ b/.github/workflows/tools_build.yml @@ -13,8 +13,9 @@ concurrency: # # - PRs use `refs/pull//merge`, so new commits cancel older # in-progress runs for the same PR. - # - When a PR is merged, a push to the target branch starts a new group, - # canceling any still-running PR CI. + # - A merge does NOT cancel the PR's own runs: this group is keyed on + # refs/pull//merge and the master push on refs/heads/master, so they + # never share a group. See the cancel-pr-runs-on-close workflow. # - Branch pushes are isolated by ref. group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true diff --git a/.github/workflows/windows_build.yml b/.github/workflows/windows_build.yml index 3f8f576e9..6bec39ac1 100644 --- a/.github/workflows/windows_build.yml +++ b/.github/workflows/windows_build.yml @@ -13,8 +13,9 @@ concurrency: # # - PRs use `refs/pull//merge`, so new commits cancel older # in-progress runs for the same PR. - # - When a PR is merged, a push to the target branch starts a new group, - # canceling any still-running PR CI. + # - A merge does NOT cancel the PR's own runs: this group is keyed on + # refs/pull//merge and the master push on refs/heads/master, so they + # never share a group. See the cancel-pr-runs-on-close workflow. # - Branch pushes are isolated by ref. group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true From 9e6803c1db42cfe08b295491c15fee0b83415fec Mon Sep 17 00:00:00 2001 From: sudlud Date: Tue, 21 Jul 2026 17:22:01 +0200 Subject: [PATCH 067/134] chore(CI): bump actions off the deprecated Node 20 runtime (#26720) Co-authored-by: Claude Opus 4.8 (1M context) --- .github/actions/linux-build/action.yml | 2 +- .github/workflows/codestyle.yml | 4 ++-- .github/workflows/core-build-nopch.yml | 2 +- .github/workflows/core-build-pch.yml | 2 +- .github/workflows/core_modules_build.yml | 2 +- .github/workflows/docker_build.yml | 4 ++-- .github/workflows/import_pending.yml | 2 +- .github/workflows/macos_build.yml | 4 ++-- .github/workflows/pr_labeler.yml | 4 ++-- .github/workflows/sql-codestyle.yml | 4 ++-- .github/workflows/tools_build.yml | 2 +- .github/workflows/windows_build.yml | 4 ++-- 12 files changed, 18 insertions(+), 18 deletions(-) diff --git a/.github/actions/linux-build/action.yml b/.github/actions/linux-build/action.yml index 2900e40d6..c607c6d02 100644 --- a/.github/actions/linux-build/action.yml +++ b/.github/actions/linux-build/action.yml @@ -50,7 +50,7 @@ runs: # walk back from the most-recent cache on this branch to progressively # broader fallbacks (branch -> pch variant -> modules variant -> compiler). - name: Cache - uses: actions/cache@v4 + uses: actions/cache@v6 with: path: ${{ github.workspace }}/var/ccache key: ccache:${{ runner.os }}:${{ inputs.CC }}_${{ inputs.CXX }}:${{ inputs.modules }}:pch=${{ inputs.pch }}:${{ github.ref_name }}-${{ github.run_id }} diff --git a/.github/workflows/codestyle.yml b/.github/workflows/codestyle.yml index 640d2d7b0..8eb7ccbfd 100644 --- a/.github/workflows/codestyle.yml +++ b/.github/workflows/codestyle.yml @@ -22,9 +22,9 @@ jobs: name: C++ if: github.repository == 'azerothcore/azerothcore-wotlk' && !github.event.pull_request.draft steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v7 - name: Setup python - uses: actions/setup-python@v5 + uses: actions/setup-python@v7 with: python-version: '3.10' - name: AzerothCore codestyle diff --git a/.github/workflows/core-build-nopch.yml b/.github/workflows/core-build-nopch.yml index 68a4515e6..a55e1a415 100644 --- a/.github/workflows/core-build-nopch.yml +++ b/.github/workflows/core-build-nopch.yml @@ -53,7 +53,7 @@ jobs: name: ${{ matrix.os }}-${{ matrix.compiler.CC }}-nopch if: github.repository == 'azerothcore/azerothcore-wotlk' && !github.event.pull_request.draft steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v7 - uses: ./.github/actions/linux-build with: CC: ${{ matrix.compiler.CC }} diff --git a/.github/workflows/core-build-pch.yml b/.github/workflows/core-build-pch.yml index e5a2af071..242473e78 100644 --- a/.github/workflows/core-build-pch.yml +++ b/.github/workflows/core-build-pch.yml @@ -49,7 +49,7 @@ jobs: name: ${{ matrix.os }}-${{ matrix.compiler.CC }}-pch if: github.repository == 'azerothcore/azerothcore-wotlk' && !github.event.pull_request.draft steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v7 - uses: ./.github/actions/linux-build with: CC: ${{ matrix.compiler.CC }} diff --git a/.github/workflows/core_modules_build.yml b/.github/workflows/core_modules_build.yml index d3f02d615..06dfa32c4 100644 --- a/.github/workflows/core_modules_build.yml +++ b/.github/workflows/core_modules_build.yml @@ -49,7 +49,7 @@ jobs: name: ${{ matrix.os }}-${{ matrix.compiler.CC }}-nopch-modules if: github.repository == 'azerothcore/azerothcore-wotlk' && !github.event.pull_request.draft steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v7 # This script installs a general list of modules to compile with # azerothcore. This is useful for ensuring that module compilation # functionality works. diff --git a/.github/workflows/docker_build.yml b/.github/workflows/docker_build.yml index 27334bf75..aa67ff903 100644 --- a/.github/workflows/docker_build.yml +++ b/.github/workflows/docker_build.yml @@ -41,7 +41,7 @@ jobs: sudo rm -rf /opt/ghc sudo rm -rf "$AGENT_TOOLSDIRECTORY" - - uses: actions/checkout@v4 + - uses: actions/checkout@v7 # The containers created in this workflow are used by # acore-docker, which has a dependency on mod-ale. @@ -50,7 +50,7 @@ jobs: # build them locally (such as with `docker compose build`) - name: Download Eluna if: github.repository == 'azerothcore/azerothcore-wotlk' && github.ref_name == 'master' - uses: actions/checkout@v4 + uses: actions/checkout@v7 with: repository: azerothcore/mod-ale path: modules/mod-ale diff --git a/.github/workflows/import_pending.yml b/.github/workflows/import_pending.yml index 7b21193b8..82ef5d771 100644 --- a/.github/workflows/import_pending.yml +++ b/.github/workflows/import_pending.yml @@ -12,7 +12,7 @@ jobs: permissions: write-all if: github.repository == 'azerothcore/azerothcore-wotlk' && !github.event.pull_request.draft steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v7 with: persist-credentials: false # If we're fetching all the history in a later step it makes sense to diff --git a/.github/workflows/macos_build.yml b/.github/workflows/macos_build.yml index cb0efefe8..702c2d208 100644 --- a/.github/workflows/macos_build.yml +++ b/.github/workflows/macos_build.yml @@ -32,9 +32,9 @@ jobs: && !github.event.pull_request.draft && (github.ref == 'refs/heads/master' || contains(github.event.pull_request.labels.*.name, 'run-build') || github.event.label.name == 'run-build') steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v7 - name: Cache - uses: actions/cache@v4 + uses: actions/cache@v6 with: path: ~/Library/Caches/ccache # Unique per run so the cache is re-saved every run instead of diff --git a/.github/workflows/pr_labeler.yml b/.github/workflows/pr_labeler.yml index 6e08bc4f6..3e1a23f85 100644 --- a/.github/workflows/pr_labeler.yml +++ b/.github/workflows/pr_labeler.yml @@ -9,10 +9,10 @@ jobs: permissions: write-all if: github.repository == 'azerothcore/azerothcore-wotlk' && !github.event.pull_request.draft steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v7 with: persist-credentials: true - - uses: actions/labeler@v5 + - uses: actions/labeler@v7 with: repo-token: ${{ secrets.GITHUB_TOKEN }} configuration-path: .github/labeler.yml diff --git a/.github/workflows/sql-codestyle.yml b/.github/workflows/sql-codestyle.yml index 809a58d12..f9dfedb7c 100644 --- a/.github/workflows/sql-codestyle.yml +++ b/.github/workflows/sql-codestyle.yml @@ -22,9 +22,9 @@ jobs: name: SQL if: github.repository == 'azerothcore/azerothcore-wotlk' && !github.event.pull_request.draft steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v7 - name: Setup python - uses: actions/setup-python@v5 + uses: actions/setup-python@v7 with: python-version: '3.10' - name: AzerothCore codestyle diff --git a/.github/workflows/tools_build.yml b/.github/workflows/tools_build.yml index 75cb5fe2f..6fc84922d 100644 --- a/.github/workflows/tools_build.yml +++ b/.github/workflows/tools_build.yml @@ -37,7 +37,7 @@ jobs: && !github.event.pull_request.draft && (github.ref == 'refs/heads/master' || contains(github.event.pull_request.labels.*.name, 'run-build') || github.event.label.name == 'run-build') steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v7 - uses: ./.github/actions/linux-build with: CC: ${{ matrix.compiler.CC }} diff --git a/.github/workflows/windows_build.yml b/.github/workflows/windows_build.yml index 6bec39ac1..c3ced4a4d 100644 --- a/.github/workflows/windows_build.yml +++ b/.github/workflows/windows_build.yml @@ -35,14 +35,14 @@ jobs: && !github.event.pull_request.draft && (github.ref == 'refs/heads/master' || contains(github.event.pull_request.labels.*.name, 'run-build') || github.event.label.name == 'run-build') steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v7 - name: ccache uses: hendrikmuhs/ccache-action@v1.2.13 # Cache the fetched Boost + MySQL client so we don't re-download ~350 MB # and re-run the Boost installer on every run. The Test-Path guards in # "Configure OS" short-circuit the install work when these are restored. - name: Cache Boost & MySQL - uses: actions/cache@v4 + uses: actions/cache@v6 with: path: | C:\local\boost_1_87_0 From 28db55efda9a0505f5fd1572a76eb1d1fd81da80 Mon Sep 17 00:00:00 2001 From: sudlud Date: Tue, 21 Jul 2026 18:28:09 +0200 Subject: [PATCH 068/134] fix(CI): stop dashboard ccache from freezing after the first run (#26718) Co-authored-by: Claude Opus 4.8 (1M context) --- .github/workflows/dashboard-ci.yml | 31 ++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/.github/workflows/dashboard-ci.yml b/.github/workflows/dashboard-ci.yml index 9e5ca3872..7de0875b0 100644 --- a/.github/workflows/dashboard-ci.yml +++ b/.github/workflows/dashboard-ci.yml @@ -20,8 +20,9 @@ concurrency: # # - PRs use `refs/pull//merge`, so new commits cancel older # in-progress runs for the same PR. - # - When a PR is merged, a push to the target branch starts a new group, - # canceling any still-running PR CI. + # - A merge does NOT cancel the PR's own runs: this group is keyed on + # refs/pull//merge and the master push on refs/heads/master, so they + # never share a group. # - Branch pushes are isolated by ref. group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true @@ -137,15 +138,23 @@ jobs: - name: Echo cache key shell: bash - run: echo "Cache key -> ccache:${{ runner.os }}:${{ steps.detect.outputs.cc_id }}_${{ steps.detect.outputs.cxx_id }}:${{ github.ref_name }}" + run: echo "Cache key -> ccache:${{ matrix.os }}:${{ steps.detect.outputs.cc_id }}_${{ steps.detect.outputs.cxx_id }}:${{ github.ref_name }}-${{ github.run_id }}" + # The primary key must be unique per run. A static key hits on itself from + # the second run onward and the save is then skipped, freezing the cache + # at its first-run contents. It is keyed on matrix.os rather than + # runner.os because both legs report Linux and share a run_id, so only the + # detected compiler would separate them. The first restore-key picks up + # the most recent cache for this leg on this ref; the rest keep runner.os + # because they are cross-workflow fallbacks to the linux-build action. - name: Restore ccache id: restore_ccache uses: actions/cache/restore@v4 with: path: ${{ github.workspace }}/var/ccache - key: ccache:${{ runner.os }}:${{ steps.detect.outputs.cc_id }}_${{ steps.detect.outputs.cxx_id }}:${{ github.ref_name }} + key: ccache:${{ matrix.os }}:${{ steps.detect.outputs.cc_id }}_${{ steps.detect.outputs.cxx_id }}:${{ github.ref_name }}-${{ github.run_id }} restore-keys: | + ccache:${{ matrix.os }}:${{ steps.detect.outputs.cc_id }}_${{ steps.detect.outputs.cxx_id }}:${{ github.ref_name }}- ccache:${{ runner.os }}:${{ steps.detect.outputs.cc_id }}_${{ steps.detect.outputs.cxx_id }}:true:pch=false: ccache:${{ runner.os }}:${{ steps.detect.outputs.cc_id }}_${{ steps.detect.outputs.cxx_id }}:false:pch=false: ccache:${{ runner.os }}:${{ steps.detect.outputs.cc_id }}_${{ steps.detect.outputs.cxx_id }}:true:pch=true: @@ -167,7 +176,7 @@ jobs: CCACHE_MAXSIZE=5G CCACHE_SLOPPINESS=pch_defines,time_macros,include_file_mtime CCACHE_COMPRESS=1 - CCACHE_COMPRESSLEVEL=9 + CCACHE_COMPRESSLEVEL=3 CCACHE_COMPILERCHECK=content CCACHE_LOGFILE=${{ github.workspace }}/var/ccache/cache.debug CMAKE_C_COMPILER_LAUNCHER=ccache @@ -273,13 +282,19 @@ jobs: timeout-minutes: 30 continue-on-error: false - # save only if we didn't hit the cache + # The old "only save on a cache miss" guard is dropped: the per-run key + # only ever collides on a re-run, since github.run_id is stable across + # attempts, and there the save is a no-op anyway. + # A failed build still compiled most of the tree and that work is worth + # keeping. A cancelled one is skipped so a superseded run cannot publish + # a half-populated cache as the newest for the ref, and a run that died + # before the restore has no compiler id and no ccache dir to save. - name: Save ccache - if: steps.restore_ccache.outputs.cache-hit != 'true' + if: ${{ !cancelled() && steps.restore_ccache.outcome == 'success' }} uses: actions/cache/save@v4 with: path: ${{ github.workspace }}/var/ccache - key: ccache:${{ runner.os }}:${{ steps.detect.outputs.cc_id }}_${{ steps.detect.outputs.cxx_id }}:${{ github.ref_name }} + key: ccache:${{ matrix.os }}:${{ steps.detect.outputs.cc_id }}_${{ steps.detect.outputs.cxx_id }}:${{ github.ref_name }}-${{ github.run_id }} - name: ccache stats (after) shell: bash From aaacfed02b549667d3d694c3999ce96a42be6a08 Mon Sep 17 00:00:00 2001 From: CarloHagens Date: Tue, 21 Jul 2026 22:07:18 +0200 Subject: [PATCH 069/134] fix(Scripts/NPC): Don't despawn Elder Clearwater (#26671) Co-authored-by: Claude Fable 5 --- src/server/scripts/World/npcs_special.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/server/scripts/World/npcs_special.cpp b/src/server/scripts/World/npcs_special.cpp index 0713d3600..94ffc122f 100644 --- a/src/server/scripts/World/npcs_special.cpp +++ b/src/server/scripts/World/npcs_special.cpp @@ -118,12 +118,6 @@ public: { sCreatureTextMgr->SendChat(me, CLEARWATER_SAY_END, 0, CHAT_MSG_MONSTER_YELL, LANG_UNIVERSAL, TEXT_RANGE_MAP); finishWarning = true; - // no one won - despawn - if (!finished) - { - me->DespawnOrUnsummon(); - break; - } } events.Repeat(1s); From a4ab07218aa0a7a4ff7b1a2c259bcead0bdfa61f Mon Sep 17 00:00:00 2001 From: glubbl Date: Wed, 22 Jul 2026 04:18:13 +0800 Subject: [PATCH 070/134] fix(Core/Player): learn higher-rank talent spells in all specs that have the talent (#23945) Co-authored-by: glubbl Co-authored-by: sudlud Co-authored-by: kclnn --- src/server/game/Entities/Player/Player.cpp | 47 ++++++++++++++++++++-- src/server/game/Entities/Player/Player.h | 2 + 2 files changed, 46 insertions(+), 3 deletions(-) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 635a65f12..5dc4d9ae9 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -3416,9 +3416,9 @@ void Player::learnSpell(uint32 spellId, bool temporary /*= false*/, bool learnFr return; } - uint32 firstRankSpellId = sSpellMgr->GetFirstSpellInChain(spellId); - bool thisSpec = GetTalentSpellCost(firstRankSpellId) > 0 || sSpellMgr->IsAdditionalTalentSpell(firstRankSpellId); - bool added = addSpell(spellId, thisSpec ? GetActiveSpecMask() : SPEC_MASK_ALL, true, temporary, learnFromSkill); + uint8 const specMask = GetLearnSpellSpecMask(spellId); + + bool const added = addSpell(spellId, specMask, true, temporary, learnFromSkill); if (added) { sScriptMgr->OnPlayerLearnSpell(this, spellId); @@ -3448,6 +3448,47 @@ void Player::learnSpell(uint32 spellId, bool temporary /*= false*/, bool learnFr } } +uint8 Player::GetLearnSpellSpecMask(uint32 spellId) const +{ + uint32 const firstRankSpellId = sSpellMgr->GetFirstSpellInChain(spellId); + + bool const isTalentBasedSpell = GetTalentSpellCost(firstRankSpellId) > 0 || sSpellMgr->IsAdditionalTalentSpell(firstRankSpellId); + + // If this spell doesn't require any talents, learn it in all talent specs + if (!isTalentBasedSpell) + return SPEC_MASK_ALL; + + uint8 specMask = GetActiveSpecMask(); + + // If the first rank of a talent-based spell has already been learned in another spec, + // the following ranks should also be learned in that spec. + if (m_spells.find(firstRankSpellId) != m_spells.end()) + { + specMask |= m_spells.at(firstRankSpellId)->specMask; + } + + // When learning a talent-based spell that has other spells as a requirement, it should not only be learned in the current spec, + // but also in all other specs that have the required spells. + // Example: Greater Blessing of Sanctuary has Blessing of Sanctuary as required spell. + auto const spellsRequiredForSpellBounds = sSpellMgr->GetSpellsRequiredForSpellBounds(spellId); + bool const spellHasRequiredSpells = (spellsRequiredForSpellBounds.begin() != spellsRequiredForSpellBounds.end()); + if (spellHasRequiredSpells) + { + uint8 requiredSpellsSpecMask = SPEC_MASK_ALL; + for (SpellRequiredMap::const_iterator itr = spellsRequiredForSpellBounds.begin(); itr != spellsRequiredForSpellBounds.end(); ++itr) + { + uint32 const requiredSpellId = itr->second; + bool const requiredSpellExistsAsPlayerSpell = (m_spells.find(requiredSpellId) != m_spells.end()); + + // The required spell should usually exist at least in the current spec, but maybe we are learning a spell via GM command + requiredSpellsSpecMask &= requiredSpellExistsAsPlayerSpell ? m_spells.at(requiredSpellId)->specMask : 0; + } + specMask |= requiredSpellsSpecMask; + } + + return specMask; +} + void Player::removeSpell(uint32 spell_id, uint8 removeSpecMask, bool onlyTemporary) { PlayerSpellMap::iterator itr = m_spells.find(spell_id); diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 20bf49b19..fe93e67b3 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -3010,6 +3010,8 @@ private: [[nodiscard]] bool HasDelayedTeleport() const { return m_bHasDelayedTeleport; } void SetHasDelayedTeleport(bool setting) { m_bHasDelayedTeleport = setting; } + uint8 GetLearnSpellSpecMask(uint32 spellId) const; + MapReference m_mapRef; void UpdateCharmedAI(); From 377c70f8fb105815ff07b2896671d58a8772a632 Mon Sep 17 00:00:00 2001 From: Gultask <100873791+Gultask@users.noreply.github.com> Date: Tue, 21 Jul 2026 22:34:53 -0300 Subject: [PATCH 071/134] fix(DB/SAI): Make Rescue OOX-17/TN! group-wide (#26722) Co-authored-by: Dan <83884799+elthehablo@users.noreply.github.com> --- data/sql/updates/pending_db_world/rev_1784673513118914800.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1784673513118914800.sql diff --git a/data/sql/updates/pending_db_world/rev_1784673513118914800.sql b/data/sql/updates/pending_db_world/rev_1784673513118914800.sql new file mode 100644 index 000000000..83b76dea8 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1784673513118914800.sql @@ -0,0 +1,2 @@ +-- +UPDATE `smart_scripts` SET `target_type` = 16 WHERE `entryorguid` = 778400 AND `source_type` = 9 AND `id` = 0; From 85cec302f5d8adf1828a49638341d96eca95cf76 Mon Sep 17 00:00:00 2001 From: Gultask <100873791+Gultask@users.noreply.github.com> Date: Tue, 21 Jul 2026 22:34:59 -0300 Subject: [PATCH 072/134] fix(DB/SAI): Make The Missing Diplomat (1249) group-wide (#26723) --- data/sql/updates/pending_db_world/rev_1784674046926366800.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1784674046926366800.sql diff --git a/data/sql/updates/pending_db_world/rev_1784674046926366800.sql b/data/sql/updates/pending_db_world/rev_1784674046926366800.sql new file mode 100644 index 000000000..6844b51ce --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1784674046926366800.sql @@ -0,0 +1,2 @@ +-- +UPDATE `smart_scripts` SET `target_type` = 16 WHERE `entryorguid` = 4963 AND `source_type` = 0 AND `id` = 3; From 815e04c3835f1aa962105457ce1535c563404de8 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 22 Jul 2026 01:36:18 +0000 Subject: [PATCH 073/134] chore(DB): import pending files Referenced commit(s): 377c70f8fb105815ff07b2896671d58a8772a632 --- .../rev_1784673513118914800.sql => db_world/2026_07_22_00.sql} | 1 + .../rev_1784674046926366800.sql => db_world/2026_07_22_01.sql} | 1 + 2 files changed, 2 insertions(+) rename data/sql/updates/{pending_db_world/rev_1784673513118914800.sql => db_world/2026_07_22_00.sql} (72%) rename data/sql/updates/{pending_db_world/rev_1784674046926366800.sql => db_world/2026_07_22_01.sql} (71%) diff --git a/data/sql/updates/pending_db_world/rev_1784673513118914800.sql b/data/sql/updates/db_world/2026_07_22_00.sql similarity index 72% rename from data/sql/updates/pending_db_world/rev_1784673513118914800.sql rename to data/sql/updates/db_world/2026_07_22_00.sql index 83b76dea8..50a8ba7a4 100644 --- a/data/sql/updates/pending_db_world/rev_1784673513118914800.sql +++ b/data/sql/updates/db_world/2026_07_22_00.sql @@ -1,2 +1,3 @@ +-- DB update 2026_07_21_02 -> 2026_07_22_00 -- UPDATE `smart_scripts` SET `target_type` = 16 WHERE `entryorguid` = 778400 AND `source_type` = 9 AND `id` = 0; diff --git a/data/sql/updates/pending_db_world/rev_1784674046926366800.sql b/data/sql/updates/db_world/2026_07_22_01.sql similarity index 71% rename from data/sql/updates/pending_db_world/rev_1784674046926366800.sql rename to data/sql/updates/db_world/2026_07_22_01.sql index 6844b51ce..a12619a2c 100644 --- a/data/sql/updates/pending_db_world/rev_1784674046926366800.sql +++ b/data/sql/updates/db_world/2026_07_22_01.sql @@ -1,2 +1,3 @@ +-- DB update 2026_07_22_00 -> 2026_07_22_01 -- UPDATE `smart_scripts` SET `target_type` = 16 WHERE `entryorguid` = 4963 AND `source_type` = 0 AND `id` = 3; From 7402f1461a26a5e7bee3548fd2e73e3d40ea3a46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=98yvind=20Bertelsen?= Date: Wed, 22 Jul 2026 03:38:03 +0200 Subject: [PATCH 074/134] fix(Core/Maps): don't block hard-reset and self-linked creatures from respawning (#26729) Co-authored-by: Claude Fable 5 --- src/server/game/Maps/Map.cpp | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index cb9056d0a..d5563c6b8 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -2792,14 +2792,20 @@ void Map::ProcessCreatureRespawn(ObjectGuid::LowType spawnId) } // Check linked_respawn: don't spawn if the master creature is still dead. - // This mirrors the check in Creature::Respawn() for compat-mode creatures. + // This mirrors the check in Creature::Respawn() for compat-mode creatures: + // hard-reset creatures bypass it (they despawn on evade and must always + // come back), and a creature linked to itself never auto-respawns. ObjectGuid dbtableHighGuid = ObjectGuid::Create(data->id, spawnId); time_t linkedRespawntime = GetLinkedRespawnTime(dbtableHighGuid); - if (linkedRespawntime) + CreatureTemplate const* cInfo = sObjectMgr->GetCreatureTemplate(data->id); + if (linkedRespawntime && !(cInfo && cInfo->HasFlagsExtra(CREATURE_FLAG_EXTRA_HARD_RESET))) { - // Master is still dead; re-queue at the master's respawn time + a small offset. time_t now = GameTime::GetGameTime().count(); - time_t newRespawnTime = (now > linkedRespawntime ? now : linkedRespawntime) + urand(5, MINUTE); + time_t newRespawnTime; + if (sObjectMgr->GetLinkedRespawnGuid(dbtableHighGuid) == dbtableHighGuid) + newRespawnTime = now + DAY; // if linking self, never respawn (check delayed to next day) + else + newRespawnTime = (now > linkedRespawntime ? now : linkedRespawntime) + urand(5, MINUTE); // master is still dead; re-queue at the master's respawn time + a small offset SaveCreatureRespawnTime(spawnId, newRespawnTime); return; } From ec52a3294ae653a507ead3680f6286ef8d16eafd Mon Sep 17 00:00:00 2001 From: sudlud Date: Wed, 22 Jul 2026 07:11:03 +0200 Subject: [PATCH 075/134] fix(CI): let dashboard PR runs inherit master's ccache again (#26721) Co-authored-by: Claude Opus 4.8 (1M context) --- .github/workflows/dashboard-ci.yml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/.github/workflows/dashboard-ci.yml b/.github/workflows/dashboard-ci.yml index 7de0875b0..263ea07a6 100644 --- a/.github/workflows/dashboard-ci.yml +++ b/.github/workflows/dashboard-ci.yml @@ -145,8 +145,13 @@ jobs: # at its first-run contents. It is keyed on matrix.os rather than # runner.os because both legs report Linux and share a run_id, so only the # detected compiler would separate them. The first restore-key picks up - # the most recent cache for this leg on this ref; the rest keep runner.os - # because they are cross-workflow fallbacks to the linux-build action. + # the most recent cache for this leg on this ref; the second the most + # recent on any ref the run can reach, which is its own and the base + # branch, and is how a first run inherits master's. Both must use + # matrix.os to stay in the key's namespace. + # The runner.os entries below reach the linux-build action's caches, but + # only on the 24.04 leg: on 26.04 this workflow detects clang-21 while + # linux-build is passed clang-20, so nothing there lines up. - name: Restore ccache id: restore_ccache uses: actions/cache/restore@v4 @@ -155,6 +160,7 @@ jobs: key: ccache:${{ matrix.os }}:${{ steps.detect.outputs.cc_id }}_${{ steps.detect.outputs.cxx_id }}:${{ github.ref_name }}-${{ github.run_id }} restore-keys: | ccache:${{ matrix.os }}:${{ steps.detect.outputs.cc_id }}_${{ steps.detect.outputs.cxx_id }}:${{ github.ref_name }}- + ccache:${{ matrix.os }}:${{ steps.detect.outputs.cc_id }}_${{ steps.detect.outputs.cxx_id }}: ccache:${{ runner.os }}:${{ steps.detect.outputs.cc_id }}_${{ steps.detect.outputs.cxx_id }}:true:pch=false: ccache:${{ runner.os }}:${{ steps.detect.outputs.cc_id }}_${{ steps.detect.outputs.cxx_id }}:false:pch=false: ccache:${{ runner.os }}:${{ steps.detect.outputs.cc_id }}_${{ steps.detect.outputs.cxx_id }}:true:pch=true: From 6fc8ef599d06aedd75046697a4e7bd372891f34f Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Wed, 22 Jul 2026 07:40:43 -0300 Subject: [PATCH 076/134] fix(Scripts/CoS): despawn Arthas summons on death (#26731) --- .../CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp index 844028f34..b2ab68fbd 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp @@ -409,6 +409,7 @@ public: void JustDied(Unit*) override { + summons.DespawnAll(); RemoveEscortState(STATE_ESCORT_ESCORTING); if (pInstance) pInstance->SetData(DATA_ARTHAS_REPOSITION, 2); From 3e741cc44f14613f7628a8287ec2914da3b34ac9 Mon Sep 17 00:00:00 2001 From: Ryan Turner <16946913+TheSCREWEDSoftware@users.noreply.github.com> Date: Wed, 22 Jul 2026 11:45:16 +0100 Subject: [PATCH 077/134] feat(Scripts/Commands): Allow quest status to be used for offline players (#25816) Co-authored-by: FlyingArowana Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> Co-authored-by: Skjalf <47818697+Nyeriah@users.noreply.github.com> --- .../Implementation/CharacterDatabase.cpp | 3 + .../Implementation/CharacterDatabase.h | 3 + src/server/scripts/Commands/cs_quest.cpp | 77 ++++++++++++------- 3 files changed, 56 insertions(+), 27 deletions(-) diff --git a/src/server/database/Database/Implementation/CharacterDatabase.cpp b/src/server/database/Database/Implementation/CharacterDatabase.cpp index 939dd0919..829a96197 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/database/Database/Implementation/CharacterDatabase.cpp @@ -523,6 +523,9 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_UPD_CHAR_QUESTSTATUS_REWARDED_FACTION_CHANGE, "UPDATE character_queststatus_rewarded SET quest = ? WHERE quest = ? AND guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_UPD_CHAR_QUESTSTATUS_REWARDED_ACTIVE, "UPDATE character_queststatus_rewarded SET active = 1 WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_UPD_CHAR_QUESTSTATUS_REWARDED_ACTIVE_BY_QUEST, "UPDATE character_queststatus_rewarded SET active = 0 WHERE quest = ? AND guid = ?", CONNECTION_ASYNC); + PrepareStatement(CHAR_SEL_CHAR_QUESTSTATUS_BY_QUEST, "SELECT status FROM character_queststatus WHERE guid = ? AND quest = ?", CONNECTION_SYNCH); + PrepareStatement(CHAR_SEL_CHAR_QUESTSTATUS_SEASONAL_BY_QUEST, "SELECT 1 FROM character_queststatus_seasonal WHERE guid = ? AND quest = ? AND event = ?", CONNECTION_SYNCH); + PrepareStatement(CHAR_SEL_CHAR_QUESTSTATUS_REWARDED_BY_QUEST, "SELECT 1 FROM character_queststatus_rewarded WHERE guid = ? AND quest = ? AND active = 1", CONNECTION_SYNCH); PrepareStatement(CHAR_DEL_CHAR_SKILL_BY_SKILL, "DELETE FROM character_skills WHERE guid = ? AND skill = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_INS_CHAR_SKILLS, "INSERT INTO character_skills (guid, skill, value, max) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_UDP_CHAR_SKILLS, "UPDATE character_skills SET value = ?, max = ? WHERE guid = ? AND skill = ?", CONNECTION_ASYNC); diff --git a/src/server/database/Database/Implementation/CharacterDatabase.h b/src/server/database/Database/Implementation/CharacterDatabase.h index 666be5255..0ca6e40c9 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.h +++ b/src/server/database/Database/Implementation/CharacterDatabase.h @@ -446,6 +446,9 @@ enum CharacterDatabaseStatements : uint32 CHAR_UPD_CHAR_QUESTSTATUS_REWARDED_FACTION_CHANGE, CHAR_UPD_CHAR_QUESTSTATUS_REWARDED_ACTIVE, CHAR_UPD_CHAR_QUESTSTATUS_REWARDED_ACTIVE_BY_QUEST, + CHAR_SEL_CHAR_QUESTSTATUS_BY_QUEST, + CHAR_SEL_CHAR_QUESTSTATUS_SEASONAL_BY_QUEST, + CHAR_SEL_CHAR_QUESTSTATUS_REWARDED_BY_QUEST, CHAR_DEL_CHAR_SKILL_BY_SKILL, CHAR_INS_CHAR_SKILLS, CHAR_UDP_CHAR_SKILLS, diff --git a/src/server/scripts/Commands/cs_quest.cpp b/src/server/scripts/Commands/cs_quest.cpp index bc1faf49b..8f7063665 100644 --- a/src/server/scripts/Commands/cs_quest.cpp +++ b/src/server/scripts/Commands/cs_quest.cpp @@ -729,6 +729,25 @@ public: return true; } + static char const* QuestStatusToString(QuestStatus status) + { + switch (status) + { + case QUEST_STATUS_NONE: + return "Not Taken"; + case QUEST_STATUS_COMPLETE: + return "Complete"; + case QUEST_STATUS_INCOMPLETE: + return "Incomplete"; + case QUEST_STATUS_FAILED: + return "Failed"; + case QUEST_STATUS_REWARDED: + return "Rewarded"; + default: + return "Unknown"; + } + } + static bool HandleQuestStatus(ChatHandler* handler, Quest const* quest, Optional playerTarget) { if (!playerTarget) @@ -741,33 +760,10 @@ public: } uint32 entry = quest->GetQuestId(); - std::string status; + if (Player* player = playerTarget->GetConnectedPlayer()) { - QuestStatus qs = player->GetQuestStatus(entry); - switch (qs) - { - case QUEST_STATUS_NONE: - status = "Not Taken"; - break; - case QUEST_STATUS_COMPLETE: - status = "Complete"; - break; - case QUEST_STATUS_INCOMPLETE: - status = "Incomplete"; - break; - case QUEST_STATUS_FAILED: - status = "Failed"; - break; - case QUEST_STATUS_REWARDED: - status = "Rewarded"; - break; - default: - status = "Unknown"; - break; - } - - handler->PSendSysMessage(LANG_CMD_QUEST_STATUS, quest->GetTitle(), entry, status); + handler->PSendSysMessage(LANG_CMD_QUEST_STATUS, quest->GetTitle(), entry, QuestStatusToString(player->GetQuestStatus(entry))); if (!player->CanTakeQuest(quest, false)) { @@ -846,8 +842,35 @@ public: } else { - handler->SendErrorMessage(LANG_PLAYER_NOT_FOUND); - return false; + ObjectGuid::LowType guid = playerTarget->GetGUID().GetCounter(); + char const* status; + + CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_QUESTSTATUS_BY_QUEST); + stmt->SetData(0, guid); + stmt->SetData(1, entry); + + if (PreparedQueryResult result = CharacterDatabase.Query(stmt)) + status = QuestStatusToString(QuestStatus(result->Fetch()[0].Get())); + else if (quest->IsSeasonal()) + { + stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_QUESTSTATUS_SEASONAL_BY_QUEST); + stmt->SetData(0, guid); + stmt->SetData(1, entry); + stmt->SetData(2, quest->GetEventIdForQuest()); + status = CharacterDatabase.Query(stmt) ? "Rewarded" : "Not Taken"; + } + // rewarded repeatable quests report Not Taken, matching Player::GetQuestStatus + else if (!quest->IsRepeatable()) + { + stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_QUESTSTATUS_REWARDED_BY_QUEST); + stmt->SetData(0, guid); + stmt->SetData(1, entry); + status = CharacterDatabase.Query(stmt) ? "Rewarded" : "Not Taken"; + } + else + status = "Not Taken"; + + handler->PSendSysMessage(LANG_CMD_QUEST_STATUS, quest->GetTitle(), entry, status); } return true; From 007f866cbf44d49af6f2c3955d3677bca8ad0a55 Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Wed, 22 Jul 2026 09:07:02 -0300 Subject: [PATCH 078/134] fix(Core/Movement): let melee pets attack targets whose chase point is unpathable (#26726) --- .../TargetedMovementGenerator.cpp | 41 +++++++++++++++---- 1 file changed, 33 insertions(+), 8 deletions(-) diff --git a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp index 188578ea0..1747d75c3 100644 --- a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp @@ -104,15 +104,40 @@ bool ChaseMovementGenerator::DispatchSplineToPosition(T* owner, float x, floa if (owner->IsHovering()) owner->UpdateAllowedPositionZ(x, y, z); - bool success = i_path->CalculatePath(x, y, z, forceDest); - uint32 pathType = i_path->GetPathType(); - bool pathFailed = !success || (pathType & PATHFIND_NOPATH); + auto isPathUsable = [&]() + { + uint32 pathType = i_path->GetPathType(); + if (pathType & PATHFIND_NOPATH) + return false; - // For pets, treat incomplete paths as failures to avoid clipping through geometry - // Players and Player-controlled units have more erratic movement, skip failure - if (cOwner && (cOwner->IsPet() || cOwner->IsControlledByPlayer()) && !GetTarget()->IsCharmedOwnedByPlayerOrPlayer()) - if (pathType & PATHFIND_INCOMPLETE) - pathFailed = true; + // For pets, treat incomplete paths as failures to avoid clipping through geometry + // Players and Player-controlled units have more erratic movement, skip failure + if (cOwner && (cOwner->IsPet() || cOwner->IsControlledByPlayer()) + && !GetTarget()->IsCharmedOwnedByPlayerOrPlayer()) + if (pathType & PATHFIND_INCOMPLETE) + return false; + + return true; + }; + + bool pathFailed = !i_path->CalculatePath(x, y, z, forceDest) || !isPathUsable(); + + // Targets with an oversized combat reach can stand entirely over unwalkable space + // (e.g. Kologarn) so pathing to their center or to an angled near point (pets chase + // to behind the target, which may hang over the void) fails even though the melee + // ring covers the navmesh. Retry against the nearest point on the ring, ignoring the + // chase angle, via GetNearPoint2D: GetNearPoint's LoS repositioning must be avoided + // here, it can rotate the point to the far side of the target. + if (pathFailed && (!_range || _range->MaxRange <= CONTACT_DISTANCE) + && !GetTarget()->IsCharmedOwnedByPlayerOrPlayer() && GetTarget()->GetCombatReach() > NOMINAL_MELEE_RANGE) + { + GetTarget()->GetNearPoint2D(owner, x, y, 0.0f, GetTarget()->GetAngle(owner)); + z = GetTarget()->GetPositionZ(); + owner->UpdateAllowedPositionZ(x, y, z); + pathFailed = !i_path->CalculatePath(x, y, z, forceDest) || !isPathUsable(); + // the destination already lies on the melee ring, nothing to cut + cutPath = false; + } if (pathFailed) { From f27db73460e267b58efb8720543b24fddfe5d56f Mon Sep 17 00:00:00 2001 From: Vox Date: Wed, 22 Jul 2026 12:18:10 -0400 Subject: [PATCH 079/134] fix(db/Creature): Ebon Hold Ambient Improvements Part 4: Knight of the Ebon Blade Fliers (#26676) --- .../rev_1784385221436876900.sql | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1784385221436876900.sql diff --git a/data/sql/updates/pending_db_world/rev_1784385221436876900.sql b/data/sql/updates/pending_db_world/rev_1784385221436876900.sql new file mode 100644 index 000000000..0aa581b1b --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1784385221436876900.sql @@ -0,0 +1,62 @@ +-- -------------------------------------------------------------------------------------------- +-- Acherus: The Ebon Hold (Eastern Plaguelands, map 0) +-- Ebon Hold Re-haul Part 4: Knight of the Ebon Blade Fliers +-- NPC Updates, waypoints, etc +-- ------------------------------------------- +-- Knight of the Ebon Blade (Entry 29202, GUIDs 125724 and 125726) +-- Set SAI for 29202; set 'CanFly' flags due to AzerothCore limitation (can't set per-guid) +UPDATE `creature_template` SET `AIName` = 'SmartAI', `flags_extra` = `flags_extra` |512 WHERE `entry` = 29202; +-- Flight Waypoints +DELETE FROM `waypoint_data` WHERE (`id` IN (1257240, 1257260)); +INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`, `velocity`, `smoothTransition`) VALUES +(1257240, 1, 2329.3564, -5658.356, 388.62885, NULL, 7400, 3, 0, 100, 0, 2.5, 0), +(1257240, 2, 2319.1614, -5657.183, 386.93494, NULL, 0, 3, 0, 100, 0, 11.2, 1), +(1257240, 3, 2307.284, -5650.997, 386.93494, NULL, 0, 3, 0, 100, 0, 11.2, 1), +(1257240, 4, 2301.35, -5635.033, 380.87967, NULL, 0, 3, 0, 100, 0, 11.2, 1), +(1257240, 5, 2322.1697, -5569.3086, 350.82324, NULL, 0, 3, 0, 100, 0, 11.2, 1), +(1257240, 6, 2338.373, -5510.7095, 352.2416, NULL, 0, 3, 0, 100, 0, 11.2, 1), +(1257240, 7, 2361.3696, -5470.4307, 352.76913, NULL, 0, 3, 0, 100, 0, 11.2, 1), +(1257240, 8, 2446.082, -5442.422, 350.90756, NULL, 0, 3, 0, 100, 0, 11.2, 1), +(1257240, 9, 2515.6255, -5450.3584, 356.76846, NULL, 0, 3, 0, 100, 0, 11.2, 1), +(1257240, 10, 2588.6985, -5507.009, 359.1858, NULL, 0, 3, 0, 100, 0, 11.2, 1), +(1257240, 11, 2503.0312, -5580.3525, 332.79803, NULL, 0, 3, 0, 100, 0, 11.2, 1), +(1257240, 12, 2374.0864, -5671.5815, 340.68686, NULL, 0, 3, 0, 100, 0, 11.2, 1), +(1257240, 13, 2320.237, -5695.78, 343.4362, NULL, 0, 3, 0, 100, 0, 11.2, 1), +(1257240, 14, 2332.0254, -5686.1157, 350.9917, NULL, 2700, 3, 0, 100, 0, 11.2, 1), +(1257240, 15, 2333.1387, -5680.5825, 390.14697, NULL, 0, 3, 0, 100, 0, 8, 0), +(1257240, 16, 2323.3472, -5656.067, 383.39368, 6.248, 2000, 3, 0, 100, 0, 8, 0), +(1257240, 17, 2323.633, -5656.0771, 382.39368, 6.248, 0, 2, 0, 100, 0, 2.5, 0), +(1257260, 1, 2329.3564, -5658.356, 388.62885, NULL, 7400, 3, 0, 100, 0, 2.5, 0), +(1257260, 2, 2319.1614, -5657.183, 386.93494, NULL, 0, 3, 0, 100, 0, 11.2, 1), +(1257260, 3, 2307.284, -5650.997, 386.93494, NULL, 0, 3, 0, 100, 0, 11.2, 1), +(1257260, 4, 2301.35, -5635.033, 380.87967, NULL, 0, 3, 0, 100, 0, 11.2, 1), +(1257260, 5, 2322.1697, -5569.3086, 350.82324, NULL, 0, 3, 0, 100, 0, 11.2, 1), +(1257260, 6, 2338.373, -5510.7095, 352.2416, NULL, 0, 3, 0, 100, 0, 11.2, 1), +(1257260, 7, 2361.3696, -5470.4307, 352.76913, NULL, 0, 3, 0, 100, 0, 11.2, 1), +(1257260, 8, 2446.082, -5442.422, 350.90756, NULL, 0, 3, 0, 100, 0, 11.2, 1), +(1257260, 9, 2515.6255, -5450.3584, 356.76846, NULL, 0, 3, 0, 100, 0, 11.2, 1), +(1257260, 10, 2588.6985, -5507.009, 359.1858, NULL, 0, 3, 0, 100, 0, 11.2, 1), +(1257260, 11, 2503.0312, -5580.3525, 332.79803, NULL, 0, 3, 0, 100, 0, 11.2, 1), +(1257260, 12, 2374.0864, -5671.5815, 340.68686, NULL, 0, 3, 0, 100, 0, 11.2, 1), +(1257260, 13, 2320.237, -5695.78, 343.4362, NULL, 0, 3, 0, 100, 0, 11.2, 1), +(1257260, 14, 2332.0254, -5686.1157, 350.9917, NULL, 2700, 3, 0, 100, 0, 11.2, 1), +(1257260, 15, 2333.1387, -5680.5825, 390.14697, NULL, 0, 3, 0, 100, 0, 8, 0), +(1257260, 16, 2325.7349, -5663.413, 383.39368, 0.384, 2000, 3, 0, 100, 0, 8, 0), +(1257260, 17, 2326.0001, -5663.3059, 382.39368, 0.384, 0, 2, 0, 100, 0, 2.5, 0); +-- Takeoff/landing sequences +DELETE FROM `smart_scripts` WHERE (`entryorguid` IN (-125724, -125726)) AND `source_type` = 0; +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`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(-125724, 0, 0, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Flyer 125724 - On Respawn - Set Fly Off (grounded)'), +(-125724, 0, 1, 2, 1, 0, 100, 0, 5000, 5000, 121600, 121600, 0, 60, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Flyer 125724 - OOC timer (~121.6s cadence) - Set Fly On (gravity disabled)'), +(-125724, 0, 2, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 67, 1, 500, 500, 0, 0, 100, 1, 0, 0, 0, 0, 0, 0, 0, 'Flyer 125724 - linked - Timed event (0.5s) before pathing'), +(-125724, 0, 3, 0, 59, 0, 100, 0, 1, 0, 0, 0, 0, 232, 1257240, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Flyer 125724 - timed event - Start flight path'), +(-125724, 0, 4, 5, 109, 0, 100, 0, 0, 0, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Flyer 125724 - Path Ended - Set Fly Off (land)'), +(-125724, 0, 5, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 67, 2, 1500, 1500, 0, 0, 100, 1, 0, 0, 0, 0, 0, 0, 0, 'Flyer 125724 - linked - Timed event (1.5s) so land settles before facing'), +(-125724, 0, 6, 0, 59, 0, 100, 0, 2, 0, 0, 0, 0, 66, 1, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 6.248, 'Flyer 125724 - timed event - Face spawn orientation (instant, explicit angle - home pos is mutated in flight)'), +(-125726, 0, 0, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Flyer 125726 - On Respawn - Set Fly Off (grounded)'), +(-125726, 0, 1, 2, 1, 0, 100, 0, 65750, 65750, 121600, 121600, 0, 60, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Flyer 125726 - OOC timer (~121.6s cadence, +60.75s offset) - Set Fly On (gravity disabled)'), +(-125726, 0, 2, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 67, 1, 500, 500, 0, 0, 100, 1, 0, 0, 0, 0, 0, 0, 0, 'Flyer 125726 - linked - Timed event (0.5s) before pathing'), +(-125726, 0, 3, 0, 59, 0, 100, 0, 1, 0, 0, 0, 0, 232, 1257260, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Flyer 125726 - timed event - Start flight path'), +(-125726, 0, 4, 5, 109, 0, 100, 0, 0, 0, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Flyer 125726 - Path Ended - Set Fly Off (land)'), +(-125726, 0, 5, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 67, 2, 1500, 1500, 0, 0, 100, 1, 0, 0, 0, 0, 0, 0, 0, 'Flyer 125726 - linked - Timed event (1.5s) so land settles before facing'), +(-125726, 0, 6, 0, 59, 0, 100, 0, 2, 0, 0, 0, 0, 66, 1, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0.384, 'Flyer 125726 - timed event - Face spawn orientation (instant, explicit angle - home pos is mutated in flight)'); From 279f618b2ab735d017e2f6097f42a193b4c2a388 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 22 Jul 2026 16:19:32 +0000 Subject: [PATCH 080/134] chore(DB): import pending files Referenced commit(s): f27db73460e267b58efb8720543b24fddfe5d56f --- .../rev_1784385221436876900.sql => db_world/2026_07_22_02.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1784385221436876900.sql => db_world/2026_07_22_02.sql} (99%) diff --git a/data/sql/updates/pending_db_world/rev_1784385221436876900.sql b/data/sql/updates/db_world/2026_07_22_02.sql similarity index 99% rename from data/sql/updates/pending_db_world/rev_1784385221436876900.sql rename to data/sql/updates/db_world/2026_07_22_02.sql index 0aa581b1b..1c6186661 100644 --- a/data/sql/updates/pending_db_world/rev_1784385221436876900.sql +++ b/data/sql/updates/db_world/2026_07_22_02.sql @@ -1,3 +1,4 @@ +-- DB update 2026_07_22_01 -> 2026_07_22_02 -- -------------------------------------------------------------------------------------------- -- Acherus: The Ebon Hold (Eastern Plaguelands, map 0) -- Ebon Hold Re-haul Part 4: Knight of the Ebon Blade Fliers From f70d9c5f518c9b60c9dbcb6a5bb3fa233cc0f53e Mon Sep 17 00:00:00 2001 From: zackchadwick <73787423+zackchadwick@users.noreply.github.com> Date: Wed, 22 Jul 2026 12:55:56 -0400 Subject: [PATCH 081/134] fix(DB/Loot): split Kel'Thuzad reference loot to pools (#26503) --- .../rev_1783316518108834675.sql | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1783316518108834675.sql diff --git a/data/sql/updates/pending_db_world/rev_1783316518108834675.sql b/data/sql/updates/pending_db_world/rev_1783316518108834675.sql new file mode 100644 index 000000000..17dc6ae01 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1783316518108834675.sql @@ -0,0 +1,25 @@ +-- Kel'Thuzad 25-player loot pool structure fix. + +UPDATE `creature_loot_template` SET `MinCount`=1, `MaxCount`=1 + WHERE `Entry`=30061 AND `Item`=1 AND `Reference`=34136; + +-- Pool A (5 items) +UPDATE `reference_loot_template` SET `GroupId`=1 WHERE `Entry`=34136 AND `Item`=40384; -- Betrayer of Humanity +UPDATE `reference_loot_template` SET `GroupId`=1 WHERE `Entry`=34136 AND `Item`=40387; -- Boundless Ambition +UPDATE `reference_loot_template` SET `GroupId`=1 WHERE `Entry`=34136 AND `Item`=40383; -- Calamity's Grasp +UPDATE `reference_loot_template` SET `GroupId`=1 WHERE `Entry`=34136 AND `Item`=40386; -- Sinister Revenge +UPDATE `reference_loot_template` SET `GroupId`=1 WHERE `Entry`=34136 AND `Item`=40385; -- Envoy of Mortality + +-- Pool B (5 items) +UPDATE `reference_loot_template` SET `GroupId`=2 WHERE `Entry`=34136 AND `Item`=40405; -- Cape of the Unworthy Wizard +UPDATE `reference_loot_template` SET `GroupId`=2 WHERE `Entry`=34136 AND `Item`=40403; -- Drape of the Deadly Foe +UPDATE `reference_loot_template` SET `GroupId`=2 WHERE `Entry`=34136 AND `Item`=40402; -- Last Laugh +UPDATE `reference_loot_template` SET `GroupId`=2 WHERE `Entry`=34136 AND `Item`=40401; -- Voice of Reason +UPDATE `reference_loot_template` SET `GroupId`=2 WHERE `Entry`=34136 AND `Item`=40400; -- Wall of Terror + +-- Pool C (5 items) +UPDATE `reference_loot_template` SET `GroupId`=3 WHERE `Entry`=34136 AND `Item`=40388; -- Journey's End +UPDATE `reference_loot_template` SET `GroupId`=3 WHERE `Entry`=34136 AND `Item`=40399; -- Signet of Manifested Pain +UPDATE `reference_loot_template` SET `GroupId`=3 WHERE `Entry`=34136 AND `Item`=40395; -- Torch of Holy Fire +UPDATE `reference_loot_template` SET `GroupId`=3 WHERE `Entry`=34136 AND `Item`=40398; -- Leggings of Mortal Arrogance +UPDATE `reference_loot_template` SET `GroupId`=3 WHERE `Entry`=34136 AND `Item`=40396; -- The Turning Tide From 8a9ffffa2eb64f9cc08318a7e95b564fc336254a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 22 Jul 2026 16:57:09 +0000 Subject: [PATCH 082/134] chore(DB): import pending files Referenced commit(s): f70d9c5f518c9b60c9dbcb6a5bb3fa233cc0f53e --- .../rev_1783316518108834675.sql => db_world/2026_07_22_03.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1783316518108834675.sql => db_world/2026_07_22_03.sql} (97%) diff --git a/data/sql/updates/pending_db_world/rev_1783316518108834675.sql b/data/sql/updates/db_world/2026_07_22_03.sql similarity index 97% rename from data/sql/updates/pending_db_world/rev_1783316518108834675.sql rename to data/sql/updates/db_world/2026_07_22_03.sql index 17dc6ae01..6417964ab 100644 --- a/data/sql/updates/pending_db_world/rev_1783316518108834675.sql +++ b/data/sql/updates/db_world/2026_07_22_03.sql @@ -1,3 +1,4 @@ +-- DB update 2026_07_22_02 -> 2026_07_22_03 -- Kel'Thuzad 25-player loot pool structure fix. UPDATE `creature_loot_template` SET `MinCount`=1, `MaxCount`=1 From 4e74894fd6699a5ff03c6a414de113fa4a3931a3 Mon Sep 17 00:00:00 2001 From: zackchadwick <73787423+zackchadwick@users.noreply.github.com> Date: Wed, 22 Jul 2026 12:59:16 -0400 Subject: [PATCH 083/134] fix(DB/Creature): Patchwork Golem, Bile Retcher, Sludge Belcher stun fix (#26502) --- data/sql/updates/pending_db_world/rev_1783313468278760539.sql | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1783313468278760539.sql diff --git a/data/sql/updates/pending_db_world/rev_1783313468278760539.sql b/data/sql/updates/pending_db_world/rev_1783313468278760539.sql new file mode 100644 index 000000000..efd98262f --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1783313468278760539.sql @@ -0,0 +1,3 @@ +-- Set Patchwork Golem and Bile Retcher stun immunity and Sludge Belcher stunnable for Naxxramas 10/25. +UPDATE `creature_template` SET `CreatureImmunitiesId` = -405 WHERE `entry` IN (16017, 16018, 29347, 29353); +UPDATE `creature_template` SET `CreatureImmunitiesId` = -93 WHERE `entry` IN (16029, 29356); From ecbc8a54acd3878d7de3b53c1d28db6f99d0ab04 Mon Sep 17 00:00:00 2001 From: zackchadwick <73787423+zackchadwick@users.noreply.github.com> Date: Wed, 22 Jul 2026 12:59:32 -0400 Subject: [PATCH 084/134] fix(DB/Spell): allow Majestic Dragon Figurine to proc from instant HoTs (#26495) --- data/sql/updates/pending_db_world/rev_1783282369115589549.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1783282369115589549.sql diff --git a/data/sql/updates/pending_db_world/rev_1783282369115589549.sql b/data/sql/updates/pending_db_world/rev_1783282369115589549.sql new file mode 100644 index 000000000..cac02aa18 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1783282369115589549.sql @@ -0,0 +1,2 @@ +-- Majestic Dragon Figurine (60524): allow instant HoT casts to trigger the item proc. +UPDATE `spell_proc` SET `SpellTypeMask` = 7 WHERE `SpellId` = 60524; From 9b05c8e9926a29d9cdb44171510aba055095ef44 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 22 Jul 2026 17:00:26 +0000 Subject: [PATCH 085/134] chore(DB): import pending files Referenced commit(s): 4e74894fd6699a5ff03c6a414de113fa4a3931a3 --- .../rev_1783282369115589549.sql => db_world/2026_07_22_04.sql} | 1 + .../rev_1783313468278760539.sql => db_world/2026_07_22_05.sql} | 1 + 2 files changed, 2 insertions(+) rename data/sql/updates/{pending_db_world/rev_1783282369115589549.sql => db_world/2026_07_22_04.sql} (78%) rename data/sql/updates/{pending_db_world/rev_1783313468278760539.sql => db_world/2026_07_22_05.sql} (87%) diff --git a/data/sql/updates/pending_db_world/rev_1783282369115589549.sql b/data/sql/updates/db_world/2026_07_22_04.sql similarity index 78% rename from data/sql/updates/pending_db_world/rev_1783282369115589549.sql rename to data/sql/updates/db_world/2026_07_22_04.sql index cac02aa18..ac136d004 100644 --- a/data/sql/updates/pending_db_world/rev_1783282369115589549.sql +++ b/data/sql/updates/db_world/2026_07_22_04.sql @@ -1,2 +1,3 @@ +-- DB update 2026_07_22_03 -> 2026_07_22_04 -- Majestic Dragon Figurine (60524): allow instant HoT casts to trigger the item proc. UPDATE `spell_proc` SET `SpellTypeMask` = 7 WHERE `SpellId` = 60524; diff --git a/data/sql/updates/pending_db_world/rev_1783313468278760539.sql b/data/sql/updates/db_world/2026_07_22_05.sql similarity index 87% rename from data/sql/updates/pending_db_world/rev_1783313468278760539.sql rename to data/sql/updates/db_world/2026_07_22_05.sql index efd98262f..9f8865705 100644 --- a/data/sql/updates/pending_db_world/rev_1783313468278760539.sql +++ b/data/sql/updates/db_world/2026_07_22_05.sql @@ -1,3 +1,4 @@ +-- DB update 2026_07_22_04 -> 2026_07_22_05 -- Set Patchwork Golem and Bile Retcher stun immunity and Sludge Belcher stunnable for Naxxramas 10/25. UPDATE `creature_template` SET `CreatureImmunitiesId` = -405 WHERE `entry` IN (16017, 16018, 29347, 29353); UPDATE `creature_template` SET `CreatureImmunitiesId` = -93 WHERE `entry` IN (16029, 29356); From 106bae8a147097cee92db66a5ae3875656a59fc2 Mon Sep 17 00:00:00 2001 From: sogladev Date: Wed, 22 Jul 2026 19:01:53 +0200 Subject: [PATCH 086/134] fix(DB/Immunities): Set Difficulty Immunities to that of Base Template (#26465) --- .../rev_1783180582875265043.sql | 605 ++++++++++++++++++ 1 file changed, 605 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1783180582875265043.sql diff --git a/data/sql/updates/pending_db_world/rev_1783180582875265043.sql b/data/sql/updates/pending_db_world/rev_1783180582875265043.sql new file mode 100644 index 000000000..6feddd737 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1783180582875265043.sql @@ -0,0 +1,605 @@ +-- Update creature_template.CreatureImmunitiesId for difficulty entries +-- Onyxia (base 10184), difficulty_entry_1 (36538) +UPDATE `creature_template` SET `CreatureImmunitiesId` = -362 WHERE `entry` = 10184; +-- Morloch (base 11657) -> difficulty_entry_1 (22685) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 22685; +-- Morloch (base 11657) -> difficulty_entry_2 (32045) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 32045; +-- Morloch (base 11657) -> difficulty_entry_3 (37366) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 37366; +-- Taskmaster Snivvle (base 11677) -> difficulty_entry_1 (22694) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 22694; +-- Taskmaster Snivvle (base 11677) -> difficulty_entry_2 (32110) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 32110; +-- Taskmaster Snivvle (base 11677) -> difficulty_entry_3 (37431) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 37431; +-- Stormpike Quartermaster (base 12096) -> difficulty_entry_1 (22658) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 22658; +-- Stormpike Quartermaster (base 12096) -> difficulty_entry_2 (32099) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 32099; +-- Stormpike Quartermaster (base 12096) -> difficulty_entry_3 (37420) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 37420; +-- Frostwolf Quartermaster (base 12097) -> difficulty_entry_1 (22648) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 22648; +-- Frostwolf Quartermaster (base 12097) -> difficulty_entry_2 (31986) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 31986; +-- Frostwolf Quartermaster (base 12097) -> difficulty_entry_3 (37305) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 37305; +-- Onyxian Warder (base 12129) -> difficulty_entry_1 (36572) 0 -> -273 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -273 WHERE `entry` = 36572; +-- Korrak the Bloodrager (base 12159) -> difficulty_entry_1 (22643) 0 -> -406 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -406 WHERE `entry` = 22643; +-- Korrak the Bloodrager (base 12159) -> difficulty_entry_2 (32027) 0 -> -406 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -406 WHERE `entry` = 32027; +-- Korrak the Bloodrager (base 12159) -> difficulty_entry_3 (37347) 0 -> -406 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -406 WHERE `entry` = 37347; +-- Umi Thorson (base 13078) -> difficulty_entry_1 (22696) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 22696; +-- Umi Thorson (base 13078) -> difficulty_entry_2 (32119) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 32119; +-- Umi Thorson (base 13078) -> difficulty_entry_3 (37442) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 37442; +-- Keetar (base 13079) -> difficulty_entry_1 (22683) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 22683; +-- Keetar (base 13079) -> difficulty_entry_2 (32026) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 32026; +-- Keetar (base 13079) -> difficulty_entry_3 (37346) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 37346; +-- Aggi Rumblestomp (base 13086) -> difficulty_entry_1 (22670) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 22670; +-- Aggi Rumblestomp (base 13086) -> difficulty_entry_2 (31918) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 31918; +-- Aggi Rumblestomp (base 13086) -> difficulty_entry_3 (37234) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 37234; +-- Masha Swiftcut (base 13088) -> difficulty_entry_1 (22684) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 22684; +-- Masha Swiftcut (base 13088) -> difficulty_entry_2 (32043) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 32043; +-- Masha Swiftcut (base 13088) -> difficulty_entry_3 (37364) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 37364; +-- Alliance Spirit Guide (base 13116) -> difficulty_entry_1 (22526) 0 -> -421 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -421 WHERE `entry` = 22526; +-- Alliance Spirit Guide (base 13116) -> difficulty_entry_2 (31920) 0 -> -421 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -421 WHERE `entry` = 31920; +-- Alliance Spirit Guide (base 13116) -> difficulty_entry_3 (37236) 0 -> -421 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -421 WHERE `entry` = 37236; +-- Horde Spirit Guide (base 13117) -> difficulty_entry_1 (22558) 0 -> -421 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -421 WHERE `entry` = 22558; +-- Horde Spirit Guide (base 13117) -> difficulty_entry_2 (32004) 0 -> -421 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -421 WHERE `entry` = 32004; +-- Horde Spirit Guide (base 13117) -> difficulty_entry_3 (37323) 0 -> -421 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -421 WHERE `entry` = 37323; +-- Lieutenant Rugba (base 13137) -> difficulty_entry_1 (22707) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 22707; +-- Lieutenant Rugba (base 13137) -> difficulty_entry_2 (32038) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 32038; +-- Lieutenant Rugba (base 13137) -> difficulty_entry_3 (37358) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 37358; +-- Lieutenant Spencer (base 13138) -> difficulty_entry_1 (22708) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 22708; +-- Lieutenant Spencer (base 13138) -> difficulty_entry_2 (32039) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 32039; +-- Lieutenant Spencer (base 13138) -> difficulty_entry_3 (37359) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 37359; +-- Commander Randolph (base 13139) -> difficulty_entry_1 (22620) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 22620; +-- Commander Randolph (base 13139) -> difficulty_entry_2 (31959) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 31959; +-- Commander Randolph (base 13139) -> difficulty_entry_3 (37277) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 37277; +-- Lieutenant Stronghoof (base 13143) -> difficulty_entry_1 (22710) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 22710; +-- Lieutenant Stronghoof (base 13143) -> difficulty_entry_2 (32041) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 32041; +-- Lieutenant Stronghoof (base 13143) -> difficulty_entry_3 (37361) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 37361; +-- Lieutenant Vol'talar (base 13144) -> difficulty_entry_1 (22711) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 22711; +-- Lieutenant Vol'talar (base 13144) -> difficulty_entry_2 (32042) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 32042; +-- Lieutenant Vol'talar (base 13144) -> difficulty_entry_3 (37362) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 37362; +-- Lieutenant Grummus (base 13145) -> difficulty_entry_1 (22701) -93 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 22701; +-- Lieutenant Grummus (base 13145) -> difficulty_entry_2 (32031) -93 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 32031; +-- Lieutenant Grummus (base 13145) -> difficulty_entry_3 (37351) -93 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 37351; +-- Lieutenant Lewis (base 13147) -> difficulty_entry_1 (22703) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 22703; +-- Lieutenant Lewis (base 13147) -> difficulty_entry_2 (32034) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 32034; +-- Lieutenant Lewis (base 13147) -> difficulty_entry_3 (37354) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 37354; +-- Commander Malgor (base 13152) -> difficulty_entry_1 (22617) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 22617; +-- Commander Malgor (base 13152) -> difficulty_entry_2 (31956) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 31956; +-- Commander Malgor (base 13152) -> difficulty_entry_3 (37274) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 37274; +-- Commander Mulfort (base 13153) -> difficulty_entry_1 (22619) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 22619; +-- Commander Mulfort (base 13153) -> difficulty_entry_2 (31958) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 31958; +-- Commander Mulfort (base 13153) -> difficulty_entry_3 (37276) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 37276; +-- Commander Louis Philips (base 13154) -> difficulty_entry_1 (22616) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 22616; +-- Commander Louis Philips (base 13154) -> difficulty_entry_2 (31955) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 31955; +-- Commander Louis Philips (base 13154) -> difficulty_entry_3 (37273) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 37273; +-- Smith Regzar (base 13176) -> difficulty_entry_1 (22571) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 22571; +-- Smith Regzar (base 13176) -> difficulty_entry_2 (32080) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 32080; +-- Smith Regzar (base 13176) -> difficulty_entry_3 (37401) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 37401; +-- Wing Commander Guse (base 13179) -> difficulty_entry_1 (22721) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 22721; +-- Wing Commander Guse (base 13179) -> difficulty_entry_2 (31828) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 31828; +-- Wing Commander Guse (base 13179) -> difficulty_entry_3 (37479) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 37479; +-- Wing Commander Jeztor (base 13180) -> difficulty_entry_1 (22697) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 22697; +-- Wing Commander Jeztor (base 13180) -> difficulty_entry_2 (31826) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 31826; +-- Wing Commander Jeztor (base 13180) -> difficulty_entry_3 (37481) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 37481; +-- Wing Commander Mulverick (base 13181) -> difficulty_entry_1 (22598) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 22598; +-- Wing Commander Mulverick (base 13181) -> difficulty_entry_2 (31825) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 31825; +-- Wing Commander Mulverick (base 13181) -> difficulty_entry_3 (37482) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 37482; +-- Gaelden Hammersmith (base 13216) -> difficulty_entry_1 (22680) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 22680; +-- Gaelden Hammersmith (base 13216) -> difficulty_entry_2 (31996) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 31996; +-- Gaelden Hammersmith (base 13216) -> difficulty_entry_3 (37315) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 37315; +-- Grunnda Wolfheart (base 13218) -> difficulty_entry_1 (22681) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 22681; +-- Grunnda Wolfheart (base 13218) -> difficulty_entry_2 (32001) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 32001; +-- Grunnda Wolfheart (base 13218) -> difficulty_entry_3 (37320) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 37320; +-- Primalist Thurloga (base 13236) -> difficulty_entry_1 (22568) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 22568; +-- Primalist Thurloga (base 13236) -> difficulty_entry_2 (32050) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 32050; +-- Primalist Thurloga (base 13236) -> difficulty_entry_3 (37371) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 37371; +-- Lokholar the Ice Lord (base 13256) -> difficulty_entry_3 (37363) 0 -> -273 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -273 WHERE `entry` = 37363; +-- Murgot Deepforge (base 13257) -> difficulty_entry_1 (22567) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 22567; +-- Murgot Deepforge (base 13257) -> difficulty_entry_2 (32048) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 32048; +-- Murgot Deepforge (base 13257) -> difficulty_entry_3 (37369) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 37369; +-- Lieutenant Largent (base 13296) -> difficulty_entry_1 (22702) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 22702; +-- Lieutenant Largent (base 13296) -> difficulty_entry_2 (32033) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 32033; +-- Lieutenant Largent (base 13296) -> difficulty_entry_3 (37353) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 37353; +-- Lieutenant Stouthandle (base 13297) -> difficulty_entry_1 (22709) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 22709; +-- Lieutenant Stouthandle (base 13297) -> difficulty_entry_2 (32040) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 32040; +-- Lieutenant Stouthandle (base 13297) -> difficulty_entry_3 (37360) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 37360; +-- Lieutenant Greywand (base 13298) -> difficulty_entry_1 (22700) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 22700; +-- Lieutenant Greywand (base 13298) -> difficulty_entry_2 (32030) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 32030; +-- Lieutenant Greywand (base 13298) -> difficulty_entry_3 (37350) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 37350; +-- Lieutenant Lonadin (base 13299) -> difficulty_entry_1 (22704) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 22704; +-- Lieutenant Lonadin (base 13299) -> difficulty_entry_2 (32035) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 32035; +-- Lieutenant Lonadin (base 13299) -> difficulty_entry_3 (37355) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 37355; +-- Lieutenant Mancuso (base 13300) -> difficulty_entry_1 (22705) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 22705; +-- Lieutenant Mancuso (base 13300) -> difficulty_entry_2 (32036) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 32036; +-- Lieutenant Mancuso (base 13300) -> difficulty_entry_3 (37356) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 37356; +-- Commander Mortimer (base 13318) -> difficulty_entry_1 (22618) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 22618; +-- Commander Mortimer (base 13318) -> difficulty_entry_2 (31957) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 31957; +-- Commander Mortimer (base 13318) -> difficulty_entry_3 (37275) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 37275; +-- Commander Duffy (base 13319) -> difficulty_entry_1 (22614) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 22614; +-- Commander Duffy (base 13319) -> difficulty_entry_2 (31953) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 31953; +-- Commander Duffy (base 13319) -> difficulty_entry_3 (37271) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 37271; +-- Commander Karl Philips (base 13320) -> difficulty_entry_1 (22615) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 22615; +-- Commander Karl Philips (base 13320) -> difficulty_entry_2 (31954) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 31954; +-- Commander Karl Philips (base 13320) -> difficulty_entry_3 (37272) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 37272; +-- Stormpike Mine Layer (base 13356) -> difficulty_entry_1 (22635) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 22635; +-- Stormpike Mine Layer (base 13356) -> difficulty_entry_2 (32096) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 32096; +-- Stormpike Mine Layer (base 13356) -> difficulty_entry_3 (37417) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 37417; +-- Frostwolf Mine Layer (base 13357) -> difficulty_entry_1 (22624) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 22624; +-- Frostwolf Mine Layer (base 13357) -> difficulty_entry_2 (31984) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 31984; +-- Frostwolf Mine Layer (base 13357) -> difficulty_entry_3 (37303) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 37303; +-- Frostwolf Shredder Unit (base 13378) -> difficulty_entry_1 (22550) 0 -> -93 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -93 WHERE `entry` = 22550; +-- Frostwolf Shredder Unit (base 13378) -> difficulty_entry_2 (31990) 0 -> -93 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -93 WHERE `entry` = 31990; +-- Frostwolf Shredder Unit (base 13378) -> difficulty_entry_3 (37309) 0 -> -93 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -93 WHERE `entry` = 37309; +-- Stormpike Shredder Unit (base 13416) -> difficulty_entry_1 (22576) 0 -> -93 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -93 WHERE `entry` = 22576; +-- Stormpike Shredder Unit (base 13416) -> difficulty_entry_2 (32104) 0 -> -93 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -93 WHERE `entry` = 32104; +-- Stormpike Shredder Unit (base 13416) -> difficulty_entry_3 (37425) 0 -> -93 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -93 WHERE `entry` = 37425; +-- Ivus the Forest Lord (base 13419) -> difficulty_entry_3 (37341) 0 -> -273 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -273 WHERE `entry` = 37341; +-- Wing Commander Ichman (base 13437) -> difficulty_entry_1 (22597) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 22597; +-- Wing Commander Ichman (base 13437) -> difficulty_entry_2 (32766) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 32766; +-- Wing Commander Ichman (base 13437) -> difficulty_entry_3 (37480) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 37480; +-- Wing Commander Slidore (base 13438) -> difficulty_entry_1 (22698) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 22698; +-- Wing Commander Slidore (base 13438) -> difficulty_entry_2 (31824) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 31824; +-- Wing Commander Slidore (base 13438) -> difficulty_entry_3 (37483) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 37483; +-- Wing Commander Vipore (base 13439) -> difficulty_entry_1 (22722) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 22722; +-- Wing Commander Vipore (base 13439) -> difficulty_entry_2 (31823) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 31823; +-- Wing Commander Vipore (base 13439) -> difficulty_entry_3 (37484) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 37484; +-- Frostwolf Wolf Rider Commander (base 13441) -> difficulty_entry_1 (22552) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 22552; +-- Frostwolf Wolf Rider Commander (base 13441) -> difficulty_entry_2 (31994) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 31994; +-- Frostwolf Wolf Rider Commander (base 13441) -> difficulty_entry_3 (37313) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 37313; +-- Arch Druid Renferal (base 13442) -> difficulty_entry_1 (22527) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 22527; +-- Arch Druid Renferal (base 13442) -> difficulty_entry_2 (31923) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 31923; +-- Arch Druid Renferal (base 13442) -> difficulty_entry_3 (37239) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 37239; +-- Corporal Noreg Stormpike (base 13447) -> difficulty_entry_1 (22735) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 22735; +-- Corporal Noreg Stormpike (base 13447) -> difficulty_entry_2 (31960) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 31960; +-- Corporal Noreg Stormpike (base 13447) -> difficulty_entry_3 (37278) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 37278; +-- Stormpike Ram Rider Commander (base 13577) -> difficulty_entry_1 (22575) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 22575; +-- Stormpike Ram Rider Commander (base 13577) -> difficulty_entry_2 (32101) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 32101; +-- Stormpike Ram Rider Commander (base 13577) -> difficulty_entry_3 (37422) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 37422; +-- Frostwolf Explosives Expert (base 13597) -> difficulty_entry_1 (22623) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 22623; +-- Frostwolf Explosives Expert (base 13597) -> difficulty_entry_2 (31980) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 31980; +-- Frostwolf Explosives Expert (base 13597) -> difficulty_entry_3 (37299) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 37299; +-- Stormpike Explosives Expert (base 13598) -> difficulty_entry_1 (22634) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 22634; +-- Stormpike Explosives Expert (base 13598) -> difficulty_entry_2 (32093) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 32093; +-- Stormpike Explosives Expert (base 13598) -> difficulty_entry_3 (37414) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 37414; +-- Frostwolf Stable Master (base 13616) -> difficulty_entry_1 (22551) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 22551; +-- Frostwolf Stable Master (base 13616) -> difficulty_entry_2 (31991) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 31991; +-- Frostwolf Stable Master (base 13616) -> difficulty_entry_3 (37310) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 37310; +-- Stormpike Stable Master (base 13617) -> difficulty_entry_1 (22577) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 22577; +-- Stormpike Stable Master (base 13617) -> difficulty_entry_2 (32105) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 32105; +-- Stormpike Stable Master (base 13617) -> difficulty_entry_3 (37426) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 37426; +-- Mountaineer Boombellow (base 13797) -> difficulty_entry_1 (22724) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 22724; +-- Mountaineer Boombellow (base 13797) -> difficulty_entry_2 (32046) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 32046; +-- Mountaineer Boombellow (base 13797) -> difficulty_entry_3 (37367) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 37367; +-- Jotek (base 13798) -> difficulty_entry_1 (22723) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 22723; +-- Jotek (base 13798) -> difficulty_entry_2 (32025) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 32025; +-- Jotek (base 13798) -> difficulty_entry_3 (37345) 0 -> -386 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -386 WHERE `entry` = 37345; +-- Dun Baldar North Marshal (base 14762) -> difficulty_entry_1 (22542) 0 -> -406 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -406 WHERE `entry` = 22542; +-- Dun Baldar North Marshal (base 14762) -> difficulty_entry_2 (31966) 0 -> -406 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -406 WHERE `entry` = 31966; +-- Dun Baldar North Marshal (base 14762) -> difficulty_entry_3 (37285) 0 -> -406 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -406 WHERE `entry` = 37285; +-- Dun Baldar South Marshal (base 14763) -> difficulty_entry_1 (22544) 0 -> -406 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -406 WHERE `entry` = 22544; +-- Dun Baldar South Marshal (base 14763) -> difficulty_entry_2 (31968) 0 -> -406 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -406 WHERE `entry` = 31968; +-- Dun Baldar South Marshal (base 14763) -> difficulty_entry_3 (37287) 0 -> -406 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -406 WHERE `entry` = 37287; +-- Icewing Marshal (base 14764) -> difficulty_entry_1 (22561) 0 -> -406 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -406 WHERE `entry` = 22561; +-- Icewing Marshal (base 14764) -> difficulty_entry_2 (32008) 0 -> -406 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -406 WHERE `entry` = 32008; +-- Icewing Marshal (base 14764) -> difficulty_entry_3 (37327) 0 -> -406 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -406 WHERE `entry` = 37327; +-- Stonehearth Marshal (base 14765) -> difficulty_entry_1 (22572) 0 -> -406 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -406 WHERE `entry` = 22572; +-- Stonehearth Marshal (base 14765) -> difficulty_entry_2 (32086) 0 -> -406 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -406 WHERE `entry` = 32086; +-- Stonehearth Marshal (base 14765) -> difficulty_entry_3 (37407) 0 -> -406 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -406 WHERE `entry` = 37407; +-- Iceblood Marshal (base 14766) -> difficulty_entry_1 (22559) 0 -> -406 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -406 WHERE `entry` = 22559; +-- Iceblood Marshal (base 14766) -> difficulty_entry_2 (32006) 0 -> -406 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -406 WHERE `entry` = 32006; +-- Iceblood Marshal (base 14766) -> difficulty_entry_3 (37325) 0 -> -406 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -406 WHERE `entry` = 37325; +-- Tower Point Marshal (base 14767) -> difficulty_entry_1 (22579) 0 -> -406 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -406 WHERE `entry` = 22579; +-- Tower Point Marshal (base 14767) -> difficulty_entry_2 (31908) 0 -> -406 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -406 WHERE `entry` = 31908; +-- Tower Point Marshal (base 14767) -> difficulty_entry_3 (37434) 0 -> -406 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -406 WHERE `entry` = 37434; +-- East Frostwolf Marshal (base 14768) -> difficulty_entry_1 (22547) 0 -> -406 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -406 WHERE `entry` = 22547; +-- East Frostwolf Marshal (base 14768) -> difficulty_entry_2 (31971) 0 -> -406 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -406 WHERE `entry` = 31971; +-- East Frostwolf Marshal (base 14768) -> difficulty_entry_3 (37290) 0 -> -406 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -406 WHERE `entry` = 37290; +-- West Frostwolf Marshal (base 14769) -> difficulty_entry_1 (22595) 0 -> -406 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -406 WHERE `entry` = 22595; +-- West Frostwolf Marshal (base 14769) -> difficulty_entry_2 (31903) 0 -> -406 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -406 WHERE `entry` = 31903; +-- West Frostwolf Marshal (base 14769) -> difficulty_entry_3 (37467) 0 -> -406 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -406 WHERE `entry` = 37467; +-- Dun Baldar North Warmaster (base 14770) -> difficulty_entry_1 (22543) 0 -> -406 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -406 WHERE `entry` = 22543; +-- Dun Baldar South Warmaster (base 14771) -> difficulty_entry_1 (22545) 0 -> -406 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -406 WHERE `entry` = 22545; +-- Dun Baldar South Warmaster (base 14771) -> difficulty_entry_2 (31969) 0 -> -406 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -406 WHERE `entry` = 31969; +-- Dun Baldar South Warmaster (base 14771) -> difficulty_entry_3 (37288) 0 -> -406 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -406 WHERE `entry` = 37288; +-- East Frostwolf Warmaster (base 14772) -> difficulty_entry_1 (22548) 0 -> -406 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -406 WHERE `entry` = 22548; +-- East Frostwolf Warmaster (base 14772) -> difficulty_entry_2 (31972) 0 -> -406 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -406 WHERE `entry` = 31972; +-- East Frostwolf Warmaster (base 14772) -> difficulty_entry_3 (37291) 0 -> -406 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -406 WHERE `entry` = 37291; +-- Iceblood Warmaster (base 14773) -> difficulty_entry_1 (22560) 0 -> -406 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -406 WHERE `entry` = 22560; +-- Iceblood Warmaster (base 14773) -> difficulty_entry_2 (32007) 0 -> -406 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -406 WHERE `entry` = 32007; +-- Iceblood Warmaster (base 14773) -> difficulty_entry_3 (37326) 0 -> -406 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -406 WHERE `entry` = 37326; +-- Icewing Warmaster (base 14774) -> difficulty_entry_1 (22562) 0 -> -406 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -406 WHERE `entry` = 22562; +-- Icewing Warmaster (base 14774) -> difficulty_entry_2 (32009) 0 -> -406 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -406 WHERE `entry` = 32009; +-- Icewing Warmaster (base 14774) -> difficulty_entry_3 (37328) 0 -> -406 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -406 WHERE `entry` = 37328; +-- Stonehearth Warmaster (base 14775) -> difficulty_entry_1 (22573) 0 -> -406 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -406 WHERE `entry` = 22573; +-- Stonehearth Warmaster (base 14775) -> difficulty_entry_2 (32087) 0 -> -406 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -406 WHERE `entry` = 32087; +-- Stonehearth Warmaster (base 14775) -> difficulty_entry_3 (37408) 0 -> -406 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -406 WHERE `entry` = 37408; +-- Tower Point Warmaster (base 14776) -> difficulty_entry_1 (22580) 0 -> -406 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -406 WHERE `entry` = 22580; +-- Tower Point Warmaster (base 14776) -> difficulty_entry_2 (31909) 0 -> -406 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -406 WHERE `entry` = 31909; +-- Tower Point Warmaster (base 14776) -> difficulty_entry_3 (37435) 0 -> -406 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -406 WHERE `entry` = 37435; +-- West Frostwolf Warmaster (base 14777) -> difficulty_entry_1 (22596) 0 -> -406 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -406 WHERE `entry` = 22596; +-- West Frostwolf Warmaster (base 14777) -> difficulty_entry_2 (31829) 0 -> -406 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -406 WHERE `entry` = 31829; +-- West Frostwolf Warmaster (base 14777) -> difficulty_entry_3 (37468) 0 -> -406 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -406 WHERE `entry` = 37468; +-- Guse's War Rider (base 14943) -> difficulty_entry_1 (22556) 0 -> -406 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -406 WHERE `entry` = 22556; +-- Guse's War Rider (base 14943) -> difficulty_entry_2 (32002) 0 -> -406 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -406 WHERE `entry` = 32002; +-- Guse's War Rider (base 14943) -> difficulty_entry_3 (37321) 0 -> -406 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -406 WHERE `entry` = 37321; +-- Jeztor's War Rider (base 14944) -> difficulty_entry_1 (22564) 0 -> -406 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -406 WHERE `entry` = 22564; +-- Jeztor's War Rider (base 14944) -> difficulty_entry_2 (32023) 0 -> -406 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -406 WHERE `entry` = 32023; +-- Jeztor's War Rider (base 14944) -> difficulty_entry_3 (37343) 0 -> -406 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -406 WHERE `entry` = 37343; +-- Mulverick's War Rider (base 14945) -> difficulty_entry_1 (22566) 0 -> -406 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -406 WHERE `entry` = 22566; +-- Slidore's Gryphon (base 14946) -> difficulty_entry_1 (22570) 0 -> -406 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -406 WHERE `entry` = 22570; +-- Ichman's Gryphon (base 14947) -> difficulty_entry_1 (22563) 0 -> -406 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -406 WHERE `entry` = 22563; +-- Ichman's Gryphon (base 14947) -> difficulty_entry_2 (32010) 0 -> -406 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -406 WHERE `entry` = 32010; +-- Ichman's Gryphon (base 14947) -> difficulty_entry_3 (37329) 0 -> -406 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -406 WHERE `entry` = 37329; +-- Vipore's Gryphon (base 14948) -> difficulty_entry_1 (22593) 0 -> -406 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -406 WHERE `entry` = 22593; +-- Vipore's Gryphon (base 14948) -> difficulty_entry_2 (32136) 0 -> -406 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -406 WHERE `entry` = 32136; +-- Vipore's Gryphon (base 14948) -> difficulty_entry_3 (37464) 0 -> -406 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -406 WHERE `entry` = 37464; + +-- Dread Creeper (base 15974) -> difficulty_entry_1 (29242) 0 -> -413 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -413 WHERE `entry` = 29242; +-- Carrion Spinner (base 15975) -> difficulty_entry_1 (29241) 0 -> -413 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -413 WHERE `entry` = 29241; +-- Venom Stalker (base 15976) -> difficulty_entry_1 (29243) 0 -> -416 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -416 WHERE `entry` = 29243; +-- Naxxramas Cultist (base 15980) -> difficulty_entry_1 (29247) 0 -> -414 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -414 WHERE `entry` = 29247; +-- Naxxramas Acolyte (base 15981) -> difficulty_entry_1 (29248) 0 -> -414 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -414 WHERE `entry` = 29248; +-- Frenzied Bat (base 16036) -> difficulty_entry_1 (29608) 0 -> -398 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -398 WHERE `entry` = 29608; +-- Plagued Bat (base 16037) -> difficulty_entry_1 (29603) 0 -> -399 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -399 WHERE `entry` = 29603; +-- Diseased Maggot (base 16056) -> difficulty_entry_1 (29612) 0 -> -398 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -398 WHERE `entry` = 29612; +-- Rotting Maggot (base 16057) -> difficulty_entry_1 (31542) 0 -> -398 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -398 WHERE `entry` = 31542; +-- Maexxna Spiderling (base 17055) -> difficulty_entry_1 (29279) 0 -> -398 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -398 WHERE `entry` = 29279; +-- Bile Sludge (base 16142) -> difficulty_entry_1 (29357) 0 -> -416 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -416 WHERE `entry` = 29357; +-- Eye Stalk (base 16236) -> difficulty_entry_1 (29613) 0 -> -398 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -398 WHERE `entry` = 29613; +-- Plague Slime (base 16243) -> difficulty_entry_1 (29575) 0 -> -417 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -417 WHERE `entry` = 29575; +-- Mutated Grub (base 16297) -> difficulty_entry_1 (29601) 0 -> -398 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -398 WHERE `entry` = 29601; +-- Corpse Scarab (base 16698) -> difficulty_entry_1 (29267) 0 -> -398 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -398 WHERE `entry` = 29267; + +-- Tomb Horror (base 15979) -> difficulty_entry_1 (29286) -93 -> -416 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -416 WHERE `entry` = 29286; +-- Mad Scientist (base 16020) -> difficulty_entry_1 (29362) -93 -> -392 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -392 WHERE `entry` = 29362; +-- Living Monstrosity (base 16021) -> difficulty_entry_1 (29359) -93 -> -403 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -403 WHERE `entry` = 29359; +-- Surgical Assistant (base 16022) -> difficulty_entry_1 (29363) -93 -> -389 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -389 WHERE `entry` = 29363; +-- Embalming Slime (base 16024) -> difficulty_entry_1 (29355) -93 -> -393 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -393 WHERE `entry` = 29355; +-- Sludge Belcher (base 16029) -> difficulty_entry_1 (29356) -93 -> -405 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -405 WHERE `entry` = 29356; +-- Plague Beast (base 16034) -> difficulty_entry_1 (29609) -93 -> -401 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -401 WHERE `entry` = 29609; +-- Unrelenting Trainee (base 16124) -> difficulty_entry_1 (29987) -93 -> -383 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -383 WHERE `entry` = 29987; +-- Unrelenting Rider (base 16126) -> difficulty_entry_1 (29986) -93 -> -412 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -412 WHERE `entry` = 29986; +-- Spectral Trainee (base 16127) -> difficulty_entry_1 (30264) -93 -> -382 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -382 WHERE `entry` = 30264; +-- Spectral Horse (base 16149) -> difficulty_entry_1 (29989) -93 -> -384 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -384 WHERE `entry` = 29989; +-- Spectral Rider (base 16150) -> difficulty_entry_1 (29988) -93 -> -388 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -388 WHERE `entry` = 29988; +-- Dark Touched Warrior (base 16156) -> difficulty_entry_1 (29833) -93 -> -385 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -385 WHERE `entry` = 29833; +-- Shade of Naxxramas (base 16164) -> difficulty_entry_1 (29825) -93 -> -390 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -390 WHERE `entry` = 29825; +-- Necro Knight (base 16165) -> difficulty_entry_1 (29828) -93 -> -403 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -403 WHERE `entry` = 29828; +-- Bony Construct (base 16167) -> difficulty_entry_1 (29835) -93 -> -391 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -391 WHERE `entry` = 29835; +-- Stoneskin Gargoyle (base 16168) -> difficulty_entry_1 (29576) -93 -> -420 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -420 WHERE `entry` = 29576; +-- Skeletal Smith (base 16193) -> difficulty_entry_1 (29837) -93 -> -303 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -303 WHERE `entry` = 29837; +-- Unholy Axe (base 16194) -> difficulty_entry_1 (29898) -93 -> -404 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -404 WHERE `entry` = 29898; +-- Unholy Staff (base 16215) -> difficulty_entry_1 (29899) -93 -> -404 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -404 WHERE `entry` = 29899; +-- Unholy Swords (base 16216) -> difficulty_entry_1 (29900) -93 -> -404 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -404 WHERE `entry` = 29900; +-- Infectious Ghoul (base 16244) -> difficulty_entry_1 (29574) -93 -> -387 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -387 WHERE `entry` = 29574; +-- Fallout Slime (base 16290) -> difficulty_entry_1 (29388) -93 -> -395 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -395 WHERE `entry` = 29388; +-- Zombie Chow (base 16360) -> difficulty_entry_1 (30303) -93 -> -387 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -387 WHERE `entry` = 30303; +-- Sewage Slime (base 16375) -> difficulty_entry_1 (29354) -93 -> -394 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -394 WHERE `entry` = 29354; +-- Soldier of the Frozen Wastes (base 16427) -> difficulty_entry_1 (30015) -93 -> -387 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -387 WHERE `entry` = 30015; +-- Unstoppable Abomination (base 16428) -> difficulty_entry_1 (30048) -93 -> -402 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -402 WHERE `entry` = 30048; +-- Soul Weaver (base 16429) -> difficulty_entry_1 (30018) -93 -> -402 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -402 WHERE `entry` = 30018; +-- Plagued Ghoul (base 16447) -> difficulty_entry_1 (30097) -93 -> -396 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -396 WHERE `entry` = 30097; +-- Crypt Guard (base 16573) -> difficulty_entry_1 (29256) -93 -> -415 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -415 WHERE `entry` = 29256; +-- Plagued Guardian (base 16981) -> difficulty_entry_1 (29634) -93 -> -389 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -389 WHERE `entry` = 29634; +-- Plagued Construct (base 16982) -> difficulty_entry_1 (29635) -93 -> -397 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -397 WHERE `entry` = 29635; +-- Plagued Champion (base 16983) -> difficulty_entry_1 (29633) -93 -> -387 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -387 WHERE `entry` = 29633; +-- Plagued Warrior (base 16984) -> difficulty_entry_1 (29632) -93 -> -397 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -397 WHERE `entry` = 29632; + +-- Gothik the Harvester (base 16060) -> difficulty_entry_1 (29955) -286 -> -410 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -410 WHERE `entry` = 29955; +-- Instructor Razuvious (base 16061) -> difficulty_entry_1 (29940) -286 -> -410 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -410 WHERE `entry` = 29940; +-- Sir Zeliek (base 16063) -> difficulty_entry_1 (30602) -286 -> -410 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -410 WHERE `entry` = 30602; +-- Thane Korth'azz (base 16064) -> difficulty_entry_1 (30603) -286 -> -410 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -410 WHERE `entry` = 30603; +-- Lady Blaumeux (base 16065) -> difficulty_entry_1 (30601) -286 -> -410 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -410 WHERE `entry` = 30601; + +-- Guardian of Icecrown (base 16441) -> difficulty_entry_1 (30057) -285 -> -411 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -411 WHERE `entry` = 30057; +-- Naxxramas Follower (base 16505) -> difficulty_entry_1 (29273) -70 -> -413 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -413 WHERE `entry` = 29273; +-- Naxxramas Worshipper (base 16506) -> difficulty_entry_1 (29274) -413 -> -414 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -414 WHERE `entry` = 29274; + +-- Thaddius (base 15928) -> difficulty_entry_1 (29448) +UPDATE `creature_template` SET `CreatureImmunitiesId` = -286 WHERE `entry` = 15928; +-- Stalagg (base 15929) -> difficulty_entry_1 (29446) +UPDATE `creature_template` SET `CreatureImmunitiesId` = -286 WHERE `entry` = 15929; +-- Feugen (base 15930) -> difficulty_entry_1 (29447) +UPDATE `creature_template` SET `CreatureImmunitiesId` = -286 WHERE `entry` = 15930; +-- Grobbulus (base 15931) -> difficulty_entry_1 (29373) +UPDATE `creature_template` SET `CreatureImmunitiesId` = -286 WHERE `entry` = 15931; +-- Gluth (base 15932) -> difficulty_entry_1 (29417) +UPDATE `creature_template` SET `CreatureImmunitiesId` = -286 WHERE `entry` = 15932; +-- Heigan the Unclean (base 15936) -> difficulty_entry_1 (29701) +UPDATE `creature_template` SET `CreatureImmunitiesId` = -286 WHERE `entry` = 15936; +-- Maexxna (base 15952) -> difficulty_entry_1 (29278) +UPDATE `creature_template` SET `CreatureImmunitiesId` = -286 WHERE `entry` = 15952; +-- Grand Widow Faerlina (base 15953) -> difficulty_entry_1 (29268) +UPDATE `creature_template` SET `CreatureImmunitiesId` = -286 WHERE `entry` = 15953; +-- Noth the Plaguebringer (base 15954) -> difficulty_entry_1 (29615) +UPDATE `creature_template` SET `CreatureImmunitiesId` = -286 WHERE `entry` = 15954; +-- Anub'Rekhan (base 15956) -> difficulty_entry_1 (29249) +UPDATE `creature_template` SET `CreatureImmunitiesId` = -286 WHERE `entry` = 15956; +-- Sapphiron (base 15989) -> difficulty_entry_1 (29991) +UPDATE `creature_template` SET `CreatureImmunitiesId` = -286 WHERE `entry` = 15989; +-- Kel'Thuzad (base 15990) -> difficulty_entry_1 (30061) +UPDATE `creature_template` SET `CreatureImmunitiesId` = -286 WHERE `entry` = 15990; +-- Loatheb (base 16011) -> difficulty_entry_1 (29718) +UPDATE `creature_template` SET `CreatureImmunitiesId` = -286 WHERE `entry` = 16011; + +-- Patchwork Golem (base 16017) -> difficulty_entry_1 (29347) -93 -> -405 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -405 WHERE `entry` = 29347; +-- Bile Retcher (base 16018) -> difficulty_entry_1 (29353) -93 -> -405 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -405 WHERE `entry` = 29353; +-- Crypt Reaver (base 15978) -> difficulty_entry_1 (30389) -93 -> -416 +UPDATE `creature_template` SET `CreatureImmunitiesId` = -416 WHERE `entry` = 30389; From 4af59a5830128df2b725b80f3120167f031947ff Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 22 Jul 2026 17:03:08 +0000 Subject: [PATCH 087/134] chore(DB): import pending files Referenced commit(s): 106bae8a147097cee92db66a5ae3875656a59fc2 --- .../rev_1783180582875265043.sql => db_world/2026_07_22_06.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1783180582875265043.sql => db_world/2026_07_22_06.sql} (99%) diff --git a/data/sql/updates/pending_db_world/rev_1783180582875265043.sql b/data/sql/updates/db_world/2026_07_22_06.sql similarity index 99% rename from data/sql/updates/pending_db_world/rev_1783180582875265043.sql rename to data/sql/updates/db_world/2026_07_22_06.sql index 6feddd737..13d5e613d 100644 --- a/data/sql/updates/pending_db_world/rev_1783180582875265043.sql +++ b/data/sql/updates/db_world/2026_07_22_06.sql @@ -1,3 +1,4 @@ +-- DB update 2026_07_22_05 -> 2026_07_22_06 -- Update creature_template.CreatureImmunitiesId for difficulty entries -- Onyxia (base 10184), difficulty_entry_1 (36538) UPDATE `creature_template` SET `CreatureImmunitiesId` = -362 WHERE `entry` = 10184; From 2cc5419d50e177bd15999c9c0ac37a906bd4af86 Mon Sep 17 00:00:00 2001 From: Xepic90 Date: Wed, 22 Jul 2026 13:10:54 -0400 Subject: [PATCH 088/134] fix(DB/SpellArea): Dun Niffelem phase not retained after Battling the Elements (#25365) (#26174) --- .../2026_06_12_02_spell_area_dun_niffelem_phasing.sql | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 data/sql/updates/pending_db_world/2026_06_12_02_spell_area_dun_niffelem_phasing.sql diff --git a/data/sql/updates/pending_db_world/2026_06_12_02_spell_area_dun_niffelem_phasing.sql b/data/sql/updates/pending_db_world/2026_06_12_02_spell_area_dun_niffelem_phasing.sql new file mode 100644 index 000000000..653de8778 --- /dev/null +++ b/data/sql/updates/pending_db_world/2026_06_12_02_spell_area_dun_niffelem_phasing.sql @@ -0,0 +1,11 @@ +-- Dun Niffelem (area 4495): add missing spell_area entry so spell 55858 continues +-- to apply after quest 12967 (Battling the Elements) is rewarded. +-- All surrounding areas (4437-4440, 4455) have two entries for spell 55858: +-- one for while quest 12924 is active, and one for after quest 12967 is rewarded. +-- Area 4495 only had the first entry (with quest_end=12967 removing it on completion), +-- causing players who finished Battling the Elements to lose the phase needed to +-- interact with NPCs and pick up follow-up quests in Dun Niffelem. +-- Fixes: https://github.com/azerothcore/azerothcore-wotlk/issues/25365 +DELETE FROM `spell_area` WHERE `spell` = 55858 AND `area` = 4495 AND `quest_start` = 12967 AND `aura_spell` = 0 AND `racemask` = 0 AND `gender` = 2; +INSERT INTO `spell_area` (`spell`, `area`, `quest_start`, `quest_end`, `aura_spell`, `racemask`, `gender`, `autocast`, `quest_start_status`, `quest_end_status`) +VALUES (55858, 4495, 12967, 0, 0, 0, 2, 1, 64, 11); From 08463bfafd5a050945bc80bdda895bc27e2be931 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 22 Jul 2026 17:12:07 +0000 Subject: [PATCH 089/134] chore(DB): import pending files Referenced commit(s): 2cc5419d50e177bd15999c9c0ac37a906bd4af86 --- .../2026_07_22_07.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/2026_06_12_02_spell_area_dun_niffelem_phasing.sql => db_world/2026_07_22_07.sql} (95%) diff --git a/data/sql/updates/pending_db_world/2026_06_12_02_spell_area_dun_niffelem_phasing.sql b/data/sql/updates/db_world/2026_07_22_07.sql similarity index 95% rename from data/sql/updates/pending_db_world/2026_06_12_02_spell_area_dun_niffelem_phasing.sql rename to data/sql/updates/db_world/2026_07_22_07.sql index 653de8778..9f873440b 100644 --- a/data/sql/updates/pending_db_world/2026_06_12_02_spell_area_dun_niffelem_phasing.sql +++ b/data/sql/updates/db_world/2026_07_22_07.sql @@ -1,3 +1,4 @@ +-- DB update 2026_07_22_06 -> 2026_07_22_07 -- Dun Niffelem (area 4495): add missing spell_area entry so spell 55858 continues -- to apply after quest 12967 (Battling the Elements) is rewarded. -- All surrounding areas (4437-4440, 4455) have two entries for spell 55858: From e8d61c6f9322487ee1fd379102e8878537efc1fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrik=20Bukovsk=C3=BD?= <144048412+lilliandris@users.noreply.github.com> Date: Wed, 22 Jul 2026 19:17:07 +0200 Subject: [PATCH 090/134] fix(DB/Quest): To Dragon's Fall requires all three Wanted quests (#26242) --- data/sql/updates/pending_db_world/rev_1781647521100364878.sql | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1781647521100364878.sql diff --git a/data/sql/updates/pending_db_world/rev_1781647521100364878.sql b/data/sql/updates/pending_db_world/rev_1781647521100364878.sql new file mode 100644 index 000000000..a5b3d58a2 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1781647521100364878.sql @@ -0,0 +1,3 @@ +-- To Dragon's Fall - requires all three Wanted quests +UPDATE `quest_template_addon` SET `PrevQuestID` = 12089 WHERE `ID` = 12095; +UPDATE `quest_template_addon` SET `ExclusiveGroup` = -12089 WHERE `ID` IN (12089, 12090, 12091); From a18b7819cbde928b2624c932c4939027b51e8f4c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 22 Jul 2026 17:18:18 +0000 Subject: [PATCH 091/134] chore(DB): import pending files Referenced commit(s): e8d61c6f9322487ee1fd379102e8878537efc1fa --- .../rev_1781647521100364878.sql => db_world/2026_07_22_08.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1781647521100364878.sql => db_world/2026_07_22_08.sql} (83%) diff --git a/data/sql/updates/pending_db_world/rev_1781647521100364878.sql b/data/sql/updates/db_world/2026_07_22_08.sql similarity index 83% rename from data/sql/updates/pending_db_world/rev_1781647521100364878.sql rename to data/sql/updates/db_world/2026_07_22_08.sql index a5b3d58a2..90f7abe58 100644 --- a/data/sql/updates/pending_db_world/rev_1781647521100364878.sql +++ b/data/sql/updates/db_world/2026_07_22_08.sql @@ -1,3 +1,4 @@ +-- DB update 2026_07_22_07 -> 2026_07_22_08 -- To Dragon's Fall - requires all three Wanted quests UPDATE `quest_template_addon` SET `PrevQuestID` = 12089 WHERE `ID` = 12095; UPDATE `quest_template_addon` SET `ExclusiveGroup` = -12089 WHERE `ID` IN (12089, 12090, 12091); From 5185c9e0302c1c670d19c7055d11e4483ac0a1e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrik=20Bukovsk=C3=BD?= <144048412+lilliandris@users.noreply.github.com> Date: Wed, 22 Jul 2026 19:19:41 +0200 Subject: [PATCH 092/134] fix(DB/Loot): Fel Creep requires Cenarion Beacon to drop from Felwood herbs (#26245) Co-authored-by: Gultask <100873791+Gultask@users.noreply.github.com> --- .../pending_db_world/rev_1781654104088564177.sql | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1781654104088564177.sql diff --git a/data/sql/updates/pending_db_world/rev_1781654104088564177.sql b/data/sql/updates/pending_db_world/rev_1781654104088564177.sql new file mode 100644 index 000000000..21720e5a4 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1781654104088564177.sql @@ -0,0 +1,10 @@ +-- Fel Creep - requires Cenarion Beacon in inventory +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` = 4 AND `SourceEntry` = 11514; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `ConditionTypeOrReference`, `ConditionValue1`, `ConditionValue2`, `Comment`) VALUES +(4, 13965, 11514, 2, 11511, 1, 'Sungrass - Fel Creep requires Cenarion Beacon'), +(4, 13966, 11514, 2, 11511, 1, 'Gromsblood - Fel Creep requires Cenarion Beacon'), +(4, 13967, 11514, 2, 11511, 1, 'Golden Sansam - Fel Creep requires Cenarion Beacon'), +(4, 13968, 11514, 2, 11511, 1, 'Dreamfoil - Fel Creep requires Cenarion Beacon'), +(4, 13969, 11514, 2, 11511, 1, 'Mountain Silversage - Fel Creep requires Cenarion Beacon'), +(4, 13970, 11514, 2, 11511, 1, 'Arthas\' Tears - Fel Creep requires Cenarion Beacon'), +(4, 13971, 11514, 2, 11511, 1, 'Plaguebloom - Fel Creep requires Cenarion Beacon'); From 23490a23c51136c65edaa24874fd0d81a02480d6 Mon Sep 17 00:00:00 2001 From: Kitzunu <24550914+Kitzunu@users.noreply.github.com> Date: Wed, 22 Jul 2026 19:20:11 +0200 Subject: [PATCH 093/134] chore(DB): archive 2024/2025 updates (#26742) --- data/sql/{updates => archive}/db_auth/2024_01_20_00.sql | 0 data/sql/{updates => archive}/db_auth/2024_11_15_00.sql | 0 data/sql/{updates => archive}/db_auth/2024_12_15_00.sql | 0 data/sql/{updates => archive}/db_auth/2025_01_26_00.sql | 0 data/sql/{updates => archive}/db_auth/2025_02_16_00.sql | 0 data/sql/{updates => archive}/db_auth/2025_02_16_01.sql | 0 data/sql/{updates => archive}/db_auth/2025_07_03_00.sql | 0 data/sql/{updates => archive}/db_auth/2025_07_24_00.sql | 0 data/sql/{updates => archive}/db_characters/2024_01_20_00.sql | 0 data/sql/{updates => archive}/db_characters/2024_07_05_00.sql | 0 data/sql/{updates => archive}/db_characters/2024_09_03_00.sql | 0 data/sql/{updates => archive}/db_characters/2024_09_22_00.sql | 0 data/sql/{updates => archive}/db_characters/2024_11_15_00.sql | 0 data/sql/{updates => archive}/db_characters/2025_01_31_00.sql | 0 data/sql/{updates => archive}/db_characters/2025_02_12_00.sql | 0 data/sql/{updates => archive}/db_characters/2025_02_16_00.sql | 0 data/sql/{updates => archive}/db_characters/2025_03_09_00.sql | 0 data/sql/{updates => archive}/db_characters/2025_07_11_00.sql | 0 data/sql/{updates => archive}/db_characters/2025_07_29_00.sql | 0 data/sql/{updates => archive}/db_characters/2025_09_03_00.sql | 0 data/sql/{updates => archive}/db_world/2025_01_03_00.sql | 0 data/sql/{updates => archive}/db_world/2025_01_04_00.sql | 0 data/sql/{updates => archive}/db_world/2025_01_04_01.sql | 0 data/sql/{updates => archive}/db_world/2025_01_04_02.sql | 0 data/sql/{updates => archive}/db_world/2025_01_05_00.sql | 0 data/sql/{updates => archive}/db_world/2025_01_05_01.sql | 0 data/sql/{updates => archive}/db_world/2025_01_05_02.sql | 0 data/sql/{updates => archive}/db_world/2025_01_05_03.sql | 0 data/sql/{updates => archive}/db_world/2025_01_05_04.sql | 0 data/sql/{updates => archive}/db_world/2025_01_05_05.sql | 0 data/sql/{updates => archive}/db_world/2025_01_05_06.sql | 0 data/sql/{updates => archive}/db_world/2025_01_05_07.sql | 0 data/sql/{updates => archive}/db_world/2025_01_07_00.sql | 0 data/sql/{updates => archive}/db_world/2025_01_07_01.sql | 0 data/sql/{updates => archive}/db_world/2025_01_07_02.sql | 0 data/sql/{updates => archive}/db_world/2025_01_07_03.sql | 0 data/sql/{updates => archive}/db_world/2025_01_09_00.sql | 0 data/sql/{updates => archive}/db_world/2025_01_09_01.sql | 0 data/sql/{updates => archive}/db_world/2025_01_09_02.sql | 0 data/sql/{updates => archive}/db_world/2025_01_10_00.sql | 0 data/sql/{updates => archive}/db_world/2025_01_10_01.sql | 0 data/sql/{updates => archive}/db_world/2025_01_10_02.sql | 0 data/sql/{updates => archive}/db_world/2025_01_10_03.sql | 0 data/sql/{updates => archive}/db_world/2025_01_11_00.sql | 0 data/sql/{updates => archive}/db_world/2025_01_11_01.sql | 0 data/sql/{updates => archive}/db_world/2025_01_12_00.sql | 0 data/sql/{updates => archive}/db_world/2025_01_12_01.sql | 0 data/sql/{updates => archive}/db_world/2025_01_13_00.sql | 0 data/sql/{updates => archive}/db_world/2025_01_14_00.sql | 0 data/sql/{updates => archive}/db_world/2025_01_14_01.sql | 0 data/sql/{updates => archive}/db_world/2025_01_14_02.sql | 0 data/sql/{updates => archive}/db_world/2025_01_14_03.sql | 0 data/sql/{updates => archive}/db_world/2025_01_14_04.sql | 0 data/sql/{updates => archive}/db_world/2025_01_14_05.sql | 0 data/sql/{updates => archive}/db_world/2025_01_15_00.sql | 0 data/sql/{updates => archive}/db_world/2025_01_15_01.sql | 0 data/sql/{updates => archive}/db_world/2025_01_15_02.sql | 0 data/sql/{updates => archive}/db_world/2025_01_15_03.sql | 0 data/sql/{updates => archive}/db_world/2025_01_15_04.sql | 0 data/sql/{updates => archive}/db_world/2025_01_16_00.sql | 0 data/sql/{updates => archive}/db_world/2025_01_16_01.sql | 0 data/sql/{updates => archive}/db_world/2025_01_16_02.sql | 0 data/sql/{updates => archive}/db_world/2025_01_16_03.sql | 0 data/sql/{updates => archive}/db_world/2025_01_16_04.sql | 0 data/sql/{updates => archive}/db_world/2025_01_17_00.sql | 0 data/sql/{updates => archive}/db_world/2025_01_17_01.sql | 0 data/sql/{updates => archive}/db_world/2025_01_18_00.sql | 0 data/sql/{updates => archive}/db_world/2025_01_18_01.sql | 0 data/sql/{updates => archive}/db_world/2025_01_19_00.sql | 0 data/sql/{updates => archive}/db_world/2025_01_19_01.sql | 0 data/sql/{updates => archive}/db_world/2025_01_19_02.sql | 0 data/sql/{updates => archive}/db_world/2025_01_22_00.sql | 0 data/sql/{updates => archive}/db_world/2025_01_22_01.sql | 0 data/sql/{updates => archive}/db_world/2025_01_22_02.sql | 0 data/sql/{updates => archive}/db_world/2025_01_23_00.sql | 0 data/sql/{updates => archive}/db_world/2025_01_23_01.sql | 0 data/sql/{updates => archive}/db_world/2025_01_23_02.sql | 0 data/sql/{updates => archive}/db_world/2025_01_23_03.sql | 0 data/sql/{updates => archive}/db_world/2025_01_23_04.sql | 0 data/sql/{updates => archive}/db_world/2025_01_24_00.sql | 0 data/sql/{updates => archive}/db_world/2025_01_24_01.sql | 0 data/sql/{updates => archive}/db_world/2025_01_25_00.sql | 0 data/sql/{updates => archive}/db_world/2025_01_26_00.sql | 0 data/sql/{updates => archive}/db_world/2025_01_26_01.sql | 0 data/sql/{updates => archive}/db_world/2025_01_26_02.sql | 0 data/sql/{updates => archive}/db_world/2025_01_27_00.sql | 0 data/sql/{updates => archive}/db_world/2025_01_27_01.sql | 0 data/sql/{updates => archive}/db_world/2025_01_27_02.sql | 0 data/sql/{updates => archive}/db_world/2025_01_28_00.sql | 0 data/sql/{updates => archive}/db_world/2025_01_31_00.sql | 0 data/sql/{updates => archive}/db_world/2025_01_31_01.sql | 0 data/sql/{updates => archive}/db_world/2025_02_01_00.sql | 0 data/sql/{updates => archive}/db_world/2025_02_01_01.sql | 0 data/sql/{updates => archive}/db_world/2025_02_01_02.sql | 0 data/sql/{updates => archive}/db_world/2025_02_03_00.sql | 0 data/sql/{updates => archive}/db_world/2025_02_03_01.sql | 0 data/sql/{updates => archive}/db_world/2025_02_04_00.sql | 0 data/sql/{updates => archive}/db_world/2025_02_05_00.sql | 0 data/sql/{updates => archive}/db_world/2025_02_05_01.sql | 0 data/sql/{updates => archive}/db_world/2025_02_06_00.sql | 0 data/sql/{updates => archive}/db_world/2025_02_06_01.sql | 0 data/sql/{updates => archive}/db_world/2025_02_06_02.sql | 0 data/sql/{updates => archive}/db_world/2025_02_06_03.sql | 0 data/sql/{updates => archive}/db_world/2025_02_06_04.sql | 0 data/sql/{updates => archive}/db_world/2025_02_07_00.sql | 0 data/sql/{updates => archive}/db_world/2025_02_07_01.sql | 0 data/sql/{updates => archive}/db_world/2025_02_07_02.sql | 0 data/sql/{updates => archive}/db_world/2025_02_07_03.sql | 0 data/sql/{updates => archive}/db_world/2025_02_07_04.sql | 0 data/sql/{updates => archive}/db_world/2025_02_09_00.sql | 0 data/sql/{updates => archive}/db_world/2025_02_09_01.sql | 0 data/sql/{updates => archive}/db_world/2025_02_09_02.sql | 0 data/sql/{updates => archive}/db_world/2025_02_09_03.sql | 0 data/sql/{updates => archive}/db_world/2025_02_09_04.sql | 0 data/sql/{updates => archive}/db_world/2025_02_10_00.sql | 0 data/sql/{updates => archive}/db_world/2025_02_10_01.sql | 0 data/sql/{updates => archive}/db_world/2025_02_12_00.sql | 0 data/sql/{updates => archive}/db_world/2025_02_12_01.sql | 0 data/sql/{updates => archive}/db_world/2025_02_13_00.sql | 0 data/sql/{updates => archive}/db_world/2025_02_13_01.sql | 0 data/sql/{updates => archive}/db_world/2025_02_14_00.sql | 0 data/sql/{updates => archive}/db_world/2025_02_15_00.sql | 0 data/sql/{updates => archive}/db_world/2025_02_15_01.sql | 0 data/sql/{updates => archive}/db_world/2025_02_15_02.sql | 0 data/sql/{updates => archive}/db_world/2025_02_16_00.sql | 0 data/sql/{updates => archive}/db_world/2025_02_16_01.sql | 0 data/sql/{updates => archive}/db_world/2025_02_16_02.sql | 0 data/sql/{updates => archive}/db_world/2025_02_16_03.sql | 0 data/sql/{updates => archive}/db_world/2025_02_18_00.sql | 0 data/sql/{updates => archive}/db_world/2025_02_19_00.sql | 0 data/sql/{updates => archive}/db_world/2025_02_19_01.sql | 0 data/sql/{updates => archive}/db_world/2025_02_21_00.sql | 0 data/sql/{updates => archive}/db_world/2025_02_21_01.sql | 0 data/sql/{updates => archive}/db_world/2025_02_21_02.sql | 0 data/sql/{updates => archive}/db_world/2025_02_21_03.sql | 0 data/sql/{updates => archive}/db_world/2025_02_22_00.sql | 0 data/sql/{updates => archive}/db_world/2025_02_24_00.sql | 0 data/sql/{updates => archive}/db_world/2025_02_25_00.sql | 0 data/sql/{updates => archive}/db_world/2025_02_26_00.sql | 0 data/sql/{updates => archive}/db_world/2025_02_26_01.sql | 0 data/sql/{updates => archive}/db_world/2025_02_26_02.sql | 0 data/sql/{updates => archive}/db_world/2025_02_26_03.sql | 0 data/sql/{updates => archive}/db_world/2025_02_27_00.sql | 0 data/sql/{updates => archive}/db_world/2025_02_28_00.sql | 0 data/sql/{updates => archive}/db_world/2025_03_01_00.sql | 0 data/sql/{updates => archive}/db_world/2025_03_01_01.sql | 0 data/sql/{updates => archive}/db_world/2025_03_02_00.sql | 0 data/sql/{updates => archive}/db_world/2025_03_02_01.sql | 0 data/sql/{updates => archive}/db_world/2025_03_02_02.sql | 0 data/sql/{updates => archive}/db_world/2025_03_03_00.sql | 0 data/sql/{updates => archive}/db_world/2025_03_03_01.sql | 0 data/sql/{updates => archive}/db_world/2025_03_05_00.sql | 0 data/sql/{updates => archive}/db_world/2025_03_06_00.sql | 0 data/sql/{updates => archive}/db_world/2025_03_06_01.sql | 0 data/sql/{updates => archive}/db_world/2025_03_08_00.sql | 0 data/sql/{updates => archive}/db_world/2025_03_08_01.sql | 0 data/sql/{updates => archive}/db_world/2025_03_09_00.sql | 0 data/sql/{updates => archive}/db_world/2025_03_09_01.sql | 0 data/sql/{updates => archive}/db_world/2025_03_09_02.sql | 0 data/sql/{updates => archive}/db_world/2025_03_09_03.sql | 0 data/sql/{updates => archive}/db_world/2025_03_10_00.sql | 0 data/sql/{updates => archive}/db_world/2025_03_11_00.sql | 0 data/sql/{updates => archive}/db_world/2025_03_11_01.sql | 0 data/sql/{updates => archive}/db_world/2025_03_11_02.sql | 0 data/sql/{updates => archive}/db_world/2025_03_13_00.sql | 0 data/sql/{updates => archive}/db_world/2025_03_15_00.sql | 0 data/sql/{updates => archive}/db_world/2025_03_16_00.sql | 0 data/sql/{updates => archive}/db_world/2025_03_16_01.sql | 0 data/sql/{updates => archive}/db_world/2025_03_16_02.sql | 0 data/sql/{updates => archive}/db_world/2025_03_16_03.sql | 0 data/sql/{updates => archive}/db_world/2025_03_16_04.sql | 0 data/sql/{updates => archive}/db_world/2025_03_17_00.sql | 0 data/sql/{updates => archive}/db_world/2025_03_17_01.sql | 0 data/sql/{updates => archive}/db_world/2025_03_17_02.sql | 0 data/sql/{updates => archive}/db_world/2025_03_17_03.sql | 0 data/sql/{updates => archive}/db_world/2025_03_19_00.sql | 0 data/sql/{updates => archive}/db_world/2025_03_19_01.sql | 0 data/sql/{updates => archive}/db_world/2025_03_21_00.sql | 0 data/sql/{updates => archive}/db_world/2025_03_22_00.sql | 0 data/sql/{updates => archive}/db_world/2025_03_22_01.sql | 0 data/sql/{updates => archive}/db_world/2025_03_22_02.sql | 0 data/sql/{updates => archive}/db_world/2025_03_24_00.sql | 0 data/sql/{updates => archive}/db_world/2025_03_25_00.sql | 0 data/sql/{updates => archive}/db_world/2025_03_25_01.sql | 0 data/sql/{updates => archive}/db_world/2025_03_27_00.sql | 0 data/sql/{updates => archive}/db_world/2025_03_27_01.sql | 0 data/sql/{updates => archive}/db_world/2025_03_28_00.sql | 0 data/sql/{updates => archive}/db_world/2025_03_29_00.sql | 0 data/sql/{updates => archive}/db_world/2025_03_29_01.sql | 0 data/sql/{updates => archive}/db_world/2025_03_29_02.sql | 0 data/sql/{updates => archive}/db_world/2025_03_30_00.sql | 0 data/sql/{updates => archive}/db_world/2025_03_30_01.sql | 0 data/sql/{updates => archive}/db_world/2025_03_30_02.sql | 0 data/sql/{updates => archive}/db_world/2025_03_31_00.sql | 0 data/sql/{updates => archive}/db_world/2025_03_31_01.sql | 0 data/sql/{updates => archive}/db_world/2025_03_31_02.sql | 0 data/sql/{updates => archive}/db_world/2025_03_31_03.sql | 0 data/sql/{updates => archive}/db_world/2025_04_01_00.sql | 0 data/sql/{updates => archive}/db_world/2025_04_01_01.sql | 0 data/sql/{updates => archive}/db_world/2025_04_01_02.sql | 0 data/sql/{updates => archive}/db_world/2025_04_01_03.sql | 0 data/sql/{updates => archive}/db_world/2025_04_01_04.sql | 0 data/sql/{updates => archive}/db_world/2025_04_01_05.sql | 0 data/sql/{updates => archive}/db_world/2025_04_01_06.sql | 0 data/sql/{updates => archive}/db_world/2025_04_01_07.sql | 0 data/sql/{updates => archive}/db_world/2025_04_02_00.sql | 0 data/sql/{updates => archive}/db_world/2025_04_02_01.sql | 0 data/sql/{updates => archive}/db_world/2025_04_02_02.sql | 0 data/sql/{updates => archive}/db_world/2025_04_02_03.sql | 0 data/sql/{updates => archive}/db_world/2025_04_02_04.sql | 0 data/sql/{updates => archive}/db_world/2025_04_03_00.sql | 0 data/sql/{updates => archive}/db_world/2025_04_04_00.sql | 0 data/sql/{updates => archive}/db_world/2025_04_05_00.sql | 0 data/sql/{updates => archive}/db_world/2025_04_05_01.sql | 0 data/sql/{updates => archive}/db_world/2025_04_08_00.sql | 0 data/sql/{updates => archive}/db_world/2025_04_09_00.sql | 0 data/sql/{updates => archive}/db_world/2025_04_10_00.sql | 0 data/sql/{updates => archive}/db_world/2025_04_10_01.sql | 0 data/sql/{updates => archive}/db_world/2025_04_11_00.sql | 0 data/sql/{updates => archive}/db_world/2025_04_11_01.sql | 0 data/sql/{updates => archive}/db_world/2025_04_12_00.sql | 0 data/sql/{updates => archive}/db_world/2025_04_12_01.sql | 0 data/sql/{updates => archive}/db_world/2025_04_13_00.sql | 0 data/sql/{updates => archive}/db_world/2025_04_13_01.sql | 0 data/sql/{updates => archive}/db_world/2025_04_13_02.sql | 0 data/sql/{updates => archive}/db_world/2025_04_13_03.sql | 0 data/sql/{updates => archive}/db_world/2025_04_13_04.sql | 0 data/sql/{updates => archive}/db_world/2025_04_14_00.sql | 0 data/sql/{updates => archive}/db_world/2025_04_15_00.sql | 0 data/sql/{updates => archive}/db_world/2025_04_15_01.sql | 0 data/sql/{updates => archive}/db_world/2025_04_17_00.sql | 0 data/sql/{updates => archive}/db_world/2025_04_17_01.sql | 0 data/sql/{updates => archive}/db_world/2025_04_19_00.sql | 0 data/sql/{updates => archive}/db_world/2025_04_20_00.sql | 0 data/sql/{updates => archive}/db_world/2025_04_20_01.sql | 0 data/sql/{updates => archive}/db_world/2025_04_25_00.sql | 0 data/sql/{updates => archive}/db_world/2025_04_25_01.sql | 0 data/sql/{updates => archive}/db_world/2025_04_26_00.sql | 0 data/sql/{updates => archive}/db_world/2025_04_29_00.sql | 0 data/sql/{updates => archive}/db_world/2025_04_29_01.sql | 0 data/sql/{updates => archive}/db_world/2025_04_30_00.sql | 0 data/sql/{updates => archive}/db_world/2025_04_30_01.sql | 0 data/sql/{updates => archive}/db_world/2025_04_30_02.sql | 0 data/sql/{updates => archive}/db_world/2025_04_30_03.sql | 0 data/sql/{updates => archive}/db_world/2025_04_30_04.sql | 0 data/sql/{updates => archive}/db_world/2025_04_30_05.sql | 0 data/sql/{updates => archive}/db_world/2025_05_01_00.sql | 0 data/sql/{updates => archive}/db_world/2025_05_03_00.sql | 0 data/sql/{updates => archive}/db_world/2025_05_04_00.sql | 0 data/sql/{updates => archive}/db_world/2025_05_04_01.sql | 0 data/sql/{updates => archive}/db_world/2025_05_04_02.sql | 0 data/sql/{updates => archive}/db_world/2025_05_04_03.sql | 0 data/sql/{updates => archive}/db_world/2025_05_04_04.sql | 0 data/sql/{updates => archive}/db_world/2025_05_05_00.sql | 0 data/sql/{updates => archive}/db_world/2025_05_09_00.sql | 0 data/sql/{updates => archive}/db_world/2025_05_09_01.sql | 0 data/sql/{updates => archive}/db_world/2025_05_10_00.sql | 0 data/sql/{updates => archive}/db_world/2025_05_10_01.sql | 0 data/sql/{updates => archive}/db_world/2025_05_10_02.sql | 0 data/sql/{updates => archive}/db_world/2025_05_10_03.sql | 0 data/sql/{updates => archive}/db_world/2025_05_10_04.sql | 0 data/sql/{updates => archive}/db_world/2025_05_12_00.sql | 0 data/sql/{updates => archive}/db_world/2025_05_12_01.sql | 0 data/sql/{updates => archive}/db_world/2025_05_13_00.sql | 0 data/sql/{updates => archive}/db_world/2025_05_15_00.sql | 0 data/sql/{updates => archive}/db_world/2025_05_18_00.sql | 0 data/sql/{updates => archive}/db_world/2025_05_19_00.sql | 0 data/sql/{updates => archive}/db_world/2025_05_20_00.sql | 0 data/sql/{updates => archive}/db_world/2025_05_21_00.sql | 0 data/sql/{updates => archive}/db_world/2025_05_21_01.sql | 0 data/sql/{updates => archive}/db_world/2025_05_22_00.sql | 0 data/sql/{updates => archive}/db_world/2025_05_23_00.sql | 0 data/sql/{updates => archive}/db_world/2025_05_23_01.sql | 0 data/sql/{updates => archive}/db_world/2025_05_23_02.sql | 0 data/sql/{updates => archive}/db_world/2025_05_23_03.sql | 0 data/sql/{updates => archive}/db_world/2025_05_23_04.sql | 0 data/sql/{updates => archive}/db_world/2025_05_23_05.sql | 0 data/sql/{updates => archive}/db_world/2025_05_23_06.sql | 0 data/sql/{updates => archive}/db_world/2025_05_24_00.sql | 0 data/sql/{updates => archive}/db_world/2025_05_24_01.sql | 0 data/sql/{updates => archive}/db_world/2025_05_24_02.sql | 0 data/sql/{updates => archive}/db_world/2025_05_26_00.sql | 0 data/sql/{updates => archive}/db_world/2025_05_27_00.sql | 0 data/sql/{updates => archive}/db_world/2025_05_27_01.sql | 0 data/sql/{updates => archive}/db_world/2025_05_27_02.sql | 0 data/sql/{updates => archive}/db_world/2025_05_29_00.sql | 0 data/sql/{updates => archive}/db_world/2025_05_29_01.sql | 0 data/sql/{updates => archive}/db_world/2025_05_30_00.sql | 0 data/sql/{updates => archive}/db_world/2025_05_30_01.sql | 0 data/sql/{updates => archive}/db_world/2025_05_30_02.sql | 0 data/sql/{updates => archive}/db_world/2025_05_30_03.sql | 0 data/sql/{updates => archive}/db_world/2025_05_30_04.sql | 0 data/sql/{updates => archive}/db_world/2025_05_30_05.sql | 0 data/sql/{updates => archive}/db_world/2025_05_30_06.sql | 0 data/sql/{updates => archive}/db_world/2025_05_30_07.sql | 0 data/sql/{updates => archive}/db_world/2025_05_30_08.sql | 0 data/sql/{updates => archive}/db_world/2025_05_31_00.sql | 0 data/sql/{updates => archive}/db_world/2025_05_31_01.sql | 0 data/sql/{updates => archive}/db_world/2025_06_05_00.sql | 0 data/sql/{updates => archive}/db_world/2025_06_05_01.sql | 0 data/sql/{updates => archive}/db_world/2025_06_05_02.sql | 0 data/sql/{updates => archive}/db_world/2025_06_05_03.sql | 0 data/sql/{updates => archive}/db_world/2025_06_06_00.sql | 0 data/sql/{updates => archive}/db_world/2025_06_06_01.sql | 0 data/sql/{updates => archive}/db_world/2025_06_07_00.sql | 0 data/sql/{updates => archive}/db_world/2025_06_08_00.sql | 0 data/sql/{updates => archive}/db_world/2025_06_08_01.sql | 0 data/sql/{updates => archive}/db_world/2025_06_08_02.sql | 0 data/sql/{updates => archive}/db_world/2025_06_08_03.sql | 0 data/sql/{updates => archive}/db_world/2025_06_08_04.sql | 0 data/sql/{updates => archive}/db_world/2025_06_08_05.sql | 0 data/sql/{updates => archive}/db_world/2025_06_08_06.sql | 0 data/sql/{updates => archive}/db_world/2025_06_09_00.sql | 0 data/sql/{updates => archive}/db_world/2025_06_12_00.sql | 0 data/sql/{updates => archive}/db_world/2025_06_12_01.sql | 0 data/sql/{updates => archive}/db_world/2025_06_12_02.sql | 0 data/sql/{updates => archive}/db_world/2025_06_12_03.sql | 0 data/sql/{updates => archive}/db_world/2025_06_12_04.sql | 0 data/sql/{updates => archive}/db_world/2025_06_15_00.sql | 0 data/sql/{updates => archive}/db_world/2025_06_15_01.sql | 0 data/sql/{updates => archive}/db_world/2025_06_15_02.sql | 0 data/sql/{updates => archive}/db_world/2025_06_16_00.sql | 0 data/sql/{updates => archive}/db_world/2025_06_17_00.sql | 0 data/sql/{updates => archive}/db_world/2025_06_17_01.sql | 0 data/sql/{updates => archive}/db_world/2025_06_17_02.sql | 0 data/sql/{updates => archive}/db_world/2025_06_17_03.sql | 0 data/sql/{updates => archive}/db_world/2025_06_18_00.sql | 0 data/sql/{updates => archive}/db_world/2025_06_21_00.sql | 0 data/sql/{updates => archive}/db_world/2025_06_21_01.sql | 0 data/sql/{updates => archive}/db_world/2025_06_21_02.sql | 0 data/sql/{updates => archive}/db_world/2025_06_21_03.sql | 0 data/sql/{updates => archive}/db_world/2025_06_27_00.sql | 0 data/sql/{updates => archive}/db_world/2025_06_27_01.sql | 0 data/sql/{updates => archive}/db_world/2025_06_27_02.sql | 0 data/sql/{updates => archive}/db_world/2025_06_28_00.sql | 0 data/sql/{updates => archive}/db_world/2025_06_29_00.sql | 0 data/sql/{updates => archive}/db_world/2025_06_29_01.sql | 0 data/sql/{updates => archive}/db_world/2025_06_29_02.sql | 0 data/sql/{updates => archive}/db_world/2025_06_29_03.sql | 0 data/sql/{updates => archive}/db_world/2025_06_30_00.sql | 0 data/sql/{updates => archive}/db_world/2025_07_01_00.sql | 0 data/sql/{updates => archive}/db_world/2025_07_01_01.sql | 0 data/sql/{updates => archive}/db_world/2025_07_01_02.sql | 0 data/sql/{updates => archive}/db_world/2025_07_01_03.sql | 0 data/sql/{updates => archive}/db_world/2025_07_02_00.sql | 0 data/sql/{updates => archive}/db_world/2025_07_02_01.sql | 0 data/sql/{updates => archive}/db_world/2025_07_03_00.sql | 0 data/sql/{updates => archive}/db_world/2025_07_03_01.sql | 0 data/sql/{updates => archive}/db_world/2025_07_03_02.sql | 0 data/sql/{updates => archive}/db_world/2025_07_03_03.sql | 0 data/sql/{updates => archive}/db_world/2025_07_07_00.sql | 0 data/sql/{updates => archive}/db_world/2025_07_08_00.sql | 0 data/sql/{updates => archive}/db_world/2025_07_08_01.sql | 0 data/sql/{updates => archive}/db_world/2025_07_09_00.sql | 0 data/sql/{updates => archive}/db_world/2025_07_10_00.sql | 0 data/sql/{updates => archive}/db_world/2025_07_12_00.sql | 0 data/sql/{updates => archive}/db_world/2025_07_12_01.sql | 0 data/sql/{updates => archive}/db_world/2025_07_12_02.sql | 0 data/sql/{updates => archive}/db_world/2025_07_14_00.sql | 0 data/sql/{updates => archive}/db_world/2025_07_15_00.sql | 0 data/sql/{updates => archive}/db_world/2025_07_15_01.sql | 0 data/sql/{updates => archive}/db_world/2025_07_18_00.sql | 0 data/sql/{updates => archive}/db_world/2025_07_19_00.sql | 0 data/sql/{updates => archive}/db_world/2025_07_19_01.sql | 0 data/sql/{updates => archive}/db_world/2025_07_20_00.sql | 0 data/sql/{updates => archive}/db_world/2025_07_20_01.sql | 0 data/sql/{updates => archive}/db_world/2025_07_20_02.sql | 0 data/sql/{updates => archive}/db_world/2025_07_21_00.sql | 0 data/sql/{updates => archive}/db_world/2025_07_21_01.sql | 0 data/sql/{updates => archive}/db_world/2025_07_22_00.sql | 0 data/sql/{updates => archive}/db_world/2025_07_22_01.sql | 0 data/sql/{updates => archive}/db_world/2025_07_22_02.sql | 0 data/sql/{updates => archive}/db_world/2025_07_22_03.sql | 0 data/sql/{updates => archive}/db_world/2025_07_23_00.sql | 0 data/sql/{updates => archive}/db_world/2025_07_24_00.sql | 0 data/sql/{updates => archive}/db_world/2025_07_24_01.sql | 0 data/sql/{updates => archive}/db_world/2025_07_24_02.sql | 0 data/sql/{updates => archive}/db_world/2025_07_24_03.sql | 0 data/sql/{updates => archive}/db_world/2025_07_25_00.sql | 0 data/sql/{updates => archive}/db_world/2025_07_26_00.sql | 0 data/sql/{updates => archive}/db_world/2025_07_26_01.sql | 0 data/sql/{updates => archive}/db_world/2025_07_27_00.sql | 0 data/sql/{updates => archive}/db_world/2025_07_27_01.sql | 0 data/sql/{updates => archive}/db_world/2025_07_27_02.sql | 0 data/sql/{updates => archive}/db_world/2025_07_29_00.sql | 0 data/sql/{updates => archive}/db_world/2025_07_29_01.sql | 0 data/sql/{updates => archive}/db_world/2025_07_29_02.sql | 0 data/sql/{updates => archive}/db_world/2025_07_29_03.sql | 0 data/sql/{updates => archive}/db_world/2025_08_01_00.sql | 0 data/sql/{updates => archive}/db_world/2025_08_01_01.sql | 0 data/sql/{updates => archive}/db_world/2025_08_06_00.sql | 0 data/sql/{updates => archive}/db_world/2025_08_06_01.sql | 0 data/sql/{updates => archive}/db_world/2025_08_06_02.sql | 0 data/sql/{updates => archive}/db_world/2025_08_06_03.sql | 0 data/sql/{updates => archive}/db_world/2025_08_06_04.sql | 0 data/sql/{updates => archive}/db_world/2025_08_07_00.sql | 0 data/sql/{updates => archive}/db_world/2025_08_08_00.sql | 0 data/sql/{updates => archive}/db_world/2025_08_08_01.sql | 0 data/sql/{updates => archive}/db_world/2025_08_10_00.sql | 0 data/sql/{updates => archive}/db_world/2025_08_10_01.sql | 0 data/sql/{updates => archive}/db_world/2025_08_12_00.sql | 0 data/sql/{updates => archive}/db_world/2025_08_12_01.sql | 0 data/sql/{updates => archive}/db_world/2025_08_13_00.sql | 0 data/sql/{updates => archive}/db_world/2025_08_14_00.sql | 0 data/sql/{updates => archive}/db_world/2025_08_18_00.sql | 0 data/sql/{updates => archive}/db_world/2025_08_18_01.sql | 0 data/sql/{updates => archive}/db_world/2025_08_19_00.sql | 0 data/sql/{updates => archive}/db_world/2025_08_23_00.sql | 0 data/sql/{updates => archive}/db_world/2025_08_23_01.sql | 0 data/sql/{updates => archive}/db_world/2025_08_23_02.sql | 0 data/sql/{updates => archive}/db_world/2025_08_24_00.sql | 0 data/sql/{updates => archive}/db_world/2025_08_25_00.sql | 0 data/sql/{updates => archive}/db_world/2025_08_25_01.sql | 0 data/sql/{updates => archive}/db_world/2025_08_25_02.sql | 0 data/sql/{updates => archive}/db_world/2025_08_27_00.sql | 0 data/sql/{updates => archive}/db_world/2025_08_27_01.sql | 0 data/sql/{updates => archive}/db_world/2025_08_27_02.sql | 0 data/sql/{updates => archive}/db_world/2025_08_28_00.sql | 0 data/sql/{updates => archive}/db_world/2025_08_29_00.sql | 0 data/sql/{updates => archive}/db_world/2025_08_29_01.sql | 0 data/sql/{updates => archive}/db_world/2025_08_30_00.sql | 0 data/sql/{updates => archive}/db_world/2025_08_30_01.sql | 0 data/sql/{updates => archive}/db_world/2025_08_30_02.sql | 0 data/sql/{updates => archive}/db_world/2025_08_30_03.sql | 0 data/sql/{updates => archive}/db_world/2025_09_02_00.sql | 0 data/sql/{updates => archive}/db_world/2025_09_02_01.sql | 0 data/sql/{updates => archive}/db_world/2025_09_02_02.sql | 0 data/sql/{updates => archive}/db_world/2025_09_03_00.sql | 0 data/sql/{updates => archive}/db_world/2025_09_03_01.sql | 0 data/sql/{updates => archive}/db_world/2025_09_03_02.sql | 0 data/sql/{updates => archive}/db_world/2025_09_04_00.sql | 0 data/sql/{updates => archive}/db_world/2025_09_04_01.sql | 0 data/sql/{updates => archive}/db_world/2025_09_04_02.sql | 0 data/sql/{updates => archive}/db_world/2025_09_04_03.sql | 0 data/sql/{updates => archive}/db_world/2025_09_05_00.sql | 0 data/sql/{updates => archive}/db_world/2025_09_05_01.sql | 0 data/sql/{updates => archive}/db_world/2025_09_06_00.sql | 0 data/sql/{updates => archive}/db_world/2025_09_06_01.sql | 0 data/sql/{updates => archive}/db_world/2025_09_06_02.sql | 0 data/sql/{updates => archive}/db_world/2025_09_06_03.sql | 0 data/sql/{updates => archive}/db_world/2025_09_06_04.sql | 0 data/sql/{updates => archive}/db_world/2025_09_06_05.sql | 0 data/sql/{updates => archive}/db_world/2025_09_07_00.sql | 0 data/sql/{updates => archive}/db_world/2025_09_09_00.sql | 0 data/sql/{updates => archive}/db_world/2025_09_09_01.sql | 0 data/sql/{updates => archive}/db_world/2025_09_09_02.sql | 0 data/sql/{updates => archive}/db_world/2025_09_09_03.sql | 0 data/sql/{updates => archive}/db_world/2025_09_09_04.sql | 0 data/sql/{updates => archive}/db_world/2025_09_09_05.sql | 0 data/sql/{updates => archive}/db_world/2025_09_10_00.sql | 0 data/sql/{updates => archive}/db_world/2025_09_10_01.sql | 0 data/sql/{updates => archive}/db_world/2025_09_10_02.sql | 0 data/sql/{updates => archive}/db_world/2025_09_11_00.sql | 0 data/sql/{updates => archive}/db_world/2025_09_11_01.sql | 0 data/sql/{updates => archive}/db_world/2025_09_11_02.sql | 0 data/sql/{updates => archive}/db_world/2025_09_11_03.sql | 0 data/sql/{updates => archive}/db_world/2025_09_12_00.sql | 0 data/sql/{updates => archive}/db_world/2025_09_12_01.sql | 0 data/sql/{updates => archive}/db_world/2025_09_12_02.sql | 0 data/sql/{updates => archive}/db_world/2025_09_12_03.sql | 0 data/sql/{updates => archive}/db_world/2025_09_12_04.sql | 0 data/sql/{updates => archive}/db_world/2025_09_12_05.sql | 0 data/sql/{updates => archive}/db_world/2025_09_13_00.sql | 0 data/sql/{updates => archive}/db_world/2025_09_13_01.sql | 0 data/sql/{updates => archive}/db_world/2025_09_13_02.sql | 0 data/sql/{updates => archive}/db_world/2025_09_13_03.sql | 0 data/sql/{updates => archive}/db_world/2025_09_14_00.sql | 0 data/sql/{updates => archive}/db_world/2025_09_14_01.sql | 0 data/sql/{updates => archive}/db_world/2025_09_14_02.sql | 0 data/sql/{updates => archive}/db_world/2025_09_15_00.sql | 0 data/sql/{updates => archive}/db_world/2025_09_15_01.sql | 0 data/sql/{updates => archive}/db_world/2025_09_15_02.sql | 0 data/sql/{updates => archive}/db_world/2025_09_15_03.sql | 0 data/sql/{updates => archive}/db_world/2025_09_16_00.sql | 0 data/sql/{updates => archive}/db_world/2025_09_16_01.sql | 0 data/sql/{updates => archive}/db_world/2025_09_16_02.sql | 0 data/sql/{updates => archive}/db_world/2025_09_16_03.sql | 0 data/sql/{updates => archive}/db_world/2025_09_16_04.sql | 0 data/sql/{updates => archive}/db_world/2025_09_16_05.sql | 0 data/sql/{updates => archive}/db_world/2025_09_16_06.sql | 0 data/sql/{updates => archive}/db_world/2025_09_17_00.sql | 0 data/sql/{updates => archive}/db_world/2025_09_19_00.sql | 0 data/sql/{updates => archive}/db_world/2025_09_19_01.sql | 0 data/sql/{updates => archive}/db_world/2025_09_19_02.sql | 0 data/sql/{updates => archive}/db_world/2025_09_19_03.sql | 0 data/sql/{updates => archive}/db_world/2025_09_19_04.sql | 0 data/sql/{updates => archive}/db_world/2025_09_19_05.sql | 0 data/sql/{updates => archive}/db_world/2025_09_19_06.sql | 0 data/sql/{updates => archive}/db_world/2025_09_20_00.sql | 0 data/sql/{updates => archive}/db_world/2025_09_20_01.sql | 0 data/sql/{updates => archive}/db_world/2025_09_20_02.sql | 0 data/sql/{updates => archive}/db_world/2025_09_20_03.sql | 0 data/sql/{updates => archive}/db_world/2025_09_20_04.sql | 0 data/sql/{updates => archive}/db_world/2025_09_20_05.sql | 0 data/sql/{updates => archive}/db_world/2025_09_20_06.sql | 0 data/sql/{updates => archive}/db_world/2025_09_22_00.sql | 0 data/sql/{updates => archive}/db_world/2025_09_22_01.sql | 0 data/sql/{updates => archive}/db_world/2025_09_22_02.sql | 0 data/sql/{updates => archive}/db_world/2025_09_22_03.sql | 0 data/sql/{updates => archive}/db_world/2025_09_23_00.sql | 0 data/sql/{updates => archive}/db_world/2025_09_23_01.sql | 0 data/sql/{updates => archive}/db_world/2025_09_23_02.sql | 0 data/sql/{updates => archive}/db_world/2025_09_23_03.sql | 0 data/sql/{updates => archive}/db_world/2025_09_26_00.sql | 0 data/sql/{updates => archive}/db_world/2025_09_26_01.sql | 0 data/sql/{updates => archive}/db_world/2025_09_27_00.sql | 0 data/sql/{updates => archive}/db_world/2025_09_27_01.sql | 0 data/sql/{updates => archive}/db_world/2025_09_27_02.sql | 0 data/sql/{updates => archive}/db_world/2025_09_27_03.sql | 0 data/sql/{updates => archive}/db_world/2025_09_28_00.sql | 0 data/sql/{updates => archive}/db_world/2025_09_28_01.sql | 0 data/sql/{updates => archive}/db_world/2025_09_29_00.sql | 0 data/sql/{updates => archive}/db_world/2025_09_30_00.sql | 0 data/sql/{updates => archive}/db_world/2025_09_30_01.sql | 0 data/sql/{updates => archive}/db_world/2025_09_30_02.sql | 0 data/sql/{updates => archive}/db_world/2025_10_01_00.sql | 0 data/sql/{updates => archive}/db_world/2025_10_01_01.sql | 0 data/sql/{updates => archive}/db_world/2025_10_01_02.sql | 0 data/sql/{updates => archive}/db_world/2025_10_02_00.sql | 0 data/sql/{updates => archive}/db_world/2025_10_02_01.sql | 0 data/sql/{updates => archive}/db_world/2025_10_04_00.sql | 0 data/sql/{updates => archive}/db_world/2025_10_04_01.sql | 0 data/sql/{updates => archive}/db_world/2025_10_04_02.sql | 0 data/sql/{updates => archive}/db_world/2025_10_04_03.sql | 0 data/sql/{updates => archive}/db_world/2025_10_04_04.sql | 0 data/sql/{updates => archive}/db_world/2025_10_04_05.sql | 0 data/sql/{updates => archive}/db_world/2025_10_04_06.sql | 0 data/sql/{updates => archive}/db_world/2025_10_06_00.sql | 0 data/sql/{updates => archive}/db_world/2025_10_07_00.sql | 0 data/sql/{updates => archive}/db_world/2025_10_07_01.sql | 0 data/sql/{updates => archive}/db_world/2025_10_09_00.sql | 0 data/sql/{updates => archive}/db_world/2025_10_09_01.sql | 0 data/sql/{updates => archive}/db_world/2025_10_09_02.sql | 0 data/sql/{updates => archive}/db_world/2025_10_09_03.sql | 0 data/sql/{updates => archive}/db_world/2025_10_09_04.sql | 0 data/sql/{updates => archive}/db_world/2025_10_10_00.sql | 0 data/sql/{updates => archive}/db_world/2025_10_10_01.sql | 0 data/sql/{updates => archive}/db_world/2025_10_11_00.sql | 0 data/sql/{updates => archive}/db_world/2025_10_11_01.sql | 0 data/sql/{updates => archive}/db_world/2025_10_11_02.sql | 0 data/sql/{updates => archive}/db_world/2025_10_11_03.sql | 0 data/sql/{updates => archive}/db_world/2025_10_11_04.sql | 0 data/sql/{updates => archive}/db_world/2025_10_11_05.sql | 0 data/sql/{updates => archive}/db_world/2025_10_11_06.sql | 0 data/sql/{updates => archive}/db_world/2025_10_12_00.sql | 0 data/sql/{updates => archive}/db_world/2025_10_12_01.sql | 0 data/sql/{updates => archive}/db_world/2025_10_12_02.sql | 0 data/sql/{updates => archive}/db_world/2025_10_12_03.sql | 0 data/sql/{updates => archive}/db_world/2025_10_12_04.sql | 0 data/sql/{updates => archive}/db_world/2025_10_12_05.sql | 0 data/sql/{updates => archive}/db_world/2025_10_12_06.sql | 0 data/sql/{updates => archive}/db_world/2025_10_14_00.sql | 0 data/sql/{updates => archive}/db_world/2025_10_16_00.sql | 0 data/sql/{updates => archive}/db_world/2025_10_16_01.sql | 0 data/sql/{updates => archive}/db_world/2025_10_16_02.sql | 0 data/sql/{updates => archive}/db_world/2025_10_16_03.sql | 0 data/sql/{updates => archive}/db_world/2025_10_16_04.sql | 0 data/sql/{updates => archive}/db_world/2025_10_16_05.sql | 0 data/sql/{updates => archive}/db_world/2025_10_17_00.sql | 0 data/sql/{updates => archive}/db_world/2025_10_18_00.sql | 0 data/sql/{updates => archive}/db_world/2025_10_18_01.sql | 0 data/sql/{updates => archive}/db_world/2025_10_18_02.sql | 0 data/sql/{updates => archive}/db_world/2025_10_19_00.sql | 0 data/sql/{updates => archive}/db_world/2025_10_21_00.sql | 0 data/sql/{updates => archive}/db_world/2025_10_24_00.sql | 0 data/sql/{updates => archive}/db_world/2025_10_24_01.sql | 0 data/sql/{updates => archive}/db_world/2025_10_24_02.sql | 0 data/sql/{updates => archive}/db_world/2025_10_24_03.sql | 0 data/sql/{updates => archive}/db_world/2025_10_24_04.sql | 0 data/sql/{updates => archive}/db_world/2025_10_24_05.sql | 0 data/sql/{updates => archive}/db_world/2025_10_25_00.sql | 0 data/sql/{updates => archive}/db_world/2025_10_25_01.sql | 0 data/sql/{updates => archive}/db_world/2025_10_26_00.sql | 0 data/sql/{updates => archive}/db_world/2025_10_26_01.sql | 0 data/sql/{updates => archive}/db_world/2025_10_26_02.sql | 0 data/sql/{updates => archive}/db_world/2025_10_26_03.sql | 0 data/sql/{updates => archive}/db_world/2025_10_28_00.sql | 0 data/sql/{updates => archive}/db_world/2025_10_28_01.sql | 0 data/sql/{updates => archive}/db_world/2025_10_28_02.sql | 0 data/sql/{updates => archive}/db_world/2025_10_28_03.sql | 0 data/sql/{updates => archive}/db_world/2025_10_28_04.sql | 0 data/sql/{updates => archive}/db_world/2025_10_28_05.sql | 0 data/sql/{updates => archive}/db_world/2025_10_29_00.sql | 0 data/sql/{updates => archive}/db_world/2025_10_29_01.sql | 0 data/sql/{updates => archive}/db_world/2025_10_29_02.sql | 0 data/sql/{updates => archive}/db_world/2025_10_30_00.sql | 0 data/sql/{updates => archive}/db_world/2025_10_30_01.sql | 0 data/sql/{updates => archive}/db_world/2025_10_31_00.sql | 0 data/sql/{updates => archive}/db_world/2025_10_31_01.sql | 0 data/sql/{updates => archive}/db_world/2025_10_31_02.sql | 0 data/sql/{updates => archive}/db_world/2025_11_01_00.sql | 0 data/sql/{updates => archive}/db_world/2025_11_01_01.sql | 0 data/sql/{updates => archive}/db_world/2025_11_01_02.sql | 0 data/sql/{updates => archive}/db_world/2025_11_01_03.sql | 0 data/sql/{updates => archive}/db_world/2025_11_03_00.sql | 0 data/sql/{updates => archive}/db_world/2025_11_03_01.sql | 0 data/sql/{updates => archive}/db_world/2025_11_04_00.sql | 0 data/sql/{updates => archive}/db_world/2025_11_04_01.sql | 0 data/sql/{updates => archive}/db_world/2025_11_05_00.sql | 0 data/sql/{updates => archive}/db_world/2025_11_06_00.sql | 0 data/sql/{updates => archive}/db_world/2025_11_06_01.sql | 0 data/sql/{updates => archive}/db_world/2025_11_07_00.sql | 0 data/sql/{updates => archive}/db_world/2025_11_07_01.sql | 0 data/sql/{updates => archive}/db_world/2025_11_07_02.sql | 0 data/sql/{updates => archive}/db_world/2025_11_08_00.sql | 0 data/sql/{updates => archive}/db_world/2025_11_08_01.sql | 0 data/sql/{updates => archive}/db_world/2025_11_08_02.sql | 0 data/sql/{updates => archive}/db_world/2025_11_09_00.sql | 0 data/sql/{updates => archive}/db_world/2025_11_09_01.sql | 0 data/sql/{updates => archive}/db_world/2025_11_09_02.sql | 0 data/sql/{updates => archive}/db_world/2025_11_09_03.sql | 0 data/sql/{updates => archive}/db_world/2025_11_09_04.sql | 0 data/sql/{updates => archive}/db_world/2025_11_09_05.sql | 0 data/sql/{updates => archive}/db_world/2025_11_10_00.sql | 0 data/sql/{updates => archive}/db_world/2025_11_10_01.sql | 0 data/sql/{updates => archive}/db_world/2025_11_10_02.sql | 0 data/sql/{updates => archive}/db_world/2025_11_10_03.sql | 0 data/sql/{updates => archive}/db_world/2025_11_11_00.sql | 0 data/sql/{updates => archive}/db_world/2025_11_11_01.sql | 0 data/sql/{updates => archive}/db_world/2025_11_11_02.sql | 0 data/sql/{updates => archive}/db_world/2025_11_11_03.sql | 0 data/sql/{updates => archive}/db_world/2025_11_12_00.sql | 0 data/sql/{updates => archive}/db_world/2025_11_12_01.sql | 0 data/sql/{updates => archive}/db_world/2025_11_12_02.sql | 0 data/sql/{updates => archive}/db_world/2025_11_12_03.sql | 0 data/sql/{updates => archive}/db_world/2025_11_12_04.sql | 0 data/sql/{updates => archive}/db_world/2025_11_12_05.sql | 0 data/sql/{updates => archive}/db_world/2025_11_12_06.sql | 0 data/sql/{updates => archive}/db_world/2025_11_13_00.sql | 0 data/sql/{updates => archive}/db_world/2025_11_13_01.sql | 0 data/sql/{updates => archive}/db_world/2025_11_13_02.sql | 0 data/sql/{updates => archive}/db_world/2025_11_13_03.sql | 0 data/sql/{updates => archive}/db_world/2025_11_13_04.sql | 0 data/sql/{updates => archive}/db_world/2025_11_13_05.sql | 0 data/sql/{updates => archive}/db_world/2025_11_14_00.sql | 0 data/sql/{updates => archive}/db_world/2025_11_14_01.sql | 0 data/sql/{updates => archive}/db_world/2025_11_14_02.sql | 0 data/sql/{updates => archive}/db_world/2025_11_14_03.sql | 0 data/sql/{updates => archive}/db_world/2025_11_15_00.sql | 0 data/sql/{updates => archive}/db_world/2025_11_15_01.sql | 0 data/sql/{updates => archive}/db_world/2025_11_15_02.sql | 0 data/sql/{updates => archive}/db_world/2025_11_15_03.sql | 0 data/sql/{updates => archive}/db_world/2025_11_15_04.sql | 0 data/sql/{updates => archive}/db_world/2025_11_15_05.sql | 0 data/sql/{updates => archive}/db_world/2025_11_15_06.sql | 0 data/sql/{updates => archive}/db_world/2025_11_15_07.sql | 0 data/sql/{updates => archive}/db_world/2025_11_15_08.sql | 0 data/sql/{updates => archive}/db_world/2025_11_15_09.sql | 0 data/sql/{updates => archive}/db_world/2025_11_15_10.sql | 0 data/sql/{updates => archive}/db_world/2025_11_15_11.sql | 0 data/sql/{updates => archive}/db_world/2025_11_15_12.sql | 0 data/sql/{updates => archive}/db_world/2025_11_15_13.sql | 0 data/sql/{updates => archive}/db_world/2025_11_15_14.sql | 0 data/sql/{updates => archive}/db_world/2025_11_15_15.sql | 0 data/sql/{updates => archive}/db_world/2025_11_16_00.sql | 0 data/sql/{updates => archive}/db_world/2025_11_16_01.sql | 0 data/sql/{updates => archive}/db_world/2025_11_16_02.sql | 0 data/sql/{updates => archive}/db_world/2025_11_17_00.sql | 0 data/sql/{updates => archive}/db_world/2025_11_17_01.sql | 0 data/sql/{updates => archive}/db_world/2025_11_17_02.sql | 0 data/sql/{updates => archive}/db_world/2025_11_17_03.sql | 0 data/sql/{updates => archive}/db_world/2025_11_17_04.sql | 0 data/sql/{updates => archive}/db_world/2025_11_18_00.sql | 0 data/sql/{updates => archive}/db_world/2025_11_18_01.sql | 0 data/sql/{updates => archive}/db_world/2025_11_18_02.sql | 0 data/sql/{updates => archive}/db_world/2025_11_20_00.sql | 0 data/sql/{updates => archive}/db_world/2025_11_20_01.sql | 0 data/sql/{updates => archive}/db_world/2025_11_20_02.sql | 0 data/sql/{updates => archive}/db_world/2025_11_20_03.sql | 0 data/sql/{updates => archive}/db_world/2025_11_20_04.sql | 0 data/sql/{updates => archive}/db_world/2025_11_21_00.sql | 0 data/sql/{updates => archive}/db_world/2025_11_21_01.sql | 0 data/sql/{updates => archive}/db_world/2025_11_21_02.sql | 0 data/sql/{updates => archive}/db_world/2025_11_21_03.sql | 0 data/sql/{updates => archive}/db_world/2025_11_21_04.sql | 0 data/sql/{updates => archive}/db_world/2025_11_21_05.sql | 0 data/sql/{updates => archive}/db_world/2025_11_21_06.sql | 0 data/sql/{updates => archive}/db_world/2025_11_21_07.sql | 0 data/sql/{updates => archive}/db_world/2025_11_23_00.sql | 0 data/sql/{updates => archive}/db_world/2025_11_24_00.sql | 0 data/sql/{updates => archive}/db_world/2025_11_24_01.sql | 0 data/sql/{updates => archive}/db_world/2025_11_24_02.sql | 0 data/sql/{updates => archive}/db_world/2025_11_24_03.sql | 0 data/sql/{updates => archive}/db_world/2025_11_25_00.sql | 0 data/sql/{updates => archive}/db_world/2025_11_25_01.sql | 0 data/sql/{updates => archive}/db_world/2025_11_25_02.sql | 0 data/sql/{updates => archive}/db_world/2025_11_26_00.sql | 0 data/sql/{updates => archive}/db_world/2025_11_26_01.sql | 0 data/sql/{updates => archive}/db_world/2025_11_26_02.sql | 0 data/sql/{updates => archive}/db_world/2025_11_26_03.sql | 0 data/sql/{updates => archive}/db_world/2025_11_26_04.sql | 0 data/sql/{updates => archive}/db_world/2025_11_26_05.sql | 0 data/sql/{updates => archive}/db_world/2025_11_26_06.sql | 0 data/sql/{updates => archive}/db_world/2025_11_27_00.sql | 0 data/sql/{updates => archive}/db_world/2025_11_27_01.sql | 0 data/sql/{updates => archive}/db_world/2025_11_27_02.sql | 0 data/sql/{updates => archive}/db_world/2025_11_27_03.sql | 0 data/sql/{updates => archive}/db_world/2025_11_27_04.sql | 0 data/sql/{updates => archive}/db_world/2025_11_27_05.sql | 0 data/sql/{updates => archive}/db_world/2025_11_27_06.sql | 0 data/sql/{updates => archive}/db_world/2025_11_27_07.sql | 0 data/sql/{updates => archive}/db_world/2025_11_27_08.sql | 0 data/sql/{updates => archive}/db_world/2025_11_27_09.sql | 0 data/sql/{updates => archive}/db_world/2025_11_27_10.sql | 0 data/sql/{updates => archive}/db_world/2025_11_28_00.sql | 0 data/sql/{updates => archive}/db_world/2025_11_28_01.sql | 0 data/sql/{updates => archive}/db_world/2025_11_28_02.sql | 0 data/sql/{updates => archive}/db_world/2025_11_28_03.sql | 0 data/sql/{updates => archive}/db_world/2025_11_28_04.sql | 0 data/sql/{updates => archive}/db_world/2025_11_28_05.sql | 0 data/sql/{updates => archive}/db_world/2025_11_28_06.sql | 0 data/sql/{updates => archive}/db_world/2025_11_28_07.sql | 0 data/sql/{updates => archive}/db_world/2025_11_28_08.sql | 0 data/sql/{updates => archive}/db_world/2025_11_29_00.sql | 0 data/sql/{updates => archive}/db_world/2025_11_29_01.sql | 0 data/sql/{updates => archive}/db_world/2025_11_29_02.sql | 0 data/sql/{updates => archive}/db_world/2025_11_29_03.sql | 0 data/sql/{updates => archive}/db_world/2025_11_30_00.sql | 0 data/sql/{updates => archive}/db_world/2025_11_30_01.sql | 0 data/sql/{updates => archive}/db_world/2025_11_30_02.sql | 0 data/sql/{updates => archive}/db_world/2025_11_30_03.sql | 0 data/sql/{updates => archive}/db_world/2025_11_30_04.sql | 0 data/sql/{updates => archive}/db_world/2025_11_30_05.sql | 0 data/sql/{updates => archive}/db_world/2025_11_30_06.sql | 0 data/sql/{updates => archive}/db_world/2025_11_30_07.sql | 0 data/sql/{updates => archive}/db_world/2025_11_30_08.sql | 0 data/sql/{updates => archive}/db_world/2025_12_01_00.sql | 0 data/sql/{updates => archive}/db_world/2025_12_01_01.sql | 0 data/sql/{updates => archive}/db_world/2025_12_01_02.sql | 0 data/sql/{updates => archive}/db_world/2025_12_01_03.sql | 0 data/sql/{updates => archive}/db_world/2025_12_01_04.sql | 0 data/sql/{updates => archive}/db_world/2025_12_01_05.sql | 0 data/sql/{updates => archive}/db_world/2025_12_02_00.sql | 0 data/sql/{updates => archive}/db_world/2025_12_02_01.sql | 0 data/sql/{updates => archive}/db_world/2025_12_02_02.sql | 0 data/sql/{updates => archive}/db_world/2025_12_02_03.sql | 0 data/sql/{updates => archive}/db_world/2025_12_02_04.sql | 0 data/sql/{updates => archive}/db_world/2025_12_04_00.sql | 0 data/sql/{updates => archive}/db_world/2025_12_05_00.sql | 0 data/sql/{updates => archive}/db_world/2025_12_05_01.sql | 0 data/sql/{updates => archive}/db_world/2025_12_08_00.sql | 0 data/sql/{updates => archive}/db_world/2025_12_08_01.sql | 0 data/sql/{updates => archive}/db_world/2025_12_09_00.sql | 0 data/sql/{updates => archive}/db_world/2025_12_10_00.sql | 0 data/sql/{updates => archive}/db_world/2025_12_10_01.sql | 0 data/sql/{updates => archive}/db_world/2025_12_11_00.sql | 0 data/sql/{updates => archive}/db_world/2025_12_12_00.sql | 0 data/sql/{updates => archive}/db_world/2025_12_12_01.sql | 0 data/sql/{updates => archive}/db_world/2025_12_12_02.sql | 0 data/sql/{updates => archive}/db_world/2025_12_14_00.sql | 0 data/sql/{updates => archive}/db_world/2025_12_15_00.sql | 0 data/sql/{updates => archive}/db_world/2025_12_16_00.sql | 0 data/sql/{updates => archive}/db_world/2025_12_16_01.sql | 0 data/sql/{updates => archive}/db_world/2025_12_16_02.sql | 0 data/sql/{updates => archive}/db_world/2025_12_17_00.sql | 0 data/sql/{updates => archive}/db_world/2025_12_17_01.sql | 0 data/sql/{updates => archive}/db_world/2025_12_17_02.sql | 0 data/sql/{updates => archive}/db_world/2025_12_17_03.sql | 0 data/sql/{updates => archive}/db_world/2025_12_18_00.sql | 0 data/sql/{updates => archive}/db_world/2025_12_18_01.sql | 0 data/sql/{updates => archive}/db_world/2025_12_18_02.sql | 0 data/sql/{updates => archive}/db_world/2025_12_18_03.sql | 0 data/sql/{updates => archive}/db_world/2025_12_18_04.sql | 0 data/sql/{updates => archive}/db_world/2025_12_18_05.sql | 0 data/sql/{updates => archive}/db_world/2025_12_18_06.sql | 0 data/sql/{updates => archive}/db_world/2025_12_18_07.sql | 0 data/sql/{updates => archive}/db_world/2025_12_19_00.sql | 0 data/sql/{updates => archive}/db_world/2025_12_19_01.sql | 0 data/sql/{updates => archive}/db_world/2025_12_19_02.sql | 0 data/sql/{updates => archive}/db_world/2025_12_19_03.sql | 0 data/sql/{updates => archive}/db_world/2025_12_19_04.sql | 0 data/sql/{updates => archive}/db_world/2025_12_20_00.sql | 0 data/sql/{updates => archive}/db_world/2025_12_20_01.sql | 0 data/sql/{updates => archive}/db_world/2025_12_20_02.sql | 0 data/sql/{updates => archive}/db_world/2025_12_20_03.sql | 0 data/sql/{updates => archive}/db_world/2025_12_20_04.sql | 0 data/sql/{updates => archive}/db_world/2025_12_21_00.sql | 0 data/sql/{updates => archive}/db_world/2025_12_21_01.sql | 0 data/sql/{updates => archive}/db_world/2025_12_21_02.sql | 0 data/sql/{updates => archive}/db_world/2025_12_21_03.sql | 0 data/sql/{updates => archive}/db_world/2025_12_22_00.sql | 0 data/sql/{updates => archive}/db_world/2025_12_22_01.sql | 0 data/sql/{updates => archive}/db_world/2025_12_23_00.sql | 0 data/sql/{updates => archive}/db_world/2025_12_23_01.sql | 0 data/sql/{updates => archive}/db_world/2025_12_24_00.sql | 0 data/sql/{updates => archive}/db_world/2025_12_24_01.sql | 0 data/sql/{updates => archive}/db_world/2025_12_26_00.sql | 0 data/sql/{updates => archive}/db_world/2025_12_26_01.sql | 0 data/sql/{updates => archive}/db_world/2025_12_26_02.sql | 0 data/sql/{updates => archive}/db_world/2025_12_26_03.sql | 0 data/sql/{updates => archive}/db_world/2025_12_26_04.sql | 0 data/sql/{updates => archive}/db_world/2025_12_26_05.sql | 0 data/sql/{updates => archive}/db_world/2025_12_26_06.sql | 0 data/sql/{updates => archive}/db_world/2025_12_26_07.sql | 0 data/sql/{updates => archive}/db_world/2025_12_26_08.sql | 0 data/sql/{updates => archive}/db_world/2025_12_26_09.sql | 0 data/sql/{updates => archive}/db_world/2025_12_26_10.sql | 0 data/sql/{updates => archive}/db_world/2025_12_26_11.sql | 0 data/sql/{updates => archive}/db_world/2025_12_27_00.sql | 0 data/sql/{updates => archive}/db_world/2025_12_27_01.sql | 0 data/sql/{updates => archive}/db_world/2025_12_27_02.sql | 0 data/sql/{updates => archive}/db_world/2025_12_27_03.sql | 0 data/sql/{updates => archive}/db_world/2025_12_27_04.sql | 0 data/sql/{updates => archive}/db_world/2025_12_27_05.sql | 0 data/sql/{updates => archive}/db_world/2025_12_28_00.sql | 0 data/sql/{updates => archive}/db_world/2025_12_29_00.sql | 0 data/sql/{updates => archive}/db_world/2025_12_29_01.sql | 0 data/sql/{updates => archive}/db_world/2025_12_29_02.sql | 0 data/sql/{updates => archive}/db_world/2025_12_29_03.sql | 0 data/sql/{updates => archive}/db_world/2025_12_29_04.sql | 0 data/sql/{updates => archive}/db_world/2025_12_29_05.sql | 0 data/sql/{updates => archive}/db_world/2025_12_29_06.sql | 0 data/sql/{updates => archive}/db_world/2025_12_29_07.sql | 0 data/sql/{updates => archive}/db_world/2025_12_29_08.sql | 0 data/sql/{updates => archive}/db_world/2025_12_29_09.sql | 0 data/sql/{updates => archive}/db_world/2025_12_29_10.sql | 0 data/sql/{updates => archive}/db_world/2025_12_29_11.sql | 0 data/sql/{updates => archive}/db_world/2025_12_29_12.sql | 0 data/sql/{updates => archive}/db_world/2025_12_29_13.sql | 0 data/sql/{updates => archive}/db_world/2025_12_29_14.sql | 0 data/sql/{updates => archive}/db_world/2025_12_29_15.sql | 0 data/sql/{updates => archive}/db_world/2025_12_29_16.sql | 0 data/sql/{updates => archive}/db_world/2025_12_29_17.sql | 0 data/sql/{updates => archive}/db_world/2025_12_29_18.sql | 0 data/sql/{updates => archive}/db_world/2025_12_29_19.sql | 0 data/sql/{updates => archive}/db_world/2025_12_30_00.sql | 0 data/sql/{updates => archive}/db_world/2025_12_31_00.sql | 0 data/sql/{updates => archive}/db_world/2025_12_31_01.sql | 0 data/sql/updates/pending_db_auth/rev_1784739022869516500.sql | 3 +++ .../updates/pending_db_characters/rev_1784738950443156500.sql | 3 +++ data/sql/updates/pending_db_world/rev_1784738776255760500.sql | 2 ++ 831 files changed, 8 insertions(+) rename data/sql/{updates => archive}/db_auth/2024_01_20_00.sql (100%) rename data/sql/{updates => archive}/db_auth/2024_11_15_00.sql (100%) rename data/sql/{updates => archive}/db_auth/2024_12_15_00.sql (100%) rename data/sql/{updates => archive}/db_auth/2025_01_26_00.sql (100%) rename data/sql/{updates => archive}/db_auth/2025_02_16_00.sql (100%) rename data/sql/{updates => archive}/db_auth/2025_02_16_01.sql (100%) rename data/sql/{updates => archive}/db_auth/2025_07_03_00.sql (100%) rename data/sql/{updates => archive}/db_auth/2025_07_24_00.sql (100%) rename data/sql/{updates => archive}/db_characters/2024_01_20_00.sql (100%) rename data/sql/{updates => archive}/db_characters/2024_07_05_00.sql (100%) rename data/sql/{updates => archive}/db_characters/2024_09_03_00.sql (100%) rename data/sql/{updates => archive}/db_characters/2024_09_22_00.sql (100%) rename data/sql/{updates => archive}/db_characters/2024_11_15_00.sql (100%) rename data/sql/{updates => archive}/db_characters/2025_01_31_00.sql (100%) rename data/sql/{updates => archive}/db_characters/2025_02_12_00.sql (100%) rename data/sql/{updates => archive}/db_characters/2025_02_16_00.sql (100%) rename data/sql/{updates => archive}/db_characters/2025_03_09_00.sql (100%) rename data/sql/{updates => archive}/db_characters/2025_07_11_00.sql (100%) rename data/sql/{updates => archive}/db_characters/2025_07_29_00.sql (100%) rename data/sql/{updates => archive}/db_characters/2025_09_03_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_03_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_04_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_04_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_04_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_05_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_05_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_05_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_05_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_05_04.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_05_05.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_05_06.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_05_07.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_07_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_07_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_07_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_07_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_09_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_09_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_09_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_10_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_10_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_10_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_10_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_11_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_11_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_12_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_12_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_13_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_14_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_14_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_14_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_14_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_14_04.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_14_05.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_15_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_15_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_15_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_15_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_15_04.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_16_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_16_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_16_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_16_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_16_04.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_17_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_17_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_18_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_18_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_19_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_19_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_19_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_22_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_22_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_22_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_23_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_23_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_23_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_23_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_23_04.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_24_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_24_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_25_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_26_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_26_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_26_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_27_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_27_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_27_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_28_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_31_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_01_31_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_02_01_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_02_01_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_02_01_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_02_03_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_02_03_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_02_04_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_02_05_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_02_05_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_02_06_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_02_06_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_02_06_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_02_06_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_02_06_04.sql (100%) rename data/sql/{updates => archive}/db_world/2025_02_07_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_02_07_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_02_07_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_02_07_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_02_07_04.sql (100%) rename data/sql/{updates => archive}/db_world/2025_02_09_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_02_09_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_02_09_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_02_09_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_02_09_04.sql (100%) rename data/sql/{updates => archive}/db_world/2025_02_10_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_02_10_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_02_12_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_02_12_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_02_13_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_02_13_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_02_14_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_02_15_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_02_15_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_02_15_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_02_16_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_02_16_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_02_16_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_02_16_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_02_18_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_02_19_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_02_19_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_02_21_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_02_21_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_02_21_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_02_21_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_02_22_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_02_24_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_02_25_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_02_26_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_02_26_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_02_26_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_02_26_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_02_27_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_02_28_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_03_01_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_03_01_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_03_02_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_03_02_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_03_02_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_03_03_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_03_03_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_03_05_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_03_06_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_03_06_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_03_08_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_03_08_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_03_09_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_03_09_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_03_09_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_03_09_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_03_10_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_03_11_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_03_11_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_03_11_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_03_13_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_03_15_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_03_16_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_03_16_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_03_16_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_03_16_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_03_16_04.sql (100%) rename data/sql/{updates => archive}/db_world/2025_03_17_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_03_17_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_03_17_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_03_17_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_03_19_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_03_19_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_03_21_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_03_22_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_03_22_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_03_22_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_03_24_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_03_25_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_03_25_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_03_27_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_03_27_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_03_28_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_03_29_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_03_29_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_03_29_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_03_30_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_03_30_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_03_30_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_03_31_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_03_31_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_03_31_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_03_31_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_04_01_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_04_01_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_04_01_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_04_01_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_04_01_04.sql (100%) rename data/sql/{updates => archive}/db_world/2025_04_01_05.sql (100%) rename data/sql/{updates => archive}/db_world/2025_04_01_06.sql (100%) rename data/sql/{updates => archive}/db_world/2025_04_01_07.sql (100%) rename data/sql/{updates => archive}/db_world/2025_04_02_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_04_02_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_04_02_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_04_02_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_04_02_04.sql (100%) rename data/sql/{updates => archive}/db_world/2025_04_03_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_04_04_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_04_05_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_04_05_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_04_08_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_04_09_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_04_10_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_04_10_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_04_11_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_04_11_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_04_12_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_04_12_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_04_13_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_04_13_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_04_13_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_04_13_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_04_13_04.sql (100%) rename data/sql/{updates => archive}/db_world/2025_04_14_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_04_15_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_04_15_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_04_17_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_04_17_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_04_19_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_04_20_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_04_20_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_04_25_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_04_25_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_04_26_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_04_29_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_04_29_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_04_30_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_04_30_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_04_30_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_04_30_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_04_30_04.sql (100%) rename data/sql/{updates => archive}/db_world/2025_04_30_05.sql (100%) rename data/sql/{updates => archive}/db_world/2025_05_01_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_05_03_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_05_04_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_05_04_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_05_04_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_05_04_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_05_04_04.sql (100%) rename data/sql/{updates => archive}/db_world/2025_05_05_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_05_09_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_05_09_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_05_10_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_05_10_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_05_10_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_05_10_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_05_10_04.sql (100%) rename data/sql/{updates => archive}/db_world/2025_05_12_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_05_12_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_05_13_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_05_15_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_05_18_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_05_19_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_05_20_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_05_21_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_05_21_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_05_22_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_05_23_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_05_23_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_05_23_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_05_23_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_05_23_04.sql (100%) rename data/sql/{updates => archive}/db_world/2025_05_23_05.sql (100%) rename data/sql/{updates => archive}/db_world/2025_05_23_06.sql (100%) rename data/sql/{updates => archive}/db_world/2025_05_24_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_05_24_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_05_24_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_05_26_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_05_27_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_05_27_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_05_27_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_05_29_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_05_29_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_05_30_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_05_30_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_05_30_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_05_30_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_05_30_04.sql (100%) rename data/sql/{updates => archive}/db_world/2025_05_30_05.sql (100%) rename data/sql/{updates => archive}/db_world/2025_05_30_06.sql (100%) rename data/sql/{updates => archive}/db_world/2025_05_30_07.sql (100%) rename data/sql/{updates => archive}/db_world/2025_05_30_08.sql (100%) rename data/sql/{updates => archive}/db_world/2025_05_31_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_05_31_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_06_05_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_06_05_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_06_05_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_06_05_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_06_06_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_06_06_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_06_07_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_06_08_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_06_08_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_06_08_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_06_08_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_06_08_04.sql (100%) rename data/sql/{updates => archive}/db_world/2025_06_08_05.sql (100%) rename data/sql/{updates => archive}/db_world/2025_06_08_06.sql (100%) rename data/sql/{updates => archive}/db_world/2025_06_09_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_06_12_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_06_12_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_06_12_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_06_12_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_06_12_04.sql (100%) rename data/sql/{updates => archive}/db_world/2025_06_15_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_06_15_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_06_15_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_06_16_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_06_17_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_06_17_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_06_17_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_06_17_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_06_18_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_06_21_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_06_21_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_06_21_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_06_21_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_06_27_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_06_27_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_06_27_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_06_28_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_06_29_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_06_29_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_06_29_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_06_29_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_06_30_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_07_01_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_07_01_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_07_01_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_07_01_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_07_02_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_07_02_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_07_03_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_07_03_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_07_03_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_07_03_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_07_07_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_07_08_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_07_08_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_07_09_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_07_10_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_07_12_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_07_12_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_07_12_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_07_14_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_07_15_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_07_15_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_07_18_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_07_19_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_07_19_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_07_20_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_07_20_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_07_20_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_07_21_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_07_21_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_07_22_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_07_22_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_07_22_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_07_22_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_07_23_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_07_24_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_07_24_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_07_24_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_07_24_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_07_25_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_07_26_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_07_26_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_07_27_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_07_27_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_07_27_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_07_29_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_07_29_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_07_29_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_07_29_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_08_01_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_08_01_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_08_06_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_08_06_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_08_06_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_08_06_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_08_06_04.sql (100%) rename data/sql/{updates => archive}/db_world/2025_08_07_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_08_08_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_08_08_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_08_10_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_08_10_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_08_12_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_08_12_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_08_13_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_08_14_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_08_18_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_08_18_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_08_19_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_08_23_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_08_23_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_08_23_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_08_24_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_08_25_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_08_25_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_08_25_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_08_27_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_08_27_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_08_27_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_08_28_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_08_29_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_08_29_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_08_30_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_08_30_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_08_30_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_08_30_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_02_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_02_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_02_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_03_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_03_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_03_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_04_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_04_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_04_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_04_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_05_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_05_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_06_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_06_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_06_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_06_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_06_04.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_06_05.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_07_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_09_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_09_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_09_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_09_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_09_04.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_09_05.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_10_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_10_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_10_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_11_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_11_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_11_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_11_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_12_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_12_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_12_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_12_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_12_04.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_12_05.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_13_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_13_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_13_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_13_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_14_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_14_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_14_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_15_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_15_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_15_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_15_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_16_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_16_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_16_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_16_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_16_04.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_16_05.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_16_06.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_17_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_19_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_19_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_19_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_19_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_19_04.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_19_05.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_19_06.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_20_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_20_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_20_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_20_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_20_04.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_20_05.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_20_06.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_22_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_22_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_22_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_22_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_23_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_23_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_23_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_23_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_26_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_26_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_27_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_27_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_27_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_27_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_28_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_28_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_29_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_30_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_30_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_09_30_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_01_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_01_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_01_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_02_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_02_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_04_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_04_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_04_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_04_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_04_04.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_04_05.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_04_06.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_06_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_07_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_07_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_09_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_09_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_09_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_09_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_09_04.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_10_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_10_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_11_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_11_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_11_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_11_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_11_04.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_11_05.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_11_06.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_12_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_12_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_12_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_12_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_12_04.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_12_05.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_12_06.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_14_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_16_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_16_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_16_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_16_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_16_04.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_16_05.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_17_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_18_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_18_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_18_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_19_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_21_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_24_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_24_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_24_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_24_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_24_04.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_24_05.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_25_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_25_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_26_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_26_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_26_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_26_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_28_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_28_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_28_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_28_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_28_04.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_28_05.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_29_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_29_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_29_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_30_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_30_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_31_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_31_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_10_31_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_01_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_01_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_01_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_01_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_03_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_03_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_04_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_04_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_05_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_06_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_06_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_07_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_07_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_07_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_08_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_08_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_08_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_09_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_09_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_09_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_09_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_09_04.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_09_05.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_10_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_10_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_10_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_10_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_11_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_11_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_11_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_11_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_12_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_12_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_12_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_12_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_12_04.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_12_05.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_12_06.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_13_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_13_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_13_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_13_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_13_04.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_13_05.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_14_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_14_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_14_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_14_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_15_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_15_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_15_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_15_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_15_04.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_15_05.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_15_06.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_15_07.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_15_08.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_15_09.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_15_10.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_15_11.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_15_12.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_15_13.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_15_14.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_15_15.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_16_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_16_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_16_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_17_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_17_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_17_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_17_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_17_04.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_18_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_18_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_18_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_20_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_20_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_20_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_20_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_20_04.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_21_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_21_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_21_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_21_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_21_04.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_21_05.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_21_06.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_21_07.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_23_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_24_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_24_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_24_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_24_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_25_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_25_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_25_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_26_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_26_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_26_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_26_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_26_04.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_26_05.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_26_06.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_27_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_27_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_27_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_27_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_27_04.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_27_05.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_27_06.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_27_07.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_27_08.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_27_09.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_27_10.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_28_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_28_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_28_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_28_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_28_04.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_28_05.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_28_06.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_28_07.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_28_08.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_29_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_29_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_29_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_29_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_30_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_30_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_30_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_30_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_30_04.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_30_05.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_30_06.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_30_07.sql (100%) rename data/sql/{updates => archive}/db_world/2025_11_30_08.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_01_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_01_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_01_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_01_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_01_04.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_01_05.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_02_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_02_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_02_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_02_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_02_04.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_04_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_05_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_05_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_08_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_08_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_09_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_10_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_10_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_11_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_12_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_12_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_12_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_14_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_15_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_16_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_16_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_16_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_17_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_17_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_17_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_17_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_18_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_18_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_18_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_18_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_18_04.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_18_05.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_18_06.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_18_07.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_19_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_19_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_19_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_19_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_19_04.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_20_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_20_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_20_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_20_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_20_04.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_21_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_21_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_21_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_21_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_22_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_22_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_23_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_23_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_24_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_24_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_26_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_26_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_26_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_26_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_26_04.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_26_05.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_26_06.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_26_07.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_26_08.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_26_09.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_26_10.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_26_11.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_27_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_27_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_27_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_27_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_27_04.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_27_05.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_28_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_29_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_29_01.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_29_02.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_29_03.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_29_04.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_29_05.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_29_06.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_29_07.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_29_08.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_29_09.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_29_10.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_29_11.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_29_12.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_29_13.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_29_14.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_29_15.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_29_16.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_29_17.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_29_18.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_29_19.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_30_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_31_00.sql (100%) rename data/sql/{updates => archive}/db_world/2025_12_31_01.sql (100%) create mode 100644 data/sql/updates/pending_db_auth/rev_1784739022869516500.sql create mode 100644 data/sql/updates/pending_db_characters/rev_1784738950443156500.sql create mode 100644 data/sql/updates/pending_db_world/rev_1784738776255760500.sql diff --git a/data/sql/updates/db_auth/2024_01_20_00.sql b/data/sql/archive/db_auth/2024_01_20_00.sql similarity index 100% rename from data/sql/updates/db_auth/2024_01_20_00.sql rename to data/sql/archive/db_auth/2024_01_20_00.sql diff --git a/data/sql/updates/db_auth/2024_11_15_00.sql b/data/sql/archive/db_auth/2024_11_15_00.sql similarity index 100% rename from data/sql/updates/db_auth/2024_11_15_00.sql rename to data/sql/archive/db_auth/2024_11_15_00.sql diff --git a/data/sql/updates/db_auth/2024_12_15_00.sql b/data/sql/archive/db_auth/2024_12_15_00.sql similarity index 100% rename from data/sql/updates/db_auth/2024_12_15_00.sql rename to data/sql/archive/db_auth/2024_12_15_00.sql diff --git a/data/sql/updates/db_auth/2025_01_26_00.sql b/data/sql/archive/db_auth/2025_01_26_00.sql similarity index 100% rename from data/sql/updates/db_auth/2025_01_26_00.sql rename to data/sql/archive/db_auth/2025_01_26_00.sql diff --git a/data/sql/updates/db_auth/2025_02_16_00.sql b/data/sql/archive/db_auth/2025_02_16_00.sql similarity index 100% rename from data/sql/updates/db_auth/2025_02_16_00.sql rename to data/sql/archive/db_auth/2025_02_16_00.sql diff --git a/data/sql/updates/db_auth/2025_02_16_01.sql b/data/sql/archive/db_auth/2025_02_16_01.sql similarity index 100% rename from data/sql/updates/db_auth/2025_02_16_01.sql rename to data/sql/archive/db_auth/2025_02_16_01.sql diff --git a/data/sql/updates/db_auth/2025_07_03_00.sql b/data/sql/archive/db_auth/2025_07_03_00.sql similarity index 100% rename from data/sql/updates/db_auth/2025_07_03_00.sql rename to data/sql/archive/db_auth/2025_07_03_00.sql diff --git a/data/sql/updates/db_auth/2025_07_24_00.sql b/data/sql/archive/db_auth/2025_07_24_00.sql similarity index 100% rename from data/sql/updates/db_auth/2025_07_24_00.sql rename to data/sql/archive/db_auth/2025_07_24_00.sql diff --git a/data/sql/updates/db_characters/2024_01_20_00.sql b/data/sql/archive/db_characters/2024_01_20_00.sql similarity index 100% rename from data/sql/updates/db_characters/2024_01_20_00.sql rename to data/sql/archive/db_characters/2024_01_20_00.sql diff --git a/data/sql/updates/db_characters/2024_07_05_00.sql b/data/sql/archive/db_characters/2024_07_05_00.sql similarity index 100% rename from data/sql/updates/db_characters/2024_07_05_00.sql rename to data/sql/archive/db_characters/2024_07_05_00.sql diff --git a/data/sql/updates/db_characters/2024_09_03_00.sql b/data/sql/archive/db_characters/2024_09_03_00.sql similarity index 100% rename from data/sql/updates/db_characters/2024_09_03_00.sql rename to data/sql/archive/db_characters/2024_09_03_00.sql diff --git a/data/sql/updates/db_characters/2024_09_22_00.sql b/data/sql/archive/db_characters/2024_09_22_00.sql similarity index 100% rename from data/sql/updates/db_characters/2024_09_22_00.sql rename to data/sql/archive/db_characters/2024_09_22_00.sql diff --git a/data/sql/updates/db_characters/2024_11_15_00.sql b/data/sql/archive/db_characters/2024_11_15_00.sql similarity index 100% rename from data/sql/updates/db_characters/2024_11_15_00.sql rename to data/sql/archive/db_characters/2024_11_15_00.sql diff --git a/data/sql/updates/db_characters/2025_01_31_00.sql b/data/sql/archive/db_characters/2025_01_31_00.sql similarity index 100% rename from data/sql/updates/db_characters/2025_01_31_00.sql rename to data/sql/archive/db_characters/2025_01_31_00.sql diff --git a/data/sql/updates/db_characters/2025_02_12_00.sql b/data/sql/archive/db_characters/2025_02_12_00.sql similarity index 100% rename from data/sql/updates/db_characters/2025_02_12_00.sql rename to data/sql/archive/db_characters/2025_02_12_00.sql diff --git a/data/sql/updates/db_characters/2025_02_16_00.sql b/data/sql/archive/db_characters/2025_02_16_00.sql similarity index 100% rename from data/sql/updates/db_characters/2025_02_16_00.sql rename to data/sql/archive/db_characters/2025_02_16_00.sql diff --git a/data/sql/updates/db_characters/2025_03_09_00.sql b/data/sql/archive/db_characters/2025_03_09_00.sql similarity index 100% rename from data/sql/updates/db_characters/2025_03_09_00.sql rename to data/sql/archive/db_characters/2025_03_09_00.sql diff --git a/data/sql/updates/db_characters/2025_07_11_00.sql b/data/sql/archive/db_characters/2025_07_11_00.sql similarity index 100% rename from data/sql/updates/db_characters/2025_07_11_00.sql rename to data/sql/archive/db_characters/2025_07_11_00.sql diff --git a/data/sql/updates/db_characters/2025_07_29_00.sql b/data/sql/archive/db_characters/2025_07_29_00.sql similarity index 100% rename from data/sql/updates/db_characters/2025_07_29_00.sql rename to data/sql/archive/db_characters/2025_07_29_00.sql diff --git a/data/sql/updates/db_characters/2025_09_03_00.sql b/data/sql/archive/db_characters/2025_09_03_00.sql similarity index 100% rename from data/sql/updates/db_characters/2025_09_03_00.sql rename to data/sql/archive/db_characters/2025_09_03_00.sql diff --git a/data/sql/updates/db_world/2025_01_03_00.sql b/data/sql/archive/db_world/2025_01_03_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_03_00.sql rename to data/sql/archive/db_world/2025_01_03_00.sql diff --git a/data/sql/updates/db_world/2025_01_04_00.sql b/data/sql/archive/db_world/2025_01_04_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_04_00.sql rename to data/sql/archive/db_world/2025_01_04_00.sql diff --git a/data/sql/updates/db_world/2025_01_04_01.sql b/data/sql/archive/db_world/2025_01_04_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_04_01.sql rename to data/sql/archive/db_world/2025_01_04_01.sql diff --git a/data/sql/updates/db_world/2025_01_04_02.sql b/data/sql/archive/db_world/2025_01_04_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_04_02.sql rename to data/sql/archive/db_world/2025_01_04_02.sql diff --git a/data/sql/updates/db_world/2025_01_05_00.sql b/data/sql/archive/db_world/2025_01_05_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_05_00.sql rename to data/sql/archive/db_world/2025_01_05_00.sql diff --git a/data/sql/updates/db_world/2025_01_05_01.sql b/data/sql/archive/db_world/2025_01_05_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_05_01.sql rename to data/sql/archive/db_world/2025_01_05_01.sql diff --git a/data/sql/updates/db_world/2025_01_05_02.sql b/data/sql/archive/db_world/2025_01_05_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_05_02.sql rename to data/sql/archive/db_world/2025_01_05_02.sql diff --git a/data/sql/updates/db_world/2025_01_05_03.sql b/data/sql/archive/db_world/2025_01_05_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_05_03.sql rename to data/sql/archive/db_world/2025_01_05_03.sql diff --git a/data/sql/updates/db_world/2025_01_05_04.sql b/data/sql/archive/db_world/2025_01_05_04.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_05_04.sql rename to data/sql/archive/db_world/2025_01_05_04.sql diff --git a/data/sql/updates/db_world/2025_01_05_05.sql b/data/sql/archive/db_world/2025_01_05_05.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_05_05.sql rename to data/sql/archive/db_world/2025_01_05_05.sql diff --git a/data/sql/updates/db_world/2025_01_05_06.sql b/data/sql/archive/db_world/2025_01_05_06.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_05_06.sql rename to data/sql/archive/db_world/2025_01_05_06.sql diff --git a/data/sql/updates/db_world/2025_01_05_07.sql b/data/sql/archive/db_world/2025_01_05_07.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_05_07.sql rename to data/sql/archive/db_world/2025_01_05_07.sql diff --git a/data/sql/updates/db_world/2025_01_07_00.sql b/data/sql/archive/db_world/2025_01_07_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_07_00.sql rename to data/sql/archive/db_world/2025_01_07_00.sql diff --git a/data/sql/updates/db_world/2025_01_07_01.sql b/data/sql/archive/db_world/2025_01_07_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_07_01.sql rename to data/sql/archive/db_world/2025_01_07_01.sql diff --git a/data/sql/updates/db_world/2025_01_07_02.sql b/data/sql/archive/db_world/2025_01_07_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_07_02.sql rename to data/sql/archive/db_world/2025_01_07_02.sql diff --git a/data/sql/updates/db_world/2025_01_07_03.sql b/data/sql/archive/db_world/2025_01_07_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_07_03.sql rename to data/sql/archive/db_world/2025_01_07_03.sql diff --git a/data/sql/updates/db_world/2025_01_09_00.sql b/data/sql/archive/db_world/2025_01_09_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_09_00.sql rename to data/sql/archive/db_world/2025_01_09_00.sql diff --git a/data/sql/updates/db_world/2025_01_09_01.sql b/data/sql/archive/db_world/2025_01_09_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_09_01.sql rename to data/sql/archive/db_world/2025_01_09_01.sql diff --git a/data/sql/updates/db_world/2025_01_09_02.sql b/data/sql/archive/db_world/2025_01_09_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_09_02.sql rename to data/sql/archive/db_world/2025_01_09_02.sql diff --git a/data/sql/updates/db_world/2025_01_10_00.sql b/data/sql/archive/db_world/2025_01_10_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_10_00.sql rename to data/sql/archive/db_world/2025_01_10_00.sql diff --git a/data/sql/updates/db_world/2025_01_10_01.sql b/data/sql/archive/db_world/2025_01_10_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_10_01.sql rename to data/sql/archive/db_world/2025_01_10_01.sql diff --git a/data/sql/updates/db_world/2025_01_10_02.sql b/data/sql/archive/db_world/2025_01_10_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_10_02.sql rename to data/sql/archive/db_world/2025_01_10_02.sql diff --git a/data/sql/updates/db_world/2025_01_10_03.sql b/data/sql/archive/db_world/2025_01_10_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_10_03.sql rename to data/sql/archive/db_world/2025_01_10_03.sql diff --git a/data/sql/updates/db_world/2025_01_11_00.sql b/data/sql/archive/db_world/2025_01_11_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_11_00.sql rename to data/sql/archive/db_world/2025_01_11_00.sql diff --git a/data/sql/updates/db_world/2025_01_11_01.sql b/data/sql/archive/db_world/2025_01_11_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_11_01.sql rename to data/sql/archive/db_world/2025_01_11_01.sql diff --git a/data/sql/updates/db_world/2025_01_12_00.sql b/data/sql/archive/db_world/2025_01_12_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_12_00.sql rename to data/sql/archive/db_world/2025_01_12_00.sql diff --git a/data/sql/updates/db_world/2025_01_12_01.sql b/data/sql/archive/db_world/2025_01_12_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_12_01.sql rename to data/sql/archive/db_world/2025_01_12_01.sql diff --git a/data/sql/updates/db_world/2025_01_13_00.sql b/data/sql/archive/db_world/2025_01_13_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_13_00.sql rename to data/sql/archive/db_world/2025_01_13_00.sql diff --git a/data/sql/updates/db_world/2025_01_14_00.sql b/data/sql/archive/db_world/2025_01_14_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_14_00.sql rename to data/sql/archive/db_world/2025_01_14_00.sql diff --git a/data/sql/updates/db_world/2025_01_14_01.sql b/data/sql/archive/db_world/2025_01_14_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_14_01.sql rename to data/sql/archive/db_world/2025_01_14_01.sql diff --git a/data/sql/updates/db_world/2025_01_14_02.sql b/data/sql/archive/db_world/2025_01_14_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_14_02.sql rename to data/sql/archive/db_world/2025_01_14_02.sql diff --git a/data/sql/updates/db_world/2025_01_14_03.sql b/data/sql/archive/db_world/2025_01_14_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_14_03.sql rename to data/sql/archive/db_world/2025_01_14_03.sql diff --git a/data/sql/updates/db_world/2025_01_14_04.sql b/data/sql/archive/db_world/2025_01_14_04.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_14_04.sql rename to data/sql/archive/db_world/2025_01_14_04.sql diff --git a/data/sql/updates/db_world/2025_01_14_05.sql b/data/sql/archive/db_world/2025_01_14_05.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_14_05.sql rename to data/sql/archive/db_world/2025_01_14_05.sql diff --git a/data/sql/updates/db_world/2025_01_15_00.sql b/data/sql/archive/db_world/2025_01_15_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_15_00.sql rename to data/sql/archive/db_world/2025_01_15_00.sql diff --git a/data/sql/updates/db_world/2025_01_15_01.sql b/data/sql/archive/db_world/2025_01_15_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_15_01.sql rename to data/sql/archive/db_world/2025_01_15_01.sql diff --git a/data/sql/updates/db_world/2025_01_15_02.sql b/data/sql/archive/db_world/2025_01_15_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_15_02.sql rename to data/sql/archive/db_world/2025_01_15_02.sql diff --git a/data/sql/updates/db_world/2025_01_15_03.sql b/data/sql/archive/db_world/2025_01_15_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_15_03.sql rename to data/sql/archive/db_world/2025_01_15_03.sql diff --git a/data/sql/updates/db_world/2025_01_15_04.sql b/data/sql/archive/db_world/2025_01_15_04.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_15_04.sql rename to data/sql/archive/db_world/2025_01_15_04.sql diff --git a/data/sql/updates/db_world/2025_01_16_00.sql b/data/sql/archive/db_world/2025_01_16_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_16_00.sql rename to data/sql/archive/db_world/2025_01_16_00.sql diff --git a/data/sql/updates/db_world/2025_01_16_01.sql b/data/sql/archive/db_world/2025_01_16_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_16_01.sql rename to data/sql/archive/db_world/2025_01_16_01.sql diff --git a/data/sql/updates/db_world/2025_01_16_02.sql b/data/sql/archive/db_world/2025_01_16_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_16_02.sql rename to data/sql/archive/db_world/2025_01_16_02.sql diff --git a/data/sql/updates/db_world/2025_01_16_03.sql b/data/sql/archive/db_world/2025_01_16_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_16_03.sql rename to data/sql/archive/db_world/2025_01_16_03.sql diff --git a/data/sql/updates/db_world/2025_01_16_04.sql b/data/sql/archive/db_world/2025_01_16_04.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_16_04.sql rename to data/sql/archive/db_world/2025_01_16_04.sql diff --git a/data/sql/updates/db_world/2025_01_17_00.sql b/data/sql/archive/db_world/2025_01_17_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_17_00.sql rename to data/sql/archive/db_world/2025_01_17_00.sql diff --git a/data/sql/updates/db_world/2025_01_17_01.sql b/data/sql/archive/db_world/2025_01_17_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_17_01.sql rename to data/sql/archive/db_world/2025_01_17_01.sql diff --git a/data/sql/updates/db_world/2025_01_18_00.sql b/data/sql/archive/db_world/2025_01_18_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_18_00.sql rename to data/sql/archive/db_world/2025_01_18_00.sql diff --git a/data/sql/updates/db_world/2025_01_18_01.sql b/data/sql/archive/db_world/2025_01_18_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_18_01.sql rename to data/sql/archive/db_world/2025_01_18_01.sql diff --git a/data/sql/updates/db_world/2025_01_19_00.sql b/data/sql/archive/db_world/2025_01_19_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_19_00.sql rename to data/sql/archive/db_world/2025_01_19_00.sql diff --git a/data/sql/updates/db_world/2025_01_19_01.sql b/data/sql/archive/db_world/2025_01_19_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_19_01.sql rename to data/sql/archive/db_world/2025_01_19_01.sql diff --git a/data/sql/updates/db_world/2025_01_19_02.sql b/data/sql/archive/db_world/2025_01_19_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_19_02.sql rename to data/sql/archive/db_world/2025_01_19_02.sql diff --git a/data/sql/updates/db_world/2025_01_22_00.sql b/data/sql/archive/db_world/2025_01_22_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_22_00.sql rename to data/sql/archive/db_world/2025_01_22_00.sql diff --git a/data/sql/updates/db_world/2025_01_22_01.sql b/data/sql/archive/db_world/2025_01_22_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_22_01.sql rename to data/sql/archive/db_world/2025_01_22_01.sql diff --git a/data/sql/updates/db_world/2025_01_22_02.sql b/data/sql/archive/db_world/2025_01_22_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_22_02.sql rename to data/sql/archive/db_world/2025_01_22_02.sql diff --git a/data/sql/updates/db_world/2025_01_23_00.sql b/data/sql/archive/db_world/2025_01_23_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_23_00.sql rename to data/sql/archive/db_world/2025_01_23_00.sql diff --git a/data/sql/updates/db_world/2025_01_23_01.sql b/data/sql/archive/db_world/2025_01_23_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_23_01.sql rename to data/sql/archive/db_world/2025_01_23_01.sql diff --git a/data/sql/updates/db_world/2025_01_23_02.sql b/data/sql/archive/db_world/2025_01_23_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_23_02.sql rename to data/sql/archive/db_world/2025_01_23_02.sql diff --git a/data/sql/updates/db_world/2025_01_23_03.sql b/data/sql/archive/db_world/2025_01_23_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_23_03.sql rename to data/sql/archive/db_world/2025_01_23_03.sql diff --git a/data/sql/updates/db_world/2025_01_23_04.sql b/data/sql/archive/db_world/2025_01_23_04.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_23_04.sql rename to data/sql/archive/db_world/2025_01_23_04.sql diff --git a/data/sql/updates/db_world/2025_01_24_00.sql b/data/sql/archive/db_world/2025_01_24_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_24_00.sql rename to data/sql/archive/db_world/2025_01_24_00.sql diff --git a/data/sql/updates/db_world/2025_01_24_01.sql b/data/sql/archive/db_world/2025_01_24_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_24_01.sql rename to data/sql/archive/db_world/2025_01_24_01.sql diff --git a/data/sql/updates/db_world/2025_01_25_00.sql b/data/sql/archive/db_world/2025_01_25_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_25_00.sql rename to data/sql/archive/db_world/2025_01_25_00.sql diff --git a/data/sql/updates/db_world/2025_01_26_00.sql b/data/sql/archive/db_world/2025_01_26_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_26_00.sql rename to data/sql/archive/db_world/2025_01_26_00.sql diff --git a/data/sql/updates/db_world/2025_01_26_01.sql b/data/sql/archive/db_world/2025_01_26_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_26_01.sql rename to data/sql/archive/db_world/2025_01_26_01.sql diff --git a/data/sql/updates/db_world/2025_01_26_02.sql b/data/sql/archive/db_world/2025_01_26_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_26_02.sql rename to data/sql/archive/db_world/2025_01_26_02.sql diff --git a/data/sql/updates/db_world/2025_01_27_00.sql b/data/sql/archive/db_world/2025_01_27_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_27_00.sql rename to data/sql/archive/db_world/2025_01_27_00.sql diff --git a/data/sql/updates/db_world/2025_01_27_01.sql b/data/sql/archive/db_world/2025_01_27_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_27_01.sql rename to data/sql/archive/db_world/2025_01_27_01.sql diff --git a/data/sql/updates/db_world/2025_01_27_02.sql b/data/sql/archive/db_world/2025_01_27_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_27_02.sql rename to data/sql/archive/db_world/2025_01_27_02.sql diff --git a/data/sql/updates/db_world/2025_01_28_00.sql b/data/sql/archive/db_world/2025_01_28_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_28_00.sql rename to data/sql/archive/db_world/2025_01_28_00.sql diff --git a/data/sql/updates/db_world/2025_01_31_00.sql b/data/sql/archive/db_world/2025_01_31_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_31_00.sql rename to data/sql/archive/db_world/2025_01_31_00.sql diff --git a/data/sql/updates/db_world/2025_01_31_01.sql b/data/sql/archive/db_world/2025_01_31_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_01_31_01.sql rename to data/sql/archive/db_world/2025_01_31_01.sql diff --git a/data/sql/updates/db_world/2025_02_01_00.sql b/data/sql/archive/db_world/2025_02_01_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_02_01_00.sql rename to data/sql/archive/db_world/2025_02_01_00.sql diff --git a/data/sql/updates/db_world/2025_02_01_01.sql b/data/sql/archive/db_world/2025_02_01_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_02_01_01.sql rename to data/sql/archive/db_world/2025_02_01_01.sql diff --git a/data/sql/updates/db_world/2025_02_01_02.sql b/data/sql/archive/db_world/2025_02_01_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_02_01_02.sql rename to data/sql/archive/db_world/2025_02_01_02.sql diff --git a/data/sql/updates/db_world/2025_02_03_00.sql b/data/sql/archive/db_world/2025_02_03_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_02_03_00.sql rename to data/sql/archive/db_world/2025_02_03_00.sql diff --git a/data/sql/updates/db_world/2025_02_03_01.sql b/data/sql/archive/db_world/2025_02_03_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_02_03_01.sql rename to data/sql/archive/db_world/2025_02_03_01.sql diff --git a/data/sql/updates/db_world/2025_02_04_00.sql b/data/sql/archive/db_world/2025_02_04_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_02_04_00.sql rename to data/sql/archive/db_world/2025_02_04_00.sql diff --git a/data/sql/updates/db_world/2025_02_05_00.sql b/data/sql/archive/db_world/2025_02_05_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_02_05_00.sql rename to data/sql/archive/db_world/2025_02_05_00.sql diff --git a/data/sql/updates/db_world/2025_02_05_01.sql b/data/sql/archive/db_world/2025_02_05_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_02_05_01.sql rename to data/sql/archive/db_world/2025_02_05_01.sql diff --git a/data/sql/updates/db_world/2025_02_06_00.sql b/data/sql/archive/db_world/2025_02_06_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_02_06_00.sql rename to data/sql/archive/db_world/2025_02_06_00.sql diff --git a/data/sql/updates/db_world/2025_02_06_01.sql b/data/sql/archive/db_world/2025_02_06_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_02_06_01.sql rename to data/sql/archive/db_world/2025_02_06_01.sql diff --git a/data/sql/updates/db_world/2025_02_06_02.sql b/data/sql/archive/db_world/2025_02_06_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_02_06_02.sql rename to data/sql/archive/db_world/2025_02_06_02.sql diff --git a/data/sql/updates/db_world/2025_02_06_03.sql b/data/sql/archive/db_world/2025_02_06_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_02_06_03.sql rename to data/sql/archive/db_world/2025_02_06_03.sql diff --git a/data/sql/updates/db_world/2025_02_06_04.sql b/data/sql/archive/db_world/2025_02_06_04.sql similarity index 100% rename from data/sql/updates/db_world/2025_02_06_04.sql rename to data/sql/archive/db_world/2025_02_06_04.sql diff --git a/data/sql/updates/db_world/2025_02_07_00.sql b/data/sql/archive/db_world/2025_02_07_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_02_07_00.sql rename to data/sql/archive/db_world/2025_02_07_00.sql diff --git a/data/sql/updates/db_world/2025_02_07_01.sql b/data/sql/archive/db_world/2025_02_07_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_02_07_01.sql rename to data/sql/archive/db_world/2025_02_07_01.sql diff --git a/data/sql/updates/db_world/2025_02_07_02.sql b/data/sql/archive/db_world/2025_02_07_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_02_07_02.sql rename to data/sql/archive/db_world/2025_02_07_02.sql diff --git a/data/sql/updates/db_world/2025_02_07_03.sql b/data/sql/archive/db_world/2025_02_07_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_02_07_03.sql rename to data/sql/archive/db_world/2025_02_07_03.sql diff --git a/data/sql/updates/db_world/2025_02_07_04.sql b/data/sql/archive/db_world/2025_02_07_04.sql similarity index 100% rename from data/sql/updates/db_world/2025_02_07_04.sql rename to data/sql/archive/db_world/2025_02_07_04.sql diff --git a/data/sql/updates/db_world/2025_02_09_00.sql b/data/sql/archive/db_world/2025_02_09_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_02_09_00.sql rename to data/sql/archive/db_world/2025_02_09_00.sql diff --git a/data/sql/updates/db_world/2025_02_09_01.sql b/data/sql/archive/db_world/2025_02_09_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_02_09_01.sql rename to data/sql/archive/db_world/2025_02_09_01.sql diff --git a/data/sql/updates/db_world/2025_02_09_02.sql b/data/sql/archive/db_world/2025_02_09_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_02_09_02.sql rename to data/sql/archive/db_world/2025_02_09_02.sql diff --git a/data/sql/updates/db_world/2025_02_09_03.sql b/data/sql/archive/db_world/2025_02_09_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_02_09_03.sql rename to data/sql/archive/db_world/2025_02_09_03.sql diff --git a/data/sql/updates/db_world/2025_02_09_04.sql b/data/sql/archive/db_world/2025_02_09_04.sql similarity index 100% rename from data/sql/updates/db_world/2025_02_09_04.sql rename to data/sql/archive/db_world/2025_02_09_04.sql diff --git a/data/sql/updates/db_world/2025_02_10_00.sql b/data/sql/archive/db_world/2025_02_10_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_02_10_00.sql rename to data/sql/archive/db_world/2025_02_10_00.sql diff --git a/data/sql/updates/db_world/2025_02_10_01.sql b/data/sql/archive/db_world/2025_02_10_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_02_10_01.sql rename to data/sql/archive/db_world/2025_02_10_01.sql diff --git a/data/sql/updates/db_world/2025_02_12_00.sql b/data/sql/archive/db_world/2025_02_12_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_02_12_00.sql rename to data/sql/archive/db_world/2025_02_12_00.sql diff --git a/data/sql/updates/db_world/2025_02_12_01.sql b/data/sql/archive/db_world/2025_02_12_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_02_12_01.sql rename to data/sql/archive/db_world/2025_02_12_01.sql diff --git a/data/sql/updates/db_world/2025_02_13_00.sql b/data/sql/archive/db_world/2025_02_13_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_02_13_00.sql rename to data/sql/archive/db_world/2025_02_13_00.sql diff --git a/data/sql/updates/db_world/2025_02_13_01.sql b/data/sql/archive/db_world/2025_02_13_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_02_13_01.sql rename to data/sql/archive/db_world/2025_02_13_01.sql diff --git a/data/sql/updates/db_world/2025_02_14_00.sql b/data/sql/archive/db_world/2025_02_14_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_02_14_00.sql rename to data/sql/archive/db_world/2025_02_14_00.sql diff --git a/data/sql/updates/db_world/2025_02_15_00.sql b/data/sql/archive/db_world/2025_02_15_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_02_15_00.sql rename to data/sql/archive/db_world/2025_02_15_00.sql diff --git a/data/sql/updates/db_world/2025_02_15_01.sql b/data/sql/archive/db_world/2025_02_15_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_02_15_01.sql rename to data/sql/archive/db_world/2025_02_15_01.sql diff --git a/data/sql/updates/db_world/2025_02_15_02.sql b/data/sql/archive/db_world/2025_02_15_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_02_15_02.sql rename to data/sql/archive/db_world/2025_02_15_02.sql diff --git a/data/sql/updates/db_world/2025_02_16_00.sql b/data/sql/archive/db_world/2025_02_16_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_02_16_00.sql rename to data/sql/archive/db_world/2025_02_16_00.sql diff --git a/data/sql/updates/db_world/2025_02_16_01.sql b/data/sql/archive/db_world/2025_02_16_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_02_16_01.sql rename to data/sql/archive/db_world/2025_02_16_01.sql diff --git a/data/sql/updates/db_world/2025_02_16_02.sql b/data/sql/archive/db_world/2025_02_16_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_02_16_02.sql rename to data/sql/archive/db_world/2025_02_16_02.sql diff --git a/data/sql/updates/db_world/2025_02_16_03.sql b/data/sql/archive/db_world/2025_02_16_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_02_16_03.sql rename to data/sql/archive/db_world/2025_02_16_03.sql diff --git a/data/sql/updates/db_world/2025_02_18_00.sql b/data/sql/archive/db_world/2025_02_18_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_02_18_00.sql rename to data/sql/archive/db_world/2025_02_18_00.sql diff --git a/data/sql/updates/db_world/2025_02_19_00.sql b/data/sql/archive/db_world/2025_02_19_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_02_19_00.sql rename to data/sql/archive/db_world/2025_02_19_00.sql diff --git a/data/sql/updates/db_world/2025_02_19_01.sql b/data/sql/archive/db_world/2025_02_19_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_02_19_01.sql rename to data/sql/archive/db_world/2025_02_19_01.sql diff --git a/data/sql/updates/db_world/2025_02_21_00.sql b/data/sql/archive/db_world/2025_02_21_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_02_21_00.sql rename to data/sql/archive/db_world/2025_02_21_00.sql diff --git a/data/sql/updates/db_world/2025_02_21_01.sql b/data/sql/archive/db_world/2025_02_21_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_02_21_01.sql rename to data/sql/archive/db_world/2025_02_21_01.sql diff --git a/data/sql/updates/db_world/2025_02_21_02.sql b/data/sql/archive/db_world/2025_02_21_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_02_21_02.sql rename to data/sql/archive/db_world/2025_02_21_02.sql diff --git a/data/sql/updates/db_world/2025_02_21_03.sql b/data/sql/archive/db_world/2025_02_21_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_02_21_03.sql rename to data/sql/archive/db_world/2025_02_21_03.sql diff --git a/data/sql/updates/db_world/2025_02_22_00.sql b/data/sql/archive/db_world/2025_02_22_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_02_22_00.sql rename to data/sql/archive/db_world/2025_02_22_00.sql diff --git a/data/sql/updates/db_world/2025_02_24_00.sql b/data/sql/archive/db_world/2025_02_24_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_02_24_00.sql rename to data/sql/archive/db_world/2025_02_24_00.sql diff --git a/data/sql/updates/db_world/2025_02_25_00.sql b/data/sql/archive/db_world/2025_02_25_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_02_25_00.sql rename to data/sql/archive/db_world/2025_02_25_00.sql diff --git a/data/sql/updates/db_world/2025_02_26_00.sql b/data/sql/archive/db_world/2025_02_26_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_02_26_00.sql rename to data/sql/archive/db_world/2025_02_26_00.sql diff --git a/data/sql/updates/db_world/2025_02_26_01.sql b/data/sql/archive/db_world/2025_02_26_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_02_26_01.sql rename to data/sql/archive/db_world/2025_02_26_01.sql diff --git a/data/sql/updates/db_world/2025_02_26_02.sql b/data/sql/archive/db_world/2025_02_26_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_02_26_02.sql rename to data/sql/archive/db_world/2025_02_26_02.sql diff --git a/data/sql/updates/db_world/2025_02_26_03.sql b/data/sql/archive/db_world/2025_02_26_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_02_26_03.sql rename to data/sql/archive/db_world/2025_02_26_03.sql diff --git a/data/sql/updates/db_world/2025_02_27_00.sql b/data/sql/archive/db_world/2025_02_27_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_02_27_00.sql rename to data/sql/archive/db_world/2025_02_27_00.sql diff --git a/data/sql/updates/db_world/2025_02_28_00.sql b/data/sql/archive/db_world/2025_02_28_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_02_28_00.sql rename to data/sql/archive/db_world/2025_02_28_00.sql diff --git a/data/sql/updates/db_world/2025_03_01_00.sql b/data/sql/archive/db_world/2025_03_01_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_03_01_00.sql rename to data/sql/archive/db_world/2025_03_01_00.sql diff --git a/data/sql/updates/db_world/2025_03_01_01.sql b/data/sql/archive/db_world/2025_03_01_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_03_01_01.sql rename to data/sql/archive/db_world/2025_03_01_01.sql diff --git a/data/sql/updates/db_world/2025_03_02_00.sql b/data/sql/archive/db_world/2025_03_02_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_03_02_00.sql rename to data/sql/archive/db_world/2025_03_02_00.sql diff --git a/data/sql/updates/db_world/2025_03_02_01.sql b/data/sql/archive/db_world/2025_03_02_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_03_02_01.sql rename to data/sql/archive/db_world/2025_03_02_01.sql diff --git a/data/sql/updates/db_world/2025_03_02_02.sql b/data/sql/archive/db_world/2025_03_02_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_03_02_02.sql rename to data/sql/archive/db_world/2025_03_02_02.sql diff --git a/data/sql/updates/db_world/2025_03_03_00.sql b/data/sql/archive/db_world/2025_03_03_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_03_03_00.sql rename to data/sql/archive/db_world/2025_03_03_00.sql diff --git a/data/sql/updates/db_world/2025_03_03_01.sql b/data/sql/archive/db_world/2025_03_03_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_03_03_01.sql rename to data/sql/archive/db_world/2025_03_03_01.sql diff --git a/data/sql/updates/db_world/2025_03_05_00.sql b/data/sql/archive/db_world/2025_03_05_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_03_05_00.sql rename to data/sql/archive/db_world/2025_03_05_00.sql diff --git a/data/sql/updates/db_world/2025_03_06_00.sql b/data/sql/archive/db_world/2025_03_06_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_03_06_00.sql rename to data/sql/archive/db_world/2025_03_06_00.sql diff --git a/data/sql/updates/db_world/2025_03_06_01.sql b/data/sql/archive/db_world/2025_03_06_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_03_06_01.sql rename to data/sql/archive/db_world/2025_03_06_01.sql diff --git a/data/sql/updates/db_world/2025_03_08_00.sql b/data/sql/archive/db_world/2025_03_08_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_03_08_00.sql rename to data/sql/archive/db_world/2025_03_08_00.sql diff --git a/data/sql/updates/db_world/2025_03_08_01.sql b/data/sql/archive/db_world/2025_03_08_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_03_08_01.sql rename to data/sql/archive/db_world/2025_03_08_01.sql diff --git a/data/sql/updates/db_world/2025_03_09_00.sql b/data/sql/archive/db_world/2025_03_09_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_03_09_00.sql rename to data/sql/archive/db_world/2025_03_09_00.sql diff --git a/data/sql/updates/db_world/2025_03_09_01.sql b/data/sql/archive/db_world/2025_03_09_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_03_09_01.sql rename to data/sql/archive/db_world/2025_03_09_01.sql diff --git a/data/sql/updates/db_world/2025_03_09_02.sql b/data/sql/archive/db_world/2025_03_09_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_03_09_02.sql rename to data/sql/archive/db_world/2025_03_09_02.sql diff --git a/data/sql/updates/db_world/2025_03_09_03.sql b/data/sql/archive/db_world/2025_03_09_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_03_09_03.sql rename to data/sql/archive/db_world/2025_03_09_03.sql diff --git a/data/sql/updates/db_world/2025_03_10_00.sql b/data/sql/archive/db_world/2025_03_10_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_03_10_00.sql rename to data/sql/archive/db_world/2025_03_10_00.sql diff --git a/data/sql/updates/db_world/2025_03_11_00.sql b/data/sql/archive/db_world/2025_03_11_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_03_11_00.sql rename to data/sql/archive/db_world/2025_03_11_00.sql diff --git a/data/sql/updates/db_world/2025_03_11_01.sql b/data/sql/archive/db_world/2025_03_11_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_03_11_01.sql rename to data/sql/archive/db_world/2025_03_11_01.sql diff --git a/data/sql/updates/db_world/2025_03_11_02.sql b/data/sql/archive/db_world/2025_03_11_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_03_11_02.sql rename to data/sql/archive/db_world/2025_03_11_02.sql diff --git a/data/sql/updates/db_world/2025_03_13_00.sql b/data/sql/archive/db_world/2025_03_13_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_03_13_00.sql rename to data/sql/archive/db_world/2025_03_13_00.sql diff --git a/data/sql/updates/db_world/2025_03_15_00.sql b/data/sql/archive/db_world/2025_03_15_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_03_15_00.sql rename to data/sql/archive/db_world/2025_03_15_00.sql diff --git a/data/sql/updates/db_world/2025_03_16_00.sql b/data/sql/archive/db_world/2025_03_16_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_03_16_00.sql rename to data/sql/archive/db_world/2025_03_16_00.sql diff --git a/data/sql/updates/db_world/2025_03_16_01.sql b/data/sql/archive/db_world/2025_03_16_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_03_16_01.sql rename to data/sql/archive/db_world/2025_03_16_01.sql diff --git a/data/sql/updates/db_world/2025_03_16_02.sql b/data/sql/archive/db_world/2025_03_16_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_03_16_02.sql rename to data/sql/archive/db_world/2025_03_16_02.sql diff --git a/data/sql/updates/db_world/2025_03_16_03.sql b/data/sql/archive/db_world/2025_03_16_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_03_16_03.sql rename to data/sql/archive/db_world/2025_03_16_03.sql diff --git a/data/sql/updates/db_world/2025_03_16_04.sql b/data/sql/archive/db_world/2025_03_16_04.sql similarity index 100% rename from data/sql/updates/db_world/2025_03_16_04.sql rename to data/sql/archive/db_world/2025_03_16_04.sql diff --git a/data/sql/updates/db_world/2025_03_17_00.sql b/data/sql/archive/db_world/2025_03_17_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_03_17_00.sql rename to data/sql/archive/db_world/2025_03_17_00.sql diff --git a/data/sql/updates/db_world/2025_03_17_01.sql b/data/sql/archive/db_world/2025_03_17_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_03_17_01.sql rename to data/sql/archive/db_world/2025_03_17_01.sql diff --git a/data/sql/updates/db_world/2025_03_17_02.sql b/data/sql/archive/db_world/2025_03_17_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_03_17_02.sql rename to data/sql/archive/db_world/2025_03_17_02.sql diff --git a/data/sql/updates/db_world/2025_03_17_03.sql b/data/sql/archive/db_world/2025_03_17_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_03_17_03.sql rename to data/sql/archive/db_world/2025_03_17_03.sql diff --git a/data/sql/updates/db_world/2025_03_19_00.sql b/data/sql/archive/db_world/2025_03_19_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_03_19_00.sql rename to data/sql/archive/db_world/2025_03_19_00.sql diff --git a/data/sql/updates/db_world/2025_03_19_01.sql b/data/sql/archive/db_world/2025_03_19_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_03_19_01.sql rename to data/sql/archive/db_world/2025_03_19_01.sql diff --git a/data/sql/updates/db_world/2025_03_21_00.sql b/data/sql/archive/db_world/2025_03_21_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_03_21_00.sql rename to data/sql/archive/db_world/2025_03_21_00.sql diff --git a/data/sql/updates/db_world/2025_03_22_00.sql b/data/sql/archive/db_world/2025_03_22_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_03_22_00.sql rename to data/sql/archive/db_world/2025_03_22_00.sql diff --git a/data/sql/updates/db_world/2025_03_22_01.sql b/data/sql/archive/db_world/2025_03_22_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_03_22_01.sql rename to data/sql/archive/db_world/2025_03_22_01.sql diff --git a/data/sql/updates/db_world/2025_03_22_02.sql b/data/sql/archive/db_world/2025_03_22_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_03_22_02.sql rename to data/sql/archive/db_world/2025_03_22_02.sql diff --git a/data/sql/updates/db_world/2025_03_24_00.sql b/data/sql/archive/db_world/2025_03_24_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_03_24_00.sql rename to data/sql/archive/db_world/2025_03_24_00.sql diff --git a/data/sql/updates/db_world/2025_03_25_00.sql b/data/sql/archive/db_world/2025_03_25_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_03_25_00.sql rename to data/sql/archive/db_world/2025_03_25_00.sql diff --git a/data/sql/updates/db_world/2025_03_25_01.sql b/data/sql/archive/db_world/2025_03_25_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_03_25_01.sql rename to data/sql/archive/db_world/2025_03_25_01.sql diff --git a/data/sql/updates/db_world/2025_03_27_00.sql b/data/sql/archive/db_world/2025_03_27_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_03_27_00.sql rename to data/sql/archive/db_world/2025_03_27_00.sql diff --git a/data/sql/updates/db_world/2025_03_27_01.sql b/data/sql/archive/db_world/2025_03_27_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_03_27_01.sql rename to data/sql/archive/db_world/2025_03_27_01.sql diff --git a/data/sql/updates/db_world/2025_03_28_00.sql b/data/sql/archive/db_world/2025_03_28_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_03_28_00.sql rename to data/sql/archive/db_world/2025_03_28_00.sql diff --git a/data/sql/updates/db_world/2025_03_29_00.sql b/data/sql/archive/db_world/2025_03_29_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_03_29_00.sql rename to data/sql/archive/db_world/2025_03_29_00.sql diff --git a/data/sql/updates/db_world/2025_03_29_01.sql b/data/sql/archive/db_world/2025_03_29_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_03_29_01.sql rename to data/sql/archive/db_world/2025_03_29_01.sql diff --git a/data/sql/updates/db_world/2025_03_29_02.sql b/data/sql/archive/db_world/2025_03_29_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_03_29_02.sql rename to data/sql/archive/db_world/2025_03_29_02.sql diff --git a/data/sql/updates/db_world/2025_03_30_00.sql b/data/sql/archive/db_world/2025_03_30_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_03_30_00.sql rename to data/sql/archive/db_world/2025_03_30_00.sql diff --git a/data/sql/updates/db_world/2025_03_30_01.sql b/data/sql/archive/db_world/2025_03_30_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_03_30_01.sql rename to data/sql/archive/db_world/2025_03_30_01.sql diff --git a/data/sql/updates/db_world/2025_03_30_02.sql b/data/sql/archive/db_world/2025_03_30_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_03_30_02.sql rename to data/sql/archive/db_world/2025_03_30_02.sql diff --git a/data/sql/updates/db_world/2025_03_31_00.sql b/data/sql/archive/db_world/2025_03_31_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_03_31_00.sql rename to data/sql/archive/db_world/2025_03_31_00.sql diff --git a/data/sql/updates/db_world/2025_03_31_01.sql b/data/sql/archive/db_world/2025_03_31_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_03_31_01.sql rename to data/sql/archive/db_world/2025_03_31_01.sql diff --git a/data/sql/updates/db_world/2025_03_31_02.sql b/data/sql/archive/db_world/2025_03_31_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_03_31_02.sql rename to data/sql/archive/db_world/2025_03_31_02.sql diff --git a/data/sql/updates/db_world/2025_03_31_03.sql b/data/sql/archive/db_world/2025_03_31_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_03_31_03.sql rename to data/sql/archive/db_world/2025_03_31_03.sql diff --git a/data/sql/updates/db_world/2025_04_01_00.sql b/data/sql/archive/db_world/2025_04_01_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_04_01_00.sql rename to data/sql/archive/db_world/2025_04_01_00.sql diff --git a/data/sql/updates/db_world/2025_04_01_01.sql b/data/sql/archive/db_world/2025_04_01_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_04_01_01.sql rename to data/sql/archive/db_world/2025_04_01_01.sql diff --git a/data/sql/updates/db_world/2025_04_01_02.sql b/data/sql/archive/db_world/2025_04_01_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_04_01_02.sql rename to data/sql/archive/db_world/2025_04_01_02.sql diff --git a/data/sql/updates/db_world/2025_04_01_03.sql b/data/sql/archive/db_world/2025_04_01_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_04_01_03.sql rename to data/sql/archive/db_world/2025_04_01_03.sql diff --git a/data/sql/updates/db_world/2025_04_01_04.sql b/data/sql/archive/db_world/2025_04_01_04.sql similarity index 100% rename from data/sql/updates/db_world/2025_04_01_04.sql rename to data/sql/archive/db_world/2025_04_01_04.sql diff --git a/data/sql/updates/db_world/2025_04_01_05.sql b/data/sql/archive/db_world/2025_04_01_05.sql similarity index 100% rename from data/sql/updates/db_world/2025_04_01_05.sql rename to data/sql/archive/db_world/2025_04_01_05.sql diff --git a/data/sql/updates/db_world/2025_04_01_06.sql b/data/sql/archive/db_world/2025_04_01_06.sql similarity index 100% rename from data/sql/updates/db_world/2025_04_01_06.sql rename to data/sql/archive/db_world/2025_04_01_06.sql diff --git a/data/sql/updates/db_world/2025_04_01_07.sql b/data/sql/archive/db_world/2025_04_01_07.sql similarity index 100% rename from data/sql/updates/db_world/2025_04_01_07.sql rename to data/sql/archive/db_world/2025_04_01_07.sql diff --git a/data/sql/updates/db_world/2025_04_02_00.sql b/data/sql/archive/db_world/2025_04_02_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_04_02_00.sql rename to data/sql/archive/db_world/2025_04_02_00.sql diff --git a/data/sql/updates/db_world/2025_04_02_01.sql b/data/sql/archive/db_world/2025_04_02_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_04_02_01.sql rename to data/sql/archive/db_world/2025_04_02_01.sql diff --git a/data/sql/updates/db_world/2025_04_02_02.sql b/data/sql/archive/db_world/2025_04_02_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_04_02_02.sql rename to data/sql/archive/db_world/2025_04_02_02.sql diff --git a/data/sql/updates/db_world/2025_04_02_03.sql b/data/sql/archive/db_world/2025_04_02_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_04_02_03.sql rename to data/sql/archive/db_world/2025_04_02_03.sql diff --git a/data/sql/updates/db_world/2025_04_02_04.sql b/data/sql/archive/db_world/2025_04_02_04.sql similarity index 100% rename from data/sql/updates/db_world/2025_04_02_04.sql rename to data/sql/archive/db_world/2025_04_02_04.sql diff --git a/data/sql/updates/db_world/2025_04_03_00.sql b/data/sql/archive/db_world/2025_04_03_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_04_03_00.sql rename to data/sql/archive/db_world/2025_04_03_00.sql diff --git a/data/sql/updates/db_world/2025_04_04_00.sql b/data/sql/archive/db_world/2025_04_04_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_04_04_00.sql rename to data/sql/archive/db_world/2025_04_04_00.sql diff --git a/data/sql/updates/db_world/2025_04_05_00.sql b/data/sql/archive/db_world/2025_04_05_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_04_05_00.sql rename to data/sql/archive/db_world/2025_04_05_00.sql diff --git a/data/sql/updates/db_world/2025_04_05_01.sql b/data/sql/archive/db_world/2025_04_05_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_04_05_01.sql rename to data/sql/archive/db_world/2025_04_05_01.sql diff --git a/data/sql/updates/db_world/2025_04_08_00.sql b/data/sql/archive/db_world/2025_04_08_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_04_08_00.sql rename to data/sql/archive/db_world/2025_04_08_00.sql diff --git a/data/sql/updates/db_world/2025_04_09_00.sql b/data/sql/archive/db_world/2025_04_09_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_04_09_00.sql rename to data/sql/archive/db_world/2025_04_09_00.sql diff --git a/data/sql/updates/db_world/2025_04_10_00.sql b/data/sql/archive/db_world/2025_04_10_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_04_10_00.sql rename to data/sql/archive/db_world/2025_04_10_00.sql diff --git a/data/sql/updates/db_world/2025_04_10_01.sql b/data/sql/archive/db_world/2025_04_10_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_04_10_01.sql rename to data/sql/archive/db_world/2025_04_10_01.sql diff --git a/data/sql/updates/db_world/2025_04_11_00.sql b/data/sql/archive/db_world/2025_04_11_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_04_11_00.sql rename to data/sql/archive/db_world/2025_04_11_00.sql diff --git a/data/sql/updates/db_world/2025_04_11_01.sql b/data/sql/archive/db_world/2025_04_11_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_04_11_01.sql rename to data/sql/archive/db_world/2025_04_11_01.sql diff --git a/data/sql/updates/db_world/2025_04_12_00.sql b/data/sql/archive/db_world/2025_04_12_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_04_12_00.sql rename to data/sql/archive/db_world/2025_04_12_00.sql diff --git a/data/sql/updates/db_world/2025_04_12_01.sql b/data/sql/archive/db_world/2025_04_12_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_04_12_01.sql rename to data/sql/archive/db_world/2025_04_12_01.sql diff --git a/data/sql/updates/db_world/2025_04_13_00.sql b/data/sql/archive/db_world/2025_04_13_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_04_13_00.sql rename to data/sql/archive/db_world/2025_04_13_00.sql diff --git a/data/sql/updates/db_world/2025_04_13_01.sql b/data/sql/archive/db_world/2025_04_13_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_04_13_01.sql rename to data/sql/archive/db_world/2025_04_13_01.sql diff --git a/data/sql/updates/db_world/2025_04_13_02.sql b/data/sql/archive/db_world/2025_04_13_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_04_13_02.sql rename to data/sql/archive/db_world/2025_04_13_02.sql diff --git a/data/sql/updates/db_world/2025_04_13_03.sql b/data/sql/archive/db_world/2025_04_13_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_04_13_03.sql rename to data/sql/archive/db_world/2025_04_13_03.sql diff --git a/data/sql/updates/db_world/2025_04_13_04.sql b/data/sql/archive/db_world/2025_04_13_04.sql similarity index 100% rename from data/sql/updates/db_world/2025_04_13_04.sql rename to data/sql/archive/db_world/2025_04_13_04.sql diff --git a/data/sql/updates/db_world/2025_04_14_00.sql b/data/sql/archive/db_world/2025_04_14_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_04_14_00.sql rename to data/sql/archive/db_world/2025_04_14_00.sql diff --git a/data/sql/updates/db_world/2025_04_15_00.sql b/data/sql/archive/db_world/2025_04_15_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_04_15_00.sql rename to data/sql/archive/db_world/2025_04_15_00.sql diff --git a/data/sql/updates/db_world/2025_04_15_01.sql b/data/sql/archive/db_world/2025_04_15_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_04_15_01.sql rename to data/sql/archive/db_world/2025_04_15_01.sql diff --git a/data/sql/updates/db_world/2025_04_17_00.sql b/data/sql/archive/db_world/2025_04_17_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_04_17_00.sql rename to data/sql/archive/db_world/2025_04_17_00.sql diff --git a/data/sql/updates/db_world/2025_04_17_01.sql b/data/sql/archive/db_world/2025_04_17_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_04_17_01.sql rename to data/sql/archive/db_world/2025_04_17_01.sql diff --git a/data/sql/updates/db_world/2025_04_19_00.sql b/data/sql/archive/db_world/2025_04_19_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_04_19_00.sql rename to data/sql/archive/db_world/2025_04_19_00.sql diff --git a/data/sql/updates/db_world/2025_04_20_00.sql b/data/sql/archive/db_world/2025_04_20_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_04_20_00.sql rename to data/sql/archive/db_world/2025_04_20_00.sql diff --git a/data/sql/updates/db_world/2025_04_20_01.sql b/data/sql/archive/db_world/2025_04_20_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_04_20_01.sql rename to data/sql/archive/db_world/2025_04_20_01.sql diff --git a/data/sql/updates/db_world/2025_04_25_00.sql b/data/sql/archive/db_world/2025_04_25_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_04_25_00.sql rename to data/sql/archive/db_world/2025_04_25_00.sql diff --git a/data/sql/updates/db_world/2025_04_25_01.sql b/data/sql/archive/db_world/2025_04_25_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_04_25_01.sql rename to data/sql/archive/db_world/2025_04_25_01.sql diff --git a/data/sql/updates/db_world/2025_04_26_00.sql b/data/sql/archive/db_world/2025_04_26_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_04_26_00.sql rename to data/sql/archive/db_world/2025_04_26_00.sql diff --git a/data/sql/updates/db_world/2025_04_29_00.sql b/data/sql/archive/db_world/2025_04_29_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_04_29_00.sql rename to data/sql/archive/db_world/2025_04_29_00.sql diff --git a/data/sql/updates/db_world/2025_04_29_01.sql b/data/sql/archive/db_world/2025_04_29_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_04_29_01.sql rename to data/sql/archive/db_world/2025_04_29_01.sql diff --git a/data/sql/updates/db_world/2025_04_30_00.sql b/data/sql/archive/db_world/2025_04_30_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_04_30_00.sql rename to data/sql/archive/db_world/2025_04_30_00.sql diff --git a/data/sql/updates/db_world/2025_04_30_01.sql b/data/sql/archive/db_world/2025_04_30_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_04_30_01.sql rename to data/sql/archive/db_world/2025_04_30_01.sql diff --git a/data/sql/updates/db_world/2025_04_30_02.sql b/data/sql/archive/db_world/2025_04_30_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_04_30_02.sql rename to data/sql/archive/db_world/2025_04_30_02.sql diff --git a/data/sql/updates/db_world/2025_04_30_03.sql b/data/sql/archive/db_world/2025_04_30_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_04_30_03.sql rename to data/sql/archive/db_world/2025_04_30_03.sql diff --git a/data/sql/updates/db_world/2025_04_30_04.sql b/data/sql/archive/db_world/2025_04_30_04.sql similarity index 100% rename from data/sql/updates/db_world/2025_04_30_04.sql rename to data/sql/archive/db_world/2025_04_30_04.sql diff --git a/data/sql/updates/db_world/2025_04_30_05.sql b/data/sql/archive/db_world/2025_04_30_05.sql similarity index 100% rename from data/sql/updates/db_world/2025_04_30_05.sql rename to data/sql/archive/db_world/2025_04_30_05.sql diff --git a/data/sql/updates/db_world/2025_05_01_00.sql b/data/sql/archive/db_world/2025_05_01_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_05_01_00.sql rename to data/sql/archive/db_world/2025_05_01_00.sql diff --git a/data/sql/updates/db_world/2025_05_03_00.sql b/data/sql/archive/db_world/2025_05_03_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_05_03_00.sql rename to data/sql/archive/db_world/2025_05_03_00.sql diff --git a/data/sql/updates/db_world/2025_05_04_00.sql b/data/sql/archive/db_world/2025_05_04_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_05_04_00.sql rename to data/sql/archive/db_world/2025_05_04_00.sql diff --git a/data/sql/updates/db_world/2025_05_04_01.sql b/data/sql/archive/db_world/2025_05_04_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_05_04_01.sql rename to data/sql/archive/db_world/2025_05_04_01.sql diff --git a/data/sql/updates/db_world/2025_05_04_02.sql b/data/sql/archive/db_world/2025_05_04_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_05_04_02.sql rename to data/sql/archive/db_world/2025_05_04_02.sql diff --git a/data/sql/updates/db_world/2025_05_04_03.sql b/data/sql/archive/db_world/2025_05_04_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_05_04_03.sql rename to data/sql/archive/db_world/2025_05_04_03.sql diff --git a/data/sql/updates/db_world/2025_05_04_04.sql b/data/sql/archive/db_world/2025_05_04_04.sql similarity index 100% rename from data/sql/updates/db_world/2025_05_04_04.sql rename to data/sql/archive/db_world/2025_05_04_04.sql diff --git a/data/sql/updates/db_world/2025_05_05_00.sql b/data/sql/archive/db_world/2025_05_05_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_05_05_00.sql rename to data/sql/archive/db_world/2025_05_05_00.sql diff --git a/data/sql/updates/db_world/2025_05_09_00.sql b/data/sql/archive/db_world/2025_05_09_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_05_09_00.sql rename to data/sql/archive/db_world/2025_05_09_00.sql diff --git a/data/sql/updates/db_world/2025_05_09_01.sql b/data/sql/archive/db_world/2025_05_09_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_05_09_01.sql rename to data/sql/archive/db_world/2025_05_09_01.sql diff --git a/data/sql/updates/db_world/2025_05_10_00.sql b/data/sql/archive/db_world/2025_05_10_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_05_10_00.sql rename to data/sql/archive/db_world/2025_05_10_00.sql diff --git a/data/sql/updates/db_world/2025_05_10_01.sql b/data/sql/archive/db_world/2025_05_10_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_05_10_01.sql rename to data/sql/archive/db_world/2025_05_10_01.sql diff --git a/data/sql/updates/db_world/2025_05_10_02.sql b/data/sql/archive/db_world/2025_05_10_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_05_10_02.sql rename to data/sql/archive/db_world/2025_05_10_02.sql diff --git a/data/sql/updates/db_world/2025_05_10_03.sql b/data/sql/archive/db_world/2025_05_10_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_05_10_03.sql rename to data/sql/archive/db_world/2025_05_10_03.sql diff --git a/data/sql/updates/db_world/2025_05_10_04.sql b/data/sql/archive/db_world/2025_05_10_04.sql similarity index 100% rename from data/sql/updates/db_world/2025_05_10_04.sql rename to data/sql/archive/db_world/2025_05_10_04.sql diff --git a/data/sql/updates/db_world/2025_05_12_00.sql b/data/sql/archive/db_world/2025_05_12_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_05_12_00.sql rename to data/sql/archive/db_world/2025_05_12_00.sql diff --git a/data/sql/updates/db_world/2025_05_12_01.sql b/data/sql/archive/db_world/2025_05_12_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_05_12_01.sql rename to data/sql/archive/db_world/2025_05_12_01.sql diff --git a/data/sql/updates/db_world/2025_05_13_00.sql b/data/sql/archive/db_world/2025_05_13_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_05_13_00.sql rename to data/sql/archive/db_world/2025_05_13_00.sql diff --git a/data/sql/updates/db_world/2025_05_15_00.sql b/data/sql/archive/db_world/2025_05_15_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_05_15_00.sql rename to data/sql/archive/db_world/2025_05_15_00.sql diff --git a/data/sql/updates/db_world/2025_05_18_00.sql b/data/sql/archive/db_world/2025_05_18_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_05_18_00.sql rename to data/sql/archive/db_world/2025_05_18_00.sql diff --git a/data/sql/updates/db_world/2025_05_19_00.sql b/data/sql/archive/db_world/2025_05_19_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_05_19_00.sql rename to data/sql/archive/db_world/2025_05_19_00.sql diff --git a/data/sql/updates/db_world/2025_05_20_00.sql b/data/sql/archive/db_world/2025_05_20_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_05_20_00.sql rename to data/sql/archive/db_world/2025_05_20_00.sql diff --git a/data/sql/updates/db_world/2025_05_21_00.sql b/data/sql/archive/db_world/2025_05_21_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_05_21_00.sql rename to data/sql/archive/db_world/2025_05_21_00.sql diff --git a/data/sql/updates/db_world/2025_05_21_01.sql b/data/sql/archive/db_world/2025_05_21_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_05_21_01.sql rename to data/sql/archive/db_world/2025_05_21_01.sql diff --git a/data/sql/updates/db_world/2025_05_22_00.sql b/data/sql/archive/db_world/2025_05_22_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_05_22_00.sql rename to data/sql/archive/db_world/2025_05_22_00.sql diff --git a/data/sql/updates/db_world/2025_05_23_00.sql b/data/sql/archive/db_world/2025_05_23_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_05_23_00.sql rename to data/sql/archive/db_world/2025_05_23_00.sql diff --git a/data/sql/updates/db_world/2025_05_23_01.sql b/data/sql/archive/db_world/2025_05_23_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_05_23_01.sql rename to data/sql/archive/db_world/2025_05_23_01.sql diff --git a/data/sql/updates/db_world/2025_05_23_02.sql b/data/sql/archive/db_world/2025_05_23_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_05_23_02.sql rename to data/sql/archive/db_world/2025_05_23_02.sql diff --git a/data/sql/updates/db_world/2025_05_23_03.sql b/data/sql/archive/db_world/2025_05_23_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_05_23_03.sql rename to data/sql/archive/db_world/2025_05_23_03.sql diff --git a/data/sql/updates/db_world/2025_05_23_04.sql b/data/sql/archive/db_world/2025_05_23_04.sql similarity index 100% rename from data/sql/updates/db_world/2025_05_23_04.sql rename to data/sql/archive/db_world/2025_05_23_04.sql diff --git a/data/sql/updates/db_world/2025_05_23_05.sql b/data/sql/archive/db_world/2025_05_23_05.sql similarity index 100% rename from data/sql/updates/db_world/2025_05_23_05.sql rename to data/sql/archive/db_world/2025_05_23_05.sql diff --git a/data/sql/updates/db_world/2025_05_23_06.sql b/data/sql/archive/db_world/2025_05_23_06.sql similarity index 100% rename from data/sql/updates/db_world/2025_05_23_06.sql rename to data/sql/archive/db_world/2025_05_23_06.sql diff --git a/data/sql/updates/db_world/2025_05_24_00.sql b/data/sql/archive/db_world/2025_05_24_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_05_24_00.sql rename to data/sql/archive/db_world/2025_05_24_00.sql diff --git a/data/sql/updates/db_world/2025_05_24_01.sql b/data/sql/archive/db_world/2025_05_24_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_05_24_01.sql rename to data/sql/archive/db_world/2025_05_24_01.sql diff --git a/data/sql/updates/db_world/2025_05_24_02.sql b/data/sql/archive/db_world/2025_05_24_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_05_24_02.sql rename to data/sql/archive/db_world/2025_05_24_02.sql diff --git a/data/sql/updates/db_world/2025_05_26_00.sql b/data/sql/archive/db_world/2025_05_26_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_05_26_00.sql rename to data/sql/archive/db_world/2025_05_26_00.sql diff --git a/data/sql/updates/db_world/2025_05_27_00.sql b/data/sql/archive/db_world/2025_05_27_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_05_27_00.sql rename to data/sql/archive/db_world/2025_05_27_00.sql diff --git a/data/sql/updates/db_world/2025_05_27_01.sql b/data/sql/archive/db_world/2025_05_27_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_05_27_01.sql rename to data/sql/archive/db_world/2025_05_27_01.sql diff --git a/data/sql/updates/db_world/2025_05_27_02.sql b/data/sql/archive/db_world/2025_05_27_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_05_27_02.sql rename to data/sql/archive/db_world/2025_05_27_02.sql diff --git a/data/sql/updates/db_world/2025_05_29_00.sql b/data/sql/archive/db_world/2025_05_29_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_05_29_00.sql rename to data/sql/archive/db_world/2025_05_29_00.sql diff --git a/data/sql/updates/db_world/2025_05_29_01.sql b/data/sql/archive/db_world/2025_05_29_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_05_29_01.sql rename to data/sql/archive/db_world/2025_05_29_01.sql diff --git a/data/sql/updates/db_world/2025_05_30_00.sql b/data/sql/archive/db_world/2025_05_30_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_05_30_00.sql rename to data/sql/archive/db_world/2025_05_30_00.sql diff --git a/data/sql/updates/db_world/2025_05_30_01.sql b/data/sql/archive/db_world/2025_05_30_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_05_30_01.sql rename to data/sql/archive/db_world/2025_05_30_01.sql diff --git a/data/sql/updates/db_world/2025_05_30_02.sql b/data/sql/archive/db_world/2025_05_30_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_05_30_02.sql rename to data/sql/archive/db_world/2025_05_30_02.sql diff --git a/data/sql/updates/db_world/2025_05_30_03.sql b/data/sql/archive/db_world/2025_05_30_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_05_30_03.sql rename to data/sql/archive/db_world/2025_05_30_03.sql diff --git a/data/sql/updates/db_world/2025_05_30_04.sql b/data/sql/archive/db_world/2025_05_30_04.sql similarity index 100% rename from data/sql/updates/db_world/2025_05_30_04.sql rename to data/sql/archive/db_world/2025_05_30_04.sql diff --git a/data/sql/updates/db_world/2025_05_30_05.sql b/data/sql/archive/db_world/2025_05_30_05.sql similarity index 100% rename from data/sql/updates/db_world/2025_05_30_05.sql rename to data/sql/archive/db_world/2025_05_30_05.sql diff --git a/data/sql/updates/db_world/2025_05_30_06.sql b/data/sql/archive/db_world/2025_05_30_06.sql similarity index 100% rename from data/sql/updates/db_world/2025_05_30_06.sql rename to data/sql/archive/db_world/2025_05_30_06.sql diff --git a/data/sql/updates/db_world/2025_05_30_07.sql b/data/sql/archive/db_world/2025_05_30_07.sql similarity index 100% rename from data/sql/updates/db_world/2025_05_30_07.sql rename to data/sql/archive/db_world/2025_05_30_07.sql diff --git a/data/sql/updates/db_world/2025_05_30_08.sql b/data/sql/archive/db_world/2025_05_30_08.sql similarity index 100% rename from data/sql/updates/db_world/2025_05_30_08.sql rename to data/sql/archive/db_world/2025_05_30_08.sql diff --git a/data/sql/updates/db_world/2025_05_31_00.sql b/data/sql/archive/db_world/2025_05_31_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_05_31_00.sql rename to data/sql/archive/db_world/2025_05_31_00.sql diff --git a/data/sql/updates/db_world/2025_05_31_01.sql b/data/sql/archive/db_world/2025_05_31_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_05_31_01.sql rename to data/sql/archive/db_world/2025_05_31_01.sql diff --git a/data/sql/updates/db_world/2025_06_05_00.sql b/data/sql/archive/db_world/2025_06_05_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_06_05_00.sql rename to data/sql/archive/db_world/2025_06_05_00.sql diff --git a/data/sql/updates/db_world/2025_06_05_01.sql b/data/sql/archive/db_world/2025_06_05_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_06_05_01.sql rename to data/sql/archive/db_world/2025_06_05_01.sql diff --git a/data/sql/updates/db_world/2025_06_05_02.sql b/data/sql/archive/db_world/2025_06_05_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_06_05_02.sql rename to data/sql/archive/db_world/2025_06_05_02.sql diff --git a/data/sql/updates/db_world/2025_06_05_03.sql b/data/sql/archive/db_world/2025_06_05_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_06_05_03.sql rename to data/sql/archive/db_world/2025_06_05_03.sql diff --git a/data/sql/updates/db_world/2025_06_06_00.sql b/data/sql/archive/db_world/2025_06_06_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_06_06_00.sql rename to data/sql/archive/db_world/2025_06_06_00.sql diff --git a/data/sql/updates/db_world/2025_06_06_01.sql b/data/sql/archive/db_world/2025_06_06_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_06_06_01.sql rename to data/sql/archive/db_world/2025_06_06_01.sql diff --git a/data/sql/updates/db_world/2025_06_07_00.sql b/data/sql/archive/db_world/2025_06_07_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_06_07_00.sql rename to data/sql/archive/db_world/2025_06_07_00.sql diff --git a/data/sql/updates/db_world/2025_06_08_00.sql b/data/sql/archive/db_world/2025_06_08_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_06_08_00.sql rename to data/sql/archive/db_world/2025_06_08_00.sql diff --git a/data/sql/updates/db_world/2025_06_08_01.sql b/data/sql/archive/db_world/2025_06_08_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_06_08_01.sql rename to data/sql/archive/db_world/2025_06_08_01.sql diff --git a/data/sql/updates/db_world/2025_06_08_02.sql b/data/sql/archive/db_world/2025_06_08_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_06_08_02.sql rename to data/sql/archive/db_world/2025_06_08_02.sql diff --git a/data/sql/updates/db_world/2025_06_08_03.sql b/data/sql/archive/db_world/2025_06_08_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_06_08_03.sql rename to data/sql/archive/db_world/2025_06_08_03.sql diff --git a/data/sql/updates/db_world/2025_06_08_04.sql b/data/sql/archive/db_world/2025_06_08_04.sql similarity index 100% rename from data/sql/updates/db_world/2025_06_08_04.sql rename to data/sql/archive/db_world/2025_06_08_04.sql diff --git a/data/sql/updates/db_world/2025_06_08_05.sql b/data/sql/archive/db_world/2025_06_08_05.sql similarity index 100% rename from data/sql/updates/db_world/2025_06_08_05.sql rename to data/sql/archive/db_world/2025_06_08_05.sql diff --git a/data/sql/updates/db_world/2025_06_08_06.sql b/data/sql/archive/db_world/2025_06_08_06.sql similarity index 100% rename from data/sql/updates/db_world/2025_06_08_06.sql rename to data/sql/archive/db_world/2025_06_08_06.sql diff --git a/data/sql/updates/db_world/2025_06_09_00.sql b/data/sql/archive/db_world/2025_06_09_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_06_09_00.sql rename to data/sql/archive/db_world/2025_06_09_00.sql diff --git a/data/sql/updates/db_world/2025_06_12_00.sql b/data/sql/archive/db_world/2025_06_12_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_06_12_00.sql rename to data/sql/archive/db_world/2025_06_12_00.sql diff --git a/data/sql/updates/db_world/2025_06_12_01.sql b/data/sql/archive/db_world/2025_06_12_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_06_12_01.sql rename to data/sql/archive/db_world/2025_06_12_01.sql diff --git a/data/sql/updates/db_world/2025_06_12_02.sql b/data/sql/archive/db_world/2025_06_12_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_06_12_02.sql rename to data/sql/archive/db_world/2025_06_12_02.sql diff --git a/data/sql/updates/db_world/2025_06_12_03.sql b/data/sql/archive/db_world/2025_06_12_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_06_12_03.sql rename to data/sql/archive/db_world/2025_06_12_03.sql diff --git a/data/sql/updates/db_world/2025_06_12_04.sql b/data/sql/archive/db_world/2025_06_12_04.sql similarity index 100% rename from data/sql/updates/db_world/2025_06_12_04.sql rename to data/sql/archive/db_world/2025_06_12_04.sql diff --git a/data/sql/updates/db_world/2025_06_15_00.sql b/data/sql/archive/db_world/2025_06_15_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_06_15_00.sql rename to data/sql/archive/db_world/2025_06_15_00.sql diff --git a/data/sql/updates/db_world/2025_06_15_01.sql b/data/sql/archive/db_world/2025_06_15_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_06_15_01.sql rename to data/sql/archive/db_world/2025_06_15_01.sql diff --git a/data/sql/updates/db_world/2025_06_15_02.sql b/data/sql/archive/db_world/2025_06_15_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_06_15_02.sql rename to data/sql/archive/db_world/2025_06_15_02.sql diff --git a/data/sql/updates/db_world/2025_06_16_00.sql b/data/sql/archive/db_world/2025_06_16_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_06_16_00.sql rename to data/sql/archive/db_world/2025_06_16_00.sql diff --git a/data/sql/updates/db_world/2025_06_17_00.sql b/data/sql/archive/db_world/2025_06_17_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_06_17_00.sql rename to data/sql/archive/db_world/2025_06_17_00.sql diff --git a/data/sql/updates/db_world/2025_06_17_01.sql b/data/sql/archive/db_world/2025_06_17_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_06_17_01.sql rename to data/sql/archive/db_world/2025_06_17_01.sql diff --git a/data/sql/updates/db_world/2025_06_17_02.sql b/data/sql/archive/db_world/2025_06_17_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_06_17_02.sql rename to data/sql/archive/db_world/2025_06_17_02.sql diff --git a/data/sql/updates/db_world/2025_06_17_03.sql b/data/sql/archive/db_world/2025_06_17_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_06_17_03.sql rename to data/sql/archive/db_world/2025_06_17_03.sql diff --git a/data/sql/updates/db_world/2025_06_18_00.sql b/data/sql/archive/db_world/2025_06_18_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_06_18_00.sql rename to data/sql/archive/db_world/2025_06_18_00.sql diff --git a/data/sql/updates/db_world/2025_06_21_00.sql b/data/sql/archive/db_world/2025_06_21_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_06_21_00.sql rename to data/sql/archive/db_world/2025_06_21_00.sql diff --git a/data/sql/updates/db_world/2025_06_21_01.sql b/data/sql/archive/db_world/2025_06_21_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_06_21_01.sql rename to data/sql/archive/db_world/2025_06_21_01.sql diff --git a/data/sql/updates/db_world/2025_06_21_02.sql b/data/sql/archive/db_world/2025_06_21_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_06_21_02.sql rename to data/sql/archive/db_world/2025_06_21_02.sql diff --git a/data/sql/updates/db_world/2025_06_21_03.sql b/data/sql/archive/db_world/2025_06_21_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_06_21_03.sql rename to data/sql/archive/db_world/2025_06_21_03.sql diff --git a/data/sql/updates/db_world/2025_06_27_00.sql b/data/sql/archive/db_world/2025_06_27_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_06_27_00.sql rename to data/sql/archive/db_world/2025_06_27_00.sql diff --git a/data/sql/updates/db_world/2025_06_27_01.sql b/data/sql/archive/db_world/2025_06_27_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_06_27_01.sql rename to data/sql/archive/db_world/2025_06_27_01.sql diff --git a/data/sql/updates/db_world/2025_06_27_02.sql b/data/sql/archive/db_world/2025_06_27_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_06_27_02.sql rename to data/sql/archive/db_world/2025_06_27_02.sql diff --git a/data/sql/updates/db_world/2025_06_28_00.sql b/data/sql/archive/db_world/2025_06_28_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_06_28_00.sql rename to data/sql/archive/db_world/2025_06_28_00.sql diff --git a/data/sql/updates/db_world/2025_06_29_00.sql b/data/sql/archive/db_world/2025_06_29_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_06_29_00.sql rename to data/sql/archive/db_world/2025_06_29_00.sql diff --git a/data/sql/updates/db_world/2025_06_29_01.sql b/data/sql/archive/db_world/2025_06_29_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_06_29_01.sql rename to data/sql/archive/db_world/2025_06_29_01.sql diff --git a/data/sql/updates/db_world/2025_06_29_02.sql b/data/sql/archive/db_world/2025_06_29_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_06_29_02.sql rename to data/sql/archive/db_world/2025_06_29_02.sql diff --git a/data/sql/updates/db_world/2025_06_29_03.sql b/data/sql/archive/db_world/2025_06_29_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_06_29_03.sql rename to data/sql/archive/db_world/2025_06_29_03.sql diff --git a/data/sql/updates/db_world/2025_06_30_00.sql b/data/sql/archive/db_world/2025_06_30_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_06_30_00.sql rename to data/sql/archive/db_world/2025_06_30_00.sql diff --git a/data/sql/updates/db_world/2025_07_01_00.sql b/data/sql/archive/db_world/2025_07_01_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_07_01_00.sql rename to data/sql/archive/db_world/2025_07_01_00.sql diff --git a/data/sql/updates/db_world/2025_07_01_01.sql b/data/sql/archive/db_world/2025_07_01_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_07_01_01.sql rename to data/sql/archive/db_world/2025_07_01_01.sql diff --git a/data/sql/updates/db_world/2025_07_01_02.sql b/data/sql/archive/db_world/2025_07_01_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_07_01_02.sql rename to data/sql/archive/db_world/2025_07_01_02.sql diff --git a/data/sql/updates/db_world/2025_07_01_03.sql b/data/sql/archive/db_world/2025_07_01_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_07_01_03.sql rename to data/sql/archive/db_world/2025_07_01_03.sql diff --git a/data/sql/updates/db_world/2025_07_02_00.sql b/data/sql/archive/db_world/2025_07_02_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_07_02_00.sql rename to data/sql/archive/db_world/2025_07_02_00.sql diff --git a/data/sql/updates/db_world/2025_07_02_01.sql b/data/sql/archive/db_world/2025_07_02_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_07_02_01.sql rename to data/sql/archive/db_world/2025_07_02_01.sql diff --git a/data/sql/updates/db_world/2025_07_03_00.sql b/data/sql/archive/db_world/2025_07_03_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_07_03_00.sql rename to data/sql/archive/db_world/2025_07_03_00.sql diff --git a/data/sql/updates/db_world/2025_07_03_01.sql b/data/sql/archive/db_world/2025_07_03_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_07_03_01.sql rename to data/sql/archive/db_world/2025_07_03_01.sql diff --git a/data/sql/updates/db_world/2025_07_03_02.sql b/data/sql/archive/db_world/2025_07_03_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_07_03_02.sql rename to data/sql/archive/db_world/2025_07_03_02.sql diff --git a/data/sql/updates/db_world/2025_07_03_03.sql b/data/sql/archive/db_world/2025_07_03_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_07_03_03.sql rename to data/sql/archive/db_world/2025_07_03_03.sql diff --git a/data/sql/updates/db_world/2025_07_07_00.sql b/data/sql/archive/db_world/2025_07_07_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_07_07_00.sql rename to data/sql/archive/db_world/2025_07_07_00.sql diff --git a/data/sql/updates/db_world/2025_07_08_00.sql b/data/sql/archive/db_world/2025_07_08_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_07_08_00.sql rename to data/sql/archive/db_world/2025_07_08_00.sql diff --git a/data/sql/updates/db_world/2025_07_08_01.sql b/data/sql/archive/db_world/2025_07_08_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_07_08_01.sql rename to data/sql/archive/db_world/2025_07_08_01.sql diff --git a/data/sql/updates/db_world/2025_07_09_00.sql b/data/sql/archive/db_world/2025_07_09_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_07_09_00.sql rename to data/sql/archive/db_world/2025_07_09_00.sql diff --git a/data/sql/updates/db_world/2025_07_10_00.sql b/data/sql/archive/db_world/2025_07_10_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_07_10_00.sql rename to data/sql/archive/db_world/2025_07_10_00.sql diff --git a/data/sql/updates/db_world/2025_07_12_00.sql b/data/sql/archive/db_world/2025_07_12_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_07_12_00.sql rename to data/sql/archive/db_world/2025_07_12_00.sql diff --git a/data/sql/updates/db_world/2025_07_12_01.sql b/data/sql/archive/db_world/2025_07_12_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_07_12_01.sql rename to data/sql/archive/db_world/2025_07_12_01.sql diff --git a/data/sql/updates/db_world/2025_07_12_02.sql b/data/sql/archive/db_world/2025_07_12_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_07_12_02.sql rename to data/sql/archive/db_world/2025_07_12_02.sql diff --git a/data/sql/updates/db_world/2025_07_14_00.sql b/data/sql/archive/db_world/2025_07_14_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_07_14_00.sql rename to data/sql/archive/db_world/2025_07_14_00.sql diff --git a/data/sql/updates/db_world/2025_07_15_00.sql b/data/sql/archive/db_world/2025_07_15_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_07_15_00.sql rename to data/sql/archive/db_world/2025_07_15_00.sql diff --git a/data/sql/updates/db_world/2025_07_15_01.sql b/data/sql/archive/db_world/2025_07_15_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_07_15_01.sql rename to data/sql/archive/db_world/2025_07_15_01.sql diff --git a/data/sql/updates/db_world/2025_07_18_00.sql b/data/sql/archive/db_world/2025_07_18_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_07_18_00.sql rename to data/sql/archive/db_world/2025_07_18_00.sql diff --git a/data/sql/updates/db_world/2025_07_19_00.sql b/data/sql/archive/db_world/2025_07_19_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_07_19_00.sql rename to data/sql/archive/db_world/2025_07_19_00.sql diff --git a/data/sql/updates/db_world/2025_07_19_01.sql b/data/sql/archive/db_world/2025_07_19_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_07_19_01.sql rename to data/sql/archive/db_world/2025_07_19_01.sql diff --git a/data/sql/updates/db_world/2025_07_20_00.sql b/data/sql/archive/db_world/2025_07_20_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_07_20_00.sql rename to data/sql/archive/db_world/2025_07_20_00.sql diff --git a/data/sql/updates/db_world/2025_07_20_01.sql b/data/sql/archive/db_world/2025_07_20_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_07_20_01.sql rename to data/sql/archive/db_world/2025_07_20_01.sql diff --git a/data/sql/updates/db_world/2025_07_20_02.sql b/data/sql/archive/db_world/2025_07_20_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_07_20_02.sql rename to data/sql/archive/db_world/2025_07_20_02.sql diff --git a/data/sql/updates/db_world/2025_07_21_00.sql b/data/sql/archive/db_world/2025_07_21_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_07_21_00.sql rename to data/sql/archive/db_world/2025_07_21_00.sql diff --git a/data/sql/updates/db_world/2025_07_21_01.sql b/data/sql/archive/db_world/2025_07_21_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_07_21_01.sql rename to data/sql/archive/db_world/2025_07_21_01.sql diff --git a/data/sql/updates/db_world/2025_07_22_00.sql b/data/sql/archive/db_world/2025_07_22_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_07_22_00.sql rename to data/sql/archive/db_world/2025_07_22_00.sql diff --git a/data/sql/updates/db_world/2025_07_22_01.sql b/data/sql/archive/db_world/2025_07_22_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_07_22_01.sql rename to data/sql/archive/db_world/2025_07_22_01.sql diff --git a/data/sql/updates/db_world/2025_07_22_02.sql b/data/sql/archive/db_world/2025_07_22_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_07_22_02.sql rename to data/sql/archive/db_world/2025_07_22_02.sql diff --git a/data/sql/updates/db_world/2025_07_22_03.sql b/data/sql/archive/db_world/2025_07_22_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_07_22_03.sql rename to data/sql/archive/db_world/2025_07_22_03.sql diff --git a/data/sql/updates/db_world/2025_07_23_00.sql b/data/sql/archive/db_world/2025_07_23_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_07_23_00.sql rename to data/sql/archive/db_world/2025_07_23_00.sql diff --git a/data/sql/updates/db_world/2025_07_24_00.sql b/data/sql/archive/db_world/2025_07_24_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_07_24_00.sql rename to data/sql/archive/db_world/2025_07_24_00.sql diff --git a/data/sql/updates/db_world/2025_07_24_01.sql b/data/sql/archive/db_world/2025_07_24_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_07_24_01.sql rename to data/sql/archive/db_world/2025_07_24_01.sql diff --git a/data/sql/updates/db_world/2025_07_24_02.sql b/data/sql/archive/db_world/2025_07_24_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_07_24_02.sql rename to data/sql/archive/db_world/2025_07_24_02.sql diff --git a/data/sql/updates/db_world/2025_07_24_03.sql b/data/sql/archive/db_world/2025_07_24_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_07_24_03.sql rename to data/sql/archive/db_world/2025_07_24_03.sql diff --git a/data/sql/updates/db_world/2025_07_25_00.sql b/data/sql/archive/db_world/2025_07_25_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_07_25_00.sql rename to data/sql/archive/db_world/2025_07_25_00.sql diff --git a/data/sql/updates/db_world/2025_07_26_00.sql b/data/sql/archive/db_world/2025_07_26_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_07_26_00.sql rename to data/sql/archive/db_world/2025_07_26_00.sql diff --git a/data/sql/updates/db_world/2025_07_26_01.sql b/data/sql/archive/db_world/2025_07_26_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_07_26_01.sql rename to data/sql/archive/db_world/2025_07_26_01.sql diff --git a/data/sql/updates/db_world/2025_07_27_00.sql b/data/sql/archive/db_world/2025_07_27_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_07_27_00.sql rename to data/sql/archive/db_world/2025_07_27_00.sql diff --git a/data/sql/updates/db_world/2025_07_27_01.sql b/data/sql/archive/db_world/2025_07_27_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_07_27_01.sql rename to data/sql/archive/db_world/2025_07_27_01.sql diff --git a/data/sql/updates/db_world/2025_07_27_02.sql b/data/sql/archive/db_world/2025_07_27_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_07_27_02.sql rename to data/sql/archive/db_world/2025_07_27_02.sql diff --git a/data/sql/updates/db_world/2025_07_29_00.sql b/data/sql/archive/db_world/2025_07_29_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_07_29_00.sql rename to data/sql/archive/db_world/2025_07_29_00.sql diff --git a/data/sql/updates/db_world/2025_07_29_01.sql b/data/sql/archive/db_world/2025_07_29_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_07_29_01.sql rename to data/sql/archive/db_world/2025_07_29_01.sql diff --git a/data/sql/updates/db_world/2025_07_29_02.sql b/data/sql/archive/db_world/2025_07_29_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_07_29_02.sql rename to data/sql/archive/db_world/2025_07_29_02.sql diff --git a/data/sql/updates/db_world/2025_07_29_03.sql b/data/sql/archive/db_world/2025_07_29_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_07_29_03.sql rename to data/sql/archive/db_world/2025_07_29_03.sql diff --git a/data/sql/updates/db_world/2025_08_01_00.sql b/data/sql/archive/db_world/2025_08_01_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_08_01_00.sql rename to data/sql/archive/db_world/2025_08_01_00.sql diff --git a/data/sql/updates/db_world/2025_08_01_01.sql b/data/sql/archive/db_world/2025_08_01_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_08_01_01.sql rename to data/sql/archive/db_world/2025_08_01_01.sql diff --git a/data/sql/updates/db_world/2025_08_06_00.sql b/data/sql/archive/db_world/2025_08_06_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_08_06_00.sql rename to data/sql/archive/db_world/2025_08_06_00.sql diff --git a/data/sql/updates/db_world/2025_08_06_01.sql b/data/sql/archive/db_world/2025_08_06_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_08_06_01.sql rename to data/sql/archive/db_world/2025_08_06_01.sql diff --git a/data/sql/updates/db_world/2025_08_06_02.sql b/data/sql/archive/db_world/2025_08_06_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_08_06_02.sql rename to data/sql/archive/db_world/2025_08_06_02.sql diff --git a/data/sql/updates/db_world/2025_08_06_03.sql b/data/sql/archive/db_world/2025_08_06_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_08_06_03.sql rename to data/sql/archive/db_world/2025_08_06_03.sql diff --git a/data/sql/updates/db_world/2025_08_06_04.sql b/data/sql/archive/db_world/2025_08_06_04.sql similarity index 100% rename from data/sql/updates/db_world/2025_08_06_04.sql rename to data/sql/archive/db_world/2025_08_06_04.sql diff --git a/data/sql/updates/db_world/2025_08_07_00.sql b/data/sql/archive/db_world/2025_08_07_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_08_07_00.sql rename to data/sql/archive/db_world/2025_08_07_00.sql diff --git a/data/sql/updates/db_world/2025_08_08_00.sql b/data/sql/archive/db_world/2025_08_08_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_08_08_00.sql rename to data/sql/archive/db_world/2025_08_08_00.sql diff --git a/data/sql/updates/db_world/2025_08_08_01.sql b/data/sql/archive/db_world/2025_08_08_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_08_08_01.sql rename to data/sql/archive/db_world/2025_08_08_01.sql diff --git a/data/sql/updates/db_world/2025_08_10_00.sql b/data/sql/archive/db_world/2025_08_10_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_08_10_00.sql rename to data/sql/archive/db_world/2025_08_10_00.sql diff --git a/data/sql/updates/db_world/2025_08_10_01.sql b/data/sql/archive/db_world/2025_08_10_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_08_10_01.sql rename to data/sql/archive/db_world/2025_08_10_01.sql diff --git a/data/sql/updates/db_world/2025_08_12_00.sql b/data/sql/archive/db_world/2025_08_12_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_08_12_00.sql rename to data/sql/archive/db_world/2025_08_12_00.sql diff --git a/data/sql/updates/db_world/2025_08_12_01.sql b/data/sql/archive/db_world/2025_08_12_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_08_12_01.sql rename to data/sql/archive/db_world/2025_08_12_01.sql diff --git a/data/sql/updates/db_world/2025_08_13_00.sql b/data/sql/archive/db_world/2025_08_13_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_08_13_00.sql rename to data/sql/archive/db_world/2025_08_13_00.sql diff --git a/data/sql/updates/db_world/2025_08_14_00.sql b/data/sql/archive/db_world/2025_08_14_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_08_14_00.sql rename to data/sql/archive/db_world/2025_08_14_00.sql diff --git a/data/sql/updates/db_world/2025_08_18_00.sql b/data/sql/archive/db_world/2025_08_18_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_08_18_00.sql rename to data/sql/archive/db_world/2025_08_18_00.sql diff --git a/data/sql/updates/db_world/2025_08_18_01.sql b/data/sql/archive/db_world/2025_08_18_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_08_18_01.sql rename to data/sql/archive/db_world/2025_08_18_01.sql diff --git a/data/sql/updates/db_world/2025_08_19_00.sql b/data/sql/archive/db_world/2025_08_19_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_08_19_00.sql rename to data/sql/archive/db_world/2025_08_19_00.sql diff --git a/data/sql/updates/db_world/2025_08_23_00.sql b/data/sql/archive/db_world/2025_08_23_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_08_23_00.sql rename to data/sql/archive/db_world/2025_08_23_00.sql diff --git a/data/sql/updates/db_world/2025_08_23_01.sql b/data/sql/archive/db_world/2025_08_23_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_08_23_01.sql rename to data/sql/archive/db_world/2025_08_23_01.sql diff --git a/data/sql/updates/db_world/2025_08_23_02.sql b/data/sql/archive/db_world/2025_08_23_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_08_23_02.sql rename to data/sql/archive/db_world/2025_08_23_02.sql diff --git a/data/sql/updates/db_world/2025_08_24_00.sql b/data/sql/archive/db_world/2025_08_24_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_08_24_00.sql rename to data/sql/archive/db_world/2025_08_24_00.sql diff --git a/data/sql/updates/db_world/2025_08_25_00.sql b/data/sql/archive/db_world/2025_08_25_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_08_25_00.sql rename to data/sql/archive/db_world/2025_08_25_00.sql diff --git a/data/sql/updates/db_world/2025_08_25_01.sql b/data/sql/archive/db_world/2025_08_25_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_08_25_01.sql rename to data/sql/archive/db_world/2025_08_25_01.sql diff --git a/data/sql/updates/db_world/2025_08_25_02.sql b/data/sql/archive/db_world/2025_08_25_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_08_25_02.sql rename to data/sql/archive/db_world/2025_08_25_02.sql diff --git a/data/sql/updates/db_world/2025_08_27_00.sql b/data/sql/archive/db_world/2025_08_27_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_08_27_00.sql rename to data/sql/archive/db_world/2025_08_27_00.sql diff --git a/data/sql/updates/db_world/2025_08_27_01.sql b/data/sql/archive/db_world/2025_08_27_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_08_27_01.sql rename to data/sql/archive/db_world/2025_08_27_01.sql diff --git a/data/sql/updates/db_world/2025_08_27_02.sql b/data/sql/archive/db_world/2025_08_27_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_08_27_02.sql rename to data/sql/archive/db_world/2025_08_27_02.sql diff --git a/data/sql/updates/db_world/2025_08_28_00.sql b/data/sql/archive/db_world/2025_08_28_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_08_28_00.sql rename to data/sql/archive/db_world/2025_08_28_00.sql diff --git a/data/sql/updates/db_world/2025_08_29_00.sql b/data/sql/archive/db_world/2025_08_29_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_08_29_00.sql rename to data/sql/archive/db_world/2025_08_29_00.sql diff --git a/data/sql/updates/db_world/2025_08_29_01.sql b/data/sql/archive/db_world/2025_08_29_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_08_29_01.sql rename to data/sql/archive/db_world/2025_08_29_01.sql diff --git a/data/sql/updates/db_world/2025_08_30_00.sql b/data/sql/archive/db_world/2025_08_30_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_08_30_00.sql rename to data/sql/archive/db_world/2025_08_30_00.sql diff --git a/data/sql/updates/db_world/2025_08_30_01.sql b/data/sql/archive/db_world/2025_08_30_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_08_30_01.sql rename to data/sql/archive/db_world/2025_08_30_01.sql diff --git a/data/sql/updates/db_world/2025_08_30_02.sql b/data/sql/archive/db_world/2025_08_30_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_08_30_02.sql rename to data/sql/archive/db_world/2025_08_30_02.sql diff --git a/data/sql/updates/db_world/2025_08_30_03.sql b/data/sql/archive/db_world/2025_08_30_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_08_30_03.sql rename to data/sql/archive/db_world/2025_08_30_03.sql diff --git a/data/sql/updates/db_world/2025_09_02_00.sql b/data/sql/archive/db_world/2025_09_02_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_02_00.sql rename to data/sql/archive/db_world/2025_09_02_00.sql diff --git a/data/sql/updates/db_world/2025_09_02_01.sql b/data/sql/archive/db_world/2025_09_02_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_02_01.sql rename to data/sql/archive/db_world/2025_09_02_01.sql diff --git a/data/sql/updates/db_world/2025_09_02_02.sql b/data/sql/archive/db_world/2025_09_02_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_02_02.sql rename to data/sql/archive/db_world/2025_09_02_02.sql diff --git a/data/sql/updates/db_world/2025_09_03_00.sql b/data/sql/archive/db_world/2025_09_03_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_03_00.sql rename to data/sql/archive/db_world/2025_09_03_00.sql diff --git a/data/sql/updates/db_world/2025_09_03_01.sql b/data/sql/archive/db_world/2025_09_03_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_03_01.sql rename to data/sql/archive/db_world/2025_09_03_01.sql diff --git a/data/sql/updates/db_world/2025_09_03_02.sql b/data/sql/archive/db_world/2025_09_03_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_03_02.sql rename to data/sql/archive/db_world/2025_09_03_02.sql diff --git a/data/sql/updates/db_world/2025_09_04_00.sql b/data/sql/archive/db_world/2025_09_04_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_04_00.sql rename to data/sql/archive/db_world/2025_09_04_00.sql diff --git a/data/sql/updates/db_world/2025_09_04_01.sql b/data/sql/archive/db_world/2025_09_04_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_04_01.sql rename to data/sql/archive/db_world/2025_09_04_01.sql diff --git a/data/sql/updates/db_world/2025_09_04_02.sql b/data/sql/archive/db_world/2025_09_04_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_04_02.sql rename to data/sql/archive/db_world/2025_09_04_02.sql diff --git a/data/sql/updates/db_world/2025_09_04_03.sql b/data/sql/archive/db_world/2025_09_04_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_04_03.sql rename to data/sql/archive/db_world/2025_09_04_03.sql diff --git a/data/sql/updates/db_world/2025_09_05_00.sql b/data/sql/archive/db_world/2025_09_05_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_05_00.sql rename to data/sql/archive/db_world/2025_09_05_00.sql diff --git a/data/sql/updates/db_world/2025_09_05_01.sql b/data/sql/archive/db_world/2025_09_05_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_05_01.sql rename to data/sql/archive/db_world/2025_09_05_01.sql diff --git a/data/sql/updates/db_world/2025_09_06_00.sql b/data/sql/archive/db_world/2025_09_06_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_06_00.sql rename to data/sql/archive/db_world/2025_09_06_00.sql diff --git a/data/sql/updates/db_world/2025_09_06_01.sql b/data/sql/archive/db_world/2025_09_06_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_06_01.sql rename to data/sql/archive/db_world/2025_09_06_01.sql diff --git a/data/sql/updates/db_world/2025_09_06_02.sql b/data/sql/archive/db_world/2025_09_06_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_06_02.sql rename to data/sql/archive/db_world/2025_09_06_02.sql diff --git a/data/sql/updates/db_world/2025_09_06_03.sql b/data/sql/archive/db_world/2025_09_06_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_06_03.sql rename to data/sql/archive/db_world/2025_09_06_03.sql diff --git a/data/sql/updates/db_world/2025_09_06_04.sql b/data/sql/archive/db_world/2025_09_06_04.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_06_04.sql rename to data/sql/archive/db_world/2025_09_06_04.sql diff --git a/data/sql/updates/db_world/2025_09_06_05.sql b/data/sql/archive/db_world/2025_09_06_05.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_06_05.sql rename to data/sql/archive/db_world/2025_09_06_05.sql diff --git a/data/sql/updates/db_world/2025_09_07_00.sql b/data/sql/archive/db_world/2025_09_07_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_07_00.sql rename to data/sql/archive/db_world/2025_09_07_00.sql diff --git a/data/sql/updates/db_world/2025_09_09_00.sql b/data/sql/archive/db_world/2025_09_09_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_09_00.sql rename to data/sql/archive/db_world/2025_09_09_00.sql diff --git a/data/sql/updates/db_world/2025_09_09_01.sql b/data/sql/archive/db_world/2025_09_09_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_09_01.sql rename to data/sql/archive/db_world/2025_09_09_01.sql diff --git a/data/sql/updates/db_world/2025_09_09_02.sql b/data/sql/archive/db_world/2025_09_09_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_09_02.sql rename to data/sql/archive/db_world/2025_09_09_02.sql diff --git a/data/sql/updates/db_world/2025_09_09_03.sql b/data/sql/archive/db_world/2025_09_09_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_09_03.sql rename to data/sql/archive/db_world/2025_09_09_03.sql diff --git a/data/sql/updates/db_world/2025_09_09_04.sql b/data/sql/archive/db_world/2025_09_09_04.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_09_04.sql rename to data/sql/archive/db_world/2025_09_09_04.sql diff --git a/data/sql/updates/db_world/2025_09_09_05.sql b/data/sql/archive/db_world/2025_09_09_05.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_09_05.sql rename to data/sql/archive/db_world/2025_09_09_05.sql diff --git a/data/sql/updates/db_world/2025_09_10_00.sql b/data/sql/archive/db_world/2025_09_10_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_10_00.sql rename to data/sql/archive/db_world/2025_09_10_00.sql diff --git a/data/sql/updates/db_world/2025_09_10_01.sql b/data/sql/archive/db_world/2025_09_10_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_10_01.sql rename to data/sql/archive/db_world/2025_09_10_01.sql diff --git a/data/sql/updates/db_world/2025_09_10_02.sql b/data/sql/archive/db_world/2025_09_10_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_10_02.sql rename to data/sql/archive/db_world/2025_09_10_02.sql diff --git a/data/sql/updates/db_world/2025_09_11_00.sql b/data/sql/archive/db_world/2025_09_11_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_11_00.sql rename to data/sql/archive/db_world/2025_09_11_00.sql diff --git a/data/sql/updates/db_world/2025_09_11_01.sql b/data/sql/archive/db_world/2025_09_11_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_11_01.sql rename to data/sql/archive/db_world/2025_09_11_01.sql diff --git a/data/sql/updates/db_world/2025_09_11_02.sql b/data/sql/archive/db_world/2025_09_11_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_11_02.sql rename to data/sql/archive/db_world/2025_09_11_02.sql diff --git a/data/sql/updates/db_world/2025_09_11_03.sql b/data/sql/archive/db_world/2025_09_11_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_11_03.sql rename to data/sql/archive/db_world/2025_09_11_03.sql diff --git a/data/sql/updates/db_world/2025_09_12_00.sql b/data/sql/archive/db_world/2025_09_12_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_12_00.sql rename to data/sql/archive/db_world/2025_09_12_00.sql diff --git a/data/sql/updates/db_world/2025_09_12_01.sql b/data/sql/archive/db_world/2025_09_12_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_12_01.sql rename to data/sql/archive/db_world/2025_09_12_01.sql diff --git a/data/sql/updates/db_world/2025_09_12_02.sql b/data/sql/archive/db_world/2025_09_12_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_12_02.sql rename to data/sql/archive/db_world/2025_09_12_02.sql diff --git a/data/sql/updates/db_world/2025_09_12_03.sql b/data/sql/archive/db_world/2025_09_12_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_12_03.sql rename to data/sql/archive/db_world/2025_09_12_03.sql diff --git a/data/sql/updates/db_world/2025_09_12_04.sql b/data/sql/archive/db_world/2025_09_12_04.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_12_04.sql rename to data/sql/archive/db_world/2025_09_12_04.sql diff --git a/data/sql/updates/db_world/2025_09_12_05.sql b/data/sql/archive/db_world/2025_09_12_05.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_12_05.sql rename to data/sql/archive/db_world/2025_09_12_05.sql diff --git a/data/sql/updates/db_world/2025_09_13_00.sql b/data/sql/archive/db_world/2025_09_13_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_13_00.sql rename to data/sql/archive/db_world/2025_09_13_00.sql diff --git a/data/sql/updates/db_world/2025_09_13_01.sql b/data/sql/archive/db_world/2025_09_13_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_13_01.sql rename to data/sql/archive/db_world/2025_09_13_01.sql diff --git a/data/sql/updates/db_world/2025_09_13_02.sql b/data/sql/archive/db_world/2025_09_13_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_13_02.sql rename to data/sql/archive/db_world/2025_09_13_02.sql diff --git a/data/sql/updates/db_world/2025_09_13_03.sql b/data/sql/archive/db_world/2025_09_13_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_13_03.sql rename to data/sql/archive/db_world/2025_09_13_03.sql diff --git a/data/sql/updates/db_world/2025_09_14_00.sql b/data/sql/archive/db_world/2025_09_14_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_14_00.sql rename to data/sql/archive/db_world/2025_09_14_00.sql diff --git a/data/sql/updates/db_world/2025_09_14_01.sql b/data/sql/archive/db_world/2025_09_14_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_14_01.sql rename to data/sql/archive/db_world/2025_09_14_01.sql diff --git a/data/sql/updates/db_world/2025_09_14_02.sql b/data/sql/archive/db_world/2025_09_14_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_14_02.sql rename to data/sql/archive/db_world/2025_09_14_02.sql diff --git a/data/sql/updates/db_world/2025_09_15_00.sql b/data/sql/archive/db_world/2025_09_15_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_15_00.sql rename to data/sql/archive/db_world/2025_09_15_00.sql diff --git a/data/sql/updates/db_world/2025_09_15_01.sql b/data/sql/archive/db_world/2025_09_15_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_15_01.sql rename to data/sql/archive/db_world/2025_09_15_01.sql diff --git a/data/sql/updates/db_world/2025_09_15_02.sql b/data/sql/archive/db_world/2025_09_15_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_15_02.sql rename to data/sql/archive/db_world/2025_09_15_02.sql diff --git a/data/sql/updates/db_world/2025_09_15_03.sql b/data/sql/archive/db_world/2025_09_15_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_15_03.sql rename to data/sql/archive/db_world/2025_09_15_03.sql diff --git a/data/sql/updates/db_world/2025_09_16_00.sql b/data/sql/archive/db_world/2025_09_16_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_16_00.sql rename to data/sql/archive/db_world/2025_09_16_00.sql diff --git a/data/sql/updates/db_world/2025_09_16_01.sql b/data/sql/archive/db_world/2025_09_16_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_16_01.sql rename to data/sql/archive/db_world/2025_09_16_01.sql diff --git a/data/sql/updates/db_world/2025_09_16_02.sql b/data/sql/archive/db_world/2025_09_16_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_16_02.sql rename to data/sql/archive/db_world/2025_09_16_02.sql diff --git a/data/sql/updates/db_world/2025_09_16_03.sql b/data/sql/archive/db_world/2025_09_16_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_16_03.sql rename to data/sql/archive/db_world/2025_09_16_03.sql diff --git a/data/sql/updates/db_world/2025_09_16_04.sql b/data/sql/archive/db_world/2025_09_16_04.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_16_04.sql rename to data/sql/archive/db_world/2025_09_16_04.sql diff --git a/data/sql/updates/db_world/2025_09_16_05.sql b/data/sql/archive/db_world/2025_09_16_05.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_16_05.sql rename to data/sql/archive/db_world/2025_09_16_05.sql diff --git a/data/sql/updates/db_world/2025_09_16_06.sql b/data/sql/archive/db_world/2025_09_16_06.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_16_06.sql rename to data/sql/archive/db_world/2025_09_16_06.sql diff --git a/data/sql/updates/db_world/2025_09_17_00.sql b/data/sql/archive/db_world/2025_09_17_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_17_00.sql rename to data/sql/archive/db_world/2025_09_17_00.sql diff --git a/data/sql/updates/db_world/2025_09_19_00.sql b/data/sql/archive/db_world/2025_09_19_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_19_00.sql rename to data/sql/archive/db_world/2025_09_19_00.sql diff --git a/data/sql/updates/db_world/2025_09_19_01.sql b/data/sql/archive/db_world/2025_09_19_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_19_01.sql rename to data/sql/archive/db_world/2025_09_19_01.sql diff --git a/data/sql/updates/db_world/2025_09_19_02.sql b/data/sql/archive/db_world/2025_09_19_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_19_02.sql rename to data/sql/archive/db_world/2025_09_19_02.sql diff --git a/data/sql/updates/db_world/2025_09_19_03.sql b/data/sql/archive/db_world/2025_09_19_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_19_03.sql rename to data/sql/archive/db_world/2025_09_19_03.sql diff --git a/data/sql/updates/db_world/2025_09_19_04.sql b/data/sql/archive/db_world/2025_09_19_04.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_19_04.sql rename to data/sql/archive/db_world/2025_09_19_04.sql diff --git a/data/sql/updates/db_world/2025_09_19_05.sql b/data/sql/archive/db_world/2025_09_19_05.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_19_05.sql rename to data/sql/archive/db_world/2025_09_19_05.sql diff --git a/data/sql/updates/db_world/2025_09_19_06.sql b/data/sql/archive/db_world/2025_09_19_06.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_19_06.sql rename to data/sql/archive/db_world/2025_09_19_06.sql diff --git a/data/sql/updates/db_world/2025_09_20_00.sql b/data/sql/archive/db_world/2025_09_20_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_20_00.sql rename to data/sql/archive/db_world/2025_09_20_00.sql diff --git a/data/sql/updates/db_world/2025_09_20_01.sql b/data/sql/archive/db_world/2025_09_20_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_20_01.sql rename to data/sql/archive/db_world/2025_09_20_01.sql diff --git a/data/sql/updates/db_world/2025_09_20_02.sql b/data/sql/archive/db_world/2025_09_20_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_20_02.sql rename to data/sql/archive/db_world/2025_09_20_02.sql diff --git a/data/sql/updates/db_world/2025_09_20_03.sql b/data/sql/archive/db_world/2025_09_20_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_20_03.sql rename to data/sql/archive/db_world/2025_09_20_03.sql diff --git a/data/sql/updates/db_world/2025_09_20_04.sql b/data/sql/archive/db_world/2025_09_20_04.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_20_04.sql rename to data/sql/archive/db_world/2025_09_20_04.sql diff --git a/data/sql/updates/db_world/2025_09_20_05.sql b/data/sql/archive/db_world/2025_09_20_05.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_20_05.sql rename to data/sql/archive/db_world/2025_09_20_05.sql diff --git a/data/sql/updates/db_world/2025_09_20_06.sql b/data/sql/archive/db_world/2025_09_20_06.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_20_06.sql rename to data/sql/archive/db_world/2025_09_20_06.sql diff --git a/data/sql/updates/db_world/2025_09_22_00.sql b/data/sql/archive/db_world/2025_09_22_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_22_00.sql rename to data/sql/archive/db_world/2025_09_22_00.sql diff --git a/data/sql/updates/db_world/2025_09_22_01.sql b/data/sql/archive/db_world/2025_09_22_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_22_01.sql rename to data/sql/archive/db_world/2025_09_22_01.sql diff --git a/data/sql/updates/db_world/2025_09_22_02.sql b/data/sql/archive/db_world/2025_09_22_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_22_02.sql rename to data/sql/archive/db_world/2025_09_22_02.sql diff --git a/data/sql/updates/db_world/2025_09_22_03.sql b/data/sql/archive/db_world/2025_09_22_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_22_03.sql rename to data/sql/archive/db_world/2025_09_22_03.sql diff --git a/data/sql/updates/db_world/2025_09_23_00.sql b/data/sql/archive/db_world/2025_09_23_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_23_00.sql rename to data/sql/archive/db_world/2025_09_23_00.sql diff --git a/data/sql/updates/db_world/2025_09_23_01.sql b/data/sql/archive/db_world/2025_09_23_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_23_01.sql rename to data/sql/archive/db_world/2025_09_23_01.sql diff --git a/data/sql/updates/db_world/2025_09_23_02.sql b/data/sql/archive/db_world/2025_09_23_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_23_02.sql rename to data/sql/archive/db_world/2025_09_23_02.sql diff --git a/data/sql/updates/db_world/2025_09_23_03.sql b/data/sql/archive/db_world/2025_09_23_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_23_03.sql rename to data/sql/archive/db_world/2025_09_23_03.sql diff --git a/data/sql/updates/db_world/2025_09_26_00.sql b/data/sql/archive/db_world/2025_09_26_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_26_00.sql rename to data/sql/archive/db_world/2025_09_26_00.sql diff --git a/data/sql/updates/db_world/2025_09_26_01.sql b/data/sql/archive/db_world/2025_09_26_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_26_01.sql rename to data/sql/archive/db_world/2025_09_26_01.sql diff --git a/data/sql/updates/db_world/2025_09_27_00.sql b/data/sql/archive/db_world/2025_09_27_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_27_00.sql rename to data/sql/archive/db_world/2025_09_27_00.sql diff --git a/data/sql/updates/db_world/2025_09_27_01.sql b/data/sql/archive/db_world/2025_09_27_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_27_01.sql rename to data/sql/archive/db_world/2025_09_27_01.sql diff --git a/data/sql/updates/db_world/2025_09_27_02.sql b/data/sql/archive/db_world/2025_09_27_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_27_02.sql rename to data/sql/archive/db_world/2025_09_27_02.sql diff --git a/data/sql/updates/db_world/2025_09_27_03.sql b/data/sql/archive/db_world/2025_09_27_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_27_03.sql rename to data/sql/archive/db_world/2025_09_27_03.sql diff --git a/data/sql/updates/db_world/2025_09_28_00.sql b/data/sql/archive/db_world/2025_09_28_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_28_00.sql rename to data/sql/archive/db_world/2025_09_28_00.sql diff --git a/data/sql/updates/db_world/2025_09_28_01.sql b/data/sql/archive/db_world/2025_09_28_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_28_01.sql rename to data/sql/archive/db_world/2025_09_28_01.sql diff --git a/data/sql/updates/db_world/2025_09_29_00.sql b/data/sql/archive/db_world/2025_09_29_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_29_00.sql rename to data/sql/archive/db_world/2025_09_29_00.sql diff --git a/data/sql/updates/db_world/2025_09_30_00.sql b/data/sql/archive/db_world/2025_09_30_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_30_00.sql rename to data/sql/archive/db_world/2025_09_30_00.sql diff --git a/data/sql/updates/db_world/2025_09_30_01.sql b/data/sql/archive/db_world/2025_09_30_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_30_01.sql rename to data/sql/archive/db_world/2025_09_30_01.sql diff --git a/data/sql/updates/db_world/2025_09_30_02.sql b/data/sql/archive/db_world/2025_09_30_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_09_30_02.sql rename to data/sql/archive/db_world/2025_09_30_02.sql diff --git a/data/sql/updates/db_world/2025_10_01_00.sql b/data/sql/archive/db_world/2025_10_01_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_01_00.sql rename to data/sql/archive/db_world/2025_10_01_00.sql diff --git a/data/sql/updates/db_world/2025_10_01_01.sql b/data/sql/archive/db_world/2025_10_01_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_01_01.sql rename to data/sql/archive/db_world/2025_10_01_01.sql diff --git a/data/sql/updates/db_world/2025_10_01_02.sql b/data/sql/archive/db_world/2025_10_01_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_01_02.sql rename to data/sql/archive/db_world/2025_10_01_02.sql diff --git a/data/sql/updates/db_world/2025_10_02_00.sql b/data/sql/archive/db_world/2025_10_02_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_02_00.sql rename to data/sql/archive/db_world/2025_10_02_00.sql diff --git a/data/sql/updates/db_world/2025_10_02_01.sql b/data/sql/archive/db_world/2025_10_02_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_02_01.sql rename to data/sql/archive/db_world/2025_10_02_01.sql diff --git a/data/sql/updates/db_world/2025_10_04_00.sql b/data/sql/archive/db_world/2025_10_04_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_04_00.sql rename to data/sql/archive/db_world/2025_10_04_00.sql diff --git a/data/sql/updates/db_world/2025_10_04_01.sql b/data/sql/archive/db_world/2025_10_04_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_04_01.sql rename to data/sql/archive/db_world/2025_10_04_01.sql diff --git a/data/sql/updates/db_world/2025_10_04_02.sql b/data/sql/archive/db_world/2025_10_04_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_04_02.sql rename to data/sql/archive/db_world/2025_10_04_02.sql diff --git a/data/sql/updates/db_world/2025_10_04_03.sql b/data/sql/archive/db_world/2025_10_04_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_04_03.sql rename to data/sql/archive/db_world/2025_10_04_03.sql diff --git a/data/sql/updates/db_world/2025_10_04_04.sql b/data/sql/archive/db_world/2025_10_04_04.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_04_04.sql rename to data/sql/archive/db_world/2025_10_04_04.sql diff --git a/data/sql/updates/db_world/2025_10_04_05.sql b/data/sql/archive/db_world/2025_10_04_05.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_04_05.sql rename to data/sql/archive/db_world/2025_10_04_05.sql diff --git a/data/sql/updates/db_world/2025_10_04_06.sql b/data/sql/archive/db_world/2025_10_04_06.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_04_06.sql rename to data/sql/archive/db_world/2025_10_04_06.sql diff --git a/data/sql/updates/db_world/2025_10_06_00.sql b/data/sql/archive/db_world/2025_10_06_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_06_00.sql rename to data/sql/archive/db_world/2025_10_06_00.sql diff --git a/data/sql/updates/db_world/2025_10_07_00.sql b/data/sql/archive/db_world/2025_10_07_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_07_00.sql rename to data/sql/archive/db_world/2025_10_07_00.sql diff --git a/data/sql/updates/db_world/2025_10_07_01.sql b/data/sql/archive/db_world/2025_10_07_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_07_01.sql rename to data/sql/archive/db_world/2025_10_07_01.sql diff --git a/data/sql/updates/db_world/2025_10_09_00.sql b/data/sql/archive/db_world/2025_10_09_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_09_00.sql rename to data/sql/archive/db_world/2025_10_09_00.sql diff --git a/data/sql/updates/db_world/2025_10_09_01.sql b/data/sql/archive/db_world/2025_10_09_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_09_01.sql rename to data/sql/archive/db_world/2025_10_09_01.sql diff --git a/data/sql/updates/db_world/2025_10_09_02.sql b/data/sql/archive/db_world/2025_10_09_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_09_02.sql rename to data/sql/archive/db_world/2025_10_09_02.sql diff --git a/data/sql/updates/db_world/2025_10_09_03.sql b/data/sql/archive/db_world/2025_10_09_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_09_03.sql rename to data/sql/archive/db_world/2025_10_09_03.sql diff --git a/data/sql/updates/db_world/2025_10_09_04.sql b/data/sql/archive/db_world/2025_10_09_04.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_09_04.sql rename to data/sql/archive/db_world/2025_10_09_04.sql diff --git a/data/sql/updates/db_world/2025_10_10_00.sql b/data/sql/archive/db_world/2025_10_10_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_10_00.sql rename to data/sql/archive/db_world/2025_10_10_00.sql diff --git a/data/sql/updates/db_world/2025_10_10_01.sql b/data/sql/archive/db_world/2025_10_10_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_10_01.sql rename to data/sql/archive/db_world/2025_10_10_01.sql diff --git a/data/sql/updates/db_world/2025_10_11_00.sql b/data/sql/archive/db_world/2025_10_11_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_11_00.sql rename to data/sql/archive/db_world/2025_10_11_00.sql diff --git a/data/sql/updates/db_world/2025_10_11_01.sql b/data/sql/archive/db_world/2025_10_11_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_11_01.sql rename to data/sql/archive/db_world/2025_10_11_01.sql diff --git a/data/sql/updates/db_world/2025_10_11_02.sql b/data/sql/archive/db_world/2025_10_11_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_11_02.sql rename to data/sql/archive/db_world/2025_10_11_02.sql diff --git a/data/sql/updates/db_world/2025_10_11_03.sql b/data/sql/archive/db_world/2025_10_11_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_11_03.sql rename to data/sql/archive/db_world/2025_10_11_03.sql diff --git a/data/sql/updates/db_world/2025_10_11_04.sql b/data/sql/archive/db_world/2025_10_11_04.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_11_04.sql rename to data/sql/archive/db_world/2025_10_11_04.sql diff --git a/data/sql/updates/db_world/2025_10_11_05.sql b/data/sql/archive/db_world/2025_10_11_05.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_11_05.sql rename to data/sql/archive/db_world/2025_10_11_05.sql diff --git a/data/sql/updates/db_world/2025_10_11_06.sql b/data/sql/archive/db_world/2025_10_11_06.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_11_06.sql rename to data/sql/archive/db_world/2025_10_11_06.sql diff --git a/data/sql/updates/db_world/2025_10_12_00.sql b/data/sql/archive/db_world/2025_10_12_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_12_00.sql rename to data/sql/archive/db_world/2025_10_12_00.sql diff --git a/data/sql/updates/db_world/2025_10_12_01.sql b/data/sql/archive/db_world/2025_10_12_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_12_01.sql rename to data/sql/archive/db_world/2025_10_12_01.sql diff --git a/data/sql/updates/db_world/2025_10_12_02.sql b/data/sql/archive/db_world/2025_10_12_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_12_02.sql rename to data/sql/archive/db_world/2025_10_12_02.sql diff --git a/data/sql/updates/db_world/2025_10_12_03.sql b/data/sql/archive/db_world/2025_10_12_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_12_03.sql rename to data/sql/archive/db_world/2025_10_12_03.sql diff --git a/data/sql/updates/db_world/2025_10_12_04.sql b/data/sql/archive/db_world/2025_10_12_04.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_12_04.sql rename to data/sql/archive/db_world/2025_10_12_04.sql diff --git a/data/sql/updates/db_world/2025_10_12_05.sql b/data/sql/archive/db_world/2025_10_12_05.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_12_05.sql rename to data/sql/archive/db_world/2025_10_12_05.sql diff --git a/data/sql/updates/db_world/2025_10_12_06.sql b/data/sql/archive/db_world/2025_10_12_06.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_12_06.sql rename to data/sql/archive/db_world/2025_10_12_06.sql diff --git a/data/sql/updates/db_world/2025_10_14_00.sql b/data/sql/archive/db_world/2025_10_14_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_14_00.sql rename to data/sql/archive/db_world/2025_10_14_00.sql diff --git a/data/sql/updates/db_world/2025_10_16_00.sql b/data/sql/archive/db_world/2025_10_16_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_16_00.sql rename to data/sql/archive/db_world/2025_10_16_00.sql diff --git a/data/sql/updates/db_world/2025_10_16_01.sql b/data/sql/archive/db_world/2025_10_16_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_16_01.sql rename to data/sql/archive/db_world/2025_10_16_01.sql diff --git a/data/sql/updates/db_world/2025_10_16_02.sql b/data/sql/archive/db_world/2025_10_16_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_16_02.sql rename to data/sql/archive/db_world/2025_10_16_02.sql diff --git a/data/sql/updates/db_world/2025_10_16_03.sql b/data/sql/archive/db_world/2025_10_16_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_16_03.sql rename to data/sql/archive/db_world/2025_10_16_03.sql diff --git a/data/sql/updates/db_world/2025_10_16_04.sql b/data/sql/archive/db_world/2025_10_16_04.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_16_04.sql rename to data/sql/archive/db_world/2025_10_16_04.sql diff --git a/data/sql/updates/db_world/2025_10_16_05.sql b/data/sql/archive/db_world/2025_10_16_05.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_16_05.sql rename to data/sql/archive/db_world/2025_10_16_05.sql diff --git a/data/sql/updates/db_world/2025_10_17_00.sql b/data/sql/archive/db_world/2025_10_17_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_17_00.sql rename to data/sql/archive/db_world/2025_10_17_00.sql diff --git a/data/sql/updates/db_world/2025_10_18_00.sql b/data/sql/archive/db_world/2025_10_18_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_18_00.sql rename to data/sql/archive/db_world/2025_10_18_00.sql diff --git a/data/sql/updates/db_world/2025_10_18_01.sql b/data/sql/archive/db_world/2025_10_18_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_18_01.sql rename to data/sql/archive/db_world/2025_10_18_01.sql diff --git a/data/sql/updates/db_world/2025_10_18_02.sql b/data/sql/archive/db_world/2025_10_18_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_18_02.sql rename to data/sql/archive/db_world/2025_10_18_02.sql diff --git a/data/sql/updates/db_world/2025_10_19_00.sql b/data/sql/archive/db_world/2025_10_19_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_19_00.sql rename to data/sql/archive/db_world/2025_10_19_00.sql diff --git a/data/sql/updates/db_world/2025_10_21_00.sql b/data/sql/archive/db_world/2025_10_21_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_21_00.sql rename to data/sql/archive/db_world/2025_10_21_00.sql diff --git a/data/sql/updates/db_world/2025_10_24_00.sql b/data/sql/archive/db_world/2025_10_24_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_24_00.sql rename to data/sql/archive/db_world/2025_10_24_00.sql diff --git a/data/sql/updates/db_world/2025_10_24_01.sql b/data/sql/archive/db_world/2025_10_24_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_24_01.sql rename to data/sql/archive/db_world/2025_10_24_01.sql diff --git a/data/sql/updates/db_world/2025_10_24_02.sql b/data/sql/archive/db_world/2025_10_24_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_24_02.sql rename to data/sql/archive/db_world/2025_10_24_02.sql diff --git a/data/sql/updates/db_world/2025_10_24_03.sql b/data/sql/archive/db_world/2025_10_24_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_24_03.sql rename to data/sql/archive/db_world/2025_10_24_03.sql diff --git a/data/sql/updates/db_world/2025_10_24_04.sql b/data/sql/archive/db_world/2025_10_24_04.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_24_04.sql rename to data/sql/archive/db_world/2025_10_24_04.sql diff --git a/data/sql/updates/db_world/2025_10_24_05.sql b/data/sql/archive/db_world/2025_10_24_05.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_24_05.sql rename to data/sql/archive/db_world/2025_10_24_05.sql diff --git a/data/sql/updates/db_world/2025_10_25_00.sql b/data/sql/archive/db_world/2025_10_25_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_25_00.sql rename to data/sql/archive/db_world/2025_10_25_00.sql diff --git a/data/sql/updates/db_world/2025_10_25_01.sql b/data/sql/archive/db_world/2025_10_25_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_25_01.sql rename to data/sql/archive/db_world/2025_10_25_01.sql diff --git a/data/sql/updates/db_world/2025_10_26_00.sql b/data/sql/archive/db_world/2025_10_26_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_26_00.sql rename to data/sql/archive/db_world/2025_10_26_00.sql diff --git a/data/sql/updates/db_world/2025_10_26_01.sql b/data/sql/archive/db_world/2025_10_26_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_26_01.sql rename to data/sql/archive/db_world/2025_10_26_01.sql diff --git a/data/sql/updates/db_world/2025_10_26_02.sql b/data/sql/archive/db_world/2025_10_26_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_26_02.sql rename to data/sql/archive/db_world/2025_10_26_02.sql diff --git a/data/sql/updates/db_world/2025_10_26_03.sql b/data/sql/archive/db_world/2025_10_26_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_26_03.sql rename to data/sql/archive/db_world/2025_10_26_03.sql diff --git a/data/sql/updates/db_world/2025_10_28_00.sql b/data/sql/archive/db_world/2025_10_28_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_28_00.sql rename to data/sql/archive/db_world/2025_10_28_00.sql diff --git a/data/sql/updates/db_world/2025_10_28_01.sql b/data/sql/archive/db_world/2025_10_28_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_28_01.sql rename to data/sql/archive/db_world/2025_10_28_01.sql diff --git a/data/sql/updates/db_world/2025_10_28_02.sql b/data/sql/archive/db_world/2025_10_28_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_28_02.sql rename to data/sql/archive/db_world/2025_10_28_02.sql diff --git a/data/sql/updates/db_world/2025_10_28_03.sql b/data/sql/archive/db_world/2025_10_28_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_28_03.sql rename to data/sql/archive/db_world/2025_10_28_03.sql diff --git a/data/sql/updates/db_world/2025_10_28_04.sql b/data/sql/archive/db_world/2025_10_28_04.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_28_04.sql rename to data/sql/archive/db_world/2025_10_28_04.sql diff --git a/data/sql/updates/db_world/2025_10_28_05.sql b/data/sql/archive/db_world/2025_10_28_05.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_28_05.sql rename to data/sql/archive/db_world/2025_10_28_05.sql diff --git a/data/sql/updates/db_world/2025_10_29_00.sql b/data/sql/archive/db_world/2025_10_29_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_29_00.sql rename to data/sql/archive/db_world/2025_10_29_00.sql diff --git a/data/sql/updates/db_world/2025_10_29_01.sql b/data/sql/archive/db_world/2025_10_29_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_29_01.sql rename to data/sql/archive/db_world/2025_10_29_01.sql diff --git a/data/sql/updates/db_world/2025_10_29_02.sql b/data/sql/archive/db_world/2025_10_29_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_29_02.sql rename to data/sql/archive/db_world/2025_10_29_02.sql diff --git a/data/sql/updates/db_world/2025_10_30_00.sql b/data/sql/archive/db_world/2025_10_30_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_30_00.sql rename to data/sql/archive/db_world/2025_10_30_00.sql diff --git a/data/sql/updates/db_world/2025_10_30_01.sql b/data/sql/archive/db_world/2025_10_30_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_30_01.sql rename to data/sql/archive/db_world/2025_10_30_01.sql diff --git a/data/sql/updates/db_world/2025_10_31_00.sql b/data/sql/archive/db_world/2025_10_31_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_31_00.sql rename to data/sql/archive/db_world/2025_10_31_00.sql diff --git a/data/sql/updates/db_world/2025_10_31_01.sql b/data/sql/archive/db_world/2025_10_31_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_31_01.sql rename to data/sql/archive/db_world/2025_10_31_01.sql diff --git a/data/sql/updates/db_world/2025_10_31_02.sql b/data/sql/archive/db_world/2025_10_31_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_10_31_02.sql rename to data/sql/archive/db_world/2025_10_31_02.sql diff --git a/data/sql/updates/db_world/2025_11_01_00.sql b/data/sql/archive/db_world/2025_11_01_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_01_00.sql rename to data/sql/archive/db_world/2025_11_01_00.sql diff --git a/data/sql/updates/db_world/2025_11_01_01.sql b/data/sql/archive/db_world/2025_11_01_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_01_01.sql rename to data/sql/archive/db_world/2025_11_01_01.sql diff --git a/data/sql/updates/db_world/2025_11_01_02.sql b/data/sql/archive/db_world/2025_11_01_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_01_02.sql rename to data/sql/archive/db_world/2025_11_01_02.sql diff --git a/data/sql/updates/db_world/2025_11_01_03.sql b/data/sql/archive/db_world/2025_11_01_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_01_03.sql rename to data/sql/archive/db_world/2025_11_01_03.sql diff --git a/data/sql/updates/db_world/2025_11_03_00.sql b/data/sql/archive/db_world/2025_11_03_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_03_00.sql rename to data/sql/archive/db_world/2025_11_03_00.sql diff --git a/data/sql/updates/db_world/2025_11_03_01.sql b/data/sql/archive/db_world/2025_11_03_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_03_01.sql rename to data/sql/archive/db_world/2025_11_03_01.sql diff --git a/data/sql/updates/db_world/2025_11_04_00.sql b/data/sql/archive/db_world/2025_11_04_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_04_00.sql rename to data/sql/archive/db_world/2025_11_04_00.sql diff --git a/data/sql/updates/db_world/2025_11_04_01.sql b/data/sql/archive/db_world/2025_11_04_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_04_01.sql rename to data/sql/archive/db_world/2025_11_04_01.sql diff --git a/data/sql/updates/db_world/2025_11_05_00.sql b/data/sql/archive/db_world/2025_11_05_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_05_00.sql rename to data/sql/archive/db_world/2025_11_05_00.sql diff --git a/data/sql/updates/db_world/2025_11_06_00.sql b/data/sql/archive/db_world/2025_11_06_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_06_00.sql rename to data/sql/archive/db_world/2025_11_06_00.sql diff --git a/data/sql/updates/db_world/2025_11_06_01.sql b/data/sql/archive/db_world/2025_11_06_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_06_01.sql rename to data/sql/archive/db_world/2025_11_06_01.sql diff --git a/data/sql/updates/db_world/2025_11_07_00.sql b/data/sql/archive/db_world/2025_11_07_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_07_00.sql rename to data/sql/archive/db_world/2025_11_07_00.sql diff --git a/data/sql/updates/db_world/2025_11_07_01.sql b/data/sql/archive/db_world/2025_11_07_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_07_01.sql rename to data/sql/archive/db_world/2025_11_07_01.sql diff --git a/data/sql/updates/db_world/2025_11_07_02.sql b/data/sql/archive/db_world/2025_11_07_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_07_02.sql rename to data/sql/archive/db_world/2025_11_07_02.sql diff --git a/data/sql/updates/db_world/2025_11_08_00.sql b/data/sql/archive/db_world/2025_11_08_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_08_00.sql rename to data/sql/archive/db_world/2025_11_08_00.sql diff --git a/data/sql/updates/db_world/2025_11_08_01.sql b/data/sql/archive/db_world/2025_11_08_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_08_01.sql rename to data/sql/archive/db_world/2025_11_08_01.sql diff --git a/data/sql/updates/db_world/2025_11_08_02.sql b/data/sql/archive/db_world/2025_11_08_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_08_02.sql rename to data/sql/archive/db_world/2025_11_08_02.sql diff --git a/data/sql/updates/db_world/2025_11_09_00.sql b/data/sql/archive/db_world/2025_11_09_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_09_00.sql rename to data/sql/archive/db_world/2025_11_09_00.sql diff --git a/data/sql/updates/db_world/2025_11_09_01.sql b/data/sql/archive/db_world/2025_11_09_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_09_01.sql rename to data/sql/archive/db_world/2025_11_09_01.sql diff --git a/data/sql/updates/db_world/2025_11_09_02.sql b/data/sql/archive/db_world/2025_11_09_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_09_02.sql rename to data/sql/archive/db_world/2025_11_09_02.sql diff --git a/data/sql/updates/db_world/2025_11_09_03.sql b/data/sql/archive/db_world/2025_11_09_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_09_03.sql rename to data/sql/archive/db_world/2025_11_09_03.sql diff --git a/data/sql/updates/db_world/2025_11_09_04.sql b/data/sql/archive/db_world/2025_11_09_04.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_09_04.sql rename to data/sql/archive/db_world/2025_11_09_04.sql diff --git a/data/sql/updates/db_world/2025_11_09_05.sql b/data/sql/archive/db_world/2025_11_09_05.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_09_05.sql rename to data/sql/archive/db_world/2025_11_09_05.sql diff --git a/data/sql/updates/db_world/2025_11_10_00.sql b/data/sql/archive/db_world/2025_11_10_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_10_00.sql rename to data/sql/archive/db_world/2025_11_10_00.sql diff --git a/data/sql/updates/db_world/2025_11_10_01.sql b/data/sql/archive/db_world/2025_11_10_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_10_01.sql rename to data/sql/archive/db_world/2025_11_10_01.sql diff --git a/data/sql/updates/db_world/2025_11_10_02.sql b/data/sql/archive/db_world/2025_11_10_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_10_02.sql rename to data/sql/archive/db_world/2025_11_10_02.sql diff --git a/data/sql/updates/db_world/2025_11_10_03.sql b/data/sql/archive/db_world/2025_11_10_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_10_03.sql rename to data/sql/archive/db_world/2025_11_10_03.sql diff --git a/data/sql/updates/db_world/2025_11_11_00.sql b/data/sql/archive/db_world/2025_11_11_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_11_00.sql rename to data/sql/archive/db_world/2025_11_11_00.sql diff --git a/data/sql/updates/db_world/2025_11_11_01.sql b/data/sql/archive/db_world/2025_11_11_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_11_01.sql rename to data/sql/archive/db_world/2025_11_11_01.sql diff --git a/data/sql/updates/db_world/2025_11_11_02.sql b/data/sql/archive/db_world/2025_11_11_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_11_02.sql rename to data/sql/archive/db_world/2025_11_11_02.sql diff --git a/data/sql/updates/db_world/2025_11_11_03.sql b/data/sql/archive/db_world/2025_11_11_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_11_03.sql rename to data/sql/archive/db_world/2025_11_11_03.sql diff --git a/data/sql/updates/db_world/2025_11_12_00.sql b/data/sql/archive/db_world/2025_11_12_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_12_00.sql rename to data/sql/archive/db_world/2025_11_12_00.sql diff --git a/data/sql/updates/db_world/2025_11_12_01.sql b/data/sql/archive/db_world/2025_11_12_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_12_01.sql rename to data/sql/archive/db_world/2025_11_12_01.sql diff --git a/data/sql/updates/db_world/2025_11_12_02.sql b/data/sql/archive/db_world/2025_11_12_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_12_02.sql rename to data/sql/archive/db_world/2025_11_12_02.sql diff --git a/data/sql/updates/db_world/2025_11_12_03.sql b/data/sql/archive/db_world/2025_11_12_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_12_03.sql rename to data/sql/archive/db_world/2025_11_12_03.sql diff --git a/data/sql/updates/db_world/2025_11_12_04.sql b/data/sql/archive/db_world/2025_11_12_04.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_12_04.sql rename to data/sql/archive/db_world/2025_11_12_04.sql diff --git a/data/sql/updates/db_world/2025_11_12_05.sql b/data/sql/archive/db_world/2025_11_12_05.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_12_05.sql rename to data/sql/archive/db_world/2025_11_12_05.sql diff --git a/data/sql/updates/db_world/2025_11_12_06.sql b/data/sql/archive/db_world/2025_11_12_06.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_12_06.sql rename to data/sql/archive/db_world/2025_11_12_06.sql diff --git a/data/sql/updates/db_world/2025_11_13_00.sql b/data/sql/archive/db_world/2025_11_13_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_13_00.sql rename to data/sql/archive/db_world/2025_11_13_00.sql diff --git a/data/sql/updates/db_world/2025_11_13_01.sql b/data/sql/archive/db_world/2025_11_13_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_13_01.sql rename to data/sql/archive/db_world/2025_11_13_01.sql diff --git a/data/sql/updates/db_world/2025_11_13_02.sql b/data/sql/archive/db_world/2025_11_13_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_13_02.sql rename to data/sql/archive/db_world/2025_11_13_02.sql diff --git a/data/sql/updates/db_world/2025_11_13_03.sql b/data/sql/archive/db_world/2025_11_13_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_13_03.sql rename to data/sql/archive/db_world/2025_11_13_03.sql diff --git a/data/sql/updates/db_world/2025_11_13_04.sql b/data/sql/archive/db_world/2025_11_13_04.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_13_04.sql rename to data/sql/archive/db_world/2025_11_13_04.sql diff --git a/data/sql/updates/db_world/2025_11_13_05.sql b/data/sql/archive/db_world/2025_11_13_05.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_13_05.sql rename to data/sql/archive/db_world/2025_11_13_05.sql diff --git a/data/sql/updates/db_world/2025_11_14_00.sql b/data/sql/archive/db_world/2025_11_14_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_14_00.sql rename to data/sql/archive/db_world/2025_11_14_00.sql diff --git a/data/sql/updates/db_world/2025_11_14_01.sql b/data/sql/archive/db_world/2025_11_14_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_14_01.sql rename to data/sql/archive/db_world/2025_11_14_01.sql diff --git a/data/sql/updates/db_world/2025_11_14_02.sql b/data/sql/archive/db_world/2025_11_14_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_14_02.sql rename to data/sql/archive/db_world/2025_11_14_02.sql diff --git a/data/sql/updates/db_world/2025_11_14_03.sql b/data/sql/archive/db_world/2025_11_14_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_14_03.sql rename to data/sql/archive/db_world/2025_11_14_03.sql diff --git a/data/sql/updates/db_world/2025_11_15_00.sql b/data/sql/archive/db_world/2025_11_15_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_15_00.sql rename to data/sql/archive/db_world/2025_11_15_00.sql diff --git a/data/sql/updates/db_world/2025_11_15_01.sql b/data/sql/archive/db_world/2025_11_15_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_15_01.sql rename to data/sql/archive/db_world/2025_11_15_01.sql diff --git a/data/sql/updates/db_world/2025_11_15_02.sql b/data/sql/archive/db_world/2025_11_15_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_15_02.sql rename to data/sql/archive/db_world/2025_11_15_02.sql diff --git a/data/sql/updates/db_world/2025_11_15_03.sql b/data/sql/archive/db_world/2025_11_15_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_15_03.sql rename to data/sql/archive/db_world/2025_11_15_03.sql diff --git a/data/sql/updates/db_world/2025_11_15_04.sql b/data/sql/archive/db_world/2025_11_15_04.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_15_04.sql rename to data/sql/archive/db_world/2025_11_15_04.sql diff --git a/data/sql/updates/db_world/2025_11_15_05.sql b/data/sql/archive/db_world/2025_11_15_05.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_15_05.sql rename to data/sql/archive/db_world/2025_11_15_05.sql diff --git a/data/sql/updates/db_world/2025_11_15_06.sql b/data/sql/archive/db_world/2025_11_15_06.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_15_06.sql rename to data/sql/archive/db_world/2025_11_15_06.sql diff --git a/data/sql/updates/db_world/2025_11_15_07.sql b/data/sql/archive/db_world/2025_11_15_07.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_15_07.sql rename to data/sql/archive/db_world/2025_11_15_07.sql diff --git a/data/sql/updates/db_world/2025_11_15_08.sql b/data/sql/archive/db_world/2025_11_15_08.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_15_08.sql rename to data/sql/archive/db_world/2025_11_15_08.sql diff --git a/data/sql/updates/db_world/2025_11_15_09.sql b/data/sql/archive/db_world/2025_11_15_09.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_15_09.sql rename to data/sql/archive/db_world/2025_11_15_09.sql diff --git a/data/sql/updates/db_world/2025_11_15_10.sql b/data/sql/archive/db_world/2025_11_15_10.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_15_10.sql rename to data/sql/archive/db_world/2025_11_15_10.sql diff --git a/data/sql/updates/db_world/2025_11_15_11.sql b/data/sql/archive/db_world/2025_11_15_11.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_15_11.sql rename to data/sql/archive/db_world/2025_11_15_11.sql diff --git a/data/sql/updates/db_world/2025_11_15_12.sql b/data/sql/archive/db_world/2025_11_15_12.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_15_12.sql rename to data/sql/archive/db_world/2025_11_15_12.sql diff --git a/data/sql/updates/db_world/2025_11_15_13.sql b/data/sql/archive/db_world/2025_11_15_13.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_15_13.sql rename to data/sql/archive/db_world/2025_11_15_13.sql diff --git a/data/sql/updates/db_world/2025_11_15_14.sql b/data/sql/archive/db_world/2025_11_15_14.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_15_14.sql rename to data/sql/archive/db_world/2025_11_15_14.sql diff --git a/data/sql/updates/db_world/2025_11_15_15.sql b/data/sql/archive/db_world/2025_11_15_15.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_15_15.sql rename to data/sql/archive/db_world/2025_11_15_15.sql diff --git a/data/sql/updates/db_world/2025_11_16_00.sql b/data/sql/archive/db_world/2025_11_16_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_16_00.sql rename to data/sql/archive/db_world/2025_11_16_00.sql diff --git a/data/sql/updates/db_world/2025_11_16_01.sql b/data/sql/archive/db_world/2025_11_16_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_16_01.sql rename to data/sql/archive/db_world/2025_11_16_01.sql diff --git a/data/sql/updates/db_world/2025_11_16_02.sql b/data/sql/archive/db_world/2025_11_16_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_16_02.sql rename to data/sql/archive/db_world/2025_11_16_02.sql diff --git a/data/sql/updates/db_world/2025_11_17_00.sql b/data/sql/archive/db_world/2025_11_17_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_17_00.sql rename to data/sql/archive/db_world/2025_11_17_00.sql diff --git a/data/sql/updates/db_world/2025_11_17_01.sql b/data/sql/archive/db_world/2025_11_17_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_17_01.sql rename to data/sql/archive/db_world/2025_11_17_01.sql diff --git a/data/sql/updates/db_world/2025_11_17_02.sql b/data/sql/archive/db_world/2025_11_17_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_17_02.sql rename to data/sql/archive/db_world/2025_11_17_02.sql diff --git a/data/sql/updates/db_world/2025_11_17_03.sql b/data/sql/archive/db_world/2025_11_17_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_17_03.sql rename to data/sql/archive/db_world/2025_11_17_03.sql diff --git a/data/sql/updates/db_world/2025_11_17_04.sql b/data/sql/archive/db_world/2025_11_17_04.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_17_04.sql rename to data/sql/archive/db_world/2025_11_17_04.sql diff --git a/data/sql/updates/db_world/2025_11_18_00.sql b/data/sql/archive/db_world/2025_11_18_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_18_00.sql rename to data/sql/archive/db_world/2025_11_18_00.sql diff --git a/data/sql/updates/db_world/2025_11_18_01.sql b/data/sql/archive/db_world/2025_11_18_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_18_01.sql rename to data/sql/archive/db_world/2025_11_18_01.sql diff --git a/data/sql/updates/db_world/2025_11_18_02.sql b/data/sql/archive/db_world/2025_11_18_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_18_02.sql rename to data/sql/archive/db_world/2025_11_18_02.sql diff --git a/data/sql/updates/db_world/2025_11_20_00.sql b/data/sql/archive/db_world/2025_11_20_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_20_00.sql rename to data/sql/archive/db_world/2025_11_20_00.sql diff --git a/data/sql/updates/db_world/2025_11_20_01.sql b/data/sql/archive/db_world/2025_11_20_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_20_01.sql rename to data/sql/archive/db_world/2025_11_20_01.sql diff --git a/data/sql/updates/db_world/2025_11_20_02.sql b/data/sql/archive/db_world/2025_11_20_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_20_02.sql rename to data/sql/archive/db_world/2025_11_20_02.sql diff --git a/data/sql/updates/db_world/2025_11_20_03.sql b/data/sql/archive/db_world/2025_11_20_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_20_03.sql rename to data/sql/archive/db_world/2025_11_20_03.sql diff --git a/data/sql/updates/db_world/2025_11_20_04.sql b/data/sql/archive/db_world/2025_11_20_04.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_20_04.sql rename to data/sql/archive/db_world/2025_11_20_04.sql diff --git a/data/sql/updates/db_world/2025_11_21_00.sql b/data/sql/archive/db_world/2025_11_21_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_21_00.sql rename to data/sql/archive/db_world/2025_11_21_00.sql diff --git a/data/sql/updates/db_world/2025_11_21_01.sql b/data/sql/archive/db_world/2025_11_21_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_21_01.sql rename to data/sql/archive/db_world/2025_11_21_01.sql diff --git a/data/sql/updates/db_world/2025_11_21_02.sql b/data/sql/archive/db_world/2025_11_21_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_21_02.sql rename to data/sql/archive/db_world/2025_11_21_02.sql diff --git a/data/sql/updates/db_world/2025_11_21_03.sql b/data/sql/archive/db_world/2025_11_21_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_21_03.sql rename to data/sql/archive/db_world/2025_11_21_03.sql diff --git a/data/sql/updates/db_world/2025_11_21_04.sql b/data/sql/archive/db_world/2025_11_21_04.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_21_04.sql rename to data/sql/archive/db_world/2025_11_21_04.sql diff --git a/data/sql/updates/db_world/2025_11_21_05.sql b/data/sql/archive/db_world/2025_11_21_05.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_21_05.sql rename to data/sql/archive/db_world/2025_11_21_05.sql diff --git a/data/sql/updates/db_world/2025_11_21_06.sql b/data/sql/archive/db_world/2025_11_21_06.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_21_06.sql rename to data/sql/archive/db_world/2025_11_21_06.sql diff --git a/data/sql/updates/db_world/2025_11_21_07.sql b/data/sql/archive/db_world/2025_11_21_07.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_21_07.sql rename to data/sql/archive/db_world/2025_11_21_07.sql diff --git a/data/sql/updates/db_world/2025_11_23_00.sql b/data/sql/archive/db_world/2025_11_23_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_23_00.sql rename to data/sql/archive/db_world/2025_11_23_00.sql diff --git a/data/sql/updates/db_world/2025_11_24_00.sql b/data/sql/archive/db_world/2025_11_24_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_24_00.sql rename to data/sql/archive/db_world/2025_11_24_00.sql diff --git a/data/sql/updates/db_world/2025_11_24_01.sql b/data/sql/archive/db_world/2025_11_24_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_24_01.sql rename to data/sql/archive/db_world/2025_11_24_01.sql diff --git a/data/sql/updates/db_world/2025_11_24_02.sql b/data/sql/archive/db_world/2025_11_24_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_24_02.sql rename to data/sql/archive/db_world/2025_11_24_02.sql diff --git a/data/sql/updates/db_world/2025_11_24_03.sql b/data/sql/archive/db_world/2025_11_24_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_24_03.sql rename to data/sql/archive/db_world/2025_11_24_03.sql diff --git a/data/sql/updates/db_world/2025_11_25_00.sql b/data/sql/archive/db_world/2025_11_25_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_25_00.sql rename to data/sql/archive/db_world/2025_11_25_00.sql diff --git a/data/sql/updates/db_world/2025_11_25_01.sql b/data/sql/archive/db_world/2025_11_25_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_25_01.sql rename to data/sql/archive/db_world/2025_11_25_01.sql diff --git a/data/sql/updates/db_world/2025_11_25_02.sql b/data/sql/archive/db_world/2025_11_25_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_25_02.sql rename to data/sql/archive/db_world/2025_11_25_02.sql diff --git a/data/sql/updates/db_world/2025_11_26_00.sql b/data/sql/archive/db_world/2025_11_26_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_26_00.sql rename to data/sql/archive/db_world/2025_11_26_00.sql diff --git a/data/sql/updates/db_world/2025_11_26_01.sql b/data/sql/archive/db_world/2025_11_26_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_26_01.sql rename to data/sql/archive/db_world/2025_11_26_01.sql diff --git a/data/sql/updates/db_world/2025_11_26_02.sql b/data/sql/archive/db_world/2025_11_26_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_26_02.sql rename to data/sql/archive/db_world/2025_11_26_02.sql diff --git a/data/sql/updates/db_world/2025_11_26_03.sql b/data/sql/archive/db_world/2025_11_26_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_26_03.sql rename to data/sql/archive/db_world/2025_11_26_03.sql diff --git a/data/sql/updates/db_world/2025_11_26_04.sql b/data/sql/archive/db_world/2025_11_26_04.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_26_04.sql rename to data/sql/archive/db_world/2025_11_26_04.sql diff --git a/data/sql/updates/db_world/2025_11_26_05.sql b/data/sql/archive/db_world/2025_11_26_05.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_26_05.sql rename to data/sql/archive/db_world/2025_11_26_05.sql diff --git a/data/sql/updates/db_world/2025_11_26_06.sql b/data/sql/archive/db_world/2025_11_26_06.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_26_06.sql rename to data/sql/archive/db_world/2025_11_26_06.sql diff --git a/data/sql/updates/db_world/2025_11_27_00.sql b/data/sql/archive/db_world/2025_11_27_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_27_00.sql rename to data/sql/archive/db_world/2025_11_27_00.sql diff --git a/data/sql/updates/db_world/2025_11_27_01.sql b/data/sql/archive/db_world/2025_11_27_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_27_01.sql rename to data/sql/archive/db_world/2025_11_27_01.sql diff --git a/data/sql/updates/db_world/2025_11_27_02.sql b/data/sql/archive/db_world/2025_11_27_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_27_02.sql rename to data/sql/archive/db_world/2025_11_27_02.sql diff --git a/data/sql/updates/db_world/2025_11_27_03.sql b/data/sql/archive/db_world/2025_11_27_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_27_03.sql rename to data/sql/archive/db_world/2025_11_27_03.sql diff --git a/data/sql/updates/db_world/2025_11_27_04.sql b/data/sql/archive/db_world/2025_11_27_04.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_27_04.sql rename to data/sql/archive/db_world/2025_11_27_04.sql diff --git a/data/sql/updates/db_world/2025_11_27_05.sql b/data/sql/archive/db_world/2025_11_27_05.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_27_05.sql rename to data/sql/archive/db_world/2025_11_27_05.sql diff --git a/data/sql/updates/db_world/2025_11_27_06.sql b/data/sql/archive/db_world/2025_11_27_06.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_27_06.sql rename to data/sql/archive/db_world/2025_11_27_06.sql diff --git a/data/sql/updates/db_world/2025_11_27_07.sql b/data/sql/archive/db_world/2025_11_27_07.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_27_07.sql rename to data/sql/archive/db_world/2025_11_27_07.sql diff --git a/data/sql/updates/db_world/2025_11_27_08.sql b/data/sql/archive/db_world/2025_11_27_08.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_27_08.sql rename to data/sql/archive/db_world/2025_11_27_08.sql diff --git a/data/sql/updates/db_world/2025_11_27_09.sql b/data/sql/archive/db_world/2025_11_27_09.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_27_09.sql rename to data/sql/archive/db_world/2025_11_27_09.sql diff --git a/data/sql/updates/db_world/2025_11_27_10.sql b/data/sql/archive/db_world/2025_11_27_10.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_27_10.sql rename to data/sql/archive/db_world/2025_11_27_10.sql diff --git a/data/sql/updates/db_world/2025_11_28_00.sql b/data/sql/archive/db_world/2025_11_28_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_28_00.sql rename to data/sql/archive/db_world/2025_11_28_00.sql diff --git a/data/sql/updates/db_world/2025_11_28_01.sql b/data/sql/archive/db_world/2025_11_28_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_28_01.sql rename to data/sql/archive/db_world/2025_11_28_01.sql diff --git a/data/sql/updates/db_world/2025_11_28_02.sql b/data/sql/archive/db_world/2025_11_28_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_28_02.sql rename to data/sql/archive/db_world/2025_11_28_02.sql diff --git a/data/sql/updates/db_world/2025_11_28_03.sql b/data/sql/archive/db_world/2025_11_28_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_28_03.sql rename to data/sql/archive/db_world/2025_11_28_03.sql diff --git a/data/sql/updates/db_world/2025_11_28_04.sql b/data/sql/archive/db_world/2025_11_28_04.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_28_04.sql rename to data/sql/archive/db_world/2025_11_28_04.sql diff --git a/data/sql/updates/db_world/2025_11_28_05.sql b/data/sql/archive/db_world/2025_11_28_05.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_28_05.sql rename to data/sql/archive/db_world/2025_11_28_05.sql diff --git a/data/sql/updates/db_world/2025_11_28_06.sql b/data/sql/archive/db_world/2025_11_28_06.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_28_06.sql rename to data/sql/archive/db_world/2025_11_28_06.sql diff --git a/data/sql/updates/db_world/2025_11_28_07.sql b/data/sql/archive/db_world/2025_11_28_07.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_28_07.sql rename to data/sql/archive/db_world/2025_11_28_07.sql diff --git a/data/sql/updates/db_world/2025_11_28_08.sql b/data/sql/archive/db_world/2025_11_28_08.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_28_08.sql rename to data/sql/archive/db_world/2025_11_28_08.sql diff --git a/data/sql/updates/db_world/2025_11_29_00.sql b/data/sql/archive/db_world/2025_11_29_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_29_00.sql rename to data/sql/archive/db_world/2025_11_29_00.sql diff --git a/data/sql/updates/db_world/2025_11_29_01.sql b/data/sql/archive/db_world/2025_11_29_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_29_01.sql rename to data/sql/archive/db_world/2025_11_29_01.sql diff --git a/data/sql/updates/db_world/2025_11_29_02.sql b/data/sql/archive/db_world/2025_11_29_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_29_02.sql rename to data/sql/archive/db_world/2025_11_29_02.sql diff --git a/data/sql/updates/db_world/2025_11_29_03.sql b/data/sql/archive/db_world/2025_11_29_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_29_03.sql rename to data/sql/archive/db_world/2025_11_29_03.sql diff --git a/data/sql/updates/db_world/2025_11_30_00.sql b/data/sql/archive/db_world/2025_11_30_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_30_00.sql rename to data/sql/archive/db_world/2025_11_30_00.sql diff --git a/data/sql/updates/db_world/2025_11_30_01.sql b/data/sql/archive/db_world/2025_11_30_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_30_01.sql rename to data/sql/archive/db_world/2025_11_30_01.sql diff --git a/data/sql/updates/db_world/2025_11_30_02.sql b/data/sql/archive/db_world/2025_11_30_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_30_02.sql rename to data/sql/archive/db_world/2025_11_30_02.sql diff --git a/data/sql/updates/db_world/2025_11_30_03.sql b/data/sql/archive/db_world/2025_11_30_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_30_03.sql rename to data/sql/archive/db_world/2025_11_30_03.sql diff --git a/data/sql/updates/db_world/2025_11_30_04.sql b/data/sql/archive/db_world/2025_11_30_04.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_30_04.sql rename to data/sql/archive/db_world/2025_11_30_04.sql diff --git a/data/sql/updates/db_world/2025_11_30_05.sql b/data/sql/archive/db_world/2025_11_30_05.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_30_05.sql rename to data/sql/archive/db_world/2025_11_30_05.sql diff --git a/data/sql/updates/db_world/2025_11_30_06.sql b/data/sql/archive/db_world/2025_11_30_06.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_30_06.sql rename to data/sql/archive/db_world/2025_11_30_06.sql diff --git a/data/sql/updates/db_world/2025_11_30_07.sql b/data/sql/archive/db_world/2025_11_30_07.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_30_07.sql rename to data/sql/archive/db_world/2025_11_30_07.sql diff --git a/data/sql/updates/db_world/2025_11_30_08.sql b/data/sql/archive/db_world/2025_11_30_08.sql similarity index 100% rename from data/sql/updates/db_world/2025_11_30_08.sql rename to data/sql/archive/db_world/2025_11_30_08.sql diff --git a/data/sql/updates/db_world/2025_12_01_00.sql b/data/sql/archive/db_world/2025_12_01_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_01_00.sql rename to data/sql/archive/db_world/2025_12_01_00.sql diff --git a/data/sql/updates/db_world/2025_12_01_01.sql b/data/sql/archive/db_world/2025_12_01_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_01_01.sql rename to data/sql/archive/db_world/2025_12_01_01.sql diff --git a/data/sql/updates/db_world/2025_12_01_02.sql b/data/sql/archive/db_world/2025_12_01_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_01_02.sql rename to data/sql/archive/db_world/2025_12_01_02.sql diff --git a/data/sql/updates/db_world/2025_12_01_03.sql b/data/sql/archive/db_world/2025_12_01_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_01_03.sql rename to data/sql/archive/db_world/2025_12_01_03.sql diff --git a/data/sql/updates/db_world/2025_12_01_04.sql b/data/sql/archive/db_world/2025_12_01_04.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_01_04.sql rename to data/sql/archive/db_world/2025_12_01_04.sql diff --git a/data/sql/updates/db_world/2025_12_01_05.sql b/data/sql/archive/db_world/2025_12_01_05.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_01_05.sql rename to data/sql/archive/db_world/2025_12_01_05.sql diff --git a/data/sql/updates/db_world/2025_12_02_00.sql b/data/sql/archive/db_world/2025_12_02_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_02_00.sql rename to data/sql/archive/db_world/2025_12_02_00.sql diff --git a/data/sql/updates/db_world/2025_12_02_01.sql b/data/sql/archive/db_world/2025_12_02_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_02_01.sql rename to data/sql/archive/db_world/2025_12_02_01.sql diff --git a/data/sql/updates/db_world/2025_12_02_02.sql b/data/sql/archive/db_world/2025_12_02_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_02_02.sql rename to data/sql/archive/db_world/2025_12_02_02.sql diff --git a/data/sql/updates/db_world/2025_12_02_03.sql b/data/sql/archive/db_world/2025_12_02_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_02_03.sql rename to data/sql/archive/db_world/2025_12_02_03.sql diff --git a/data/sql/updates/db_world/2025_12_02_04.sql b/data/sql/archive/db_world/2025_12_02_04.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_02_04.sql rename to data/sql/archive/db_world/2025_12_02_04.sql diff --git a/data/sql/updates/db_world/2025_12_04_00.sql b/data/sql/archive/db_world/2025_12_04_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_04_00.sql rename to data/sql/archive/db_world/2025_12_04_00.sql diff --git a/data/sql/updates/db_world/2025_12_05_00.sql b/data/sql/archive/db_world/2025_12_05_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_05_00.sql rename to data/sql/archive/db_world/2025_12_05_00.sql diff --git a/data/sql/updates/db_world/2025_12_05_01.sql b/data/sql/archive/db_world/2025_12_05_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_05_01.sql rename to data/sql/archive/db_world/2025_12_05_01.sql diff --git a/data/sql/updates/db_world/2025_12_08_00.sql b/data/sql/archive/db_world/2025_12_08_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_08_00.sql rename to data/sql/archive/db_world/2025_12_08_00.sql diff --git a/data/sql/updates/db_world/2025_12_08_01.sql b/data/sql/archive/db_world/2025_12_08_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_08_01.sql rename to data/sql/archive/db_world/2025_12_08_01.sql diff --git a/data/sql/updates/db_world/2025_12_09_00.sql b/data/sql/archive/db_world/2025_12_09_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_09_00.sql rename to data/sql/archive/db_world/2025_12_09_00.sql diff --git a/data/sql/updates/db_world/2025_12_10_00.sql b/data/sql/archive/db_world/2025_12_10_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_10_00.sql rename to data/sql/archive/db_world/2025_12_10_00.sql diff --git a/data/sql/updates/db_world/2025_12_10_01.sql b/data/sql/archive/db_world/2025_12_10_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_10_01.sql rename to data/sql/archive/db_world/2025_12_10_01.sql diff --git a/data/sql/updates/db_world/2025_12_11_00.sql b/data/sql/archive/db_world/2025_12_11_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_11_00.sql rename to data/sql/archive/db_world/2025_12_11_00.sql diff --git a/data/sql/updates/db_world/2025_12_12_00.sql b/data/sql/archive/db_world/2025_12_12_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_12_00.sql rename to data/sql/archive/db_world/2025_12_12_00.sql diff --git a/data/sql/updates/db_world/2025_12_12_01.sql b/data/sql/archive/db_world/2025_12_12_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_12_01.sql rename to data/sql/archive/db_world/2025_12_12_01.sql diff --git a/data/sql/updates/db_world/2025_12_12_02.sql b/data/sql/archive/db_world/2025_12_12_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_12_02.sql rename to data/sql/archive/db_world/2025_12_12_02.sql diff --git a/data/sql/updates/db_world/2025_12_14_00.sql b/data/sql/archive/db_world/2025_12_14_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_14_00.sql rename to data/sql/archive/db_world/2025_12_14_00.sql diff --git a/data/sql/updates/db_world/2025_12_15_00.sql b/data/sql/archive/db_world/2025_12_15_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_15_00.sql rename to data/sql/archive/db_world/2025_12_15_00.sql diff --git a/data/sql/updates/db_world/2025_12_16_00.sql b/data/sql/archive/db_world/2025_12_16_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_16_00.sql rename to data/sql/archive/db_world/2025_12_16_00.sql diff --git a/data/sql/updates/db_world/2025_12_16_01.sql b/data/sql/archive/db_world/2025_12_16_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_16_01.sql rename to data/sql/archive/db_world/2025_12_16_01.sql diff --git a/data/sql/updates/db_world/2025_12_16_02.sql b/data/sql/archive/db_world/2025_12_16_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_16_02.sql rename to data/sql/archive/db_world/2025_12_16_02.sql diff --git a/data/sql/updates/db_world/2025_12_17_00.sql b/data/sql/archive/db_world/2025_12_17_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_17_00.sql rename to data/sql/archive/db_world/2025_12_17_00.sql diff --git a/data/sql/updates/db_world/2025_12_17_01.sql b/data/sql/archive/db_world/2025_12_17_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_17_01.sql rename to data/sql/archive/db_world/2025_12_17_01.sql diff --git a/data/sql/updates/db_world/2025_12_17_02.sql b/data/sql/archive/db_world/2025_12_17_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_17_02.sql rename to data/sql/archive/db_world/2025_12_17_02.sql diff --git a/data/sql/updates/db_world/2025_12_17_03.sql b/data/sql/archive/db_world/2025_12_17_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_17_03.sql rename to data/sql/archive/db_world/2025_12_17_03.sql diff --git a/data/sql/updates/db_world/2025_12_18_00.sql b/data/sql/archive/db_world/2025_12_18_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_18_00.sql rename to data/sql/archive/db_world/2025_12_18_00.sql diff --git a/data/sql/updates/db_world/2025_12_18_01.sql b/data/sql/archive/db_world/2025_12_18_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_18_01.sql rename to data/sql/archive/db_world/2025_12_18_01.sql diff --git a/data/sql/updates/db_world/2025_12_18_02.sql b/data/sql/archive/db_world/2025_12_18_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_18_02.sql rename to data/sql/archive/db_world/2025_12_18_02.sql diff --git a/data/sql/updates/db_world/2025_12_18_03.sql b/data/sql/archive/db_world/2025_12_18_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_18_03.sql rename to data/sql/archive/db_world/2025_12_18_03.sql diff --git a/data/sql/updates/db_world/2025_12_18_04.sql b/data/sql/archive/db_world/2025_12_18_04.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_18_04.sql rename to data/sql/archive/db_world/2025_12_18_04.sql diff --git a/data/sql/updates/db_world/2025_12_18_05.sql b/data/sql/archive/db_world/2025_12_18_05.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_18_05.sql rename to data/sql/archive/db_world/2025_12_18_05.sql diff --git a/data/sql/updates/db_world/2025_12_18_06.sql b/data/sql/archive/db_world/2025_12_18_06.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_18_06.sql rename to data/sql/archive/db_world/2025_12_18_06.sql diff --git a/data/sql/updates/db_world/2025_12_18_07.sql b/data/sql/archive/db_world/2025_12_18_07.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_18_07.sql rename to data/sql/archive/db_world/2025_12_18_07.sql diff --git a/data/sql/updates/db_world/2025_12_19_00.sql b/data/sql/archive/db_world/2025_12_19_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_19_00.sql rename to data/sql/archive/db_world/2025_12_19_00.sql diff --git a/data/sql/updates/db_world/2025_12_19_01.sql b/data/sql/archive/db_world/2025_12_19_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_19_01.sql rename to data/sql/archive/db_world/2025_12_19_01.sql diff --git a/data/sql/updates/db_world/2025_12_19_02.sql b/data/sql/archive/db_world/2025_12_19_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_19_02.sql rename to data/sql/archive/db_world/2025_12_19_02.sql diff --git a/data/sql/updates/db_world/2025_12_19_03.sql b/data/sql/archive/db_world/2025_12_19_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_19_03.sql rename to data/sql/archive/db_world/2025_12_19_03.sql diff --git a/data/sql/updates/db_world/2025_12_19_04.sql b/data/sql/archive/db_world/2025_12_19_04.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_19_04.sql rename to data/sql/archive/db_world/2025_12_19_04.sql diff --git a/data/sql/updates/db_world/2025_12_20_00.sql b/data/sql/archive/db_world/2025_12_20_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_20_00.sql rename to data/sql/archive/db_world/2025_12_20_00.sql diff --git a/data/sql/updates/db_world/2025_12_20_01.sql b/data/sql/archive/db_world/2025_12_20_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_20_01.sql rename to data/sql/archive/db_world/2025_12_20_01.sql diff --git a/data/sql/updates/db_world/2025_12_20_02.sql b/data/sql/archive/db_world/2025_12_20_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_20_02.sql rename to data/sql/archive/db_world/2025_12_20_02.sql diff --git a/data/sql/updates/db_world/2025_12_20_03.sql b/data/sql/archive/db_world/2025_12_20_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_20_03.sql rename to data/sql/archive/db_world/2025_12_20_03.sql diff --git a/data/sql/updates/db_world/2025_12_20_04.sql b/data/sql/archive/db_world/2025_12_20_04.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_20_04.sql rename to data/sql/archive/db_world/2025_12_20_04.sql diff --git a/data/sql/updates/db_world/2025_12_21_00.sql b/data/sql/archive/db_world/2025_12_21_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_21_00.sql rename to data/sql/archive/db_world/2025_12_21_00.sql diff --git a/data/sql/updates/db_world/2025_12_21_01.sql b/data/sql/archive/db_world/2025_12_21_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_21_01.sql rename to data/sql/archive/db_world/2025_12_21_01.sql diff --git a/data/sql/updates/db_world/2025_12_21_02.sql b/data/sql/archive/db_world/2025_12_21_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_21_02.sql rename to data/sql/archive/db_world/2025_12_21_02.sql diff --git a/data/sql/updates/db_world/2025_12_21_03.sql b/data/sql/archive/db_world/2025_12_21_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_21_03.sql rename to data/sql/archive/db_world/2025_12_21_03.sql diff --git a/data/sql/updates/db_world/2025_12_22_00.sql b/data/sql/archive/db_world/2025_12_22_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_22_00.sql rename to data/sql/archive/db_world/2025_12_22_00.sql diff --git a/data/sql/updates/db_world/2025_12_22_01.sql b/data/sql/archive/db_world/2025_12_22_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_22_01.sql rename to data/sql/archive/db_world/2025_12_22_01.sql diff --git a/data/sql/updates/db_world/2025_12_23_00.sql b/data/sql/archive/db_world/2025_12_23_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_23_00.sql rename to data/sql/archive/db_world/2025_12_23_00.sql diff --git a/data/sql/updates/db_world/2025_12_23_01.sql b/data/sql/archive/db_world/2025_12_23_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_23_01.sql rename to data/sql/archive/db_world/2025_12_23_01.sql diff --git a/data/sql/updates/db_world/2025_12_24_00.sql b/data/sql/archive/db_world/2025_12_24_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_24_00.sql rename to data/sql/archive/db_world/2025_12_24_00.sql diff --git a/data/sql/updates/db_world/2025_12_24_01.sql b/data/sql/archive/db_world/2025_12_24_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_24_01.sql rename to data/sql/archive/db_world/2025_12_24_01.sql diff --git a/data/sql/updates/db_world/2025_12_26_00.sql b/data/sql/archive/db_world/2025_12_26_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_26_00.sql rename to data/sql/archive/db_world/2025_12_26_00.sql diff --git a/data/sql/updates/db_world/2025_12_26_01.sql b/data/sql/archive/db_world/2025_12_26_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_26_01.sql rename to data/sql/archive/db_world/2025_12_26_01.sql diff --git a/data/sql/updates/db_world/2025_12_26_02.sql b/data/sql/archive/db_world/2025_12_26_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_26_02.sql rename to data/sql/archive/db_world/2025_12_26_02.sql diff --git a/data/sql/updates/db_world/2025_12_26_03.sql b/data/sql/archive/db_world/2025_12_26_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_26_03.sql rename to data/sql/archive/db_world/2025_12_26_03.sql diff --git a/data/sql/updates/db_world/2025_12_26_04.sql b/data/sql/archive/db_world/2025_12_26_04.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_26_04.sql rename to data/sql/archive/db_world/2025_12_26_04.sql diff --git a/data/sql/updates/db_world/2025_12_26_05.sql b/data/sql/archive/db_world/2025_12_26_05.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_26_05.sql rename to data/sql/archive/db_world/2025_12_26_05.sql diff --git a/data/sql/updates/db_world/2025_12_26_06.sql b/data/sql/archive/db_world/2025_12_26_06.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_26_06.sql rename to data/sql/archive/db_world/2025_12_26_06.sql diff --git a/data/sql/updates/db_world/2025_12_26_07.sql b/data/sql/archive/db_world/2025_12_26_07.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_26_07.sql rename to data/sql/archive/db_world/2025_12_26_07.sql diff --git a/data/sql/updates/db_world/2025_12_26_08.sql b/data/sql/archive/db_world/2025_12_26_08.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_26_08.sql rename to data/sql/archive/db_world/2025_12_26_08.sql diff --git a/data/sql/updates/db_world/2025_12_26_09.sql b/data/sql/archive/db_world/2025_12_26_09.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_26_09.sql rename to data/sql/archive/db_world/2025_12_26_09.sql diff --git a/data/sql/updates/db_world/2025_12_26_10.sql b/data/sql/archive/db_world/2025_12_26_10.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_26_10.sql rename to data/sql/archive/db_world/2025_12_26_10.sql diff --git a/data/sql/updates/db_world/2025_12_26_11.sql b/data/sql/archive/db_world/2025_12_26_11.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_26_11.sql rename to data/sql/archive/db_world/2025_12_26_11.sql diff --git a/data/sql/updates/db_world/2025_12_27_00.sql b/data/sql/archive/db_world/2025_12_27_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_27_00.sql rename to data/sql/archive/db_world/2025_12_27_00.sql diff --git a/data/sql/updates/db_world/2025_12_27_01.sql b/data/sql/archive/db_world/2025_12_27_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_27_01.sql rename to data/sql/archive/db_world/2025_12_27_01.sql diff --git a/data/sql/updates/db_world/2025_12_27_02.sql b/data/sql/archive/db_world/2025_12_27_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_27_02.sql rename to data/sql/archive/db_world/2025_12_27_02.sql diff --git a/data/sql/updates/db_world/2025_12_27_03.sql b/data/sql/archive/db_world/2025_12_27_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_27_03.sql rename to data/sql/archive/db_world/2025_12_27_03.sql diff --git a/data/sql/updates/db_world/2025_12_27_04.sql b/data/sql/archive/db_world/2025_12_27_04.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_27_04.sql rename to data/sql/archive/db_world/2025_12_27_04.sql diff --git a/data/sql/updates/db_world/2025_12_27_05.sql b/data/sql/archive/db_world/2025_12_27_05.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_27_05.sql rename to data/sql/archive/db_world/2025_12_27_05.sql diff --git a/data/sql/updates/db_world/2025_12_28_00.sql b/data/sql/archive/db_world/2025_12_28_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_28_00.sql rename to data/sql/archive/db_world/2025_12_28_00.sql diff --git a/data/sql/updates/db_world/2025_12_29_00.sql b/data/sql/archive/db_world/2025_12_29_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_29_00.sql rename to data/sql/archive/db_world/2025_12_29_00.sql diff --git a/data/sql/updates/db_world/2025_12_29_01.sql b/data/sql/archive/db_world/2025_12_29_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_29_01.sql rename to data/sql/archive/db_world/2025_12_29_01.sql diff --git a/data/sql/updates/db_world/2025_12_29_02.sql b/data/sql/archive/db_world/2025_12_29_02.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_29_02.sql rename to data/sql/archive/db_world/2025_12_29_02.sql diff --git a/data/sql/updates/db_world/2025_12_29_03.sql b/data/sql/archive/db_world/2025_12_29_03.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_29_03.sql rename to data/sql/archive/db_world/2025_12_29_03.sql diff --git a/data/sql/updates/db_world/2025_12_29_04.sql b/data/sql/archive/db_world/2025_12_29_04.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_29_04.sql rename to data/sql/archive/db_world/2025_12_29_04.sql diff --git a/data/sql/updates/db_world/2025_12_29_05.sql b/data/sql/archive/db_world/2025_12_29_05.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_29_05.sql rename to data/sql/archive/db_world/2025_12_29_05.sql diff --git a/data/sql/updates/db_world/2025_12_29_06.sql b/data/sql/archive/db_world/2025_12_29_06.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_29_06.sql rename to data/sql/archive/db_world/2025_12_29_06.sql diff --git a/data/sql/updates/db_world/2025_12_29_07.sql b/data/sql/archive/db_world/2025_12_29_07.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_29_07.sql rename to data/sql/archive/db_world/2025_12_29_07.sql diff --git a/data/sql/updates/db_world/2025_12_29_08.sql b/data/sql/archive/db_world/2025_12_29_08.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_29_08.sql rename to data/sql/archive/db_world/2025_12_29_08.sql diff --git a/data/sql/updates/db_world/2025_12_29_09.sql b/data/sql/archive/db_world/2025_12_29_09.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_29_09.sql rename to data/sql/archive/db_world/2025_12_29_09.sql diff --git a/data/sql/updates/db_world/2025_12_29_10.sql b/data/sql/archive/db_world/2025_12_29_10.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_29_10.sql rename to data/sql/archive/db_world/2025_12_29_10.sql diff --git a/data/sql/updates/db_world/2025_12_29_11.sql b/data/sql/archive/db_world/2025_12_29_11.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_29_11.sql rename to data/sql/archive/db_world/2025_12_29_11.sql diff --git a/data/sql/updates/db_world/2025_12_29_12.sql b/data/sql/archive/db_world/2025_12_29_12.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_29_12.sql rename to data/sql/archive/db_world/2025_12_29_12.sql diff --git a/data/sql/updates/db_world/2025_12_29_13.sql b/data/sql/archive/db_world/2025_12_29_13.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_29_13.sql rename to data/sql/archive/db_world/2025_12_29_13.sql diff --git a/data/sql/updates/db_world/2025_12_29_14.sql b/data/sql/archive/db_world/2025_12_29_14.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_29_14.sql rename to data/sql/archive/db_world/2025_12_29_14.sql diff --git a/data/sql/updates/db_world/2025_12_29_15.sql b/data/sql/archive/db_world/2025_12_29_15.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_29_15.sql rename to data/sql/archive/db_world/2025_12_29_15.sql diff --git a/data/sql/updates/db_world/2025_12_29_16.sql b/data/sql/archive/db_world/2025_12_29_16.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_29_16.sql rename to data/sql/archive/db_world/2025_12_29_16.sql diff --git a/data/sql/updates/db_world/2025_12_29_17.sql b/data/sql/archive/db_world/2025_12_29_17.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_29_17.sql rename to data/sql/archive/db_world/2025_12_29_17.sql diff --git a/data/sql/updates/db_world/2025_12_29_18.sql b/data/sql/archive/db_world/2025_12_29_18.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_29_18.sql rename to data/sql/archive/db_world/2025_12_29_18.sql diff --git a/data/sql/updates/db_world/2025_12_29_19.sql b/data/sql/archive/db_world/2025_12_29_19.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_29_19.sql rename to data/sql/archive/db_world/2025_12_29_19.sql diff --git a/data/sql/updates/db_world/2025_12_30_00.sql b/data/sql/archive/db_world/2025_12_30_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_30_00.sql rename to data/sql/archive/db_world/2025_12_30_00.sql diff --git a/data/sql/updates/db_world/2025_12_31_00.sql b/data/sql/archive/db_world/2025_12_31_00.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_31_00.sql rename to data/sql/archive/db_world/2025_12_31_00.sql diff --git a/data/sql/updates/db_world/2025_12_31_01.sql b/data/sql/archive/db_world/2025_12_31_01.sql similarity index 100% rename from data/sql/updates/db_world/2025_12_31_01.sql rename to data/sql/archive/db_world/2025_12_31_01.sql diff --git a/data/sql/updates/pending_db_auth/rev_1784739022869516500.sql b/data/sql/updates/pending_db_auth/rev_1784739022869516500.sql new file mode 100644 index 000000000..547e5df2f --- /dev/null +++ b/data/sql/updates/pending_db_auth/rev_1784739022869516500.sql @@ -0,0 +1,3 @@ +-- +UPDATE `updates` SET `state` = 'ARCHIVED' WHERE `name` LIKE '2024_%'; +UPDATE `updates` SET `state` = 'ARCHIVED' WHERE `name` LIKE '2025_%'; diff --git a/data/sql/updates/pending_db_characters/rev_1784738950443156500.sql b/data/sql/updates/pending_db_characters/rev_1784738950443156500.sql new file mode 100644 index 000000000..547e5df2f --- /dev/null +++ b/data/sql/updates/pending_db_characters/rev_1784738950443156500.sql @@ -0,0 +1,3 @@ +-- +UPDATE `updates` SET `state` = 'ARCHIVED' WHERE `name` LIKE '2024_%'; +UPDATE `updates` SET `state` = 'ARCHIVED' WHERE `name` LIKE '2025_%'; diff --git a/data/sql/updates/pending_db_world/rev_1784738776255760500.sql b/data/sql/updates/pending_db_world/rev_1784738776255760500.sql new file mode 100644 index 000000000..a1144c5c7 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1784738776255760500.sql @@ -0,0 +1,2 @@ +-- +UPDATE `updates` SET `state` = 'ARCHIVED' WHERE `name` LIKE '2025_%'; From f63e74128c523eb2e784c2d02717cc5274ba08cd Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 22 Jul 2026 17:20:51 +0000 Subject: [PATCH 094/134] chore(DB): import pending files Referenced commit(s): 5185c9e0302c1c670d19c7055d11e4483ac0a1e6 --- .../rev_1784739022869516500.sql => db_auth/2026_07_22_00.sql} | 1 + .../2026_07_22_00.sql} | 1 + .../rev_1781654104088564177.sql => db_world/2026_07_22_09.sql} | 1 + .../rev_1784738776255760500.sql => db_world/2026_07_22_10.sql} | 1 + 4 files changed, 4 insertions(+) rename data/sql/updates/{pending_db_auth/rev_1784739022869516500.sql => db_auth/2026_07_22_00.sql} (76%) rename data/sql/updates/{pending_db_characters/rev_1784738950443156500.sql => db_characters/2026_07_22_00.sql} (76%) rename data/sql/updates/{pending_db_world/rev_1781654104088564177.sql => db_world/2026_07_22_09.sql} (95%) rename data/sql/updates/{pending_db_world/rev_1784738776255760500.sql => db_world/2026_07_22_10.sql} (62%) diff --git a/data/sql/updates/pending_db_auth/rev_1784739022869516500.sql b/data/sql/updates/db_auth/2026_07_22_00.sql similarity index 76% rename from data/sql/updates/pending_db_auth/rev_1784739022869516500.sql rename to data/sql/updates/db_auth/2026_07_22_00.sql index 547e5df2f..fc7bed897 100644 --- a/data/sql/updates/pending_db_auth/rev_1784739022869516500.sql +++ b/data/sql/updates/db_auth/2026_07_22_00.sql @@ -1,3 +1,4 @@ +-- DB update 2026_07_19_00 -> 2026_07_22_00 -- UPDATE `updates` SET `state` = 'ARCHIVED' WHERE `name` LIKE '2024_%'; UPDATE `updates` SET `state` = 'ARCHIVED' WHERE `name` LIKE '2025_%'; diff --git a/data/sql/updates/pending_db_characters/rev_1784738950443156500.sql b/data/sql/updates/db_characters/2026_07_22_00.sql similarity index 76% rename from data/sql/updates/pending_db_characters/rev_1784738950443156500.sql rename to data/sql/updates/db_characters/2026_07_22_00.sql index 547e5df2f..627238f75 100644 --- a/data/sql/updates/pending_db_characters/rev_1784738950443156500.sql +++ b/data/sql/updates/db_characters/2026_07_22_00.sql @@ -1,3 +1,4 @@ +-- DB update 2026_07_21_00 -> 2026_07_22_00 -- UPDATE `updates` SET `state` = 'ARCHIVED' WHERE `name` LIKE '2024_%'; UPDATE `updates` SET `state` = 'ARCHIVED' WHERE `name` LIKE '2025_%'; diff --git a/data/sql/updates/pending_db_world/rev_1781654104088564177.sql b/data/sql/updates/db_world/2026_07_22_09.sql similarity index 95% rename from data/sql/updates/pending_db_world/rev_1781654104088564177.sql rename to data/sql/updates/db_world/2026_07_22_09.sql index 21720e5a4..a4b81a825 100644 --- a/data/sql/updates/pending_db_world/rev_1781654104088564177.sql +++ b/data/sql/updates/db_world/2026_07_22_09.sql @@ -1,3 +1,4 @@ +-- DB update 2026_07_22_08 -> 2026_07_22_09 -- Fel Creep - requires Cenarion Beacon in inventory DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` = 4 AND `SourceEntry` = 11514; INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `ConditionTypeOrReference`, `ConditionValue1`, `ConditionValue2`, `Comment`) VALUES diff --git a/data/sql/updates/pending_db_world/rev_1784738776255760500.sql b/data/sql/updates/db_world/2026_07_22_10.sql similarity index 62% rename from data/sql/updates/pending_db_world/rev_1784738776255760500.sql rename to data/sql/updates/db_world/2026_07_22_10.sql index a1144c5c7..ebdff0299 100644 --- a/data/sql/updates/pending_db_world/rev_1784738776255760500.sql +++ b/data/sql/updates/db_world/2026_07_22_10.sql @@ -1,2 +1,3 @@ +-- DB update 2026_07_22_09 -> 2026_07_22_10 -- UPDATE `updates` SET `state` = 'ARCHIVED' WHERE `name` LIKE '2025_%'; From e68f4ff9b72e9273fd5aeb7bdf37b356e3758b06 Mon Sep 17 00:00:00 2001 From: Efymer <79163132+Efymer@users.noreply.github.com> Date: Wed, 22 Jul 2026 19:48:11 +0200 Subject: [PATCH 095/134] fix(DB/Text): Wright Williams banter uses incorrect lines (#26291) --- .../pending_db_world/rev_1781977507798643900.sql | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1781977507798643900.sql diff --git a/data/sql/updates/pending_db_world/rev_1781977507798643900.sql b/data/sql/updates/pending_db_world/rev_1781977507798643900.sql new file mode 100644 index 000000000..1c2cf1342 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1781977507798643900.sql @@ -0,0 +1,10 @@ +-- Wright Williams (28355) banter fix: groups 0-3 had Text/BroadcastTextId scrambled, +-- making the Miles Sidney <-> Wright Williams conversations nonsensical, and group 3 +-- pointed at BroadcastTextId 27809 ("Skadi the Ruthless is within range..."). +-- Realign with correct broadcast lines so the scripted conversations read coherently. +DELETE FROM `creature_text` WHERE `CreatureID` = 28355 AND `GroupID` IN (0,1,2,3); +INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES +(28355,0,0,'Sir, our customers are complaining that there\'s not enough Maiden\'s Anguish in our Deadly Poisons.',12,0,100,0,0,0,27801,0,'Wright Williams'), +(28355,1,0,'Sir, I think we were close with the Lethargy Root in that last poison recipe.',12,0,100,0,0,0,27803,0,'Wright Williams'), +(28355,2,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'), +(28355,3,0,'Sir, our customers are complaining that there\'s too much Deathweed in our Anesthetics.',12,0,100,0,0,0,27802,0,'Wright Williams'); From 5a60e6f88b35dceb2925fc047f0b6660b9378bb4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 22 Jul 2026 17:49:26 +0000 Subject: [PATCH 096/134] chore(DB): import pending files Referenced commit(s): e68f4ff9b72e9273fd5aeb7bdf37b356e3758b06 --- .../rev_1781977507798643900.sql => db_world/2026_07_22_11.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1781977507798643900.sql => db_world/2026_07_22_11.sql} (96%) diff --git a/data/sql/updates/pending_db_world/rev_1781977507798643900.sql b/data/sql/updates/db_world/2026_07_22_11.sql similarity index 96% rename from data/sql/updates/pending_db_world/rev_1781977507798643900.sql rename to data/sql/updates/db_world/2026_07_22_11.sql index 1c2cf1342..558d94a44 100644 --- a/data/sql/updates/pending_db_world/rev_1781977507798643900.sql +++ b/data/sql/updates/db_world/2026_07_22_11.sql @@ -1,3 +1,4 @@ +-- DB update 2026_07_22_10 -> 2026_07_22_11 -- Wright Williams (28355) banter fix: groups 0-3 had Text/BroadcastTextId scrambled, -- making the Miles Sidney <-> Wright Williams conversations nonsensical, and group 3 -- pointed at BroadcastTextId 27809 ("Skadi the Ruthless is within range..."). From f7f2dfd31a30c9b8aa4381ce2c4f5aad13ef1ec1 Mon Sep 17 00:00:00 2001 From: Gultask <100873791+Gultask@users.noreply.github.com> Date: Wed, 22 Jul 2026 16:01:50 -0300 Subject: [PATCH 097/134] fix(DB/Quest): Implement Summoned Guardian Event for quest Attack on the Tower (#26743) Co-authored-by: sudlud --- .../rev_1784745357536870700.sql | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1784745357536870700.sql diff --git a/data/sql/updates/pending_db_world/rev_1784745357536870700.sql b/data/sql/updates/pending_db_world/rev_1784745357536870700.sql new file mode 100644 index 000000000..9d53d59c9 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1784745357536870700.sql @@ -0,0 +1,21 @@ +-- +UPDATE `creature_template` SET `speed_walk` = 1, `speed_run` = 1.28968 WHERE (`entry` = 2794); + +UPDATE `gameobject_template` SET `AIName` = 'SmartGameObjectAI' WHERE `entry` = 2715; +DELETE FROM `smart_scripts` WHERE (`source_type` = 1 AND `entryorguid` = 2715); +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 +(2715, 1, 0, 0, 71, 0, 100, 0, 413, 0, 0, 0, 0, 0, 107, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Runed Pedestal - On Event 413 (Use Enchanted Agate) - Summon Creature Group'); + +DELETE FROM `creature_summon_groups` WHERE `summonerId` = 2715 AND `summonerType` = 1 AND `groupId` = 0; +INSERT INTO `creature_summon_groups` (`summonerId`, `summonerType`, `groupId`, `entry`, `position_x`, `position_y`, `position_z`, `orientation`, `summonType`, `summonTime`, `Comment`) VALUES +(2715, 1, 0, 2794, -1776.3521728515625, -1523.4576416015625, 65.00421142578125, 1.570796370506286621, 4, 60000, 'Runed Pedestal - Summoned Guardian'), +(2715, 1, 0, 2794, -1777.7584228515625, -1516.91162109375, 99.33446502685546875, 4.293509960174560546, 4, 60000, 'Runed Pedestal - Summoned Guardian'), +(2715, 1, 0, 2794, -1772.38427734375, -1522.574951171875, 75.32105255126953125, 2.129301786422729492, 4, 60000, 'Runed Pedestal - Summoned Guardian'), +(2715, 1, 0, 2794, -1748.8072509765625, -1555.64599609375, 58.52048110961914062, 4.380776405334472656, 4, 60000, 'Runed Pedestal - Summoned Guardian'), +(2715, 1, 0, 2794, -1782.6334228515625, -1508.9366455078125, 99.33446502685546875, 3.089232683181762695, 4, 60000, 'Runed Pedestal - Summoned Guardian'), +(2715, 1, 0, 2794, -1770.3160400390625, -1510.4705810546875, 90.59513092041015625, 0.890117883682250976, 4, 60000, 'Runed Pedestal - Summoned Guardian'), +(2715, 1, 0, 2794, -1758.890625, -1555.829833984375, 58.64284896850585937, 5.113814830780029296, 4, 60000, 'Runed Pedestal - Summoned Guardian'); + +DELETE FROM `conditions` WHERE (`SourceTypeOrReferenceId` = 22) AND (`SourceGroup` = 1) AND (`SourceEntry` = 2715) AND (`SourceId` = 1) AND (`ElseGroup` = 0) AND (`ConditionTypeOrReference` = 29) AND (`ConditionTarget` = 1) AND (`ConditionValue1` = 2794) AND (`ConditionValue2` = 200) AND (`ConditionValue3` = 0); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(22, 1, 2715, 1, 0, 29, 1, 2794, 50, 0, 1, 0, 0, '', 'Only Summon Creature Group if None are Already Spawned'); From c796c7160c1404c9e8082b1fb2f36c633b54ef64 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 22 Jul 2026 19:03:03 +0000 Subject: [PATCH 098/134] chore(DB): import pending files Referenced commit(s): f7f2dfd31a30c9b8aa4381ce2c4f5aad13ef1ec1 --- .../rev_1784745357536870700.sql => db_world/2026_07_22_12.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1784745357536870700.sql => db_world/2026_07_22_12.sql} (98%) diff --git a/data/sql/updates/pending_db_world/rev_1784745357536870700.sql b/data/sql/updates/db_world/2026_07_22_12.sql similarity index 98% rename from data/sql/updates/pending_db_world/rev_1784745357536870700.sql rename to data/sql/updates/db_world/2026_07_22_12.sql index 9d53d59c9..402de6d18 100644 --- a/data/sql/updates/pending_db_world/rev_1784745357536870700.sql +++ b/data/sql/updates/db_world/2026_07_22_12.sql @@ -1,3 +1,4 @@ +-- DB update 2026_07_22_11 -> 2026_07_22_12 -- UPDATE `creature_template` SET `speed_walk` = 1, `speed_run` = 1.28968 WHERE (`entry` = 2794); From b20406cd2cf3a476f006b47e3750aca06fea91da Mon Sep 17 00:00:00 2001 From: Eddy Vega <61223313+Si1ker@users.noreply.github.com> Date: Wed, 22 Jul 2026 13:13:35 -0600 Subject: [PATCH 099/134] fix(DB/creature_template_model): Adjust Nature Bomb model (#26708) Co-authored-by: Gultask <100873791+Gultask@users.noreply.github.com> Co-authored-by: Benjamin Jackson <38561765+heyitsbench@users.noreply.github.com> --- .../updates/pending_db_world/rev_1784574368934795000.sql | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1784574368934795000.sql diff --git a/data/sql/updates/pending_db_world/rev_1784574368934795000.sql b/data/sql/updates/pending_db_world/rev_1784574368934795000.sql new file mode 100644 index 000000000..4fd244124 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1784574368934795000.sql @@ -0,0 +1,6 @@ +DELETE FROM `creature_template_model` WHERE `CreatureID` IN (34129, 34153); +INSERT INTO `creature_template_model` (`CreatureID`, `Idx`, `CreatureDisplayID`, `DisplayScale`, `Probability`, `VerifiedBuild`) VALUES +(34129, 0, 169, 1, 0, 51831), +(34129, 1, 23258, 1, 1, 51831), +(34153, 0, 169, 1, 0, 51831), +(34153, 1, 23258, 1, 1, 51831); From f69161bcfad69ae8b07a5c9957cb8321e4700446 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 22 Jul 2026 19:14:48 +0000 Subject: [PATCH 100/134] chore(DB): import pending files Referenced commit(s): b20406cd2cf3a476f006b47e3750aca06fea91da --- .../rev_1784574368934795000.sql => db_world/2026_07_22_13.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1784574368934795000.sql => db_world/2026_07_22_13.sql} (88%) diff --git a/data/sql/updates/pending_db_world/rev_1784574368934795000.sql b/data/sql/updates/db_world/2026_07_22_13.sql similarity index 88% rename from data/sql/updates/pending_db_world/rev_1784574368934795000.sql rename to data/sql/updates/db_world/2026_07_22_13.sql index 4fd244124..28bed95c6 100644 --- a/data/sql/updates/pending_db_world/rev_1784574368934795000.sql +++ b/data/sql/updates/db_world/2026_07_22_13.sql @@ -1,3 +1,4 @@ +-- DB update 2026_07_22_12 -> 2026_07_22_13 DELETE FROM `creature_template_model` WHERE `CreatureID` IN (34129, 34153); INSERT INTO `creature_template_model` (`CreatureID`, `Idx`, `CreatureDisplayID`, `DisplayScale`, `Probability`, `VerifiedBuild`) VALUES (34129, 0, 169, 1, 0, 51831), From 9e8bcca4368dcbb3ee4cd6e64bb2614187485fae Mon Sep 17 00:00:00 2001 From: Rocco Silipo <108557877+Rorschach91@users.noreply.github.com> Date: Thu, 23 Jul 2026 00:54:27 +0200 Subject: [PATCH 101/134] fix(DB/SAI): Tirisfal and Hearthglen Crusaders don't stay in place when they engage combat. (#26745) --- data/sql/updates/pending_db_world/rev_1784747750.sql | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1784747750.sql diff --git a/data/sql/updates/pending_db_world/rev_1784747750.sql b/data/sql/updates/pending_db_world/rev_1784747750.sql new file mode 100644 index 000000000..7b2a90814 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1784747750.sql @@ -0,0 +1,8 @@ + +-- Change Tirisfal and Hearthglen Crusader row 2. +UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry` = 29103; + +DELETE FROM `smart_scripts` WHERE (`entryorguid` IN (29102, 29103)) AND (`source_type` = 0) AND (`id` IN (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 +(29102, 0, 2, 0, 0, 1, 100, 0, 2000, 4000, 4000, 6000, 0, 0, 11, 53345, 128, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Hearthglen Crusader - In Combat - Cast \'Arrow Assault\' (Phase 1)'), +(29103, 0, 2, 0, 0, 1, 100, 0, 2000, 4000, 4000, 6000, 0, 0, 11, 53345, 128, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Tirisfal Crusader - In Combat - Cast \'Arrow Assault\' (Phase 1)'); From 7e9e72abe7f2dfa61213ece151a5135f63ff4c3e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 22 Jul 2026 22:56:23 +0000 Subject: [PATCH 102/134] chore(DB): import pending files Referenced commit(s): 9e8bcca4368dcbb3ee4cd6e64bb2614187485fae --- .../rev_1784747750.sql => db_world/2026_07_22_14.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1784747750.sql => db_world/2026_07_22_14.sql} (96%) diff --git a/data/sql/updates/pending_db_world/rev_1784747750.sql b/data/sql/updates/db_world/2026_07_22_14.sql similarity index 96% rename from data/sql/updates/pending_db_world/rev_1784747750.sql rename to data/sql/updates/db_world/2026_07_22_14.sql index 7b2a90814..9124eae89 100644 --- a/data/sql/updates/pending_db_world/rev_1784747750.sql +++ b/data/sql/updates/db_world/2026_07_22_14.sql @@ -1,3 +1,4 @@ +-- DB update 2026_07_22_13 -> 2026_07_22_14 -- Change Tirisfal and Hearthglen Crusader row 2. UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry` = 29103; From 96c7c8dea874f96b6a334ac079808ed4270ff251 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=98yvind=20Bertelsen?= Date: Thu, 23 Jul 2026 08:11:50 +0200 Subject: [PATCH 103/134] fix(DB/Creature): hide The Lich King whisper trigger at Havenshire (#26740) Co-authored-by: Claude Fable 5 --- data/sql/updates/pending_db_world/rev_1784731268413348600.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1784731268413348600.sql diff --git a/data/sql/updates/pending_db_world/rev_1784731268413348600.sql b/data/sql/updates/pending_db_world/rev_1784731268413348600.sql new file mode 100644 index 000000000..ebdf911cc --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1784731268413348600.sql @@ -0,0 +1,2 @@ +-- Flag 'The Lich King' (28765) whisper controller in the Scarlet Enclave as a trigger creature so it is invisible to players +UPDATE `creature_template` SET `flags_extra` = `flags_extra`|128 WHERE `entry` = 28765; From be7d63b16cfbc9d8833b010096af399111a27da5 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 23 Jul 2026 06:13:01 +0000 Subject: [PATCH 104/134] chore(DB): import pending files Referenced commit(s): 96c7c8dea874f96b6a334ac079808ed4270ff251 --- .../rev_1784731268413348600.sql => db_world/2026_07_23_00.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1784731268413348600.sql => db_world/2026_07_23_00.sql} (82%) diff --git a/data/sql/updates/pending_db_world/rev_1784731268413348600.sql b/data/sql/updates/db_world/2026_07_23_00.sql similarity index 82% rename from data/sql/updates/pending_db_world/rev_1784731268413348600.sql rename to data/sql/updates/db_world/2026_07_23_00.sql index ebdf911cc..37ea4b61d 100644 --- a/data/sql/updates/pending_db_world/rev_1784731268413348600.sql +++ b/data/sql/updates/db_world/2026_07_23_00.sql @@ -1,2 +1,3 @@ +-- DB update 2026_07_22_14 -> 2026_07_23_00 -- Flag 'The Lich King' (28765) whisper controller in the Scarlet Enclave as a trigger creature so it is invisible to players UPDATE `creature_template` SET `flags_extra` = `flags_extra`|128 WHERE `entry` = 28765; From 6c449d1dbf6dca3c1011cfc2d3cb4f8b253f3137 Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Thu, 23 Jul 2026 06:33:04 -0300 Subject: [PATCH 105/134] refactor(Scripts/Ulduar): seat Kologarn arms as vehicle accessories (#26747) --- .../rev_1784760633944475600.sql | 5 ++ .../Northrend/Ulduar/Ulduar/boss_kologarn.cpp | 90 +++++++++---------- 2 files changed, 46 insertions(+), 49 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1784760633944475600.sql diff --git a/data/sql/updates/pending_db_world/rev_1784760633944475600.sql b/data/sql/updates/pending_db_world/rev_1784760633944475600.sql new file mode 100644 index 000000000..1cbac0d94 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1784760633944475600.sql @@ -0,0 +1,5 @@ +-- +DELETE FROM `vehicle_template_accessory` WHERE `entry` = 32930; +INSERT INTO `vehicle_template_accessory` (`entry`, `accessory_entry`, `seat_id`, `minion`, `description`, `summontype`, `summontimer`) VALUES +(32930, 32933, 0, 1, 'Kologarn', 8, 0), +(32930, 32934, 1, 1, 'Kologarn', 8, 0); diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp index 3710026d8..4d28f8110 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp @@ -156,6 +156,10 @@ struct boss_kologarn : public BossAI instance->SaveToDB(); } Reset(); + // Arms are vehicle accessories; the initial pair is seated by Map::AddToMap, + // so only wipe recovery needs to heal survivors or reinstall missing arms. + AttachLeftArm(); + AttachRightArm(); me->setActive(false); } @@ -167,18 +171,8 @@ struct boss_kologarn : public BossAI // Clear the arm's combat-start state so it can re-pull the boss on a subsequent attempt. arm->AI()->Reset(); } - else if (Creature* accessory = me->SummonCreature(NPC_LEFT_ARM, *me, TEMPSUMMON_MANUAL_DESPAWN)) - { - accessory->AddUnitTypeMask(UNIT_MASK_ACCESSORY); - if (!me->HandleSpellClick(accessory, 0)) - accessory->DespawnOrUnsummon(); - else - { - _left = accessory->GetGUID(); - accessory->SetOrientation(M_PI); - accessory->CastSpell(accessory, SPELL_ARM_RESPAWN_VISUAL, true); - } - } + else + vehicle->InstallAccessory(NPC_LEFT_ARM, 0, true, TEMPSUMMON_MANUAL_DESPAWN, 0); } void AttachRightArm() @@ -189,18 +183,8 @@ struct boss_kologarn : public BossAI // Clear the arm's combat-start state so it can re-pull the boss on a subsequent attempt. arm->AI()->Reset(); } - else if (Creature* accessory = me->SummonCreature(NPC_RIGHT_ARM, *me, TEMPSUMMON_MANUAL_DESPAWN)) - { - accessory->AddUnitTypeMask(UNIT_MASK_ACCESSORY); - if (!me->HandleSpellClick(accessory, 1)) - accessory->DespawnOrUnsummon(); - else - { - _right = accessory->GetGUID(); - accessory->SetOrientation(M_PI); - accessory->CastSpell(accessory, SPELL_ARM_RESPAWN_VISUAL, true); - } - } + else + vehicle->InstallAccessory(NPC_RIGHT_ARM, 1, true, TEMPSUMMON_MANUAL_DESPAWN, 0); } void Reset() override @@ -221,9 +205,6 @@ struct boss_kologarn : public BossAI door->SetGoState(GO_STATE_ACTIVE); } - AttachLeftArm(); - AttachRightArm(); - // Reset breath on pull breathReady = false; } @@ -326,35 +307,46 @@ struct boss_kologarn : public BossAI void PassengerBoarded(Unit* who, int8 /*seatId*/, bool apply) override { + if (apply) + { + if (who->GetEntry() == NPC_LEFT_ARM) + _left = who->GetGUID(); + else if (who->GetEntry() == NPC_RIGHT_ARM) + _right = who->GetGUID(); + else + return; + + who->SetOrientation(M_PI); + who->CastSpell(who, SPELL_ARM_RESPAWN_VISUAL, true); + return; + } + if (!me->IsAlive() || instance->GetBossState(BOSS_KOLOGARN) != IN_PROGRESS) return; - if (!apply) + // left arm + if (who->GetGUID() == _left) { - // left arm - if (who->GetGUID() == _left) + _left.Clear(); + if (me->IsInCombat()) { - _left.Clear(); - if (me->IsInCombat()) - { - Talk(SAY_LEFT_ARM_GONE); - events.ScheduleEvent(EVENT_RESTORE_ARM_LEFT, 50s); - } + Talk(SAY_LEFT_ARM_GONE); + events.ScheduleEvent(EVENT_RESTORE_ARM_LEFT, 50s); } - else - { - _right.Clear(); - if (me->IsInCombat()) - { - Talk(SAY_RIGHT_ARM_GONE); - events.ScheduleEvent(EVENT_RESTORE_ARM_RIGHT, 50s); - } - } - - me->CastSpell(me, SPELL_ARM_DEAD, true); - if (!_right && !_left) - events.ScheduleEvent(EVENT_STONE_SHOUT, 5s); } + else + { + _right.Clear(); + if (me->IsInCombat()) + { + Talk(SAY_RIGHT_ARM_GONE); + events.ScheduleEvent(EVENT_RESTORE_ARM_RIGHT, 50s); + } + } + + me->CastSpell(me, SPELL_ARM_DEAD, true); + if (!_right && !_left) + events.ScheduleEvent(EVENT_STONE_SHOUT, 5s); } void DamageTaken(Unit* who, uint32& damage, DamageEffectType, SpellSchoolMask) override From 878cb1e3560b5726f7235c8b56b57f97a9862a1f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 23 Jul 2026 09:34:20 +0000 Subject: [PATCH 106/134] chore(DB): import pending files Referenced commit(s): 6c449d1dbf6dca3c1011cfc2d3cb4f8b253f3137 --- .../rev_1784760633944475600.sql => db_world/2026_07_23_01.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1784760633944475600.sql => db_world/2026_07_23_01.sql} (86%) diff --git a/data/sql/updates/pending_db_world/rev_1784760633944475600.sql b/data/sql/updates/db_world/2026_07_23_01.sql similarity index 86% rename from data/sql/updates/pending_db_world/rev_1784760633944475600.sql rename to data/sql/updates/db_world/2026_07_23_01.sql index 1cbac0d94..5db282226 100644 --- a/data/sql/updates/pending_db_world/rev_1784760633944475600.sql +++ b/data/sql/updates/db_world/2026_07_23_01.sql @@ -1,3 +1,4 @@ +-- DB update 2026_07_23_00 -> 2026_07_23_01 -- DELETE FROM `vehicle_template_accessory` WHERE `entry` = 32930; INSERT INTO `vehicle_template_accessory` (`entry`, `accessory_entry`, `seat_id`, `minion`, `description`, `summontype`, `summontimer`) VALUES From dc8c9416dde0d6e61ec7ecf46e91c8df29e5a159 Mon Sep 17 00:00:00 2001 From: Benjamin Jackson <38561765+heyitsbench@users.noreply.github.com> Date: Thu, 23 Jul 2026 14:30:57 -0400 Subject: [PATCH 107/134] fix(Core/Packets): Correct data source for attack stop packet, rewrite to modern class. (#25915) Co-authored-by: Shauren Co-authored-by: Ludwig Co-authored-by: Claude Opus 4.8 (1M context) --- src/server/game/Entities/Unit/Unit.cpp | 16 +++++++--------- src/server/game/Entities/Unit/Unit.h | 2 +- src/server/game/Handlers/CombatHandler.cpp | 19 +++---------------- .../game/Server/Packets/CombatPackets.cpp | 11 +++++++++++ .../game/Server/Packets/CombatPackets.h | 12 ++++++++++++ src/server/game/Server/WorldSession.h | 2 -- 6 files changed, 34 insertions(+), 28 deletions(-) diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 9af94cbb5..e76d6597b 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -28,6 +28,7 @@ #include "Chat.h" #include "ChatPackets.h" #include "ChatTextBuilder.h" +#include "CombatPackets.h" #include "Common.h" #include "ConditionMgr.h" #include "Creature.h" @@ -3236,21 +3237,18 @@ void Unit::SendMeleeAttackStart(Unit* victim, Player* sendTo) * @brief Send to the client SMSG_ATTACKSTOP but doesn't clear UNIT_STATE_MELEE_ATTACKING on server side * or interrupt spells. Unless you know exactly what you're doing, use AttackStop() or RemoveAllAttackers() instead */ -void Unit::SendMeleeAttackStop(Unit* victim) +void Unit::SendMeleeAttackStop(Unit const* victim) const { // pussywizard: calling SendMeleeAttackStop without clearing UNIT_STATE_MELEE_ATTACKING and then AttackStart the same player may spoil npc rotating! // pussywizard: this happens in some boss scripts, just add clearing here // ClearUnitState(UNIT_STATE_MELEE_ATTACKING); // commented out for now - WorldPacket data(SMSG_ATTACKSTOP, (8 + 8 + 4)); - data << GetPackGUID(); + WorldPackets::Combat::SAttackStop attackStop; + attackStop.Attacker = GetGUID(); + attackStop.Victim = Object::GetGUID(victim); + attackStop.NowDead = !IsAlive(); - if (victim) - { - data << victim->GetPackGUID(); - data << (uint32)victim->isDead(); - } - SendMessageToSet(&data, true); + SendMessageToSet(attackStop.Write(), true); LOG_DEBUG("entities.unit", "WORLD: Sent SMSG_ATTACKSTOP"); if (victim) diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index fd01e4909..9f71cd725 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -909,7 +909,7 @@ public: void StopAttackingInvalidTarget(); Unit* SelectNearbyTarget(Unit* exclude = nullptr, float dist = NOMINAL_MELEE_RANGE) const; Unit* SelectNearbyNoTotemTarget(Unit* exclude = nullptr, float dist = NOMINAL_MELEE_RANGE) const; - void SendMeleeAttackStop(Unit* victim = nullptr); + void SendMeleeAttackStop(Unit const* victim = nullptr) const; void SendMeleeAttackStart(Unit* victim, Player* sendTo = nullptr); [[nodiscard]] uint32 GetAttackTime(WeaponAttackType att) const diff --git a/src/server/game/Handlers/CombatHandler.cpp b/src/server/game/Handlers/CombatHandler.cpp index 7f945eb17..f3b49643d 100644 --- a/src/server/game/Handlers/CombatHandler.cpp +++ b/src/server/game/Handlers/CombatHandler.cpp @@ -37,14 +37,14 @@ void WorldSession::HandleAttackSwingOpcode(WorldPacket& recvData) if (!pEnemy) { // stop attack state at client - SendAttackStop(nullptr); + _player->SendMeleeAttackStop(nullptr); return; } if (!_player->IsValidAttackTarget(pEnemy)) { // stop attack state at client - SendAttackStop(pEnemy); + _player->SendMeleeAttackStop(pEnemy); return; } @@ -57,7 +57,7 @@ void WorldSession::HandleAttackSwingOpcode(WorldPacket& recvData) ASSERT(seat); if (!(seat->m_flags & VEHICLE_SEAT_FLAG_CAN_ATTACK)) { - SendAttackStop(pEnemy); + _player->SendMeleeAttackStop(pEnemy); return; } } @@ -80,16 +80,3 @@ void WorldSession::HandleSetSheathedOpcode(WorldPackets::Combat::SetSheathed& pa _player->SetSheath(SheathState(packet.CurrentSheathState)); } - -void WorldSession::SendAttackStop(Unit const* enemy) -{ - WorldPacket data(SMSG_ATTACKSTOP, (8 + 8 + 4)); // we guess size - data << GetPlayer()->GetPackGUID(); - - if (enemy) - { - data << enemy->GetPackGUID(); // must be packed guid - data << (uint32)enemy->isDead(); - } - SendPacket(&data); -} diff --git a/src/server/game/Server/Packets/CombatPackets.cpp b/src/server/game/Server/Packets/CombatPackets.cpp index a58ec7edb..b569172af 100644 --- a/src/server/game/Server/Packets/CombatPackets.cpp +++ b/src/server/game/Server/Packets/CombatPackets.cpp @@ -21,3 +21,14 @@ void WorldPackets::Combat::SetSheathed::Read() { _worldPacket >> CurrentSheathState; } + +WorldPacket const* WorldPackets::Combat::SAttackStop::Write() +{ + // Packed in place because ObjectGuid::WriteAsPacked() returns a PackedGuid by value, and each one + // heap-allocates its buffer. Use it again once TC's non-owning PackedGuidWriter is ported. + _worldPacket.appendPackGUID(Attacker.GetRawValue()); + _worldPacket.appendPackGUID(Victim.GetRawValue()); + _worldPacket << uint32(NowDead); + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/CombatPackets.h b/src/server/game/Server/Packets/CombatPackets.h index b379c33f2..a8970bea6 100644 --- a/src/server/game/Server/Packets/CombatPackets.h +++ b/src/server/game/Server/Packets/CombatPackets.h @@ -34,6 +34,18 @@ namespace WorldPackets uint32 CurrentSheathState = 0; }; + + class SAttackStop final : public ServerPacket + { + public: + SAttackStop() : ServerPacket(SMSG_ATTACKSTOP, 8 + 8 + 4) { } + + WorldPacket const* Write() override; + + ObjectGuid Attacker; + ObjectGuid Victim; + bool NowDead = false; + }; } } diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index bea564076..8e6ec9be5 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -553,8 +553,6 @@ public: void SendSpiritResurrect(); void SendBindPoint(Creature* npc); - void SendAttackStop(Unit const* enemy); - void SendBattleGroundList(ObjectGuid guid, BattlegroundTypeId bgTypeId = BATTLEGROUND_RB); void SendTradeStatus(TradeStatusInfo const& info); From f8c2cc9b71e7df17eaa094b89cf4880c2c8bfeb4 Mon Sep 17 00:00:00 2001 From: lightninjay Date: Thu, 23 Jul 2026 15:09:34 -0400 Subject: [PATCH 108/134] fix(Scripts/Pet): Fix Ethereal Soul-Trader Companion Pet (#26249) Co-authored-by: lightinjay Co-authored-by: Ludwig Co-authored-by: Claude Opus 4.8 (1M context) Co-authored-by: DanVS <33371360+DanVS@users.noreply.github.com> --- .../rev_1781665996127369421.sql | 3 ++ src/server/scripts/Pet/pet_generic.cpp | 10 ++-- src/server/scripts/Spells/spell_generic.cpp | 53 +++++++++++++++++++ 3 files changed, 63 insertions(+), 3 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1781665996127369421.sql diff --git a/data/sql/updates/pending_db_world/rev_1781665996127369421.sql b/data/sql/updates/pending_db_world/rev_1781665996127369421.sql new file mode 100644 index 000000000..28ba4d037 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1781665996127369421.sql @@ -0,0 +1,3 @@ +DELETE FROM `spell_script_names` WHERE (`spell_id` = 50051); +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(50051, 'spell_gen_ethereal_pet_aura'); diff --git a/src/server/scripts/Pet/pet_generic.cpp b/src/server/scripts/Pet/pet_generic.cpp index e7ca2c8bb..3d5168c33 100644 --- a/src/server/scripts/Pet/pet_generic.cpp +++ b/src/server/scripts/Pet/pet_generic.cpp @@ -63,9 +63,10 @@ struct npc_pet_gen_soul_trader_beacon : public ScriptedAI Player* GetOwner() const { return ObjectAccessor::GetPlayer(*me, ownerGUID); } - void SpellHitTarget(Unit* target, SpellInfo const* spellInfo) override + void SpellHit(Unit* /*caster*/, SpellInfo const* spellInfo) override { - if (spellInfo->Id == SPELL_STEAL_ESSENCE_VISUAL && target == me) + // Handle the kill notification from the owner's kill aura (spell 50051) + if (spellInfo->Id == SPELL_OWNER_KILLED_INFORM) { Talk(1); events.ScheduleEvent(EVENT_ADD_TOKEN, 3s); @@ -83,7 +84,10 @@ struct npc_pet_gen_soul_trader_beacon : public ScriptedAI break; case EVENT_ADD_TOKEN: me->RemoveAurasDueToSpell(SPELL_EMOTE_STATE_SWIM_RUN); - me->CastSpell(me, SPELL_CREATE_TOKEN, true); + // Cast the token creation spell on the player owner, not on the pet + if (Player* owner = GetOwner()) + me->CastSpell(owner, SPELL_CREATE_TOKEN, true); + Talk(2); break; } diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp index a9038eeba..2bb2d19da 100644 --- a/src/server/scripts/Spells/spell_generic.cpp +++ b/src/server/scripts/Spells/spell_generic.cpp @@ -4543,6 +4543,58 @@ class spell_gen_eject_passenger : public SpellScript } }; +// 50051 - Ethereal Pet Aura (Soultrader Beacon) +// Triggers when the owner kills an opponent, applying spell 50050 (SPELL_OWNER_KILLED_INFORM) to notify the pet +class spell_gen_ethereal_pet_aura : public AuraScript +{ + PrepareAuraScript(spell_gen_ethereal_pet_aura); + + enum EtherealSoulTrader + { + NPC_ETHEREAL_SOUL_TRADER = 27914, + SPELL_OWNER_KILLED_INFORM = 50050, + SPELL_STEAL_ESSENCE_VISUAL = 50101, + }; + + bool CheckProc(ProcEventInfo& eventInfo) + { + Unit* procTarget = eventInfo.GetProcTarget(); + if (!procTarget) + return false; + + // Only trigger on players killing creatures that are not grey mobs + int32 levelDiff = int32(GetTarget()->GetLevel()) - int32(procTarget->GetLevel()); + return levelDiff <= 9; + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + Unit* procTarget = eventInfo.GetProcTarget(); + if (!procTarget) + return; + + // Get all Ethereal Soul-Trader minions owned by this player + std::list minionList; + GetUnitOwner()->GetAllMinionsByEntry(minionList, NPC_ETHEREAL_SOUL_TRADER); + + for (Creature* minion : minionList) + { + // Cast the laser beam visual from the pet to the killed mob + minion->CastSpell(procTarget, SPELL_STEAL_ESSENCE_VISUAL); + // Notify the pet AI that a valid kill occurred (triggers the pet's SpellHit handler) + minion->CastSpell(minion, SPELL_OWNER_KILLED_INFORM, true); + } + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_gen_ethereal_pet_aura::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_gen_ethereal_pet_aura::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); + } +}; + /* 37727 - Touch of Darkness 37851 - Tag Greater Felfire Diemetradon 37917 - Arcano-Cloak @@ -6263,6 +6315,7 @@ void AddSC_generic_spell_scripts() RegisterSpellScript(spell_gen_whisper_gulch_yogg_saron_whisper); RegisterSpellScript(spell_gen_eject_all_passengers); RegisterSpellScript(spell_gen_eject_passenger); + RegisterSpellScript(spell_gen_ethereal_pet_aura); RegisterSpellScript(spell_gen_charmed_unit_spell_cooldown); RegisterSpellScript(spell_contagion_of_rot); RegisterSpellScript(spell_gen_holiday_buff_food); From 428a73c9b18c4cb007029d4bea679824c3cf4189 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 23 Jul 2026 19:10:47 +0000 Subject: [PATCH 109/134] chore(DB): import pending files Referenced commit(s): f8c2cc9b71e7df17eaa094b89cf4880c2c8bfeb4 --- .../rev_1781665996127369421.sql => db_world/2026_07_23_02.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1781665996127369421.sql => db_world/2026_07_23_02.sql} (79%) diff --git a/data/sql/updates/pending_db_world/rev_1781665996127369421.sql b/data/sql/updates/db_world/2026_07_23_02.sql similarity index 79% rename from data/sql/updates/pending_db_world/rev_1781665996127369421.sql rename to data/sql/updates/db_world/2026_07_23_02.sql index 28ba4d037..60e3b7ab7 100644 --- a/data/sql/updates/pending_db_world/rev_1781665996127369421.sql +++ b/data/sql/updates/db_world/2026_07_23_02.sql @@ -1,3 +1,4 @@ +-- DB update 2026_07_23_01 -> 2026_07_23_02 DELETE FROM `spell_script_names` WHERE (`spell_id` = 50051); INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES (50051, 'spell_gen_ethereal_pet_aura'); From 3de58f80d5e332d1b9fe1de7278351fae5b290df Mon Sep 17 00:00:00 2001 From: Efymer <79163132+Efymer@users.noreply.github.com> Date: Thu, 23 Jul 2026 21:27:58 +0200 Subject: [PATCH 110/134] fix(DB): Spirit of the Vale race-specific gossip greeting (#26315) --- .../rev_1782123510559549800.sql | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1782123510559549800.sql diff --git a/data/sql/updates/pending_db_world/rev_1782123510559549800.sql b/data/sql/updates/pending_db_world/rev_1782123510559549800.sql new file mode 100644 index 000000000..74bb0eb23 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1782123510559549800.sql @@ -0,0 +1,43 @@ +-- +-- Spirit of the Vale (entry 17087, Azuremyst Isle) - gossip greeting was race-insensitive. +-- Issue azerothcore/azerothcore-wotlk#14219 (chromiecraft/chromiecraft#4535). +-- +-- The gossip text (menu 7376) only distinguished shaman from non-shaman: every non-shaman +-- (PR #9942, condition CLASS != shaman on text 8824) saw the draenei line "Return to your +-- people and tell them to send one of your shaman to me." regardless of race, and Horde +-- characters saw it too. Per Wrath Classic (Wowhead/Wowpedia npc=17087) the greeting varies +-- by race: +-- * draenei -> 8824 "Return to your people and tell them to send one of your shaman to me." (broadcast 13549) +-- * non-draenei -> 8825 "Return to the draenei and tell them to send me one of their shaman." (broadcast 13550) +-- * Horde -> 8831 "Your presence here can only mean trouble, of the Horde. Go in peace." (broadcast 13557) +-- The shaman quest-chain texts are kept: 8827 while "Call of Earth" (9451) is in progress, +-- 8826 once it is rewarded. +-- +-- Reference cores (TrinityCore, cMaNGOS) do not implement the race split for this NPC; the +-- intended data already exists in AC (npc_text 8824/8825 and broadcast 13557), so this +-- only wires it up with gossip conditions. npc_text 8825 (non-draenei) and 8826/8827 (shaman) +-- already exist; 8831 is added to wrap the Horde broadcast 13557. + +-- Horde greeting text (wraps broadcast 13557). +DELETE FROM `npc_text` WHERE `ID` = 8831; +INSERT INTO `npc_text` (`ID`, `text0_0`, `BroadcastTextID0`, `Probability0`) VALUES +(8831, 'Your presence here can only mean trouble, $g son : daughter; of the Horde. Go in peace.', 13557, 1); + +-- Make the race-specific greetings selectable from menu 7376 (8824/8826/8827 already present). +DELETE FROM `gossip_menu` WHERE `MenuID` = 7376 AND `TextID` IN (8825, 8831); +INSERT INTO `gossip_menu` (`MenuID`, `TextID`) VALUES +(7376, 8825), +(7376, 8831); + +-- Rebuild the gossip-menu text conditions so exactly one line matches each player. +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` = 14 AND `SourceGroup` = 7376; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(14, 7376, 8824, 0, 0, 16, 0, 1024, 0, 0, 0, 0, 0, '', 'Spirit of the Vale - text 8824 if player is a draenei'), +(14, 7376, 8824, 0, 0, 15, 0, 64, 0, 0, 1, 0, 0, '', 'Spirit of the Vale - text 8824 if player is not a shaman'), +(14, 7376, 8825, 0, 0, 6, 0, 469, 0, 0, 0, 0, 0, '', 'Spirit of the Vale - text 8825 if player is Alliance'), +(14, 7376, 8825, 0, 0, 16, 0, 1024, 0, 0, 1, 0, 0, '', 'Spirit of the Vale - text 8825 if player is not a draenei'), +(14, 7376, 8826, 0, 0, 47, 0, 9451, 64, 0, 0, 0, 0, '', 'Spirit of the Vale - text 8826 if quest Call of Earth (9451) is rewarded'), +(14, 7376, 8827, 0, 0, 6, 0, 469, 0, 0, 0, 0, 0, '', 'Spirit of the Vale - text 8827 if player is Alliance'), +(14, 7376, 8827, 0, 0, 15, 0, 64, 0, 0, 0, 0, 0, '', 'Spirit of the Vale - text 8827 if player is a shaman'), +(14, 7376, 8827, 0, 0, 47, 0, 9451, 64, 0, 1, 0, 0, '', 'Spirit of the Vale - text 8827 if quest Call of Earth (9451) is not rewarded'), +(14, 7376, 8831, 0, 0, 6, 0, 67, 0, 0, 0, 0, 0, '', 'Spirit of the Vale - text 8831 if player is Horde'); From 1cf300412150954aab398f5f84dfd897d425d218 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 23 Jul 2026 19:29:41 +0000 Subject: [PATCH 111/134] chore(DB): import pending files Referenced commit(s): 3de58f80d5e332d1b9fe1de7278351fae5b290df --- .../rev_1782123510559549800.sql => db_world/2026_07_23_03.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1782123510559549800.sql => db_world/2026_07_23_03.sql} (98%) diff --git a/data/sql/updates/pending_db_world/rev_1782123510559549800.sql b/data/sql/updates/db_world/2026_07_23_03.sql similarity index 98% rename from data/sql/updates/pending_db_world/rev_1782123510559549800.sql rename to data/sql/updates/db_world/2026_07_23_03.sql index 74bb0eb23..e443a2a4d 100644 --- a/data/sql/updates/pending_db_world/rev_1782123510559549800.sql +++ b/data/sql/updates/db_world/2026_07_23_03.sql @@ -1,3 +1,4 @@ +-- DB update 2026_07_23_02 -> 2026_07_23_03 -- -- Spirit of the Vale (entry 17087, Azuremyst Isle) - gossip greeting was race-insensitive. -- Issue azerothcore/azerothcore-wotlk#14219 (chromiecraft/chromiecraft#4535). From 172877a35d1b3532c768737bf9c2a3080d6aa6f3 Mon Sep 17 00:00:00 2001 From: nyilas7 Date: Thu, 23 Jul 2026 21:52:15 +0200 Subject: [PATCH 112/134] fix(Core/Movement): Fix caster NPC infinite chase (#26120) --- .../TargetedMovementGenerator.cpp | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp index 1747d75c3..8487e7a9e 100644 --- a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp @@ -196,20 +196,13 @@ bool ChaseMovementGenerator::DoUpdate(T* owner, uint32 time_diff) // the owner might be unable to move (rooted or casting), or we have lost the target, pause movement if (owner->HasUnitState(UNIT_STATE_NOT_MOVE) || HasLostTarget(owner) || isStoppedBecauseOfCasting) { + // Every time a caster mob stops to cast a spell, the leash timer ticks down. Once the timer expires, the mob evades and walks home. owner->StopMoving(); _lastTargetPosition.reset(); + if (cOwner) { - if (isStoppedBecauseOfCasting) - { - // Don't reset leash timer if it's a spell like Shoot with a short cast time. - /// @todo: Research how it should actually work. - Spell *spell = cOwner->GetFirstCurrentCastingSpell(); - bool spellHasLongCast = spell && spell->GetCastTime() > 1 * SECOND * IN_MILLISECONDS; - if (spellHasLongCast) - cOwner->UpdateLeashExtensionTime(); - } - else + if (!isStoppedBecauseOfCasting) cOwner->UpdateLeashExtensionTime(); cOwner->SetCannotReachTarget(); From a8d75f59c5d7e6c902aad6a2f617ee360d8bb0c8 Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Thu, 23 Jul 2026 20:59:36 -0300 Subject: [PATCH 113/134] fix(Scripts/UtgardeKeep): don't restart Ingvar's feign death sequence on residual damage (#26728) --- .../UtgardeKeep/boss_ingvar_the_plunderer.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp index 7ae0c1fe8..460476335 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp @@ -120,9 +120,18 @@ struct boss_ingvar_the_plunderer : public ScriptedAI void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) override { + // Residual damage (e.g. DoT ticks) during the feign death would restart + // the death sequence, repeating the yell and delaying Annhylde + if (me->HasUnitFlag2(UNIT_FLAG2_FEIGN_DEATH)) + { + if (damage >= me->GetHealth()) + damage = me->GetHealth() - 1; + return; + } + if (me->GetDisplayId() == DISPLAYID_DEFAULT && damage >= me->GetHealth()) { - damage = 0; + damage = me->GetHealth() - 1; me->InterruptNonMeleeSpells(true); me->RemoveAllAuras(); me->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE); From a8c37368792e0d8fce05ffaf6411f96d906581fb Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Thu, 23 Jul 2026 21:22:08 -0300 Subject: [PATCH 114/134] refactor(Core/Mails): centralize mail count bookkeeping in a new MailMgr (#26727) --- .../Implementation/CharacterDatabase.cpp | 2 +- src/server/game/Cache/CharacterCache.cpp | 41 ++-- src/server/game/Cache/CharacterCache.h | 15 +- .../game/Entities/Player/PlayerStorage.cpp | 14 +- src/server/game/Globals/ObjectMgr.cpp | 123 ----------- src/server/game/Globals/ObjectMgr.h | 2 - src/server/game/Handlers/MailHandler.cpp | 7 +- src/server/game/Mails/Mail.cpp | 3 +- src/server/game/Mails/MailMgr.cpp | 209 ++++++++++++++++++ src/server/game/Mails/MailMgr.h | 87 ++++++++ src/server/game/World/World.cpp | 5 +- src/server/scripts/Commands/cs_cache.cpp | 3 +- src/server/scripts/Commands/cs_mail.cpp | 3 +- 13 files changed, 346 insertions(+), 168 deletions(-) create mode 100644 src/server/game/Mails/MailMgr.cpp create mode 100644 src/server/game/Mails/MailMgr.h diff --git a/src/server/database/Database/Implementation/CharacterDatabase.cpp b/src/server/database/Database/Implementation/CharacterDatabase.cpp index 829a96197..f70764724 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/database/Database/Implementation/CharacterDatabase.cpp @@ -424,7 +424,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_SEL_CHAR_SOCIAL, "SELECT DISTINCT guid FROM character_social WHERE friend = ?", CONNECTION_SYNCH); PrepareStatement(CHAR_SEL_CHAR_OLD_CHARS, "SELECT guid, deleteInfos_Account FROM characters WHERE deleteDate IS NOT NULL AND deleteDate < ?", CONNECTION_SYNCH); PrepareStatement(CHAR_SEL_ARENA_TEAM_ID_BY_PLAYER_GUID, "SELECT arena_team_member.arenateamid FROM arena_team_member JOIN arena_team ON arena_team_member.arenateamid = arena_team.arenateamid WHERE guid = ? AND type = ? LIMIT 1", CONNECTION_SYNCH); - PrepareStatement(CHAR_SEL_MAIL, "SELECT id, messageType, sender, receiver, subject, body, expire_time, deliver_time, money, cod, checked, stationery, mailTemplateId FROM mail WHERE receiver = ? ORDER BY id DESC", CONNECTION_ASYNC); + PrepareStatement(CHAR_SEL_MAIL, "SELECT id, messageType, sender, receiver, subject, body, expire_time, deliver_time, money, cod, checked, stationery, mailTemplateId, has_items FROM mail WHERE receiver = ? ORDER BY id DESC", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_NEXT_MAIL_DELIVERYTIME, "SELECT MIN(deliver_time) FROM mail WHERE receiver = ? AND deliver_time > ? AND (checked & 1) = 0 LIMIT 1", CONNECTION_SYNCH); PrepareStatement(CHAR_DEL_CHAR_AURA_FROZEN, "DELETE FROM character_aura WHERE spell = 9454 AND guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHAR_INVENTORY_COUNT_ITEM, "SELECT COUNT(itemEntry) FROM character_inventory ci INNER JOIN item_instance ii ON ii.guid = ci.item WHERE itemEntry = ?", CONNECTION_SYNCH); diff --git a/src/server/game/Cache/CharacterCache.cpp b/src/server/game/Cache/CharacterCache.cpp index f940173dc..1840c5749 100644 --- a/src/server/game/Cache/CharacterCache.cpp +++ b/src/server/game/Cache/CharacterCache.cpp @@ -19,9 +19,12 @@ #include "ArenaTeam.h" #include "DatabaseEnv.h" #include "Log.h" +#include "MailMgr.h" #include "Player.h" #include "Timer.h" #include "World.h" +#include +#include #include namespace @@ -76,15 +79,7 @@ void CharacterCache::LoadCharacterCacheStorage() fields[4].Get() /*gender*/, fields[3].Get() /*race*/, fields[5].Get() /*class*/, fields[6].Get() /*level*/); } while (result->NextRow()); - QueryResult mailCountResult = CharacterDatabase.Query("SELECT receiver, COUNT(receiver) FROM mail GROUP BY receiver"); - if (mailCountResult) - { - do - { - Field* fields = mailCountResult->Fetch(); - UpdateCharacterMailCount(ObjectGuid(HighGuid::Player, fields[0].Get()), static_cast(fields[1].Get()), true); - } while (mailCountResult->NextRow()); - } + sMailMgr->LoadMailCounts(); LOG_INFO("server.loading", ">> Loaded Character Infos For {} Characters in {} ms", _characterCacheStore.size(), GetMSTimeDiffToNow(oldMSTime)); LOG_INFO("server.loading", " "); @@ -105,15 +100,7 @@ void CharacterCache::RefreshCacheEntry(uint32 lowGuid) AddCharacterCacheEntry(ObjectGuid::Create(fields[0].Get()) /*guid*/, fields[2].Get() /*account*/, fields[1].Get() /*name*/, fields[4].Get() /*gender*/, fields[3].Get() /*race*/, fields[5].Get() /*class*/, fields[6].Get() /*level*/); } while (result->NextRow()); - QueryResult mailCountResult = CharacterDatabase.Query("SELECT receiver, COUNT(receiver) FROM mail WHERE receiver = {} GROUP BY receiver", lowGuid); - if (mailCountResult) - { - do - { - Field* fields = mailCountResult->Fetch(); - UpdateCharacterMailCount(ObjectGuid(HighGuid::Player, fields[0].Get()), static_cast(fields[1].Get()), true); - } while (mailCountResult->NextRow()); - } + sMailMgr->RecountMailCount(lowGuid); } /* @@ -216,27 +203,25 @@ void CharacterCache::UpdateCharacterArenaTeamId(ObjectGuid const& guid, uint8 sl itr->second.ArenaTeamId[slot] = arenaTeamId; } -void CharacterCache::UpdateCharacterMailCount(ObjectGuid const& guid, int8 count, bool update) +void CharacterCache::UpdateCharacterMailCount(ObjectGuid const& guid, int32 count, bool update) { auto itr = _characterCacheStore.find(guid); if (itr == _characterCacheStore.end()) - { return; - } + + constexpr int32 maxCount = std::numeric_limits::max(); if (update) { - itr->second.MailCount = count; + itr->second.MailCount = static_cast(std::clamp(count, 0, maxCount)); return; } - // Let's be safe and prevent overflow - if (!itr->second.MailCount && count < 0) - { - return; - } + int32 newCount = static_cast(itr->second.MailCount) + count; + if (newCount < 0) + LOG_WARN("entities.player", "CharacterCache::UpdateCharacterMailCount: mail count for {} would go negative ({}), a mail insert was not reported; clamping to 0", guid.ToString(), newCount); - itr->second.MailCount += count; + itr->second.MailCount = static_cast(std::clamp(newCount, 0, maxCount)); } void CharacterCache::UpdateCharacterGroup(ObjectGuid const& guid, ObjectGuid groupGUID) diff --git a/src/server/game/Cache/CharacterCache.h b/src/server/game/Cache/CharacterCache.h index c0f8572ac..5ef83df06 100644 --- a/src/server/game/Cache/CharacterCache.h +++ b/src/server/game/Cache/CharacterCache.h @@ -33,7 +33,7 @@ struct CharacterCacheEntry uint8 Race; uint8 Sex; uint8 Level; - uint8 MailCount; + uint16 MailCount; ObjectGuid::LowType GuildId; std::array ArenaTeamId; ObjectGuid GroupGuid; @@ -58,10 +58,6 @@ class AC_GAME_API CharacterCache void UpdateCharacterGuildId(ObjectGuid const& guid, ObjectGuid::LowType guildId); void UpdateCharacterArenaTeamId(ObjectGuid const& guid, uint8 slot, uint32 arenaTeamId); - void UpdateCharacterMailCount(ObjectGuid const& guid, int8 count, bool update = false); - void DecreaseCharacterMailCount(ObjectGuid const& guid) { UpdateCharacterMailCount(guid, -1); }; - void IncreaseCharacterMailCount(ObjectGuid const& guid) { UpdateCharacterMailCount(guid, 1); }; - [[nodiscard]] bool HasCharacterCacheEntry(ObjectGuid const& guid) const; [[nodiscard]] CharacterCacheEntry const* GetCharacterCacheByGuid(ObjectGuid const& guid) const; [[nodiscard]] CharacterCacheEntry const* GetCharacterCacheByName(std::string const& name) const; @@ -78,6 +74,15 @@ class AC_GAME_API CharacterCache [[nodiscard]] ObjectGuid::LowType GetCharacterGuildIdByGuid(ObjectGuid guid) const; [[nodiscard]] uint32 GetCharacterArenaTeamIdByGuid(ObjectGuid guid, uint8 type) const; [[nodiscard]] ObjectGuid GetCharacterGroupGuidByGuid(ObjectGuid guid) const; + + private: + // Only MailMgr may touch the mail count, so every change is paired + // with the matching write to the `mail` table + void UpdateCharacterMailCount(ObjectGuid const& guid, int32 count, bool update = false); + void DecreaseCharacterMailCount(ObjectGuid const& guid) { UpdateCharacterMailCount(guid, -1); } + void IncreaseCharacterMailCount(ObjectGuid const& guid) { UpdateCharacterMailCount(guid, 1); } + + friend class MailMgr; }; #define sCharacterCache CharacterCache::instance() diff --git a/src/server/game/Entities/Player/PlayerStorage.cpp b/src/server/game/Entities/Player/PlayerStorage.cpp index 0bc0ad0fe..8def7f56d 100644 --- a/src/server/game/Entities/Player/PlayerStorage.cpp +++ b/src/server/game/Entities/Player/PlayerStorage.cpp @@ -40,6 +40,7 @@ #include "Language.h" #include "Log.h" #include "LootItemStorage.h" +#include "MailMgr.h" #include "MapMgr.h" #include "ObjectAccessor.h" #include "ObjectMgr.h" @@ -6298,10 +6299,21 @@ void Player::_LoadMail(PreparedQueryResult mailsResult, PreparedQueryResult mail m->checked = fields[10].Get(); m->stationery = fields[11].Get(); m->mailTemplateId = fields[12].Get(); + bool has_items = fields[13].Get(); if (cur_time > m->expire_time) { - LOG_DEBUG("entities.player", "Player::_LoadMail: Mail ({}) has expired - ignored.", m->messageID); + // Drop empty expired mail now; mail with items or money is left + // for ReturnOrDeleteOldMails, which owns return-to-sender handling + if (!has_items && !m->money && !m->COD) + { + LOG_DEBUG("entities.player", "Player::_LoadMail: Mail ({}) has expired - deleted.", m->messageID); + sMailMgr->DeleteEmptyExpiredMail(m->messageID, GetGUID().GetCounter()); + } + else + LOG_DEBUG("entities.player", "Player::_LoadMail: Mail ({}) has expired - ignored.", m->messageID); + + delete m; continue; } diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index f9c76d214..111dc7c26 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -6804,129 +6804,6 @@ void ObjectMgr::LoadNpcTextLocales() LOG_INFO("server.loading", ">> Loaded {} Npc Text Locale Strings in {} ms", (uint32)_npcTextLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime)); } -void ObjectMgr::ReturnOrDeleteOldMails(bool serverUp) -{ - uint32 oldMSTime = getMSTime(); - - time_t curTime = GameTime::GetGameTime().count(); - - CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_EXPIRED_MAIL); - stmt->SetData(0, uint32(curTime)); - PreparedQueryResult result = CharacterDatabase.Query(stmt); - if (!result) - return; - - std::map itemsCache; - stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_EXPIRED_MAIL_ITEMS); - stmt->SetData(0, uint32(curTime)); - if (PreparedQueryResult items = CharacterDatabase.Query(stmt)) - { - MailItemInfo item; - do - { - Field* fields = items->Fetch(); - item.item_guid = fields[0].Get(); - item.item_template = fields[1].Get(); - uint32 mailId = fields[2].Get(); - itemsCache[mailId].push_back(item); - } while (items->NextRow()); - } - - uint32 deletedCount = 0; - uint32 returnedCount = 0; - do - { - Field* fields = result->Fetch(); - Mail* m = new Mail; - m->messageID = fields[0].Get(); - m->messageType = fields[1].Get(); - m->sender = fields[2].Get(); - m->receiver = fields[3].Get(); - bool has_items = fields[4].Get(); - m->expire_time = time_t(fields[5].Get()); - m->deliver_time = time_t(0); - m->stationery = fields[6].Get(); - m->checked = fields[7].Get(); - m->mailTemplateId = fields[8].Get(); - - Player* player = nullptr; - if (serverUp) - player = ObjectAccessor::FindPlayerByLowGUID(m->receiver); - - if (player) // don't modify mails of a logged in player - { - delete m; - continue; - } - - // Delete or return mail - if (has_items) - { - // read items from cache - m->items.swap(itemsCache[m->messageID]); - - // If it is mail from non-player, or if it's already return mail, it shouldn't be returned, but deleted - if (!m->IsSentByPlayer() || m->IsSentByGM() || (m->IsCODPayment() || m->IsReturnedMail())) - { - for (auto const& mailedItem : m->items) - { - stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE); - stmt->SetData(0, mailedItem.item_guid); - CharacterDatabase.Execute(stmt); - } - - stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_ITEM_BY_ID); - stmt->SetData(0, m->messageID); - CharacterDatabase.Execute(stmt); - } - else - { - // Mail will be returned - stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_MAIL_RETURNED); - stmt->SetData(0, m->receiver); - stmt->SetData(1, m->sender); - stmt->SetData(2, uint32(curTime + 30 * DAY)); - stmt->SetData(3, uint32(curTime)); - stmt->SetData (4, uint8(MAIL_CHECK_MASK_RETURNED)); - stmt->SetData(5, m->messageID); - CharacterDatabase.Execute(stmt); - for (auto const& mailedItem : m->items) - { - // Update receiver in mail items for its proper delivery, and in instance_item for avoid lost item at sender delete - stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_MAIL_ITEM_RECEIVER); - stmt->SetData(0, m->sender); - stmt->SetData(1, mailedItem.item_guid); - CharacterDatabase.Execute(stmt); - - stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_ITEM_OWNER); - stmt->SetData(0, m->sender); - stmt->SetData(1, mailedItem.item_guid); - CharacterDatabase.Execute(stmt); - } - - // xinef: update global data - sCharacterCache->IncreaseCharacterMailCount(ObjectGuid(HighGuid::Player, m->sender)); - sCharacterCache->DecreaseCharacterMailCount(ObjectGuid(HighGuid::Player, m->receiver)); - - delete m; - ++returnedCount; - continue; - } - } - - sCharacterCache->DecreaseCharacterMailCount(ObjectGuid(HighGuid::Player, m->receiver)); - - stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_BY_ID); - stmt->SetData(0, m->messageID); - CharacterDatabase.Execute(stmt); - delete m; - ++deletedCount; - } while (result->NextRow()); - - LOG_INFO("server.loading", ">> Processed {} expired mails: {} deleted and {} returned in {} ms", deletedCount + returnedCount, deletedCount, returnedCount, GetMSTimeDiffToNow(oldMSTime)); - LOG_INFO("server.loading", " "); -} - void ObjectMgr::LoadQuestAreaTriggers() { uint32 oldMSTime = getMSTime(); diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h index c384ae2f3..24f837cb7 100644 --- a/src/server/game/Globals/ObjectMgr.h +++ b/src/server/game/Globals/ObjectMgr.h @@ -1129,8 +1129,6 @@ public: return itr != _fishingBaseForAreaStore.end() ? itr->second : 0; } - void ReturnOrDeleteOldMails(bool serverUp); - CreatureBaseStats const* GetCreatureBaseStats(uint8 level, uint8 unitClass); void SetHighestGuids(); diff --git a/src/server/game/Handlers/MailHandler.cpp b/src/server/game/Handlers/MailHandler.cpp index e44001d36..e70a9d94f 100644 --- a/src/server/game/Handlers/MailHandler.cpp +++ b/src/server/game/Handlers/MailHandler.cpp @@ -26,6 +26,7 @@ #include "Language.h" #include "Log.h" #include "Mail.h" +#include "MailMgr.h" #include "ObjectMgr.h" #include "Opcodes.h" #include "Player.h" @@ -416,7 +417,7 @@ void WorldSession::HandleMailDelete(WorldPacket& recvData) Mail* m = _player->GetMail(mailId); Player* player = _player; player->m_mailsUpdated = true; - if (m) + if (m && m->state != MAIL_STATE_DELETED) { // delete shouldn't show up for COD mails if (m->COD) @@ -427,7 +428,7 @@ void WorldSession::HandleMailDelete(WorldPacket& recvData) m->state = MAIL_STATE_DELETED; - sCharacterCache->DecreaseCharacterMailCount(player->GetGUID()); + sMailMgr->OnMailDeleted(player->GetGUID().GetCounter()); } player->SendMailResult(mailId, MAIL_DELETED, MAIL_OK); } @@ -509,7 +510,7 @@ void WorldSession::HandleMailReturnToSender(WorldPacket& recvData) delete m; //we can deallocate old mail player->SendMailResult(mailId, MAIL_RETURNED_TO_SENDER, MAIL_OK); - sCharacterCache->DecreaseCharacterMailCount(player->GetGUID()); + sMailMgr->OnMailDeleted(player->GetGUID().GetCounter()); } //called when player takes item attached in mail diff --git a/src/server/game/Mails/Mail.cpp b/src/server/game/Mails/Mail.cpp index 81bc4085f..58051dcdb 100644 --- a/src/server/game/Mails/Mail.cpp +++ b/src/server/game/Mails/Mail.cpp @@ -24,6 +24,7 @@ #include "GameTime.h" #include "Item.h" #include "Log.h" +#include "MailMgr.h" #include "ObjectMgr.h" #include "Player.h" #include "ScriptMgr.h" @@ -251,7 +252,7 @@ void MailDraft::SendMailTo(CharacterDatabaseTransaction trans, MailReceiver cons trans->Append(stmt); } - sCharacterCache->IncreaseCharacterMailCount(ObjectGuid(HighGuid::Player, receiver.GetPlayerGUIDLow())); + sMailMgr->OnMailSent(receiver.GetPlayerGUIDLow()); // For online receiver update in game mail status and data if (pReceiver) diff --git a/src/server/game/Mails/MailMgr.cpp b/src/server/game/Mails/MailMgr.cpp new file mode 100644 index 000000000..3bb5278fb --- /dev/null +++ b/src/server/game/Mails/MailMgr.cpp @@ -0,0 +1,209 @@ +/* + * This file is part of the AzerothCore Project. See AUTHORS file for Copyright information + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#include "MailMgr.h" +#include "CharacterCache.h" +#include "Common.h" +#include "DatabaseEnv.h" +#include "GameTime.h" +#include "Log.h" +#include "Mail.h" +#include "ObjectAccessor.h" +#include "Timer.h" +#include + +MailMgr* MailMgr::instance() +{ + static MailMgr instance; + return &instance; +} + +void MailMgr::OnMailSent(ObjectGuid::LowType receiverLow) +{ + sCharacterCache->IncreaseCharacterMailCount(ObjectGuid(HighGuid::Player, receiverLow)); +} + +void MailMgr::OnMailDeleted(ObjectGuid::LowType receiverLow) +{ + sCharacterCache->DecreaseCharacterMailCount(ObjectGuid(HighGuid::Player, receiverLow)); +} + +void MailMgr::OnMailReturned(ObjectGuid::LowType oldReceiverLow, ObjectGuid::LowType newReceiverLow) +{ + sCharacterCache->DecreaseCharacterMailCount(ObjectGuid(HighGuid::Player, oldReceiverLow)); + sCharacterCache->IncreaseCharacterMailCount(ObjectGuid(HighGuid::Player, newReceiverLow)); +} + +void MailMgr::LoadMailCounts() +{ + QueryResult result = CharacterDatabase.Query("SELECT receiver, COUNT(receiver) FROM mail GROUP BY receiver"); + if (!result) + return; + + do + { + Field* fields = result->Fetch(); + sCharacterCache->UpdateCharacterMailCount(ObjectGuid(HighGuid::Player, fields[0].Get()), static_cast(fields[1].Get()), true); + } while (result->NextRow()); +} + +void MailMgr::RecountMailCount(ObjectGuid::LowType receiverLow) +{ + int32 count = 0; + if (QueryResult result = CharacterDatabase.Query("SELECT COUNT(*) FROM mail WHERE receiver = {}", receiverLow)) + count = static_cast((*result)[0].Get()); + + sCharacterCache->UpdateCharacterMailCount(ObjectGuid(HighGuid::Player, receiverLow), count, true); +} + +void MailMgr::DeleteEmptyExpiredMail(uint32 mailId, ObjectGuid::LowType receiverLow) +{ + CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_BY_ID); + stmt->SetData(0, mailId); + CharacterDatabase.Execute(stmt); + + OnMailDeleted(receiverLow); +} + +void MailMgr::ReturnOrDeleteOldMails(bool serverUp) +{ + uint32 oldMSTime = getMSTime(); + + time_t curTime = GameTime::GetGameTime().count(); + + CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_EXPIRED_MAIL); + stmt->SetData(0, uint32(curTime)); + PreparedQueryResult result = CharacterDatabase.Query(stmt); + if (!result) + return; + + std::map itemsCache; + stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_EXPIRED_MAIL_ITEMS); + stmt->SetData(0, uint32(curTime)); + if (PreparedQueryResult items = CharacterDatabase.Query(stmt)) + { + MailItemInfo item; + do + { + Field* fields = items->Fetch(); + item.item_guid = fields[0].Get(); + item.item_template = fields[1].Get(); + uint32 mailId = fields[2].Get(); + itemsCache[mailId].push_back(item); + } while (items->NextRow()); + } + + uint32 deletedCount = 0; + uint32 returnedCount = 0; + do + { + Field* fields = result->Fetch(); + Mail* m = new Mail; + m->messageID = fields[0].Get(); + m->messageType = fields[1].Get(); + m->sender = fields[2].Get(); + m->receiver = fields[3].Get(); + bool has_items = fields[4].Get(); + m->expire_time = time_t(fields[5].Get()); + m->deliver_time = time_t(0); + m->stationery = fields[6].Get(); + m->checked = fields[7].Get(); + m->mailTemplateId = fields[8].Get(); + + Player* player = nullptr; + if (serverUp) + player = ObjectAccessor::FindPlayerByLowGUID(m->receiver); + + if (player) // don't modify mails of a logged in player + { + delete m; + continue; + } + + // Keep each mail's correlated writes atomic + CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction(); + + // Delete or return mail + if (has_items) + { + // read items from cache + m->items.swap(itemsCache[m->messageID]); + + // If it is mail from non-player, or if it's already return mail, it shouldn't be returned, but deleted + if (!m->IsSentByPlayer() || m->IsSentByGM() || (m->IsCODPayment() || m->IsReturnedMail())) + { + for (auto const& mailedItem : m->items) + { + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE); + stmt->SetData(0, mailedItem.item_guid); + trans->Append(stmt); + } + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_ITEM_BY_ID); + stmt->SetData(0, m->messageID); + trans->Append(stmt); + } + else + { + // Mail will be returned + stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_MAIL_RETURNED); + stmt->SetData(0, m->receiver); + stmt->SetData(1, m->sender); + stmt->SetData(2, uint32(curTime + 30 * DAY)); + stmt->SetData(3, uint32(curTime)); + stmt->SetData(4, uint8(MAIL_CHECK_MASK_RETURNED)); + stmt->SetData(5, m->messageID); + trans->Append(stmt); + for (auto const& mailedItem : m->items) + { + // Update receiver in mail items for its proper delivery, and in instance_item for avoid lost item at sender delete + stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_MAIL_ITEM_RECEIVER); + stmt->SetData(0, m->sender); + stmt->SetData(1, mailedItem.item_guid); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_ITEM_OWNER); + stmt->SetData(0, m->sender); + stmt->SetData(1, mailedItem.item_guid); + trans->Append(stmt); + } + + CharacterDatabase.CommitTransaction(trans); + + OnMailReturned(m->receiver, m->sender); + + delete m; + ++returnedCount; + continue; + } + } + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_BY_ID); + stmt->SetData(0, m->messageID); + trans->Append(stmt); + + CharacterDatabase.CommitTransaction(trans); + + OnMailDeleted(m->receiver); + + delete m; + ++deletedCount; + } while (result->NextRow()); + + LOG_INFO("server.loading", ">> Processed {} expired mails: {} deleted and {} returned in {} ms", deletedCount + returnedCount, deletedCount, returnedCount, GetMSTimeDiffToNow(oldMSTime)); + LOG_INFO("server.loading", " "); +} diff --git a/src/server/game/Mails/MailMgr.h b/src/server/game/Mails/MailMgr.h new file mode 100644 index 000000000..b8a9f69d8 --- /dev/null +++ b/src/server/game/Mails/MailMgr.h @@ -0,0 +1,87 @@ +/* + * This file is part of the AzerothCore Project. See AUTHORS file for Copyright information + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#ifndef _MAILMGR_H +#define _MAILMGR_H + +#include "Define.h" +#include "ObjectGuid.h" + +/** + * @brief Owns the mail lifecycle bookkeeping that lives outside a single player + * session: the per-character mail count mirrored in CharacterCache and the + * cleanup of expired mail. + * + * Every code path that inserts or deletes a row in the characters `mail` table + * must report it here, otherwise the cached count drifts until the next recount. + */ +class AC_GAME_API MailMgr +{ +public: + static MailMgr* instance(); + + /** + * @brief Reports a mail row inserted for a character. + * @param receiverLow Low GUID of the mail receiver + */ + void OnMailSent(ObjectGuid::LowType receiverLow); + + /** + * @brief Reports a mail row deleted from a character's mailbox. + * @param receiverLow Low GUID of the mail receiver + */ + void OnMailDeleted(ObjectGuid::LowType receiverLow); + + /** + * @brief Reports a mail row handed to a new receiver (return to sender). + * @param oldReceiverLow Low GUID of the previous receiver + * @param newReceiverLow Low GUID of the new receiver + */ + void OnMailReturned(ObjectGuid::LowType oldReceiverLow, ObjectGuid::LowType newReceiverLow); + + /** + * @brief Recounts the mail of all characters from the database. + * Called once at startup after the character cache is filled. + */ + void LoadMailCounts(); + + /** + * @brief Recounts one character's mail from the database, overwriting the + * cached value. + * @param receiverLow Low GUID of the character to recount + */ + void RecountMailCount(ObjectGuid::LowType receiverLow); + + /** + * @brief Deletes an expired mail row that has no items, money or COD + * attached. Used at login for mail that would otherwise stay invisible in + * the DB until ReturnOrDeleteOldMails catches the receiver offline. + * @param mailId Id of the mail row to delete + * @param receiverLow Low GUID of the mail receiver + */ + void DeleteEmptyExpiredMail(uint32 mailId, ObjectGuid::LowType receiverLow); + + /** + * @brief Returns expired mail with items to the sender and deletes the rest. + * @param serverUp When true, receivers that are currently online are skipped. + */ + void ReturnOrDeleteOldMails(bool serverUp); +}; + +#define sMailMgr MailMgr::instance() + +#endif diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index f2deafa83..f68c524c5 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -61,6 +61,7 @@ #include "LootItemStorage.h" #include "LootMgr.h" #include "M2Stores.h" +#include "MailMgr.h" #include "MapMgr.h" #include "Metric.h" #include "MotdMgr.h" @@ -847,7 +848,7 @@ void World::SetInitialWorldSettings() ///- Handle outdated emails (delete/return) LOG_INFO("server.loading", "Returning Old Mails..."); LOG_INFO("server.loading", " "); - sObjectMgr->ReturnOrDeleteOldMails(false); + sMailMgr->ReturnOrDeleteOldMails(false); ///- Load AutoBroadCast LOG_INFO("server.loading", "Loading Autobroadcasts..."); @@ -1196,7 +1197,7 @@ void World::Update(uint32 diff) if (currentGameTime > _mail_expire_check_timer) { - sObjectMgr->ReturnOrDeleteOldMails(true); + sMailMgr->ReturnOrDeleteOldMails(true); _mail_expire_check_timer = currentGameTime + 6h; } diff --git a/src/server/scripts/Commands/cs_cache.cpp b/src/server/scripts/Commands/cs_cache.cpp index 6f7899824..3c0866197 100644 --- a/src/server/scripts/Commands/cs_cache.cpp +++ b/src/server/scripts/Commands/cs_cache.cpp @@ -19,6 +19,7 @@ #include "CommandScript.h" #include "Group.h" #include "Language.h" +#include "MailMgr.h" #include "Player.h" #include "RBAC.h" @@ -122,7 +123,7 @@ public: sCharacterCache->UpdateCharacterAccountId(cPlayer->GetGUID(), cPlayer->GetSession()->GetAccountId()); sCharacterCache->UpdateCharacterGuildId(cPlayer->GetGUID(), cPlayer->GetGuildId()); - sCharacterCache->UpdateCharacterMailCount(cPlayer->GetGUID(), cPlayer->GetMailSize(), true); + sMailMgr->RecountMailCount(cPlayer->GetGUID().GetCounter()); sCharacterCache->UpdateCharacterArenaTeamId(cPlayer->GetGUID(), ARENA_SLOT_2v2, cPlayer->GetArenaTeamId(ARENA_SLOT_2v2)); sCharacterCache->UpdateCharacterArenaTeamId(cPlayer->GetGUID(), ARENA_SLOT_3v3, cPlayer->GetArenaTeamId(ARENA_SLOT_3v3)); sCharacterCache->UpdateCharacterArenaTeamId(cPlayer->GetGUID(), ARENA_SLOT_5v5, cPlayer->GetArenaTeamId(ARENA_SLOT_5v5)); diff --git a/src/server/scripts/Commands/cs_mail.cpp b/src/server/scripts/Commands/cs_mail.cpp index d8f09f85b..b646de392 100644 --- a/src/server/scripts/Commands/cs_mail.cpp +++ b/src/server/scripts/Commands/cs_mail.cpp @@ -23,6 +23,7 @@ #include "GameTime.h" #include "Language.h" #include "Mail.h" +#include "MailMgr.h" #include "ObjectAccessor.h" #include "ObjectMgr.h" #include "Player.h" @@ -391,7 +392,7 @@ public: CharacterDatabase.CommitTransaction(trans); - sCharacterCache->DecreaseCharacterMailCount(ObjectGuid(HighGuid::Player, receiver)); + sMailMgr->OnMailDeleted(receiver); handler->PSendSysMessage(LANG_MAIL_RETURN_SUCCESS, mailId, handler->playerLink(target.GetName())); return true; From 86ca0e875c2f527dc57ca62f440b6bd2be8aeeef Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Thu, 23 Jul 2026 21:34:18 -0300 Subject: [PATCH 115/134] fix(DB/Creature): Auriaya's Feral Defender overtuned melee damage (#26761) --- data/sql/updates/pending_db_world/rev_1784848474071730700.sql | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1784848474071730700.sql diff --git a/data/sql/updates/pending_db_world/rev_1784848474071730700.sql b/data/sql/updates/pending_db_world/rev_1784848474071730700.sql new file mode 100644 index 000000000..d74d518ee --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1784848474071730700.sql @@ -0,0 +1,4 @@ +-- Feral Defender melee was calibrated for physical school mitigated by armor, +-- but it deals shadow damage and Feral Essence multiplies it by up to 5. +UPDATE `creature_template` SET `DamageModifier` = 2.6 WHERE `entry` = 34035; +UPDATE `creature_template` SET `DamageModifier` = 5.2 WHERE `entry` = 34171; From 44df0285cee7f948fd73440ec18fa4a7e0dc6fda Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 24 Jul 2026 00:35:48 +0000 Subject: [PATCH 116/134] chore(DB): import pending files Referenced commit(s): 86ca0e875c2f527dc57ca62f440b6bd2be8aeeef --- .../rev_1784848474071730700.sql => db_world/2026_07_24_00.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1784848474071730700.sql => db_world/2026_07_24_00.sql} (87%) diff --git a/data/sql/updates/pending_db_world/rev_1784848474071730700.sql b/data/sql/updates/db_world/2026_07_24_00.sql similarity index 87% rename from data/sql/updates/pending_db_world/rev_1784848474071730700.sql rename to data/sql/updates/db_world/2026_07_24_00.sql index d74d518ee..57dd754d1 100644 --- a/data/sql/updates/pending_db_world/rev_1784848474071730700.sql +++ b/data/sql/updates/db_world/2026_07_24_00.sql @@ -1,3 +1,4 @@ +-- DB update 2026_07_23_03 -> 2026_07_24_00 -- Feral Defender melee was calibrated for physical school mitigated by armor, -- but it deals shadow damage and Feral Essence multiplies it by up to 5. UPDATE `creature_template` SET `DamageModifier` = 2.6 WHERE `entry` = 34035; From c9317a79401f7e93fef2510e52d457ec2e99b2e1 Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Thu, 23 Jul 2026 21:39:39 -0300 Subject: [PATCH 117/134] fix(Scripts/Ulduar): overhaul Auriaya's Feral Defender (#26762) Co-authored-by: Keader --- .../rev_1784846222197249400.sql | 7 + .../Northrend/Ulduar/Ulduar/boss_auriaya.cpp | 207 +++++++++++++----- .../Northrend/Ulduar/Ulduar/ulduar.cpp | 28 +++ 3 files changed, 189 insertions(+), 53 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1784846222197249400.sql diff --git a/data/sql/updates/pending_db_world/rev_1784846222197249400.sql b/data/sql/updates/pending_db_world/rev_1784846222197249400.sql new file mode 100644 index 000000000..b0244b5da --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1784846222197249400.sql @@ -0,0 +1,7 @@ +-- +DELETE FROM `spell_script_names` WHERE `ScriptName` IN ('spell_ulduar_random_aggro_periodic', 'spell_auriaya_feral_essence_removal', 'spell_auriaya_feral_rush'); +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(61906, 'spell_ulduar_random_aggro_periodic'), +(64456, 'spell_auriaya_feral_essence_removal'), +(64496, 'spell_auriaya_feral_rush'), +(64674, 'spell_auriaya_feral_rush'); diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp index 913e2c32d..e4ba147e7 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp @@ -42,9 +42,18 @@ enum AuriayaSpells // Feral Defender SPELL_FERAL_ESSENCE = 64455, + SPELL_FERAL_ESSENCE_REMOVAL = 64456, + SPELL_SUMMON_ESSENCE = 64457, SPELL_FERAL_POUNCE = 64478, SPELL_FERAL_RUSH = 64496, - //SPELL_SEEPING_FERAL_ESSENCE_SUMMON = 64457, + SPELL_FERAL_RUSH_2 = 64489, + SPELL_SHADOW_PAWS = 64479, + SPELL_REDUCE_CRIT_CHANCE = 64481, + SPELL_RANDOM_AGGRO_PERIODIC = 61906, + SPELL_PERMANENT_FEIGN_DEATH = 58951, + SPELL_CLEAR_ALL_DEBUFFS = 34098, + SPELL_DROWNED_STATE = 64462, + SPELL_FULL_HEAL = 64460, SPELL_SEEPING_FERAL_ESSENCE = 64458, }; @@ -64,7 +73,6 @@ enum AuriayaEvents EVENT_GUARDIAN_SWARM = 4, EVENT_SENTINEL_BLAST = 5, EVENT_REMOVE_IMMUNE = 6, - EVENT_RESPAWN_FERAL_DEFENDER = 7, // Sanctum Sentry EVENT_SAVAGE_POUNCE = 8, @@ -73,6 +81,9 @@ enum AuriayaEvents // Feral Defender EVENT_FERAL_RUSH = 10, EVENT_FERAL_POUNCE = 11, + EVENT_RESPAWN_DEFENDER = 12, + EVENT_RESPAWN_DEFENDER_2 = 13, + EVENT_RESPAWN_DEFENDER_3 = 14, }; enum Texts @@ -87,10 +98,8 @@ enum Texts enum Misc { - ACTION_FERAL_RESPAWN = 1, ACTION_FERAL_DEATH = 2, ACTION_DESPAWN_ADDS = 3, - ACTION_FERAL_DEATH_WITH_STACK = 4, ACTION_SENTRY_DEATH = 5, DATA_CRAZY_CAT = 10, @@ -178,9 +187,7 @@ struct boss_auriaya : public BossAI void DoAction(int32 param) override { - if (param == ACTION_FERAL_DEATH_WITH_STACK) - events.ScheduleEvent(EVENT_RESPAWN_FERAL_DEFENDER, 25s); - else if (param == ACTION_FERAL_DEATH) + if (param == ACTION_FERAL_DEATH) _nineLives = true; else if (param == ACTION_SENTRY_DEATH) _feralDied = true; @@ -217,12 +224,6 @@ struct boss_auriaya : public BossAI events.Repeat(35s); events.DelayEvents(5s, 0); break; - case EVENT_RESPAWN_FERAL_DEFENDER: - { - EntryCheckPredicate pred(NPC_FERAL_DEFENDER); - summons.DoAction(ACTION_FERAL_RESPAWN, pred); - break; - } } } }; @@ -288,21 +289,38 @@ struct npc_auriaya_sanctum_sentry : public ScriptedAI } }; +class CatsTargetSelector +{ +public: + CatsTargetSelector(Unit const* unit, float minDist, float maxDist) : _me(unit), _minDist(minDist), _maxDist(maxDist) { } + + bool operator()(Unit* unit) const + { + float dist = _me->GetDistance(unit); + return unit->IsPlayer() && dist >= _minDist && dist < _maxDist && _me->IsWithinLOSInMap(unit); + } + +private: + Unit const* _me; + float _minDist; + float _maxDist; +}; + struct npc_auriaya_feral_defender : public ScriptedAI { npc_auriaya_feral_defender(Creature* creature) : ScriptedAI(creature), _summons(creature) { } - uint8 _feralEssenceStack{8}; SummonList _summons; void Reset() override { events.Reset(); _summons.DespawnAll(); - _feralEssenceStack = 8; - if (Aura* aur = me->AddAura(SPELL_FERAL_ESSENCE, me)) - aur->SetStackAmount(_feralEssenceStack); + DoCastSelf(SPELL_SHADOW_PAWS, true); + DoCastSelf(SPELL_REDUCE_CRIT_CHANCE, true); + me->SetAuraStack(SPELL_FERAL_ESSENCE, me, 8); + DoCastSelf(SPELL_RANDOM_AGGRO_PERIODIC, true); } void JustEngagedWith(Unit*) override @@ -311,43 +329,45 @@ struct npc_auriaya_feral_defender : public ScriptedAI events.ScheduleEvent(EVENT_FERAL_POUNCE, 6s); } + void JustSummoned(Creature* summon) override + { + _summons.Summon(summon); + } + + void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) override + { + if (damage >= me->GetHealth() && me->HasAura(SPELL_FERAL_ESSENCE)) + { + damage = 0; + if (!me->HasAura(SPELL_PERMANENT_FEIGN_DEATH)) + { + me->SetReactState(REACT_PASSIVE); + me->AttackStop(); + me->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE); + me->RemoveAurasDueToSpell(SPELL_RANDOM_AGGRO_PERIODIC); + DoCastSelf(SPELL_PERMANENT_FEIGN_DEATH, true); + DoCastSelf(SPELL_FERAL_ESSENCE_REMOVAL, true); + DoCastSelf(SPELL_SUMMON_ESSENCE, true); + DoCastSelf(SPELL_CLEAR_ALL_DEBUFFS, true); + DoResetThreatList(); + events.ScheduleEvent(EVENT_RESPAWN_DEFENDER, 30s); + events.CancelEvent(EVENT_FERAL_RUSH); + } + } + } + void JustDied(Unit*) override { + DoCastSelf(SPELL_SUMMON_ESSENCE, true); + if (InstanceScript* instance = me->GetInstanceScript()) if (Creature* cr = instance->GetCreature(BOSS_AURIAYA)) - cr->AI()->DoAction(_feralEssenceStack ? ACTION_FERAL_DEATH_WITH_STACK : ACTION_FERAL_DEATH); - - if (_feralEssenceStack) - { - if (Creature* cr = me->SummonCreature(NPC_SEEPING_FERAL_ESSENCE, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0.0f)) - _summons.Summon(cr); - - --_feralEssenceStack; - } + cr->AI()->DoAction(ACTION_FERAL_DEATH); } void DoAction(int32 param) override { - if (param == ACTION_FERAL_RESPAWN) - { - me->setDeathState(DeathState::JustRespawned); - - if (Player* target = SelectTargetFromPlayerList(200)) - AttackStart(target); - else - { - _summons.DespawnAll(); - me->DespawnOrUnsummon(1ms); - } - - if (_feralEssenceStack) - if (Aura* aur = me->AddAura(SPELL_FERAL_ESSENCE, me)) - aur->SetStackAmount(_feralEssenceStack); - - events.ScheduleEvent(EVENT_FERAL_RUSH, 3s); - events.ScheduleEvent(EVENT_FERAL_POUNCE, 6s); - } - else if (param == ACTION_DESPAWN_ADDS) + if (param == ACTION_DESPAWN_ADDS) _summons.DespawnAll(); } @@ -364,15 +384,51 @@ struct npc_auriaya_feral_defender : public ScriptedAI switch (events.ExecuteEvent()) { case EVENT_FERAL_RUSH: - DoResetThreatList(); - if (!UpdateVictim()) - return; - DoCastVictim(SPELL_FERAL_RUSH, true); - events.Repeat(6s); + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, CatsTargetSelector(me, 10.0f, 11.0f))) + { + DoCast(target, SPELL_FERAL_RUSH, true); + events.Repeat(5s); + break; + } + events.Repeat(1s); break; case EVENT_FERAL_POUNCE: - DoCastVictim(SPELL_FERAL_POUNCE); - events.Repeat(6s); + { + Unit* victim = me->GetVictim(); + if (me->GetReactState() != REACT_PASSIVE && victim) + { + float distance = me->GetDistance2d(victim); + if (distance > 5.0f && distance <= 45.0f) + { + DoCastVictim(SPELL_FERAL_POUNCE); + events.Repeat(5s); + break; + } + } + events.Repeat(1s); + break; + } + case EVENT_RESPAWN_DEFENDER: + me->SetDisableGravity(true); + me->SetHover(true); + DoCastSelf(SPELL_DROWNED_STATE, true); + events.ScheduleEvent(EVENT_RESPAWN_DEFENDER_2, 3s); + events.ScheduleEvent(EVENT_RESPAWN_DEFENDER_3, 5s); + break; + case EVENT_RESPAWN_DEFENDER_2: + me->RemoveAurasDueToSpell(SPELL_DROWNED_STATE); + break; + case EVENT_RESPAWN_DEFENDER_3: + me->RemoveAurasDueToSpell(SPELL_PERMANENT_FEIGN_DEATH); + DoCastSelf(SPELL_FULL_HEAL, true); + me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE); + me->SetReactState(REACT_AGGRESSIVE); + me->SetDisableGravity(false); + me->SetHover(false); + DoCastSelf(SPELL_RANDOM_AGGRO_PERIODIC, true); + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true)) + AttackStart(target); + events.ScheduleEvent(EVENT_FERAL_RUSH, 1s); break; } @@ -395,6 +451,49 @@ class spell_auriaya_sentinel_blast : public SpellScript } }; +// 64456 - Feral Essence Application Removal +class spell_auriaya_feral_essence_removal : public SpellScript +{ + PrepareSpellScript(spell_auriaya_feral_essence_removal); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_FERAL_ESSENCE }); + } + + void HandleScriptEffect(SpellEffIndex /*effIndex*/) + { + if (Aura* essence = GetCaster()->GetAura(SPELL_FERAL_ESSENCE)) + essence->ModStackAmount(-1); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_auriaya_feral_essence_removal::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +// 64496, 64674 - Feral Rush +class spell_auriaya_feral_rush : public SpellScript +{ + PrepareSpellScript(spell_auriaya_feral_rush); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_FERAL_RUSH_2 }); + } + + void HandleOnHit(SpellEffIndex /*effIndex*/) + { + GetCaster()->CastSpell(GetCaster(), SPELL_FERAL_RUSH_2, true); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_auriaya_feral_rush::HandleOnHit, EFFECT_1, SPELL_EFFECT_SCHOOL_DAMAGE); + } +}; + class achievement_auriaya_crazy_cat_lady : public AchievementCriteriaScript { public: @@ -434,6 +533,8 @@ void AddSC_boss_auriaya() RegisterUlduarCreatureAI(npc_auriaya_feral_defender); RegisterSpellScript(spell_auriaya_sentinel_blast); + RegisterSpellScript(spell_auriaya_feral_essence_removal); + RegisterSpellScript(spell_auriaya_feral_rush); new achievement_auriaya_crazy_cat_lady(); new achievement_auriaya_nine_lives(); diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.cpp index 411e9ac10..406422e05 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.cpp @@ -239,6 +239,33 @@ class spell_ulduar_energy_sap_aura : public AuraScript } }; +// 61906 - Random Aggro Periodic (5 sec) +class spell_ulduar_random_aggro_periodic : public AuraScript +{ + PrepareAuraScript(spell_ulduar_random_aggro_periodic); + + void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) + { + Unit* target = GetTarget(); + target->GetThreatMgr().ResetAllThreat(); + + Creature* creature = target->ToCreature(); + if (!creature || !creature->IsAIEnabled) + return; + + if (Unit* victim = creature->AI()->SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true)) + { + creature->AddThreat(victim, 3000000.0f); + creature->AI()->AttackStart(victim); + } + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_ulduar_random_aggro_periodic::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + } +}; + struct npc_ulduar_snow_mound : public ScriptedAI { npc_ulduar_snow_mound(Creature* creature) : ScriptedAI(creature) @@ -590,6 +617,7 @@ void AddSC_ulduar() new npc_ulduar_keeper(); RegisterSpellScript(spell_ulduar_teleporter); RegisterSpellScript(spell_ulduar_energy_sap_aura); + RegisterSpellScript(spell_ulduar_random_aggro_periodic); RegisterUlduarCreatureAI(npc_ulduar_snow_mound); RegisterUlduarCreatureAI(npc_ulduar_storm_tempered_keeper); RegisterUlduarCreatureAI(npc_ulduar_arachnopod_destroyer); From 46f351072e7b151aa5b271e7486784aa6f108b79 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 24 Jul 2026 00:41:27 +0000 Subject: [PATCH 118/134] chore(DB): import pending files Referenced commit(s): 44df0285cee7f948fd73440ec18fa4a7e0dc6fda --- .../rev_1784846222197249400.sql => db_world/2026_07_24_01.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1784846222197249400.sql => db_world/2026_07_24_01.sql} (90%) diff --git a/data/sql/updates/pending_db_world/rev_1784846222197249400.sql b/data/sql/updates/db_world/2026_07_24_01.sql similarity index 90% rename from data/sql/updates/pending_db_world/rev_1784846222197249400.sql rename to data/sql/updates/db_world/2026_07_24_01.sql index b0244b5da..b8523b3c5 100644 --- a/data/sql/updates/pending_db_world/rev_1784846222197249400.sql +++ b/data/sql/updates/db_world/2026_07_24_01.sql @@ -1,3 +1,4 @@ +-- DB update 2026_07_24_00 -> 2026_07_24_01 -- DELETE FROM `spell_script_names` WHERE `ScriptName` IN ('spell_ulduar_random_aggro_periodic', 'spell_auriaya_feral_essence_removal', 'spell_auriaya_feral_rush'); INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES From a95dff8ca03b3ef06e23ac5f6c653f3d181cf677 Mon Sep 17 00:00:00 2001 From: daobashun <49193927+fangshun2004@users.noreply.github.com> Date: Fri, 24 Jul 2026 12:10:08 +0800 Subject: [PATCH 119/134] fix(Core): SMART_ACTION_ESCORT_STOP now stops a repeating escort path (#26455) Co-authored-by: sudlud --- src/server/game/AI/SmartScripts/SmartAI.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/server/game/AI/SmartScripts/SmartAI.cpp b/src/server/game/AI/SmartScripts/SmartAI.cpp index 18e3cbcfa..bdbb5cba5 100644 --- a/src/server/game/AI/SmartScripts/SmartAI.cpp +++ b/src/server/game/AI/SmartScripts/SmartAI.cpp @@ -338,6 +338,8 @@ void SmartAI::StopPath(uint32 DespawnTime, uint32 quest, bool fail) if (quest) mEscortQuestID = quest; + mCanRepeatPath = false; + SetDespawnTime(DespawnTime); if (me->GetMotionMaster()->GetMotionSlotType(MOTION_SLOT_ACTIVE) == ESCORT_MOTION_TYPE) From 17abd043385acebab6a0c4cd3048a9dc7cb527c4 Mon Sep 17 00:00:00 2001 From: Vox Date: Fri, 24 Jul 2026 00:13:15 -0400 Subject: [PATCH 120/134] fix(DB): The Avalanche sub-Zone Improvements Part 2: Urgreth of the Thousand Tombs (#26764) --- .../rev_1784852139513895100.sql | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1784852139513895100.sql diff --git a/data/sql/updates/pending_db_world/rev_1784852139513895100.sql b/data/sql/updates/pending_db_world/rev_1784852139513895100.sql new file mode 100644 index 000000000..209c78660 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1784852139513895100.sql @@ -0,0 +1,18 @@ +-- -------------------------------------------------------------------------------------------- +-- Sholazar Basin (Northrend, map 571) +-- The Avalanche sub-Zone Improvements Part 2: Urgreth of the Thousand Tombs +-- NPC Updates, waypoints, etc +-- ------------------------------------------- +-- Urgreth of the Thousand Tombs (Entry 28103, GUID 114741) +-- Out of combat yell texts and emotes +DELETE FROM `creature_text` WHERE `CreatureID`= 28103 AND `GroupID`= 1; +INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES + (28103, 1, 0, 'Onward, you maggots! This land is the Lich King''s now!', 14, 0, 100, 53, 0, 0, 27537, 0, 'Urgreth of the Thousand Tombs'), + (28103, 1, 1, 'Nothing can stop the Scourge! Nothing!', 14, 0, 100, 53, 0, 0, 27538, 0, 'Urgreth of the Thousand Tombs'), + (28103, 1, 2, 'Crush anything that stands in your path! For the Lich King!', 14, 0, 100, 53, 0, 0, 27539, 0, 'Urgreth of the Thousand Tombs'); + +DELETE FROM `smart_scripts` WHERE `entryorguid`= 28103 AND `source_type`= 0 AND `id`= 3; +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 +(28103, 0, 3, 0, 1, 0, 100, 0, 90000, 175000, 90000, 175000, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Urgreth of the Thousand Tombs - Out of Combat - Say Line 1'); +-- Correct sheathe state +UPDATE `creature_template_addon` SET `bytes2` = 1 WHERE (`entry` = 28103); From 331c3ca1feaa1b8c939f6107721f8f145ce0a2a4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 24 Jul 2026 04:14:25 +0000 Subject: [PATCH 121/134] chore(DB): import pending files Referenced commit(s): 17abd043385acebab6a0c4cd3048a9dc7cb527c4 --- .../rev_1784852139513895100.sql => db_world/2026_07_24_02.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1784852139513895100.sql => db_world/2026_07_24_02.sql} (97%) diff --git a/data/sql/updates/pending_db_world/rev_1784852139513895100.sql b/data/sql/updates/db_world/2026_07_24_02.sql similarity index 97% rename from data/sql/updates/pending_db_world/rev_1784852139513895100.sql rename to data/sql/updates/db_world/2026_07_24_02.sql index 209c78660..9d7aaf8f4 100644 --- a/data/sql/updates/pending_db_world/rev_1784852139513895100.sql +++ b/data/sql/updates/db_world/2026_07_24_02.sql @@ -1,3 +1,4 @@ +-- DB update 2026_07_24_01 -> 2026_07_24_02 -- -------------------------------------------------------------------------------------------- -- Sholazar Basin (Northrend, map 571) -- The Avalanche sub-Zone Improvements Part 2: Urgreth of the Thousand Tombs From af7bc95fad642043967cb8a13e41efb423e30400 Mon Sep 17 00:00:00 2001 From: mostlynick3 Date: Fri, 24 Jul 2026 07:51:10 +0200 Subject: [PATCH 122/134] feat(apps/docker): use Ninja to improve build error visibility (#26281) --- apps/docker/Dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/docker/Dockerfile b/apps/docker/Dockerfile index 8b4ff60b2..d679c708f 100644 --- a/apps/docker/Dockerfile +++ b/apps/docker/Dockerfile @@ -64,7 +64,7 @@ ARG CCACHE_LOGFILE="" RUN apt-get update \ && apt-get install -y --no-install-recommends \ - build-essential ccache libtool cmake-data make cmake clang \ + build-essential ccache libtool cmake-data ninja-build 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 liblzma-dev \ @@ -89,6 +89,7 @@ RUN --mount=type=cache,target=/ccache,sharing=locked \ --mount=type=bind,target=/azerothcore/.git,source=.git \ git config --global --add safe.directory /azerothcore \ && cmake /azerothcore \ + -G Ninja \ -DCMAKE_INSTALL_PREFIX="/azerothcore/env/dist" \ -DAPPS_BUILD="all" \ -DTOOLS_BUILD="$CTOOLS_BUILD" \ From d1331412e63ae2b90f1f24542b70e25b373b47b4 Mon Sep 17 00:00:00 2001 From: Yehonal <147092+Yehonal@users.noreply.github.com> Date: Fri, 24 Jul 2026 05:51:54 +0000 Subject: [PATCH 123/134] fix(Core/Spells): clear stale spellmod tracking spell (#26535) --- src/server/game/Spells/Spell.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 4ce8e3870..9847c0bf5 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -695,6 +695,10 @@ Spell::Spell(Unit* caster, SpellInfo const* info, TriggerCastFlags triggerFlags, Spell::~Spell() { + if (Player* modOwner = m_caster ? m_caster->GetSpellModOwner() : nullptr) + if (modOwner->m_spellModTakingSpell == this) + modOwner->SetSpellModTakingSpell(this, false); + // unload scripts while (!m_loadedScripts.empty()) { @@ -4469,6 +4473,9 @@ void Spell::finish(bool ok) return; m_spellState = SPELL_STATE_FINISHED; + if (Player* modOwner = m_caster->GetSpellModOwner()) + modOwner->SetSpellModTakingSpell(this, false); + if (m_spellInfo->IsChanneled()) m_caster->UpdateInterruptMask(); From ca5b38fb6c7d3c00f7f37322fbf3fb47edd6fdf0 Mon Sep 17 00:00:00 2001 From: Gazeshooter <221618862+Gazeshooter@users.noreply.github.com> Date: Fri, 24 Jul 2026 07:53:21 +0100 Subject: [PATCH 124/134] fix(DB/GameObject): correct Higher Learning pooled respawn cycle (#26439) --- .../rev_1783977805714123300.sql | 28 +++++++++++++++++++ .../game/Entities/GameObject/GameObject.cpp | 5 +++- 2 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 data/sql/updates/pending_db_world/rev_1783977805714123300.sql diff --git a/data/sql/updates/pending_db_world/rev_1783977805714123300.sql b/data/sql/updates/pending_db_world/rev_1783977805714123300.sql new file mode 100644 index 000000000..ed0b895a7 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1783977805714123300.sql @@ -0,0 +1,28 @@ +-- Higher Learning +UPDATE `smart_scripts` SET + `action_type` = 41, + `action_param1` = 0, + `action_param2` = 0, + `action_param3` = 0, + `action_param4` = 0, + `action_param5` = 0, + `action_param6` = 0, + `comment` = 'Higher Learning - Timed Event Triggered - Force Despawn' +WHERE `entryorguid` IN ( + 192708, 192706, 192871, 192905, + 192710, 192886, 192869, 192880, 192895, + 192713, 192889, 192890, 192894, 192884, + 192866, 192891, 192872, 192881, + 192709, 192883, 192651, 192888, + 192711, 192653, 192887, 192652, + 192865, 192874, 192868, 192870, 192885, + 192867, 192882, 192707, 192896 +) + AND `source_type` = 1 + AND `id` = 1 + AND `link` = 0 + AND `event_type` = 59 + AND `event_param1` = 1 + AND `action_type` = 99 + AND `action_param1` = 3 + AND `target_type` = 1; diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index ff5984b1f..206d01e07 100644 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -962,7 +962,10 @@ void GameObject::DespawnOrUnsummon(Milliseconds delay /*= 0ms*/, Seconds forceRe } uint32 poolid = m_spawnId ? sPoolMgr->IsPartOfAPool(m_spawnId) : 0; - if (poolid) + + // Keep the current pooled gameobject reserved until its respawn timer expires. + // GameObject::Update() will update the pool when the object is ready to respawn. + if (poolid && !m_respawnTime) { sPoolMgr->UpdatePool(poolid, m_spawnId); } From 38dc96259c888dd74670110e695dd8a61a4e93b4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 24 Jul 2026 06:54:34 +0000 Subject: [PATCH 125/134] chore(DB): import pending files Referenced commit(s): ca5b38fb6c7d3c00f7f37322fbf3fb47edd6fdf0 --- .../rev_1783977805714123300.sql => db_world/2026_07_24_03.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1783977805714123300.sql => db_world/2026_07_24_03.sql} (94%) diff --git a/data/sql/updates/pending_db_world/rev_1783977805714123300.sql b/data/sql/updates/db_world/2026_07_24_03.sql similarity index 94% rename from data/sql/updates/pending_db_world/rev_1783977805714123300.sql rename to data/sql/updates/db_world/2026_07_24_03.sql index ed0b895a7..ed48c8163 100644 --- a/data/sql/updates/pending_db_world/rev_1783977805714123300.sql +++ b/data/sql/updates/db_world/2026_07_24_03.sql @@ -1,3 +1,4 @@ +-- DB update 2026_07_24_02 -> 2026_07_24_03 -- Higher Learning UPDATE `smart_scripts` SET `action_type` = 41, From 6c104dfba02c7544c5bfd46b1efc1058a6130156 Mon Sep 17 00:00:00 2001 From: moostigre Date: Fri, 24 Jul 2026 09:03:00 +0200 Subject: [PATCH 126/134] fix(Core/GameObject): clean up stale fishing bobbers (#26453) Co-authored-by: sudlud --- .../game/Entities/GameObject/GameObject.cpp | 8 +++--- src/server/game/Entities/Unit/Unit.cpp | 26 +++++++++++++++++++ src/server/game/Entities/Unit/Unit.h | 1 + src/server/game/Spells/SpellEffects.cpp | 3 +++ 4 files changed, 33 insertions(+), 5 deletions(-) diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index 206d01e07..dbfc27b93 100644 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -634,7 +634,7 @@ void GameObject::Update(uint32 diff) WorldPacket data(SMSG_FISH_ESCAPED, 0); caster->ToPlayer()->SendDirectMessage(&data); } - // can be delete + // can be deleted m_lootState = GO_JUST_DEACTIVATED; return; } @@ -1775,10 +1775,8 @@ void GameObject::Use(Unit* user) // but you will likely cause junk in areas that require a high fishing skill (not yet implemented) if (chance >= roll) { - //TODO: I do not understand this hack. Need some explanation. - // prevent removing GO at spell cancel - RemoveFromOwner(); - SetOwnerGUID(player->GetGUID()); + // Keep the bobber owned while loot is open, but clear the + // spell id so finishing the fishing channel does not delete it. SetSpellId(0); // prevent removing unintended auras at Unit::RemoveGameObject // fishing pool catch diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index e76d6597b..3aefb59a4 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -6640,6 +6640,32 @@ void Unit::RemoveGameObject(uint32 spellid, bool del) } } +void Unit::RemoveGameObjectsByType(GameobjectTypes type, bool del) +{ + if (m_gameObj.empty()) + return; + + for (GameObjectList::iterator itr = m_gameObj.begin(); itr != m_gameObj.end();) + { + if (GameObject* go = ObjectAccessor::GetGameObject(*this, *itr)) + { + if (go->GetGoType() != type) + { + ++itr; + continue; + } + + go->SetOwnerGUID(ObjectGuid::Empty); + if (del) + { + go->SetRespawnTime(0); + go->Delete(); + } + } + m_gameObj.erase(itr++); + } +} + void Unit::RemoveAllGameObjects() { while(!m_gameObj.empty()) diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 9f71cd725..f3086462b 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1698,6 +1698,7 @@ public: void AddGameObject(GameObject* gameObj); void RemoveGameObject(GameObject* gameObj, bool del); void RemoveGameObject(uint32 spellid, bool del); + void RemoveGameObjectsByType(GameobjectTypes type, bool del); void RemoveAllGameObjects(); /*********************************************************/ diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 0a441a881..0c57476a5 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -5447,6 +5447,9 @@ void Spell::EffectTransmitted(SpellEffIndex effIndex) { case GAMEOBJECT_TYPE_FISHINGNODE: { + if (m_caster->IsPlayer()) + m_caster->RemoveGameObjectsByType(GAMEOBJECT_TYPE_FISHINGNODE, true); + m_caster->SetGuidValue(UNIT_FIELD_CHANNEL_OBJECT, pGameObj->GetGUID()); m_caster->AddGameObject(pGameObj); // will removed at spell cancel From 10f378bc1d666aa027551366e4ef16bffcf85f84 Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Fri, 24 Jul 2026 06:11:39 -0300 Subject: [PATCH 127/134] fix(Scripts/Naxxramas): despawn summons on boss death (#26770) --- .../scripts/Northrend/Naxxramas/boss_gluth.cpp | 13 +------------ .../scripts/Northrend/Naxxramas/boss_gothik.cpp | 12 +----------- .../Northrend/Naxxramas/boss_grobbulus.cpp | 17 +---------------- .../Northrend/Naxxramas/boss_loatheb.cpp | 6 +----- .../Northrend/Naxxramas/boss_maexxna.cpp | 17 +---------------- .../scripts/Northrend/Naxxramas/boss_noth.cpp | 6 +----- 6 files changed, 6 insertions(+), 65 deletions(-) diff --git a/src/server/scripts/Northrend/Naxxramas/boss_gluth.cpp b/src/server/scripts/Northrend/Naxxramas/boss_gluth.cpp index c57bc427e..0aa6b0550 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_gluth.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_gluth.cpp @@ -76,18 +76,13 @@ public: struct boss_gluthAI : public BossAI { - explicit boss_gluthAI(Creature* c) : BossAI(c, BOSS_GLUTH), summons(me) + explicit boss_gluthAI(Creature* c) : BossAI(c, BOSS_GLUTH) {} - EventMap events; - SummonList summons; - void Reset() override { BossAI::Reset(); me->ApplySpellImmune(SPELL_INFECTED_WOUND, IMMUNITY_ID, SPELL_INFECTED_WOUND, true); - events.Reset(); - summons.DespawnAll(); me->SetReactState(REACT_AGGRESSIVE); } @@ -139,12 +134,6 @@ public: instance->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1); } - void JustDied(Unit* killer) override - { - BossAI::JustDied(killer); - summons.DespawnAll(); - } - bool SelectPlayerInRoom() { if (me->IsInCombat()) diff --git a/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp b/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp index f2be10718..f1a01bdde 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp @@ -186,11 +186,9 @@ public: struct boss_gothikAI : public BossAI { - explicit boss_gothikAI(Creature* c) : BossAI(c, BOSS_GOTHIK), summons(me) + explicit boss_gothikAI(Creature* c) : BossAI(c, BOSS_GOTHIK) {} - EventMap events; - SummonList summons; bool secondPhase{}; bool gateOpened{}; bool lastTeleportDead{}; @@ -209,8 +207,6 @@ public: void Reset() override { BossAI::Reset(); - events.Reset(); - summons.DespawnAll(); me->RemoveUnitFlag(UNIT_FLAG_DISABLE_MOVE); me->SetImmuneToPC(false); me->SetReactState(REACT_PASSIVE); @@ -275,11 +271,6 @@ public: } } - void SummonedCreatureDespawn(Creature* cr) override - { - summons.Despawn(cr); - } - void KilledUnit(Unit* who) override { if (!who->IsPlayer()) @@ -293,7 +284,6 @@ public: { BossAI::JustDied(killer); Talk(SAY_DEATH); - summons.DespawnAll(); } void SummonHelpers(uint32 entry) diff --git a/src/server/scripts/Northrend/Naxxramas/boss_grobbulus.cpp b/src/server/scripts/Northrend/Naxxramas/boss_grobbulus.cpp index 672930c98..3ef6ab875 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_grobbulus.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_grobbulus.cpp @@ -67,18 +67,14 @@ public: struct boss_grobbulusAI : public BossAI { - explicit boss_grobbulusAI(Creature* c) : BossAI(c, BOSS_GROBBULUS), summons(me) + explicit boss_grobbulusAI(Creature* c) : BossAI(c, BOSS_GROBBULUS) {} - EventMap events; - SummonList summons; uint32 dropSludgeTimer{}; void Reset() override { BossAI::Reset(); - events.Reset(); - summons.DespawnAll(); dropSludgeTimer = 0; } @@ -114,17 +110,6 @@ public: summons.Summon(cr); } - void SummonedCreatureDespawn(Creature* summon) override - { - summons.Despawn(summon); - } - - void JustDied(Unit* killer) override - { - BossAI::JustDied(killer); - summons.DespawnAll(); - } - void KilledUnit(Unit* who) override { if (who->IsPlayer()) diff --git a/src/server/scripts/Northrend/Naxxramas/boss_loatheb.cpp b/src/server/scripts/Northrend/Naxxramas/boss_loatheb.cpp index 0a91706ea..48901fbe6 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_loatheb.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_loatheb.cpp @@ -58,20 +58,16 @@ public: struct boss_loathebAI : public BossAI { - explicit boss_loathebAI(Creature* c) : BossAI(c, BOSS_LOATHEB), summons(me) + explicit boss_loathebAI(Creature* c) : BossAI(c, BOSS_LOATHEB) { me->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation()); } uint8 doomCounter; - EventMap events; - SummonList summons; void Reset() override { BossAI::Reset(); - events.Reset(); - summons.DespawnAll(); doomCounter = 0; } diff --git a/src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp b/src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp index 6d3361b38..fd2dc6103 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp @@ -101,12 +101,9 @@ public: struct boss_maexxnaAI : public BossAI { - explicit boss_maexxnaAI(Creature* c) : BossAI(c, BOSS_MAEXXNA), summons(me) + explicit boss_maexxnaAI(Creature* c) : BossAI(c, BOSS_MAEXXNA) {} - EventMap events; - SummonList summons; - GuidList wraps; bool IsInRoom() @@ -119,13 +116,6 @@ public: return true; } - void Reset() override - { - BossAI::Reset(); - events.Reset(); - summons.DespawnAll(); - } - void JustEngagedWith(Unit* who) override { BossAI::JustEngagedWith(who); @@ -157,11 +147,6 @@ public: instance->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1); } - void JustDied(Unit* killer) override - { - BossAI::JustDied(killer); - } - void DoCastWebWrap() { std::list candidates; diff --git a/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp b/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp index 33d6ff391..840c699cc 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp @@ -86,12 +86,10 @@ public: struct boss_nothAI : public BossAI { - explicit boss_nothAI(Creature* c) : BossAI(c, BOSS_NOTH), summons(me) + explicit boss_nothAI(Creature* c) : BossAI(c, BOSS_NOTH) {} uint8 timesInBalcony; - EventMap events; - SummonList summons; void StartGroundPhase() { @@ -140,8 +138,6 @@ public: void Reset() override { BossAI::Reset(); - events.Reset(); - summons.DespawnAll(); me->CastSpell(me, SPELL_TELEPORT_BACK, true); me->SetControlled(false, UNIT_STATE_ROOT); me->SetReactState(REACT_AGGRESSIVE); From 1a7b191da2b0656941bcf142c4e1e980682ed9b3 Mon Sep 17 00:00:00 2001 From: Vox Date: Fri, 24 Jul 2026 05:27:21 -0400 Subject: [PATCH 128/134] fix(db/Creature): Dead Mage Hunter Improvements (#26760) --- .../pending_db_world/rev_1784841270168338100.sql | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1784841270168338100.sql diff --git a/data/sql/updates/pending_db_world/rev_1784841270168338100.sql b/data/sql/updates/pending_db_world/rev_1784841270168338100.sql new file mode 100644 index 000000000..9d0d58da7 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1784841270168338100.sql @@ -0,0 +1,13 @@ +-- -------------------------------------------------------------------------------------------- +-- Dragonblight (Northrend, map 571) +-- Dead Mage Hunter (26477): permanent, randomized corpse appearance +-- ------------------------------------------- +-- Populate spell Serverside - Dead Mage Hunter Transform (47090) with transform effect to Dead Mage Hunter Transform (26476) +UPDATE `spell_dbc` SET `Effect_1` = 6, `EffectAura_1` = 56, `ImplicitTargetA_1` = 1, `EffectMiscValue_1` = 26476 WHERE `ID` = 47090; +-- Dead Mage Hunter (26477) - apply sniffed displayIDs +DELETE FROM `creature_template_model` WHERE `CreatureID` = 26477; +INSERT INTO `creature_template_model` (`CreatureID`, `Idx`, `CreatureDisplayID`, `DisplayScale`, `Probability`, `VerifiedBuild`) VALUES +(26477, 0, 16888, 1, 0, 51831), +(26477, 1, 11686, 1, 1, 51831); +-- Dead Mage Hunter (26477) - apply blanket transform spell as aura +UPDATE `creature_template_addon` SET `auras` = '47090' WHERE (`entry` = 26477); From 0e9abcd3058a8e77926fcb7d7e4e949ba9be9f8a Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Fri, 24 Jul 2026 06:28:38 -0300 Subject: [PATCH 129/134] fix(Core/Spells): don't resolve spellmod owner for casters no longer on a map (#26780) --- src/server/game/Spells/Spell.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 9847c0bf5..a328e3244 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -695,7 +695,9 @@ Spell::Spell(Unit* caster, SpellInfo const* info, TriggerCastFlags triggerFlags, Spell::~Spell() { - if (Player* modOwner = m_caster ? m_caster->GetSpellModOwner() : nullptr) + // FindMap() check: pending spell events are destroyed after the caster has left the map, + // where resolving a unit-summoned caster's owner through ObjectAccessor would assert + if (Player* modOwner = (m_caster && m_caster->FindMap()) ? m_caster->GetSpellModOwner() : nullptr) if (modOwner->m_spellModTakingSpell == this) modOwner->SetSpellModTakingSpell(this, false); From f86772437cbcf46e9299a235ebb63e68d1db2c48 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 24 Jul 2026 09:29:57 +0000 Subject: [PATCH 130/134] chore(DB): import pending files Referenced commit(s): 0e9abcd3058a8e77926fcb7d7e4e949ba9be9f8a --- .../rev_1784841270168338100.sql => db_world/2026_07_24_04.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1784841270168338100.sql => db_world/2026_07_24_04.sql} (95%) diff --git a/data/sql/updates/pending_db_world/rev_1784841270168338100.sql b/data/sql/updates/db_world/2026_07_24_04.sql similarity index 95% rename from data/sql/updates/pending_db_world/rev_1784841270168338100.sql rename to data/sql/updates/db_world/2026_07_24_04.sql index 9d0d58da7..2ad57d02f 100644 --- a/data/sql/updates/pending_db_world/rev_1784841270168338100.sql +++ b/data/sql/updates/db_world/2026_07_24_04.sql @@ -1,3 +1,4 @@ +-- DB update 2026_07_24_03 -> 2026_07_24_04 -- -------------------------------------------------------------------------------------------- -- Dragonblight (Northrend, map 571) -- Dead Mage Hunter (26477): permanent, randomized corpse appearance From ac6592ae3fd1599962a125e1170d7022dd6bb9fd Mon Sep 17 00:00:00 2001 From: EricksOliveira Date: Fri, 24 Jul 2026 19:03:44 +0000 Subject: [PATCH 131/134] fix(Scripts/IcecrownCitadel): Fixed Blood Orb Game Object (#24340) Co-authored-by: Lucas Nascimento --- .../rev_1767742001111707700.sql | 31 + .../game/Spells/SpellInfoCorrections.cpp | 6 - .../boss_blood_prince_council.cpp | 4 + .../boss_blood_queen_lana_thel.cpp | 4 + .../IcecrownCitadel/icecrown_citadel.cpp | 677 ++++++++++++++++++ .../IcecrownCitadel/icecrown_citadel.h | 11 + 6 files changed, 727 insertions(+), 6 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1767742001111707700.sql diff --git a/data/sql/updates/pending_db_world/rev_1767742001111707700.sql b/data/sql/updates/pending_db_world/rev_1767742001111707700.sql new file mode 100644 index 000000000..3bc12c5f2 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1767742001111707700.sql @@ -0,0 +1,31 @@ +-- +UPDATE `creature_template` SET `unit_flags`=33554432 WHERE `entry`=38463; +UPDATE `creature_template` SET `ScriptName`='npc_icc_orb_controller' WHERE `entry`=38463; +UPDATE `creature_template` SET `ScriptName`='npc_darkfallen_blood_knight' WHERE `entry`=37595; +UPDATE `creature_template` SET `ScriptName`='npc_darkfallen_noble' WHERE `entry`=37663; +UPDATE `creature_template` SET `ScriptName`='npc_vampiric_fiend' WHERE `entry`=37901; +UPDATE `creature_template` SET `ScriptName`='npc_darkfallen_archmage' WHERE `entry`=37664; +UPDATE `creature_template` SET `ScriptName`='npc_darkfallen_advisor' WHERE `entry`=37571; +UPDATE `creature_template` SET `ScriptName`='npc_darkfallen_tactician' WHERE `entry`=37666; +UPDATE `gameobject_template` SET `ScriptName`='go_empowering_blood_orb' WHERE `entry`=201741; + +DELETE FROM `spell_script_names` WHERE `spell_id` IN (70227,70304,70299,70450,72131,70939); +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(70227,'spell_icc_empowered_blood'), +(70304,'spell_icc_empowered_blood_3'), +(70299,'spell_icc_siphon_essence'), +(70450,'spell_darkfallen_blood_mirror'), +(72131,'spell_generic_remove_empowered_blood'), +(70939,'spell_generic_remove_empowered_blood'); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry` IN (72099,70299,70293); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(13,1,72099,0,0,31,0,3,36934,0,0,0,0,'','Effect_0 hits Empowering Orb Controller'), +(13,1,70299,0,0,31,0,3,36934,0,0,0,0,'','Effect_0 hits Empowering Orb Controller'), +(13,1,70293,0,0,31,0,3,38463,0,0,0,0,'','Effect_0 hits Empowering Orb Controller'); + +DELETE FROM `creature_template_movement` WHERE `CreatureId`=36934; +INSERT INTO `creature_template_movement` (`CreatureId`, `Ground`, `Swim`, `Flight`, `Rooted`, `Chase`, `Random`) VALUES +(36934,0,0,1,1,0,0); + +DELETE FROM `creature` WHERE `guid` IN (201220,201473,201559) AND `id`=38463; diff --git a/src/server/game/Spells/SpellInfoCorrections.cpp b/src/server/game/Spells/SpellInfoCorrections.cpp index 0c44900dc..eab2da490 100644 --- a/src/server/game/Spells/SpellInfoCorrections.cpp +++ b/src/server/game/Spells/SpellInfoCorrections.cpp @@ -3300,12 +3300,6 @@ void SpellMgr::LoadSpellInfoCorrections() spellInfo->Effects[EFFECT_0].MiscValue = 100; }); - // Empowered Blood - ApplySpellFix({ 70227, 70232 }, [](SpellInfo* spellInfo) - { - spellInfo->AreaGroupId = 2452; // Whole icc instead of Crimson Halls only, remove when area calculation is fixed - }); - ApplySpellFix({ 74509 }, [](SpellInfo* spellInfo) { spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_20_YARDS); // 20yd diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp index a686b46a3..c4ba87933 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp @@ -101,6 +101,8 @@ enum Spells SPELL_KINETIC_BOMB = 72080, SPELL_SHOCK_VORTEX = 72037, SPELL_EMPOWERED_SHOCK_VORTEX = 72039, + SPELL_REMOVE_EMPOWERED_BLOOD = 72131, + SPELL_CLEAR_ALL_STATUS_AILMENTS = 70939, // Kinetic Bomb SPELL_UNSTABLE = 72059, @@ -233,6 +235,7 @@ public: _isEmpowered = false; _evading = false; me->SetHealth(me->GetMaxHealth()); + me->CastSpell(me, SPELL_REMOVE_EMPOWERED_BLOOD, true); me->SetReactState(REACT_AGGRESSIVE); } @@ -261,6 +264,7 @@ public: me->SetLootRecipient(who); me->LowerPlayerDamageReq(me->GetMaxHealth()); me->SetReactState(REACT_AGGRESSIVE); + DoCastSelf(SPELL_CLEAR_ALL_STATUS_AILMENTS, true); instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me); if (Creature* taldaram = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_PRINCE_TALDARAM_GUID))) diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp index 3456652ca..0b8b0bb68 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp @@ -71,6 +71,7 @@ enum Spells SPELL_INCITE_TERROR = 73070, SPELL_BLOODBOLT_WHIRL = 71772, SPELL_ANNIHILATE = 71322, + SPELL_CLEAR_ALL_STATUS_AILMENTS = 70939, }; enum Shadowmourne @@ -224,8 +225,11 @@ public: me->setActive(true); DoZoneInCombat(); Talk(SAY_AGGRO); + if (instance->GetBossState(DATA_BLOOD_QUEEN_LANA_THEL) != DONE) instance->SetBossState(DATA_BLOOD_QUEEN_LANA_THEL, IN_PROGRESS); + + DoCastSelf(SPELL_CLEAR_ALL_STATUS_AILMENTS, true); _creditBloodQuickening = instance->GetData(DATA_BLOOD_QUICKENING_STATE) == IN_PROGRESS; } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp index bdde946bd..cd541ced1 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp @@ -21,6 +21,8 @@ #include "Cell.h" #include "CellImpl.h" #include "CreatureScript.h" +#include "GameObject.h" +#include "GameObjectAI.h" #include "GridNotifiers.h" #include "GridNotifiersImpl.h" #include "Group.h" @@ -160,6 +162,46 @@ enum Spells // Invisible Stalker (Float, Uninteractible, LargeAOI) SPELL_SOUL_MISSILE = 72585, + + // Empowering Blood Orb + SPELL_EMPOWERED_BLOOD_2 = 70232, + SPELL_EMPOWERED_BLOOD_3 = 70304, + SPELL_EMPOWERED_BLOOD_4 = 70320, + SPELL_ORB_CONTROLLER_ACTIVE = 70293, + + // Darkfallen Generic + SPELL_BLOOD_ORB_VISUAL = 72099, + SPELL_SIPHON_ESSENCE = 70299, + + // Darkfallen Blood Knight + SPELL_VAMPIRIC_AURA = 71736, + SPELL_BLOOD_MIRROR = 70450, + SPELL_BLOOD_MIRROR_2 = 70451, + SPELL_BLOOD_MIRROR_DAMAGE_SHARE = 70445, + SPELL_UNHOLY_STRIKE = 70437, + + // Darkfallen Noble + SPELL_SHADOW_BOLT = 72960, + SPELL_CHAINS_OF_SHADOW = 70645, + + // Darkfallen Archmage + SPELL_FIREBALL = 70409, + SPELL_AMPLIFY_MAGIC = 70408, + SPELL_BLAST_WAVE = 70407, + SPELL_POLYMORPH_ALLY = 72106, + SPELL_POLYMORPH = 70410, + + // Darkfallen Advisor + SPELL_LICH_SLAP = 72057, + SPELL_SHROUD_OF_SPELL_WARDING = 72066, + + // Vampiric Fiend + SPELL_DISEASE_CLOUD = 41290, + SPELL_LEECHING_ROOT = 70671, + + // Darkfallen Tactician + SPELL_SHADOWSTEP = 70431, + SPELL_BLOOD_SAP = 70432 }; // Helper defines @@ -258,6 +300,7 @@ enum EventTypes enum DataTypesICC { DATA_DAMNED_KILLS = 1, + DATA_GUID }; enum Actions @@ -268,6 +311,9 @@ enum Actions ACTION_RESURRECT_CAPTAINS = 3, ACTION_CAPTAIN_DIES = 4, ACTION_RESET_EVENT = 5, + ACTION_SIPHON_INTERRUPTED = 6, + ACTION_EVADE = 7, + ACTION_COMBAT = 8 }; enum EventIds @@ -1940,6 +1986,624 @@ public: } }; +class ICCOrbControllerMinionSearch +{ +public: + ICCOrbControllerMinionSearch(Unit* owner, bool checkCasting) : _owner(owner), _checkCasting(checkCasting) {} + + bool operator()(Creature* target) const + { + if (!target->IsAlive() || (_checkCasting && target->HasUnitState(UNIT_STATE_CASTING)) || target->GetWaypointPath() || _owner->GetDistance(target) > 10.0f) + return false; + + switch (target->GetEntry()) + { + case NPC_DARKFALLEN_BLOOD_KNIGHT: + case NPC_DARKFALLEN_NOBLE: + case NPC_DARKFALLEN_ARCHMAGE: + case NPC_DARKFALLEN_ADVISOR: + case NPC_DARKFALLEN_TACTICIAN: + return true; + default: + return false; + } + } + +private: + // Need check to not use polymorph in a casting creature + Unit* _owner; + bool _checkCasting; +}; + +std::vector DarkFallensEmotes = +{ + EMOTE_ONESHOT_TALK, + EMOTE_ONESHOT_EXCLAMATION, + EMOTE_ONESHOT_QUESTION, + EMOTE_ONESHOT_LAUGH, + EMOTE_ONESHOT_YES, + EMOTE_ONESHOT_NO +}; + +// 38463 - Empowering Orb Visual Stalker +struct npc_icc_orb_controller : public ScriptedAI +{ + npc_icc_orb_controller(Creature* creature) : ScriptedAI(creature), _isInCombat(false), _isLongRepeat(false) {} + + void Reset() override + { + _scheduler.Schedule(1s, [this](TaskContext /*initialize*/) + { + std::vector creatures; + ICCOrbControllerMinionSearch check(me, false); + Acore::CreatureListSearcher searcher(me, creatures, check); + Cell::VisitObjects(me, searcher, 10.0f); + + if (creatures.empty()) + return; + + for (Creature* creature : creatures) + { + creature->AI()->SetGUID(me->GetGUID(), DATA_GUID); + _minionGuids.push_back(creature->GetGUID()); + } + + ScheduleVisualChannel(false); + }); + } + + void ScheduleVisualChannel(bool evading) + { + _scheduler.Schedule(evading ? 5s : 1s, [this](TaskContext visual) + { + if (_minionGuids.empty()) + return; + + ObjectGuid mGuid = Acore::Containers::SelectRandomContainerElement(_minionGuids); + if (Unit* minion = ObjectAccessor::GetUnit(*me, mGuid)) + minion->CastSpell(nullptr, SPELL_BLOOD_ORB_VISUAL); + + visual.Repeat(_isLongRepeat ? 21s : 3s); + _isLongRepeat = !_isLongRepeat; + }); + } + + void UpdateValidGuids() + { + for (GuidVector::iterator itr = _minionGuids.begin(); itr != _minionGuids.end();) + { + if (Unit* minion = ObjectAccessor::GetUnit(*me, (*itr))) + { + if (!minion->IsAlive()) + { + itr = _minionGuids.erase(itr); + continue; + } + + ++itr; + } + // Is not in world anymore + else + itr = _minionGuids.erase(itr); + } + } + + void SpellHit(Unit* caster, SpellInfo const* spellInfo) override + { + if (spellInfo->Id == SPELL_ORB_CONTROLLER_ACTIVE) + if (GameObject* orb = me->FindNearestGameObject(GO_EMPOWERING_BLOOD_ORB, 5.0f)) + orb->AI()->SetGUID(caster->GetGUID(), DATA_GUID); + } + + void SetGUID(ObjectGuid const& guid, int32 id) override + { + if (id != ACTION_COMBAT || _isInCombat) + return; + + Creature* darkfallen = ObjectAccessor::GetCreature(*me, guid); + if (!darkfallen) + return; + + _isInCombat = true; + _scheduler.CancelAll(); + if (_minionGuids.empty()) + return; + + for (ObjectGuid minionGuid : _minionGuids) + { + if (Creature* minion = ObjectAccessor::GetCreature(*me, minionGuid)) + if (minion->IsAIEnabled && !minion->IsInCombat()) + minion->AI()->DoZoneInCombat(darkfallen); + } + + if (Unit* minion = ObjectAccessor::GetUnit(*me, Acore::Containers::SelectRandomContainerElement(_minionGuids))) + minion->CastSpell(nullptr, SPELL_SIPHON_ESSENCE); + } + + void DoAction(int32 action) override + { + if (action == ACTION_EVADE && _isInCombat) + { + _isInCombat = false; + UpdateValidGuids(); + ScheduleVisualChannel(true); + if (GameObject* orb = me->FindNearestGameObject(GO_EMPOWERING_BLOOD_ORB, 5.0f)) + orb->SetGameObjectFlag(GO_FLAG_NOT_SELECTABLE); + } + } + + void UpdateAI(uint32 diff) override + { + _scheduler.Update(diff); + + if (_isInCombat) + { + UpdateValidGuids(); + if (_minionGuids.empty()) + DoAction(ACTION_EVADE); + } + } + +private: + TaskScheduler _scheduler; + GuidVector _minionGuids; + bool _isInCombat; + bool _isLongRepeat; +}; + +struct DarkFallenAI : public ScriptedAI +{ + DarkFallenAI(Creature* creature) : ScriptedAI(creature), IsDoingEmotes(true), AttackSpellId(0) {} + + virtual void ScheduleSpells() = 0; + + void Reset() override + { + IsDoingEmotes = me->GetWaypointPath() ? false : true; + Scheduler.CancelAll(); + Scheduler.SetValidator([this] + { + return !me->HasUnitState(UNIT_STATE_CASTING); + }) + .Schedule(1s, 10s, [this](TaskContext emote) + { + if (!IsDoingEmotes) + return; + + if (roll_chance_i(20)) + { + std::vector creatures; + ICCOrbControllerMinionSearch check(me, true); + Acore::CreatureListSearcher searcher(me, creatures, check); + Cell::VisitObjects(me, searcher, 10.0f); + if (!creatures.empty()) + { + Creature* friendly = Acore::Containers::SelectRandomContainerElement(creatures); + DoCast(friendly, SPELL_POLYMORPH_ALLY); + } + } + Scheduler.Schedule(1s, [this](TaskContext /*emote*/) + { + me->HandleEmoteCommand(Acore::Containers::SelectRandomContainerElement(DarkFallensEmotes)); + }); + emote.Repeat(15s, 30s); + }); + } + + void JustEngagedWith(Unit* /*who*/) override + { + IsDoingEmotes = false; + Scheduler.CancelAll(); + ScheduleSpells(); + if (Unit* trigger = ObjectAccessor::GetUnit(*me, TriggerGuid)) + trigger->GetAI()->SetGUID(me->GetGUID(), ACTION_COMBAT); + } + + void DoAction(int32 action) override + { + if (action == ACTION_SIPHON_INTERRUPTED) + if (GameObject* orb = me->FindNearestGameObject(GO_EMPOWERING_BLOOD_ORB, 10.0f)) + orb->RemoveGameObjectFlag(GO_FLAG_NOT_SELECTABLE); + } + + void SetGUID(ObjectGuid const& guid, int32 id) override + { + if (id == DATA_GUID) + TriggerGuid = guid; + } + + void EnterEvadeMode(EvadeReason why) override + { + ScriptedAI::EnterEvadeMode(why); + if (Unit* trigger = ObjectAccessor::GetUnit(*me, TriggerGuid)) + trigger->GetAI()->DoAction(ACTION_EVADE); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim() && !IsDoingEmotes) + return; + + Scheduler.Update(diff); + + if (AttackSpellId) + DoSpellAttackIfReady(AttackSpellId); + else + DoMeleeAttackIfReady(); + } + +protected: + TaskScheduler Scheduler; + ObjectGuid TriggerGuid; + bool IsDoingEmotes; + uint32 AttackSpellId; +}; + +struct npc_darkfallen_blood_knight : public DarkFallenAI +{ + npc_darkfallen_blood_knight(Creature* creature) : DarkFallenAI(creature) {} + + void ScheduleSpells() override + { + Scheduler.Schedule(500ms, [this](TaskContext /*context*/) + { + DoCastSelf(SPELL_VAMPIRIC_AURA); + }) + .Schedule(8s, [this](TaskContext unholyStrike) + { + DoCastVictim(SPELL_UNHOLY_STRIKE); + unholyStrike.Repeat(8s, 9s); + }) + .Schedule(6s, [this](TaskContext bloodMirror) + { + DoCastSelf(SPELL_BLOOD_MIRROR); + bloodMirror.Repeat(34s); + }); + } +}; + +struct npc_darkfallen_noble : public DarkFallenAI +{ + npc_darkfallen_noble(Creature* creature) : DarkFallenAI(creature) {} + + void ScheduleSpells() override + { + AttackSpellId = SPELL_SHADOW_BOLT; + Scheduler.Schedule(500ms, [this](TaskContext /*context*/) + { + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true, false, -SPELL_CHAINS_OF_SHADOW)) + DoCast(target, SPELL_CHAINS_OF_SHADOW); + }) + .Schedule(11s, [this](TaskContext summonVampiric) + { + // Vampiric should be summoned by 70647 but i have no idea what is miscB of summon effect + if (Unit* target = me->GetVictim()) + if (Creature* vampiric = me->SummonCreature(NPC_VAMPIRIC_FIEND, target->GetPosition(), TEMPSUMMON_CORPSE_DESPAWN)) + vampiric->AI()->AttackStart(target); + + summonVampiric.Repeat(30s); + }); + } +}; + +struct npc_vampiric_fiend : public ScriptedAI +{ + npc_vampiric_fiend(Creature* creature) : ScriptedAI(creature) {} + + void JustEngagedWith(Unit* /*who*/) override + { + DoCastSelf(SPELL_DISEASE_CLOUD); + _scheduler.Schedule(9s, [this](TaskContext /*leechingRoot*/) + { + DoCastVictim(SPELL_LEECHING_ROOT); + }) + .Schedule(38s, [this](TaskContext /*leechingRoot*/) + { + me->DespawnOrUnsummon(); + }); + } + + void EnterEvadeMode(EvadeReason /*why*/) override + { + _scheduler.CancelAll(); + me->DespawnOrUnsummon(); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + _scheduler.Update(diff); + + DoMeleeAttackIfReady(); + } + +private: + TaskScheduler _scheduler; +}; + +// 37664 - Darkfallen Archmage +struct npc_darkfallen_archmage : public DarkFallenAI +{ + npc_darkfallen_archmage(Creature* creature) : DarkFallenAI(creature) {} + + void ScheduleSpells() override + { + AttackSpellId = SPELL_FIREBALL; + Scheduler.Schedule(1s, [this](TaskContext amplifyMagic) + { + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) + DoCast(target, SPELL_AMPLIFY_MAGIC); + + amplifyMagic.Repeat(15s, 24s); + }) + .Schedule(10s, [this](TaskContext blastWave) + { + DoCastSelf(SPELL_BLAST_WAVE); + blastWave.Repeat(25s, 30s); + }) + .Schedule(17s, [this](TaskContext polymorph) + { + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true, false, -SPELL_POLYMORPH)) + DoCast(target, SPELL_POLYMORPH); + + polymorph.Repeat(25s, 35s); + }); + } +}; + +// 37571 - Darkfallen Advisor +struct npc_darkfallen_advisor : public DarkFallenAI +{ + npc_darkfallen_advisor(Creature* creature) : DarkFallenAI(creature) {} + + void ScheduleSpells() override + { + Scheduler.Schedule(8s, [this](TaskContext lichSlap) + { + DoCastVictim(SPELL_LICH_SLAP); + lichSlap.Repeat(12s); + }) + .Schedule(50s, [this](TaskContext immunity) + { + if (Unit* target = DoSelectLowestHpFriendly(40.0f)) + DoCast(target, SPELL_SHROUD_OF_SPELL_WARDING); + + immunity.Repeat(20s, 25s); + }); + } +}; + +// 37666 - Darkfallen Tactician +struct npc_darkfallen_tactician : public DarkFallenAI +{ + npc_darkfallen_tactician(Creature* creature) : DarkFallenAI(creature) {} + + void ScheduleSpells() override + { + Scheduler.Schedule(8s, [this](TaskContext unholyStrike) + { + DoCastVictim(SPELL_UNHOLY_STRIKE); + unholyStrike.Repeat(8s, 11s); + }) + .Schedule(10s, [this](TaskContext shadowStep) + { + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true, false)) + { + DoCast(target, SPELL_SHADOWSTEP); + DoCast(target, SPELL_BLOOD_SAP); + } + shadowStep.Repeat(20s); + }); + } +}; + +// 201741 - Empowering Blood Orb +struct go_empowering_blood_orb : public GameObjectAI +{ + go_empowering_blood_orb(GameObject* go) : GameObjectAI(go) {} + + void Reset() override + { + if (Creature* trigger = ObjectAccessor::GetCreature(*me, _triggerGuid)) + trigger->DespawnOrUnsummon(); + + if (Creature* trigger = me->SummonCreature(NPC_ORB_VISUAL_STALKER, me->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN)) + _triggerGuid = trigger->GetGUID(); + else + _triggerGuid.Clear(); + } + + bool GossipHello(Player* player, bool /*reportUse*/) override + { + me->CastSpell(player, SPELL_EMPOWERED_BLOOD); + HandleObjectUse(); + return true; + } + + void HandleObjectUse() + { + me->SetGameObjectFlag(GO_FLAG_IN_USE); + me->SetGoAnimProgress(255); + me->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE); + + if (Creature* trigger = ObjectAccessor::GetCreature(*me, _triggerGuid)) + trigger->DespawnOrUnsummon(); + + _scheduler.Schedule(3s, [this](TaskContext /*context*/) + { + me->Delete(); + }); + } + + void SetGUID(ObjectGuid const& guid, int32 id) override + { + if (id == DATA_GUID) + { + if (Unit* target = ObjectAccessor::GetUnit(*me, guid)) + me->CastSpell(target, SPELL_EMPOWERED_BLOOD_3); + + HandleObjectUse(); + } + } + + void UpdateAI(uint32 diff) override + { + _scheduler.Update(diff); + } + +private: + TaskScheduler _scheduler; + ObjectGuid _triggerGuid; +}; + +// 70227 - Empowered Blood +class spell_icc_empowered_blood : public AuraScript +{ + PrepareAuraScript(spell_icc_empowered_blood); + + bool Validate(SpellInfo const* /*spell*/) override + { + return ValidateSpellInfo({ SPELL_EMPOWERED_BLOOD_2 }); + } + + void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetTarget()->CastSpell(GetTarget(), SPELL_EMPOWERED_BLOOD_2, true); + } + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetTarget()->RemoveAurasDueToSpell(SPELL_EMPOWERED_BLOOD_2); + } + + void Register() override + { + OnEffectApply += AuraEffectApplyFn(spell_icc_empowered_blood::OnApply, EFFECT_0, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove += AuraEffectRemoveFn(spell_icc_empowered_blood::OnRemove, EFFECT_0, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, AURA_EFFECT_HANDLE_REAL); + } +}; + +// 70304 - Empowered Blood +class spell_icc_empowered_blood_3 : public AuraScript +{ + PrepareAuraScript(spell_icc_empowered_blood_3); + + bool Validate(SpellInfo const* /*spell*/) override + { + return ValidateSpellInfo({ SPELL_EMPOWERED_BLOOD_4 }); + } + + void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetTarget()->CastSpell(GetTarget(), SPELL_EMPOWERED_BLOOD_4, true); + } + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetTarget()->RemoveAurasDueToSpell(SPELL_EMPOWERED_BLOOD_4); + } + + void Register() override + { + OnEffectApply += AuraEffectApplyFn(spell_icc_empowered_blood_3::OnApply, EFFECT_0, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove += AuraEffectRemoveFn(spell_icc_empowered_blood_3::OnRemove, EFFECT_0, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, AURA_EFFECT_HANDLE_REAL); + } +}; + +// 70299 - Siphon Essence +class spell_icc_siphon_essence : public AuraScript +{ + PrepareAuraScript(spell_icc_siphon_essence); + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_CANCEL) + GetTarget()->GetAI()->DoAction(ACTION_SIPHON_INTERRUPTED); + } + + void Register() override + { + AfterEffectRemove += AuraEffectRemoveFn(spell_icc_siphon_essence::OnRemove, EFFECT_1, SPELL_AURA_MOD_ROOT, AURA_EFFECT_HANDLE_REAL); + } +}; + +// 70450 - Blood Mirror +class spell_darkfallen_blood_mirror : public SpellScript +{ + PrepareSpellScript(spell_darkfallen_blood_mirror); + + bool Validate(SpellInfo const* /*spell*/) override + { + return ValidateSpellInfo({ SPELL_BLOOD_MIRROR_2, SPELL_BLOOD_MIRROR_DAMAGE_SHARE }); + } + + void FilterTargets(std::list& targets) + { + targets.remove_if([](WorldObject* target) + { + return !target->IsPlayer(); + }); + + if (targets.size() < 2) + { + targets.clear(); + return; + } + + Acore::Containers::RandomResize(targets, 2); + _targets = targets; + } + + void HandleMirror(SpellEffIndex /*effIndex*/) + { + if (_targets.empty()) + return; + + Unit* caster = GetCaster(); + Unit* target = _targets.front()->ToUnit(); + Unit* mirror = _targets.back()->ToUnit(); + + if (!caster || !target || !mirror) + return; + + caster->CastSpell(target, SPELL_BLOOD_MIRROR_2, true); + target->CastSpell(mirror, SPELL_BLOOD_MIRROR_DAMAGE_SHARE, true); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_darkfallen_blood_mirror::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + OnEffectLaunch += SpellEffectFn(spell_darkfallen_blood_mirror::HandleMirror, EFFECT_0, SPELL_EFFECT_DUMMY); + } + +private: + std::list _targets; +}; + +// 72131 - Remove Empowered Blood +// 70939 - Blood Queen Lana'thel - Clear all Status Ailments +class spell_generic_remove_empowered_blood : public SpellScript +{ + PrepareSpellScript(spell_generic_remove_empowered_blood); + + bool Validate(SpellInfo const* /*spell*/) override + { + return ValidateSpellInfo({ SPELL_EMPOWERED_BLOOD }); + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + GetHitUnit()->RemoveAurasDueToSpell(SPELL_EMPOWERED_BLOOD); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_generic_remove_empowered_blood::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + class spell_icc_stoneform_aura : public AuraScript { PrepareAuraScript(spell_icc_stoneform_aura); @@ -3693,6 +4357,19 @@ void AddSC_icecrown_citadel() new npc_frostwing_vrykul(); new npc_impaling_spear(); new npc_arthas_teleport_visual(); + RegisterIcecrownCitadelCreatureAI(npc_icc_orb_controller); + RegisterIcecrownCitadelCreatureAI(npc_darkfallen_blood_knight); + RegisterIcecrownCitadelCreatureAI(npc_darkfallen_noble); + RegisterIcecrownCitadelCreatureAI(npc_vampiric_fiend); + RegisterIcecrownCitadelCreatureAI(npc_darkfallen_archmage); + RegisterIcecrownCitadelCreatureAI(npc_darkfallen_advisor); + RegisterIcecrownCitadelCreatureAI(npc_darkfallen_tactician); + RegisterGameObjectAI(go_empowering_blood_orb); + RegisterSpellScript(spell_icc_empowered_blood); + RegisterSpellScript(spell_icc_empowered_blood_3); + RegisterSpellScript(spell_icc_siphon_essence); + RegisterSpellScript(spell_darkfallen_blood_mirror); + RegisterSpellScript(spell_generic_remove_empowered_blood); RegisterSpellScript(spell_icc_stoneform_aura); RegisterSpellScript(spell_icc_sprit_alarm); RegisterSpellScript(spell_icc_geist_alarm); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h index d3f5a724b..77b95abb4 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h +++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h @@ -62,6 +62,9 @@ enum SharedSpells SPELL_UNSATED_CRAVING = 71168, SPELL_SHADOWS_FATE = 71169, + // Empowering Blood Orb + SPELL_EMPOWERED_BLOOD = 70227, + // Misc SPELL_WEB_BEAM = 69887, SPELL_WEB_BEAM2 = 69986, @@ -282,6 +285,13 @@ enum CreaturesIds NPC_KINETIC_BOMB_TARGET = 38458, NPC_KINETIC_BOMB = 38454, NPC_SHOCK_VORTEX = 38422, + NPC_DARKFALLEN_BLOOD_KNIGHT = 37595, + NPC_DARKFALLEN_NOBLE = 37663, + NPC_DARKFALLEN_ARCHMAGE = 37664, + NPC_DARKFALLEN_ADVISOR = 37571, + NPC_DARKFALLEN_TACTICIAN = 37666, + NPC_VAMPIRIC_FIEND = 37901, + NPC_ORB_VISUAL_STALKER = 38463, // Blood-Queen Lana'thel NPC_BLOOD_QUEEN_LANA_THEL = 37955, @@ -434,6 +444,7 @@ enum GameObjectsIds GO_CRIMSON_HALL_DOOR = 201376, GO_BLOOD_ELF_COUNCIL_DOOR = 201378, GO_BLOOD_ELF_COUNCIL_DOOR_RIGHT = 201377, + GO_EMPOWERING_BLOOD_ORB = 201741, // Blood-Queen Lana'thel GO_DOODAD_ICECROWN_BLOODPRINCE_DOOR_01 = 201746, From 194ea65e00476f28387e011444a625194c207887 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 24 Jul 2026 19:04:59 +0000 Subject: [PATCH 132/134] chore(DB): import pending files Referenced commit(s): ac6592ae3fd1599962a125e1170d7022dd6bb9fd --- .../rev_1767742001111707700.sql => db_world/2026_07_24_05.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1767742001111707700.sql => db_world/2026_07_24_05.sql} (97%) diff --git a/data/sql/updates/pending_db_world/rev_1767742001111707700.sql b/data/sql/updates/db_world/2026_07_24_05.sql similarity index 97% rename from data/sql/updates/pending_db_world/rev_1767742001111707700.sql rename to data/sql/updates/db_world/2026_07_24_05.sql index 3bc12c5f2..07331181b 100644 --- a/data/sql/updates/pending_db_world/rev_1767742001111707700.sql +++ b/data/sql/updates/db_world/2026_07_24_05.sql @@ -1,3 +1,4 @@ +-- DB update 2026_07_24_04 -> 2026_07_24_05 -- UPDATE `creature_template` SET `unit_flags`=33554432 WHERE `entry`=38463; UPDATE `creature_template` SET `ScriptName`='npc_icc_orb_controller' WHERE `entry`=38463; From 653d177503e3b25965abc06503e2a0a49e8c50e0 Mon Sep 17 00:00:00 2001 From: Crow Date: Fri, 24 Jul 2026 14:50:30 -0500 Subject: [PATCH 133/134] fix(Scripts/BRD): Use Correct Fiery Burst and War Stomp Spell IDs for Magmus (#26666) --- .../BlackrockMountain/BlackrockDepths/boss_magmus.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_magmus.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_magmus.cpp index 3e326e817..ac02312ae 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_magmus.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_magmus.cpp @@ -21,8 +21,8 @@ enum Spells { - SPELL_FIERYBURST = 13900, - SPELL_WARSTOMP = 24375 + SPELL_FIERYBURST = 15668, + SPELL_WARSTOMP = 15593 }; struct boss_magmus : public BossAI From 0dafc681edf654689d353c60783c984775524c3b Mon Sep 17 00:00:00 2001 From: mpfans Date: Sat, 25 Jul 2026 05:02:29 +0800 Subject: [PATCH 134/134] fix(Core/Spells): guard m_caster access during Spell destruction chain (#26782) --- src/server/game/Spells/Spell.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index a328e3244..d155bc6c0 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -4475,7 +4475,9 @@ void Spell::finish(bool ok) return; m_spellState = SPELL_STATE_FINISHED; - if (Player* modOwner = m_caster->GetSpellModOwner()) + // FindMap() check: pending spell events are destroyed after the caster has left the map, + // where resolving a unit-summoned caster's owner through ObjectAccessor would assert + if (Player* modOwner = (m_caster && m_caster->FindMap()) ? m_caster->GetSpellModOwner() : nullptr) modOwner->SetSpellModTakingSpell(this, false); if (m_spellInfo->IsChanneled())