54#include <unordered_map>
60 : std::false_type { };
100 : std::true_type { };
104 : std::true_type { };
108 : std::true_type { };
112 : std::true_type { };
116 : std::true_type { };
120 : std::true_type { };
124 : std::true_type { };
128 : std::true_type { };
132 : std::true_type { };
136 : std::true_type { };
140 : std::true_type { };
144 : std::true_type { };
148 : std::true_type { };
223 "Scriptname was assigned to this context already!");
231 "Given scriptname doesn't exist!");
238 registry->ReleaseContext(context);
245 if (itr->second == context)
254 registry->SwapContext(initialize);
262 registry->RemoveUsedScriptsFromContainer(scripts);
274 registry->SyncScriptNames();
283 >(std::forward<T>(any))
314#define sScriptRegistryCompositum ScriptRegistryCompositum::Instance()
316template<
typename ,
bool >
320template<
class ScriptType>
323 ScriptType, is_script_database_bound<ScriptType>::value>
341 TC_LOG_ERROR(
"scripts",
"Script '{}' has same memory pointer as '{}'.",
342 first->GetName(), second->GetName());
371template<
typename ScriptType,
typename Base>
377template<
typename Base>
384 auto const bounds =
static_cast<Base*
>(
this)->_ids_of_contexts.equal_range(context);
385 ASSERT(bounds.first == bounds.second);
390template<
typename ObjectType,
typename ScriptType,
typename Base>
402 void Visit(std::unordered_map<ObjectGuid, ObjectType*>& objects)
408 void Visit(std::unordered_map<ObjectGuid, O*>&) { }
440 "There is a disabled AI which is still loaded.");
450 "Destroying the AI should never fail here!");
454 "The AI should be null here!");
472 "The AI should be null here!");
490 "The AI should be null here!");
508 "The AI should be null here!");
515 "The AI should be null here!");
522 "Creating the AI should never fail here!");
546 "The AI should be null here!");
560 "The AI should be null here!");
574 "The AI should be null here!");
606 return [&idsToRemove](
Map* map,
auto&& visitor)
608 auto evaluator = [&](std::unordered_map<ObjectGuid, ObjectType*>& objects)
610 for (
auto object : objects)
614 uint32 aiId =
object.second->AI() ?
object.second->AI()->GetId() : 0;
615 if (idsToRemove.find(aiId) != idsToRemove.end() || (aiId == 0 &&
object.second->GetScriptId()))
616 visitor(
object.second);
620 AIFunctionMapWorker<
typename std::decay<
decltype(evaluator)>::type> worker(std::move(evaluator));
629 return [](
Map* map,
auto&& visitor)
631 auto evaluator = [&](std::unordered_map<ObjectGuid, ObjectType*>& objects)
633 for (
auto object : objects)
635 if (
object.second->AI())
637 ASSERT(
object.second->AI()->GetId());
639 uint32 aiId =
object.second->AI()->GetId();
644 if (aiId == scriptId)
650 if (!
sObjectMgr->IsScriptDatabaseBound(scriptId)
657 visitor(
object.second);
660 visitor(
object.second);
664 AIFunctionMapWorker<
typename std::decay<
decltype(evaluator)>::type> worker(std::move(evaluator));
677 std::vector<ObjectGuid> guidsToReset;
679 visitor(map, [&](ObjectType*
object)
682 guidsToReset.
push_back(object->GetGUID());
687 if (
auto entity =
GetEntityFromMap(std::common_type<ObjectType>{}, map, guid))
691 visitor(map, [&](ObjectType*
object)
704 std::vector<ObjectGuid> guidsToReset;
706 visitor(map, [&](ObjectType*
object)
711 LoadInitializeScript(object);
712 guidsToReset.push_back(object->GetGUID());
719 if (
auto entity =
GetEntityFromMap(std::common_type<ObjectType>{}, map, guid))
733 auto idsToRemove =
static_cast<Base*
>(
this)->GetScriptIDsToRemove(context);
737 ids_removed_.insert(idsToRemove.begin(), idsToRemove.end());
748 ids_removed_.insert(
static_cast<Base*
>(
this)->GetRecentlyAddedScriptIDs().begin(),
749 static_cast<Base*
>(
this)->GetRecentlyAddedScriptIDs().end());
775template<
typename Base>
778 Creature, CreatureScript, Base
782template<
typename Base>
785 GameObject, GameObjectScript, Base
789template<
typename Base>
792 AreaTrigger, AreaTriggerEntityScript, Base
796template<
typename Base>
799 Conversation, ConversationScript, Base
804template<
typename Base>
809template<
typename Base>
818 auto const bounds =
static_cast<Base*
>(
this)->_ids_of_contexts.equal_range(context);
820 if ((!swapped) && (bounds.first != bounds.second))
830 if ((!initialize) && swapped)
847template<
typename Base>
856 auto const bounds =
static_cast<Base*
>(
this)->_ids_of_contexts.equal_range(context);
857 if (bounds.first != bounds.second)
876template<
typename Base>
885 auto const bounds =
static_cast<Base*
>(
this)->_ids_of_contexts.equal_range(context);
886 if (bounds.first != bounds.second)
905template<
typename Base>
914 auto const bounds =
static_cast<Base*
>(
this)->_ids_of_contexts.equal_range(context);
915 if (bounds.first != bounds.second)
934template<
typename Base>
943 auto const bounds =
static_cast<Base*
>(
this)->_ids_of_contexts.equal_range(context);
944 if (bounds.first != bounds.second)
963template<
typename Base>
972 auto const bounds =
static_cast<Base*
>(
this)->_ids_of_contexts.equal_range(context);
974 if (bounds.first != bounds.second)
997template<
typename ScriptType>
1005 template<
typename,
typename>
1008 template<
typename,
typename,
typename>
1014 typedef
std::unordered_map<
1016 std::unique_ptr<ScriptType>
1021 void ReleaseContext(
std::
string const& context) final
override
1023 this->BeforeReleaseContext(context);
1025 auto const bounds = _ids_of_contexts.equal_range(context);
1026 for (
auto itr = bounds.first; itr != bounds.second; ++itr)
1027 _scripts.erase(itr->second);
1032 this->BeforeSwapContext(initialize);
1034 _recently_added_ids.clear();
1039 for (
auto const& script : _scripts)
1040 scripts.erase(script.second->GetName());
1045 this->BeforeUnload();
1047 ASSERT(_recently_added_ids.empty(),
1048 "Recently added script ids should be empty here!");
1051 _ids_of_contexts.clear();
1056 this->OnScriptNamesSync();
1063 "Tried to call AddScript with a nullpointer!");
1065 "Tried to register a script without being in a valid script context!");
1067 std::unique_ptr<ScriptType> script_ptr(script);
1073 for (
auto const& stored_script : _scripts)
1076 if (stored_script.second->GetName() == script->GetName())
1079 ABORT_MSG(
"Script '%s' already assigned with the same script name, "
1080 "so the script can't work.", script->GetName().c_str());
1090 _scripts.insert(std::make_pair(
id, std::move(script_ptr)));
1091 _ids_of_contexts.insert(std::make_pair(
sScriptMgr->GetCurrentScriptContext(),
id));
1092 _recently_added_ids.insert(
id);
1101 auto const itr = _scripts.find(
id);
1102 if (itr != _scripts.end())
1103 return itr->second.get();
1118 std::unordered_set<uint32> scripts_to_remove;
1120 auto const bounds = _ids_of_contexts.equal_range(context);
1121 for (
auto itr = bounds.first; itr != bounds.second; ++itr)
1122 scripts_to_remove.insert(itr->second);
1124 return scripts_to_remove;
1129 return _recently_added_ids;
1143template<
typename Base>
1165template<
typename ScriptType>
1170 template<
typename,
typename>
1174 typedef std::unordered_multimap<std::string , std::unique_ptr<ScriptType>>
ScriptStoreType;
1179 void ReleaseContext(
std::
string const& context) final
override
1181 this->BeforeReleaseContext(context);
1183 _scripts.erase(context);
1188 this->BeforeSwapContext(initialize);
1193 for (
auto const& script : _scripts)
1194 scripts.erase(script.second->GetName());
1199 this->BeforeUnload();
1212 "Tried to call AddScript with a nullpointer!");
1214 "Tried to register a script without being in a valid script context!");
1216 std::unique_ptr<ScriptType> script_ptr(script);
1218 for (
auto const& entry : _scripts)
1219 if (entry.second.get() == script)
1222 LogDuplicatedScriptPointerError(script, entry.second.get());
1229 _scripts.insert(std::make_pair(
sScriptMgr->GetCurrentScriptContext(), std::move(script_ptr)));
1242#define SCR_REG_MAP(T) ScriptRegistry<T>::ScriptStoreType
1243#define SCR_REG_ITR(T) ScriptRegistry<T>::ScriptStoreIteratorType
1244#define SCR_REG_LST(T) ScriptRegistry<T>::Instance()->GetScripts()
1247#define FOR_SCRIPTS(T, C, E) \
1248 if (!SCR_REG_LST(T).empty()) \
1249 for (SCR_REG_ITR(T) C = SCR_REG_LST(T).begin(); \
1250 C != SCR_REG_LST(T).end(); ++C)
1252#define FOR_SCRIPTS_RET(T, C, E, R) \
1253 if (SCR_REG_LST(T).empty()) \
1256 for (SCR_REG_ITR(T) C = SCR_REG_LST(T).begin(); \
1257 C != SCR_REG_LST(T).end(); ++C)
1259#define FOREACH_SCRIPT(T) \
1260 FOR_SCRIPTS(T, itr, end) \
1264#define GET_SCRIPT(T, I, V) \
1265 T* V = ScriptRegistry<T>::Instance()->GetScriptById(I); \
1269#define GET_SCRIPT_RET(T, I, V, R) \
1270 T* V = ScriptRegistry<T>::Instance()->GetScriptById(I); \
1290 : _scriptCount(0), _scriptIdUpdated(false), _script_loader_callback(nullptr)
1305 &&
"Reload hotswap spell effect for creatures isn't valid!");
1311 TC_LOG_INFO(
"server.loading",
"Loading C++ scripts");
1325 sMapMgr->AddSC_BuiltInScripts();
1329 "Script loader callback wasn't registered!");
1341 std::unordered_set<std::string> unusedScriptNames =
sObjectMgr->GetAllDBScriptNames();
1348 unusedScriptNames.erase(
"");
1350 for (std::string
const& scriptName : unusedScriptNames)
1351 TC_LOG_ERROR(
"sql.sql",
"Script '{}' is referenced by the database, but does not exist in the core!", scriptName);
1353 TC_LOG_INFO(
"server.loading",
">> Loaded {} C++ scripts in {} ms",
1384 static std::string
const name =
"___static___";
1393std::shared_ptr<ModuleReference>
1396#ifdef TRINITY_API_USE_DYNAMIC_LINKING
1425template<
typename T, Trinity::invocable_r<T*, SpellScriptLoader const*> GetScriptFn,
typename O>
1429 for (
auto itr = bounds.first; itr != bounds.second; ++itr)
1432 if (!itr->second.second)
1439 T* script = extractor(tmpscript);
1443 script->_Init(tmpscript->
GetName(), spellId);
1444 if (!script->_Load(objectInvoker))
1450 scriptVector.push_back(script);
1581template <
typename ScriptType,
typename MapType,
typename... Args, std::invocable<ScriptType*, MapType*, Args...>
Action>
1587 action(script, map, args...);
1593 MapEntry const* entry = script->GetEntry();
1594 if (!entry || entry->
ID != map->GetId())
1597 action(script.get(), map, args...);
1602template <
typename... Args,
typename Action>
1606 ForEachMapScriptType<InstanceMapScript>(action, instanceMap, args...);
1608 ForEachMapScriptType<BattlegroundMapScript>(action, battlegroundMap, args...);
1610 ForEachMapScriptType<WorldMapScript>(action, map, args...);
1617 ForEachMapScript([](
auto* script,
auto* map) { script->OnCreate(map); }, map);
1624 ForEachMapScript([](
auto* script,
auto* map) { script->OnDestroy(map); }, map);
1634 ForEachMapScript([](
auto* script,
auto* map,
Player* player) { script->OnPlayerEnter(map, player); }, map, player);
1642 ForEachMapScript([](
auto* script,
auto* map,
Player* player) { script->OnPlayerLeave(map, player); }, map, player);
1657 return tmpscript->GetInstanceScript(map);
1665 return tmpscript->GetBattlegroundScript(map);
1676 return tmpscript->OnQuestAccept(player, item, quest);
1685 return tmpscript->OnUse(player, item, targets, castId);
1694 return tmpscript->OnExpire(player, proto);
1703 return tmpscript->OnRemove(player, item);
1714 return tmpscript->OnCastItemCombatSpell(player, victim, spellInfo, item);
1727 return tmpscript->GetAI(creature);
1740 return tmpscript->GetAI(gameobject);
1753 return tmpscript->GetAI(areatrigger);
1762 return entered ? tmpscript->OnTrigger(player, trigger) : tmpscript->OnExit(player, trigger);
1775 return tmpscript->GetAI(conversation);
1781 return tmpscript->GetBattlefield(map);
1787 return tmpscript->GetOutdoorPvP(map);
1792 std::vector<Trinity::ChatCommands::ChatCommandBuilder> table;
1796 std::span<Trinity::ChatCommands::ChatCommandBuilder const> cmds = itr->second->GetCommands();
1797 table.insert(table.end(), cmds.begin(), cmds.end());
1808 tmpscript->OnChange(weather, state, grade);
1816 tmpscript->OnUpdate(weather, diff);
1856 return tmpscript->OnConditionCheck(condition, sourceInfo);
1865 tmpscript->OnInstall(veh);
1874 tmpscript->OnUninstall(veh);
1883 tmpscript->OnReset(veh);
1893 tmpscript->OnInstallAccessory(veh, accessory);
1903 tmpscript->OnAddPassenger(veh, passenger, seatId);
1913 tmpscript->OnRemovePassenger(veh, passenger);
1921 itr->second->OnUpdate(dynobj, diff);
1930 tmpscript->OnAddPassenger(transport, player);
1939 tmpscript->OnAddCreaturePassenger(transport, creature);
1948 tmpscript->OnRemovePassenger(transport, player);
1956 tmpscript->OnUpdate(transport, diff);
1962 tmpscript->OnRelocate(transport, mapId, x, y, z);
1982 tmpscript->OnCompleted(player, achievement);
1991 return tmpscript->OnCheck(source, target);
2161 tmpscript->OnResponse(
object, player, choice, response, clientIdentifier);
2237 bool isDestBank,
uint8 destContainer,
uint8 destSlotId)
2239 FOREACH_SCRIPT(
GuildScript)->OnItemMove(guild, player, pItem, isSrcBank, srcContainer, srcSlotId, isDestBank, destContainer, destSlotId);
2316 tmpscript->OnSceneStart(player, sceneInstanceID, sceneTemplate);
2325 tmpscript->OnSceneTriggerEvent(player, sceneInstanceID, sceneTemplate, triggerName);
2334 tmpscript->OnSceneCancel(player, sceneInstanceID, sceneTemplate);
2343 tmpscript->OnSceneComplete(player, sceneInstanceID, sceneTemplate);
2353 tmpscript->OnQuestStatusChange(player, quest, oldStatus, newStatus);
2362 tmpscript->OnAcknowledgeAutoAccept(player, quest);
2371 tmpscript->OnQuestObjectiveChange(player, quest, objective, oldAmount, newAmount);
2377 ASSERT(worldStateTemplate);
2380 tmpscript->OnValueChange(worldStateTemplate->
Id, oldValue, newValue, map);
2389 tmpscript->OnTrigger(
object, invoker, eventId);
2516template <
class TMap>
2521template <
class TMap>
2527template <
class TMap>
2532template <
class TMap>
2537template <
class TMap>
2542template <
class TMap>
2547template <
class TMap>
2560 TC_LOG_ERROR(
"scripts",
"Invalid WorldMapScript for {}; no such map ID.", mapId);
2563 TC_LOG_ERROR(
"scripts",
"WorldMapScript for map {} is invalid.", mapId);
2574 TC_LOG_ERROR(
"scripts",
"Invalid InstanceMapScript for {}; no such map ID.", mapId);
2577 TC_LOG_ERROR(
"scripts",
"InstanceMapScript for map {} is invalid.", mapId);
2593 TC_LOG_ERROR(
"scripts",
"Invalid BattlegroundMapScript for {}; no such map ID.", mapId);
2596 TC_LOG_ERROR(
"scripts",
"BattlegroundMapScript for map {} is invalid.", mapId);
2707 uint32 const triggerId = trigger->
ID;
T GetEntry(std::unordered_map< uint32, T > const &map, CriteriaTreeEntry const *tree)
DB2Storage< MapEntry > sMapStore("Map.db2", &MapLoadInfo::Instance)
#define TC_LOG_ERROR(filterType__, message__,...)
#define TC_LOG_INFO(filterType__, message__,...)
std::pair< SpellScriptsContainer::iterator, SpellScriptsContainer::iterator > SpellScriptsBounds
static void ForEachMapScriptType(Action const &action, MapType *map, Args... args)
#define FOREACH_SCRIPT(T)
@ SPELL_HOTSWAP_VISUAL_SPELL_EFFECT
static void ForEachMapScript(Action const &action, Map *map, Args... args)
#define GET_SCRIPT_RET(T, I, V, R)
#define GET_SCRIPT(T, I, V)
#define sScriptRegistryCompositum
#define FOR_SCRIPTS(T, C, E)
void CreateSpellOrAuraScripts(uint32 spellId, std::vector< T * > &scriptVector, GetScriptFn extractor, O *objectInvoker)
void AddSC_SmartScripts()
Registers scripts required by the SAI scripting system.
uint32 GetMSTimeDiffToNow(uint32 oldMSTime)
virtual void OnFailedEmailChange(uint32 accountId)
virtual void OnPasswordChange(uint32 accountId)
virtual void OnEmailChange(uint32 accountId)
virtual void OnFailedAccountLogin(uint32 accountId)
virtual void OnFailedPasswordChange(uint32 accountId)
virtual void OnAccountLogin(uint32 accountId)
AccountScript(char const *name) noexcept
AchievementCriteriaScript(char const *name) noexcept
~AchievementCriteriaScript()
AchievementScript(char const *name) noexcept
virtual void OnCompleted(Player *player, AchievementEntry const *achievement)
virtual void OnCreate(Spell const *creatingSpell)
virtual AreaTriggerAI * GetAI(AreaTrigger *at) const
~AreaTriggerEntityScript()
AreaTriggerEntityScript(char const *name) noexcept
virtual bool OnExit(Player *player, AreaTriggerEntry const *trigger)
AreaTriggerScript(char const *name) noexcept
virtual bool OnTrigger(Player *player, AreaTriggerEntry const *trigger)
uint32 GetScriptId() const
virtual void OnAuctionAdd(AuctionHouseObject *ah, AuctionPosting *auction)
virtual void OnAuctionRemove(AuctionHouseObject *ah, AuctionPosting *auction)
AuctionHouseScript(char const *name) noexcept
virtual void OnAuctionSuccessful(AuctionHouseObject *ah, AuctionPosting *auction)
virtual void OnAuctionExpire(AuctionHouseObject *ah, AuctionPosting *auction)
BattlefieldScript(char const *name) noexcept
virtual BattlegroundScript * GetBattlegroundScript(BattlegroundMap *map) const
BattlegroundMapScript(char const *name, uint32 mapId) noexcept
uint32 GetScriptId() const
CommandScript(char const *name) noexcept
virtual bool OnConditionCheck(Condition const *condition, ConditionSourceInfo &sourceInfo)
ConditionScript(char const *name) noexcept
virtual void OnCreate(Unit *creator)
virtual ConversationAI * GetAI(Conversation *conversation) const
ConversationScript(char const *name) noexcept
uint32 GetScriptId() const
virtual void EnterEvadeMode(EvadeReason why=EvadeReason::Other)
void Visit(std::unordered_map< ObjectGuid, ObjectType * > &objects)
void Visit(std::unordered_map< ObjectGuid, O * > &)
AIFunctionMapWorker(T &&worker)
AsyncCastHotswapEffectEvent(Unit *owner)
bool Execute(uint64, uint32) override
This hook is responsible for swapping Creature, GameObject and AreaTrigger AI's.
void BeforeSwapContext(bool initialize) override
Called before SwapContext.
static void UnloadResetScript(AreaTrigger *at)
static void LoadResetScript(GameObject *gameobject)
void BeforeUnload() final override
Called before Unload.
static auto VisitObjectsToSwapOnMap(std::unordered_set< uint32 > const &idsToRemove)
static Creature * GetEntityFromMap(std::common_type< Creature >, Map *map, ObjectGuid const &guid)
static void LoadResetScript(Conversation *conversation)
static void LoadInitializeScript(Creature *creature)
static AreaTrigger * GetEntityFromMap(std::common_type< AreaTrigger >, Map *map, ObjectGuid const &guid)
static void LoadResetScript(AreaTrigger *at)
static void LoadInitializeScript(GameObject *gameobject)
void BeforeReleaseContext(std::string const &context) final override
Called before the actual context release happens.
std::unordered_set< uint32 > ids_removed_
static void DestroyScriptIdsWithVisitor(T &&visitor)
static void UnloadResetScript(Creature *creature)
static void UnloadResetScript(GameObject *gameobject)
static void LoadResetScript(Creature *creature)
static auto VisitObjectsWhereIdWasUpdated()
static void UnloadDestroyScript(GameObject *gameobject)
static void UnloadDestroyScript(AreaTrigger *at)
static void UnloadResetScript(Conversation *conversation)
static void LoadInitializeScript(Conversation *conversation)
static void InitializeScriptIdsWithVisitor(T &&visitor)
static void LoadInitializeScript(AreaTrigger *at)
void OnScriptNamesSync() final override
Called manually to sync scriptnames.
static void UnloadDestroyScript(Conversation *conversation)
static void UnloadDestroyScript(Creature *creature)
static GameObject * GetEntityFromMap(std::common_type< GameObject >, Map *map, ObjectGuid const &guid)
static Conversation * GetEntityFromMap(std::common_type< Conversation >, Map *map, ObjectGuid const &guid)
CreatureScript(char const *name) noexcept
uint32 GetScriptId() const
bool AIM_Create(CreatureAI *ai=nullptr)
DynamicObjectScript(char const *name) noexcept
virtual void OnUpdate(DynamicObject *obj, uint32 diff)
void KillAllEvents(bool force)
void AddEvent(BasicEvent *event, Milliseconds e_time, bool set_addtime=true)
Milliseconds CalculateTime(Milliseconds t_offset) const
EventScript(char const *name) noexcept
virtual void OnTrigger(WorldObject *object, WorldObject *invoker, uint32 eventId)
GameObjectScript(char const *name) noexcept
GameObjectAI * AI() const
uint32 GetScriptId() const
virtual void OnAddMember(Group *group, ObjectGuid guid)
virtual void OnChangeLeader(Group *group, ObjectGuid newLeaderGuid, ObjectGuid oldLeaderGuid)
virtual void OnInviteMember(Group *group, ObjectGuid guid)
virtual void OnDisband(Group *group)
GroupScript(char const *name) noexcept
virtual void OnRemoveMember(Group *group, ObjectGuid guid, RemoveMethod method, ObjectGuid kicker, char const *reason)
virtual void OnMemberDepositMoney(Guild *guild, Player *player, uint64 &amount)
virtual void OnEvent(Guild *guild, uint8 eventType, ObjectGuid::LowType playerGuid1, ObjectGuid::LowType playerGuid2, uint8 newRank)
GuildScript(char const *name) noexcept
virtual void OnMemberWitdrawMoney(Guild *guild, Player *player, uint64 &amount, bool isRepair)
virtual void OnItemMove(Guild *guild, Player *player, Item *pItem, bool isSrcBank, uint8 srcContainer, uint8 srcSlotId, bool isDestBank, uint8 destContainer, uint8 destSlotId)
virtual void OnInfoChanged(Guild *guild, std::string const &newInfo)
virtual void OnMOTDChanged(Guild *guild, std::string const &newMotd)
virtual void OnCreate(Guild *guild, Player *leader, std::string const &name)
virtual void OnDisband(Guild *guild)
virtual void OnRemoveMember(Guild *guild, ObjectGuid guid, bool isDisbanding, bool isKicked)
virtual void OnBankEvent(Guild *guild, uint8 eventType, uint8 tabId, ObjectGuid::LowType playerGuid, uint64 itemOrMoney, uint16 itemStackCount, uint8 destTabId)
virtual void OnAddMember(Guild *guild, Player *player, uint8 plRank)
virtual InstanceScript * GetInstanceScript(InstanceMap *map) const
InstanceMapScript(char const *name, uint32 mapId) noexcept
uint32 GetScriptId() const
bool IsAreaTriggerDone(uint32 id) const
void MarkAreaTriggerDone(uint32 id)
void ResetAreaTriggerDone(uint32 id)
ItemScript(char const *name) noexcept
virtual bool OnRemove(Player *player, Item *item)
virtual bool OnQuestAccept(Player *player, Item *item, Quest const *quest)
virtual bool OnUse(Player *player, Item *item, SpellCastTargets const &targets, ObjectGuid castId)
virtual bool OnCastItemCombatSpell(Player *player, Unit *victim, SpellInfo const *spellInfo, Item *item)
virtual bool OnExpire(Player *player, ItemTemplate const *proto)
uint32 GetScriptId() const
void push_back(LinkedListElement *pElem)
virtual void OnCreate(TMap *map)
MapScript(MapEntry const *mapEntry) noexcept
MapEntry const * GetEntry() const
virtual void OnDestroy(TMap *map)
virtual void OnUpdate(TMap *map, uint32 diff)
virtual void OnPlayerEnter(TMap *map, Player *player)
virtual void OnPlayerLeave(TMap *map, Player *player)
MapStoredObjectTypesContainer & GetObjectsStore()
BattlegroundMap * ToBattlegroundMap()
GameObject * GetGameObject(ObjectGuid const &guid)
Conversation * GetConversation(ObjectGuid const &guid)
MapEntry const * GetEntry() const
InstanceMap * ToInstanceMap()
AreaTrigger * GetAreaTrigger(ObjectGuid const &guid)
Creature * GetCreature(ObjectGuid const &guid)
bool OnTrigger(Player *player, AreaTriggerEntry const *trigger) final
virtual bool TryHandleOnce(Player *player, AreaTriggerEntry const *trigger)=0
~OnlyOnceAreaTriggerScript()
void ResetAreaTriggerDone(InstanceScript *instance, uint32 triggerId)
OutdoorPvPScript(char const *name) noexcept
PlayerChoiceScript(char const *name) noexcept
virtual void OnResponse(WorldObject *object, Player *player, PlayerChoice const *choice, PlayerChoiceResponse const *response, uint16 clientIdentifier)
virtual void OnReputationChange(Player *player, uint32 factionId, int32 &standing, bool incremental)
virtual void OnLevelChanged(Player *player, uint8 oldLevel)
virtual void OnDuelRequest(Player *target, Player *challenger)
PlayerScript(char const *name) noexcept
virtual void OnMovieComplete(Player *player, uint32 movieId)
virtual void OnClearEmote(Player *player)
virtual void OnTalentsReset(Player *player, bool noCost)
virtual void OnFreeTalentPointsChanged(Player *player, uint32 points)
virtual void OnSpellCast(Player *player, Spell *spell, bool skipCheck)
virtual void OnPVPKill(Player *killer, Player *killed)
virtual void OnMapChanged(Player *player)
virtual void OnGiveXP(Player *player, uint32 &amount, Unit *victim)
virtual void OnChat(Player *player, uint32 type, uint32 lang, std::string &msg)
virtual void OnCreatureKill(Player *killer, Creature *killed)
virtual void OnLogout(Player *player)
virtual void OnSave(Player *player)
virtual void OnLogin(Player *player, bool firstLogin)
virtual void OnDelete(ObjectGuid guid, uint32 accountId)
virtual void OnQuestStatusChange(Player *player, uint32 questId)
virtual void OnPlayerRepop(Player *player)
virtual void OnPlayerKilledByCreature(Creature *killer, Player *killed)
virtual void OnBindToInstance(Player *player, Difficulty difficulty, uint32 mapId, bool permanent, uint8 extendState)
virtual void OnDuelStart(Player *player1, Player *player2)
virtual void OnUpdateZone(Player *player, uint32 newZone, uint32 newArea)
virtual void OnCreate(Player *player)
virtual void OnMoneyLimit(Player *player, int64 amount)
virtual void OnFailedDelete(ObjectGuid guid, uint32 accountId)
virtual void OnDuelEnd(Player *winner, Player *loser, DuelCompleteType type)
virtual void OnTextEmote(Player *player, uint32 textEmote, uint32 emoteNum, ObjectGuid guid)
virtual void OnMoneyChanged(Player *player, int64 &amount)
std::unique_ptr< PlayerMenu > PlayerTalkClass
QuestScript(char const *name) noexcept
virtual void OnAcknowledgeAutoAccept(Player *player, Quest const *quest)
virtual void OnQuestObjectiveChange(Player *player, Quest const *quest, QuestObjective const &objective, int32 oldAmount, int32 newAmount)
virtual void OnQuestStatusChange(Player *player, Quest const *quest, QuestStatus oldStatus, QuestStatus newStatus)
uint32 GetScriptId() const
SceneScript(char const *name) noexcept
virtual void OnSceneTriggerEvent(Player *player, uint32 sceneInstanceID, SceneTemplate const *sceneTemplate, std::string const &triggerName)
virtual void OnSceneStart(Player *player, uint32 sceneInstanceID, SceneTemplate const *sceneTemplate)
virtual void OnSceneCancel(Player *player, uint32 sceneInstanceID, SceneTemplate const *sceneTemplate)
virtual void OnSceneComplete(Player *player, uint32 sceneInstanceID, SceneTemplate const *sceneTemplate)
void NotifyScriptIDUpdate()
Inform the ScriptMgr that an entity has a changed script id.
void OnAuctionRemove(AuctionHouseObject *ah, AuctionPosting *auction)
void OnPlayerDelete(ObjectGuid guid, uint32 accountId)
void OnSceneTrigger(Player *player, uint32 sceneInstanceID, SceneTemplate const *sceneTemplate, std::string const &triggerName)
void OnPlayerLogin(Player *player, bool firstLogin)
void OnPlayerCreate(Player *player)
void OnEmailChange(uint32 accountId)
void OnPlayerTalentsReset(Player *player, bool noCost)
std::shared_ptr< ModuleReference > AcquireModuleReferenceOfScriptName(std::string const &scriptname) const
void CreateSpellScripts(uint32 spellId, std::vector< SpellScript * > &scriptVector, Spell *invoker) const
void OnOpenStateChange(bool open)
void OnMovieComplete(Player *player, uint32 movieId)
void OnBaseGainCalculation(uint32 &gain, uint8 playerLevel, uint8 mobLevel)
void OnPlayerFreeTalentPointsChanged(Player *player, uint32 newPoints)
bool CanCreateCreatureAI(uint32 scriptId) const
void ModifyPeriodicDamageAurasTick(Unit *target, Unit *attacker, uint32 &damage)
void ModifySpellDamageTaken(Unit *target, Unit *attacker, int32 &damage, SpellInfo const *spellInfo)
bool OnQuestAccept(Player *player, Item *item, Quest const *quest)
void OnQuestStatusChange(Player *player, uint32 questId)
void OnHonorCalculation(float &honor, uint8 level, float multiplier)
void OnPlayerBindToInstance(Player *player, Difficulty difficulty, uint32 mapid, bool permanent, uint8 extendState)
void OnGroupInviteMember(Group *group, ObjectGuid guid)
void OnGuildRemoveMember(Guild *guild, ObjectGuid guid, bool isDisbanding, bool isKicked)
void OnDestroyMap(Map *map)
void OnPacketSend(WorldSession *session, WorldPacket const &packet)
void OnGrayLevelCalculation(uint8 &grayLevel, uint8 playerLevel)
void OnGroupRemoveMember(Group *group, ObjectGuid guid, RemoveMethod method, ObjectGuid kicker, char const *reason)
void OnAchievementCompleted(Player *player, AchievementEntry const *achievement)
void SwapScriptContext(bool initialize=false)
uint32 GetScriptCount() const
void OnHeal(Unit *healer, Unit *reciever, uint32 &gain)
void OnUninstall(Vehicle *veh)
void OnPlayerLeaveMap(Map *map, Player *player)
void OnSceneComplete(Player *player, uint32 sceneInstanceID, SceneTemplate const *sceneTemplate)
void OnGuildAddMember(Guild *guild, Player *player, uint8 plRank)
void OnDynamicObjectUpdate(DynamicObject *dynobj, uint32 diff)
void OnGuildDisband(Guild *guild)
bool OnCriteriaCheck(uint32 scriptId, Player *source, Unit *target)
void SyncScripts()
Synchronize all scripts with their current ids.
void OnGuildBankEvent(Guild *guild, uint8 eventType, uint8 tabId, ObjectGuid::LowType playerGuid, uint64 itemOrMoney, uint16 itemStackCount, uint8 destTabId)
void OnAccountLogin(uint32 accountId)
void OnRemovePassenger(Vehicle *veh, Unit *passenger)
void OnFailedPasswordChange(uint32 accountId)
void OnPlayerChat(Player *player, uint32 type, uint32 lang, std::string &msg)
void OnPlayerMoneyChanged(Player *player, int64 &amount)
void ModifyMeleeDamage(Unit *target, Unit *attacker, uint32 &damage)
static std::string const & GetNameOfStaticContext()
Returns the context name of the static context provided by the worldserver.
void OnMotdChange(std::string &newMotd)
void OnGuildItemMove(Guild *guild, Player *player, Item *pItem, bool isSrcBank, uint8 srcContainer, uint8 srcSlotId, bool isDestBank, uint8 destContainer, uint8 destSlotId)
void OnTransportUpdate(Transport *transport, uint32 diff)
void OnGroupChangeLeader(Group *group, ObjectGuid newLeaderGuid, ObjectGuid oldLeaderGuid)
SpellScriptLoader * GetSpellScriptLoader(uint32 scriptId)
void OnPlayerDuelEnd(Player *winner, Player *loser, DuelCompleteType type)
void OnFailedEmailChange(uint32 accountId)
void OnPlayerReputationChange(Player *player, uint32 factionID, int32 &standing, bool incremental)
void OnPlayerFailedDelete(ObjectGuid guid, uint32 accountId)
void OnPlayerSpellCast(Player *player, Spell *spell, bool skipCheck)
void OnPVPKill(Player *killer, Player *killed)
void OnWorldUpdate(uint32 diff)
void OnGroupRateCalculation(float &rate, uint32 count, bool isRaid)
void OnSocketOpen(std::shared_ptr< WorldSocket > const &socket)
Battlefield * CreateBattlefield(uint32 scriptId, Map *map)
bool OnAreaTrigger(Player *player, AreaTriggerEntry const *trigger, bool entered)
GameObjectAI * GetGameObjectAI(GameObject *go)
bool CanCreateGameObjectAI(uint32 scriptId) const
void OnRelocate(Transport *transport, uint32 mapId, float x, float y, float z)
BattlegroundScript * CreateBattlegroundData(BattlegroundMap *map)
OutdoorPvP * CreateOutdoorPvP(uint32 scriptId, Map *map)
void OnAuctionSuccessful(AuctionHouseObject *ah, AuctionPosting *auction)
ConversationAI * GetConversationAI(Conversation *conversation)
void OnPlayerClearEmote(Player *player)
void OnReset(Vehicle *veh)
void OnQuestObjectiveChange(Player *player, Quest const *quest, QuestObjective const &objective, int32 oldAmount, int32 newAmount)
void OnGroupAddMember(Group *group, ObjectGuid guid)
void OnGroupDisband(Group *group)
void OnZeroDifferenceCalculation(uint8 &diff, uint8 playerLevel)
std::string _currentContext
void SetScriptContext(std::string const &context)
void OnInstallAccessory(Vehicle *veh, Creature *accessory)
void OnGuildMOTDChanged(Guild *guild, const std::string &newMotd)
void OnPlayerChoiceResponse(WorldObject *object, Player *player, PlayerChoice const *choice, PlayerChoiceResponse const *response, uint16 clientIdentifier)
ScriptLoaderCallbackType _script_loader_callback
void OnDamage(Unit *attacker, Unit *victim, uint32 &damage)
void OnShutdownInitiate(ShutdownExitCode code, ShutdownMask mask)
void OnGuildInfoChanged(Guild *guild, const std::string &newInfo)
void OnPlayerKilledByCreature(Creature *killer, Player *killed)
void OnGainCalculation(uint32 &gain, Player *player, Unit *unit)
bool OnItemUse(Player *player, Item *item, SpellCastTargets const &targets, ObjectGuid castId)
void OnPlayerLevelChanged(Player *player, uint8 oldLevel)
void OnPlayerSave(Player *player)
void OnPlayerMoneyLimit(Player *player, int64 amount)
bool CanCreateConversationAI(uint32 scriptId) const
void OnSceneCancel(Player *player, uint32 sceneInstanceID, SceneTemplate const *sceneTemplate)
void OnGuildMemberDepositMoney(Guild *guild, Player *player, uint64 &amount)
void OnPlayerLogout(Player *player)
void OnGivePlayerXP(Player *player, uint32 &amount, Unit *victim)
void OnPlayerDuelRequest(Player *target, Player *challenger)
void OnConfigLoad(bool reload)
void OnWorldStateValueChange(WorldStateTemplate const *worldStateTemplate, int32 oldValue, int32 newValue, Map const *map)
void OnMapUpdate(Map *map, uint32 diff)
std::vector< Trinity::ChatCommands::ChatCommandBuilder > GetChatCommands()
CreatureAI * GetCreatureAI(Creature *creature)
void OnPlayerTextEmote(Player *player, uint32 textEmote, uint32 emoteNum, ObjectGuid guid)
void OnPlayerEnterMap(Map *map, Player *player)
void OnInstall(Vehicle *veh)
InstanceScript * CreateInstanceData(InstanceMap *map)
void ReleaseScriptContext(std::string const &context)
void OnGuildEvent(Guild *guild, uint8 eventType, ObjectGuid::LowType playerGuid1, ObjectGuid::LowType playerGuid2, uint8 newRank)
void CreateAuraScripts(uint32 spellId, std::vector< AuraScript * > &scriptVector, Aura *invoker) const
void OnWeatherUpdate(Weather *weather, uint32 diff)
void OnColorCodeCalculation(XPColorChar &color, uint8 playerLevel, uint8 mobLevel)
bool OnCastItemCombatSpell(Player *player, Unit *victim, SpellInfo const *spellInfo, Item *item)
void OnPlayerUpdateZone(Player *player, uint32 newZone, uint32 newArea)
bool OnItemRemove(Player *player, Item *item)
void OnFailedAccountLogin(uint32 accountId)
bool OnConditionCheck(Condition const *condition, ConditionSourceInfo &sourceInfo)
void OnEventTrigger(WorldObject *object, WorldObject *invoker, uint32 eventId)
void OnPacketReceive(WorldSession *session, WorldPacket const &packet)
AreaTriggerAI * GetAreaTriggerAI(AreaTrigger *areaTrigger)
void OnCreatureKill(Player *killer, Creature *killed)
void OnAuctionExpire(AuctionHouseObject *ah, AuctionPosting *auction)
void OnGuildCreate(Guild *guild, Player *leader, const std::string &name)
void OnAddCreaturePassenger(Transport *transport, Creature *creature)
void OnPlayerDuelStart(Player *player1, Player *player2)
void OnGuildMemberWitdrawMoney(Guild *guild, Player *player, uint64 &amount, bool isRepair)
void OnPasswordChange(uint32 accountId)
void OnSocketClose(std::shared_ptr< WorldSocket > const &socket)
void OnWeatherChange(Weather *weather, WeatherState state, float grade)
void OnSceneStart(Player *player, uint32 sceneInstanceID, SceneTemplate const *sceneTemplate)
bool OnItemExpire(Player *player, ItemTemplate const *proto)
void OnQuestAcknowledgeAutoAccept(Player *player, Quest const *quest)
void OnCreateMap(Map *map)
void OnAuctionAdd(AuctionHouseObject *ah, AuctionPosting *auction)
void OnAddPassenger(Vehicle *veh, Unit *passenger, int8 seatId)
void OnPlayerRepop(Player *player)
bool CanCreateAreaTriggerAI(uint32 scriptId) const
static ScriptMgr * instance()
std::string const & GetName() const
ScriptObject(ScriptObject const &right)=delete
Type erasure wrapper for objects.
DeleteableObjectBase(DeleteableObjectBase const &)=delete
virtual ~DeleteableObjectBase()
DeleteableObject(T &&object)
void QueueForDelayedDelete(T &&any)
std::vector< std::unique_ptr< DeleteableObjectBase > > _delayed_delete_queue
std::unordered_set< ScriptRegistryInterface * > _registries
void Unload() final override
Unloads the script registry.
void Register(ScriptRegistryInterface *registry)
std::string const & GetScriptContextOfScriptName(std::string const &scriptname) const
void SetScriptNameInContext(std::string const &scriptname, std::string const &context)
void ReleaseContext(std::string const &context) final override
void SyncScriptNames() final override
Updates the scripts to reflect the current id.
void SwapContext(bool initialize) final override
Injects and updates the changed script objects.
static ScriptRegistryCompositum * Instance()
std::unordered_map< std::string, std::string > _scriptnames_to_context
ScriptRegistryCompositum() noexcept=default
void RemoveUsedScriptsFromContainer(std::unordered_set< std::string > &scripts) final override
virtual void Unload()=0
Unloads the script registry.
ScriptRegistryInterface()=default
ScriptRegistryInterface(ScriptRegistryInterface const &)=delete
ScriptRegistryInterface(ScriptRegistryInterface &&)=delete
virtual void ReleaseContext(std::string const &context)=0
ScriptRegistryInterface & operator=(ScriptRegistryInterface const &)=delete
virtual ~ScriptRegistryInterface()=default
virtual void SyncScriptNames()=0
Updates the scripts to reflect the current id.
virtual void SwapContext(bool initialize)=0
Injects and updates the changed script objects.
virtual void RemoveUsedScriptsFromContainer(std::unordered_set< std::string > &scripts)=0
virtual void BeforeReleaseContext(std::string const &)
Called before the actual context release happens.
ScriptRegistrySwapHookBase()
virtual void BeforeSwapContext(bool)
Called before SwapContext.
virtual ~ScriptRegistrySwapHookBase()
ScriptRegistrySwapHookBase & operator=(ScriptRegistrySwapHookBase const &)=delete
ScriptRegistrySwapHookBase(ScriptRegistrySwapHookBase &&)=delete
virtual void BeforeUnload()
Called before Unload.
ScriptRegistrySwapHookBase(ScriptRegistrySwapHookBase const &)=delete
virtual void OnScriptNamesSync()
Called manually to sync scriptnames.
void BeforeSwapContext(bool) override
Called before SwapContext.
void BeforeUnload() final override
Called before Unload.
void BeforeReleaseContext(std::string const &context) final override
Called before the actual context release happens.
ScriptRegistrySwapHooks()
void BeforeReleaseContext(std::string const &) final override
Called before the actual context release happens.
void BeforeSwapContext(bool) override
Called before SwapContext.
void BeforeUnload() final override
Called before Unload.
ScriptRegistrySwapHooks()
void BeforeReleaseContext(std::string const &context) final override
Called before the actual context release happens.
void BeforeUnload() final override
Called before Unload.
void BeforeSwapContext(bool) override
Called before SwapContext.
void BeforeReleaseContext(std::string const &context) final override
Called before the actual context release happens.
void BeforeUnload() final override
Called before Unload.
void BeforeSwapContext(bool initialize) override
Called before SwapContext.
ScriptRegistrySwapHooks()
void BeforeSwapContext(bool) override
Called before SwapContext.
ScriptRegistrySwapHooks()
void BeforeReleaseContext(std::string const &context) final override
Called before the actual context release happens.
void BeforeUnload() final override
Called before Unload.
ScriptRegistrySwapHooks()
void BeforeReleaseContext(std::string const &context) final override
Called before the actual context release happens.
void BeforeUnload() final override
Called before Unload.
void BeforeSwapContext(bool) override
Called before SwapContext.
void BeforeUnload() final override
Called before Unload.
void BeforeSwapContext(bool) override
Called before SwapContext.
void BeforeReleaseContext(std::string const &context) final override
Called before the actual context release happens.
ScriptRegistrySwapHooks()
ScriptRegistry() noexcept
void LogDuplicatedScriptPointerError(ScriptType const *first, ScriptType const *second)
static ScriptRegistry * Instance()
static std::shared_ptr< ModuleReference > AcquireModuleReferenceOfContext(std::string const &context)
Returns an owning reference to the current module of the given context.
ServerScript(char const *name) noexcept
virtual void OnNetworkStop()
virtual void OnNetworkStart()
virtual void OnSocketOpen(std::shared_ptr< WorldSocket > socket)
virtual void OnPacketSend(WorldSession *session, WorldPacket &packet)
virtual void OnSocketClose(std::shared_ptr< WorldSocket > socket)
virtual void OnPacketReceive(WorldSession *session, WorldPacket &packet)
void SwapContext(bool initialize) final override
Injects and updates the changed script objects.
void SyncScriptNames() final override
Updates the scripts to reflect the current id.
void AddScript(ScriptType *script) noexcept
void Unload() final override
Unloads the script registry.
ScriptStoreType & GetScripts()
ScriptStoreType::iterator ScriptStoreIteratorType
std::unordered_multimap< std::string, std::unique_ptr< ScriptType > > ScriptStoreType
void RemoveUsedScriptsFromContainer(std::unordered_set< std::string > &scripts) final override
SpecializedScriptRegistry() noexcept=default
ScriptStoreType::iterator ScriptStoreIteratorType
std::unordered_multimap< std::string, uint32 > _ids_of_contexts
void SyncScriptNames() final override
Updates the scripts to reflect the current id.
void RemoveUsedScriptsFromContainer(std::unordered_set< std::string > &scripts) final override
std::unordered_set< uint32 > const & GetRecentlyAddedScriptIDs() const
std::unordered_map< uint32, std::unique_ptr< ScriptType > > ScriptStoreType
void SwapContext(bool initialize) final override
Injects and updates the changed script objects.
std::unordered_set< uint32 > _recently_added_ids
ScriptStoreType & GetScripts()
std::unordered_set< uint32 > GetScriptIDsToRemove(std::string const &context) const
void AddScript(ScriptType *script) noexcept
ScriptType * GetScriptById(uint32 id)
SpecializedScriptRegistry() noexcept=default
void Unload() final override
Unloads the script registry.
virtual SpellScript * GetSpellScript() const
virtual AuraScript * GetAuraScript() const
SpellScriptLoader(char const *name) noexcept
virtual void OnUpdate(Transport *transport, uint32 diff)
virtual void OnAddCreaturePassenger(Transport *transport, Creature *creature)
virtual void OnRelocate(Transport *transport, uint32 mapId, float x, float y, float z)
virtual void OnAddPassenger(Transport *transport, Player *player)
virtual void OnRemovePassenger(Transport *transport, Player *player)
TransportScript(char const *name) noexcept
static void FillAISpellInfo()
virtual void InitializeAI()
static std::unordered_map< std::pair< uint32, Difficulty >, AISpellInfoType > AISpellInfo
virtual void OnHeal(Unit *healer, Unit *reciever, uint32 &gain)
virtual void OnDamage(Unit *attacker, Unit *victim, uint32 &damage)
virtual void ModifyPeriodicDamageAurasTick(Unit *target, Unit *attacker, uint32 &damage)
virtual void ModifySpellDamageTaken(Unit *target, Unit *attacker, int32 &damage, SpellInfo const *spellInfo)
UnitScript(char const *name) noexcept
virtual void ModifyMeleeDamage(Unit *target, Unit *attacker, uint32 &damage)
void ClearUnitState(uint32 f)
void RemoveCharmedBy(Unit *charmer)
Vehicle * GetVehicleKit() const
void BeforeReleaseContext(std::string const &context) final override
Called before the actual context release happens.
virtual void OnUninstall(Vehicle *veh)
VehicleScript(char const *name) noexcept
virtual void OnRemovePassenger(Vehicle *veh, Unit *passenger)
virtual void OnInstallAccessory(Vehicle *veh, Creature *accessory)
virtual void OnInstall(Vehicle *veh)
virtual void OnReset(Vehicle *veh)
virtual void OnAddPassenger(Vehicle *veh, Unit *passenger, int8 seatId)
void Reset(bool evading=false)
Reapplies immunities and reinstalls accessories. Only has effect for creatures.
virtual void OnChange(Weather *weather, WeatherState state, float grade)
virtual void OnUpdate(Weather *weather, uint32 diff)
WeatherScript(char const *name) noexcept
WorldMapScript(char const *name, uint32 mapId) noexcept
InstanceScript * GetInstanceScript() const
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
virtual void OnOpenStateChange(bool open)
virtual void OnShutdownCancel()
virtual void OnShutdown()
virtual void OnConfigLoad(bool reload)
WorldScript(char const *name) noexcept
virtual void OnShutdownInitiate(ShutdownExitCode code, ShutdownMask mask)
virtual void OnUpdate(uint32 diff)
virtual void OnMotdChange(std::string &newMotd)
Player session in the World.
WorldStateScript(char const *name) noexcept
virtual void OnValueChange(int32 worldStateId, int32 oldValue, int32 newValue, Map const *map)
uint32 GetScriptId() const
uint32 GetSelectedAIId(Creature const *creature)
TC_GAME_API void InvalidateCommandMap()