mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-03-16 05:55:07 +00:00
feat(Core/Globals): Dynamically calculate max race and racemasks from DBC data. (#24665)
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user