feat(Core/Globals): Dynamically calculate max race and racemasks from DBC data. (#24665)

This commit is contained in:
Benjamin Jackson
2026-02-28 18:12:52 -05:00
committed by GitHub
parent 85b224bcef
commit 515aeca570
15 changed files with 221 additions and 75 deletions

View File

@@ -28,6 +28,7 @@
#include "ObjectMgr.h"
#include "Player.h"
#include "PoolMgr.h"
#include "RaceMgr.h"
#include "ScriptedCreature.h"
#include "ScriptedGossip.h"
#include "SpellScript.h"
@@ -859,8 +860,8 @@ public:
bool IsFriendly(Unit* passenger)
{
return ((me->GetUInt32Value(GAMEOBJECT_FACTION) == WintergraspFaction[TEAM_HORDE] && passenger->getRaceMask() & RACEMASK_HORDE) ||
(me->GetUInt32Value(GAMEOBJECT_FACTION) == WintergraspFaction[TEAM_ALLIANCE] && passenger->getRaceMask() & RACEMASK_ALLIANCE));
return ((me->GetUInt32Value(GAMEOBJECT_FACTION) == WintergraspFaction[TEAM_HORDE] && passenger->getRaceMask() & sRaceMgr->GetHordeRaceMask()) ||
(me->GetUInt32Value(GAMEOBJECT_FACTION) == WintergraspFaction[TEAM_ALLIANCE] && passenger->getRaceMask() & sRaceMgr->GetAllianceRaceMask()));
}
Creature* IsValidVehicle(Creature* cVeh)

View File

@@ -20,11 +20,14 @@
#include "Group.h"
#include "PassiveAI.h"
#include "Player.h"
#include "RaceMgr.h"
#include "ScriptedCreature.h"
#include "ScriptedGossip.h"
#include "SpellAuras.h"
#include "SpellScript.h"
#include "SpellScriptLoader.h"
#include <unordered_map>
/*
* Ordered alphabetically using scriptname.
* Scriptnames of files in this file should be prefixed with "npc_pet_gen_".
@@ -128,20 +131,17 @@ struct argentPonyBanner
const char* text;
};
static argentPonyBanner argentBanners[MAX_RACES] =
{
{0, 0, ""},
{2781, 62594, "Stormwind Champion's Pennant"},
{2783, 63433, "Orgrimmar Champion's Pennant"},
{2780, 63427, "Ironforge Champion's Pennant"},
{2777, 63406, "Darnassus Champion's Pennant"},
{2787, 63430, "Forsaken Champion's Pennant"},
{2786, 63436, "Thunder Bluff Champion's Pennant"},
{2779, 63396, "Gnomeregan Champion's Pennant"},
{2784, 63399, "Darkspear Champion's Pennant"},
{0, 0, ""},
{2785, 63403, "Silvermoon Champion's Pennant"},
{2778, 63423, "Exodar Champion's Pennant"}
static std::unordered_map<uint8, argentPonyBanner> argentBanners = {
{RACE_HUMAN, {2781, 62594, "Stormwind Champion's Pennant"}},
{RACE_ORC, {2783, 63433, "Orgrimmar Champion's Pennant"}},
{RACE_DWARF, {2780, 63427, "Ironforge Champion's Pennant"}},
{RACE_NIGHTELF, {2777, 63406, "Darnassus Champion's Pennant"}},
{RACE_UNDEAD_PLAYER, {2787, 63430, "Forsaken Champion's Pennant"}},
{RACE_TAUREN, {2786, 63436, "Thunder Bluff Champion's Pennant"}},
{RACE_GNOME, {2779, 63396, "Gnomeregan Champion's Pennant"}},
{RACE_TROLL, {2784, 63399, "Darkspear Champion's Pennant"}},
{RACE_BLOODELF, {2785, 63403, "Silvermoon Champion's Pennant"}},
{RACE_DRAENEI, {2778, 63423, "Exodar Champion's Pennant"}}
};
struct npc_pet_gen_argent_pony_bridle : public ScriptedAI
@@ -152,7 +152,6 @@ struct npc_pet_gen_argent_pony_bridle : public ScriptedAI
_init = false;
_mountTimer = 4000;
_lastAura = 0;
memset(_banners, 0, sizeof(_banners));
}
void EnterEvadeMode(EvadeReason /*why*/) override
@@ -211,10 +210,12 @@ struct npc_pet_gen_argent_pony_bridle : public ScriptedAI
}
// Generate Banners
uint32 mask = player->GetTeamId(true) ? RACEMASK_HORDE : RACEMASK_ALLIANCE;
for (uint8 i = 1; i < MAX_RACES; ++i)
if (mask & (1 << (i - 1)) && player->HasAchieved(argentBanners[i].achievement))
_banners[i] = true;
uint32 mask = player->GetTeamId(true) ? sRaceMgr->GetHordeRaceMask() : sRaceMgr->GetAllianceRaceMask();
for (auto const& [raceId, banner] : argentBanners)
{
if ((mask & (1 << (raceId - 1))) && player->HasAchieved(banner.achievement))
_banners[raceId] = true;
}
}
if (duration && aura)
@@ -247,7 +248,8 @@ struct npc_pet_gen_argent_pony_bridle : public ScriptedAI
if (param == 0)
return _state;
return _banners[param];
auto itr = _banners.find(param);
return (itr != _banners.end() && itr->second) ? 1 : 0;
}
void DoAction(int32 param) override
@@ -279,9 +281,11 @@ struct npc_pet_gen_argent_pony_bridle : public ScriptedAI
AddGossipItemFor(player, GOSSIP_ICON_CHAT, "Visit a mailbox.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_MAILBOX);
}
for (uint8 i = RACE_HUMAN; i < MAX_RACES; ++i)
if (creature->AI()->GetData(i) == uint32(true))
AddGossipItemFor(player, GOSSIP_ICON_CHAT, argentBanners[i].text, GOSSIP_SENDER_MAIN, argentBanners[i].spell);
for (auto const& [raceId, banner] : argentBanners)
{
if (creature->AI()->GetData(raceId) == uint32(true))
AddGossipItemFor(player, GOSSIP_ICON_CHAT, banner.text, GOSSIP_SENDER_MAIN, banner.spell);
}
SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
return true;
@@ -336,7 +340,7 @@ private:
bool _init;
uint8 _state;
int32 _mountTimer;
bool _banners[MAX_RACES];
std::unordered_map<uint8, bool> _banners;
uint32 _lastAura;
};