53#include <unordered_map>
59 : std::false_type { };
103 : std::true_type { };
107 : std::true_type { };
111 : std::true_type { };
115 : std::true_type { };
119 : std::true_type { };
123 : std::true_type { };
127 : std::true_type { };
131 : std::true_type { };
135 : std::true_type { };
139 : std::true_type { };
143 : std::true_type { };
218 "Scriptname was assigned to this context already!");
226 "Given scriptname doesn't exist!");
233 registry->ReleaseContext(context);
240 if (itr->second == context)
249 registry->SwapContext(initialize);
257 registry->RemoveUsedScriptsFromContainer(scripts);
269 registry->SyncScriptNames();
278 >(std::forward<T>(any))
309#define sScriptRegistryCompositum ScriptRegistryCompositum::Instance()
311template<
typename ,
bool >
315template<
class ScriptType>
318 ScriptType, is_script_database_bound<ScriptType>::value>
336 TC_LOG_ERROR(
"scripts",
"Script '{}' has same memory pointer as '{}'.",
337 first->GetName(), second->GetName());
366template<
typename ScriptType,
typename Base>
372template<
typename Base>
379 auto const bounds =
static_cast<Base*
>(
this)->_ids_of_contexts.equal_range(context);
380 ASSERT(bounds.first == bounds.second);
385template<
typename ObjectType,
typename ScriptType,
typename Base>
397 void Visit(std::unordered_map<ObjectGuid, ObjectType*>& objects)
403 void Visit(std::unordered_map<ObjectGuid, O*>&) { }
435 "There is a disabled AI which is still loaded.");
445 "Destroying the AI should never fail here!");
449 "The AI should be null here!");
467 "The AI should be null here!");
485 "The AI should be null here!");
503 "The AI should be null here!");
510 "The AI should be null here!");
517 "Creating the AI should never fail here!");
541 "The AI should be null here!");
555 "The AI should be null here!");
569 "The AI should be null here!");
601 return [&idsToRemove](
Map* map,
auto&& visitor)
603 auto evaluator = [&](std::unordered_map<ObjectGuid, ObjectType*>& objects)
605 for (
auto object : objects)
609 uint32 aiId =
object.second->AI() ?
object.second->AI()->GetId() : 0;
610 if (idsToRemove.find(aiId) != idsToRemove.end() || (aiId == 0 &&
object.second->GetScriptId()))
611 visitor(
object.second);
615 AIFunctionMapWorker<
typename std::decay<
decltype(evaluator)>::type> worker(std::move(evaluator));
624 return [](
Map* map,
auto&& visitor)
626 auto evaluator = [&](std::unordered_map<ObjectGuid, ObjectType*>& objects)
628 for (
auto object : objects)
630 if (
object.second->AI())
632 ASSERT(
object.second->AI()->GetId());
634 uint32 aiId =
object.second->AI()->GetId();
639 if (aiId == scriptId)
645 if (!
sObjectMgr->IsScriptDatabaseBound(scriptId)
652 visitor(
object.second);
655 visitor(
object.second);
659 AIFunctionMapWorker<
typename std::decay<
decltype(evaluator)>::type> worker(std::move(evaluator));
672 std::vector<ObjectGuid> guidsToReset;
674 visitor(map, [&](ObjectType*
object)
677 guidsToReset.push_back(object->GetGUID());
682 if (
auto entity =
GetEntityFromMap(std::common_type<ObjectType>{}, map, guid))
686 visitor(map, [&](ObjectType*
object)
699 std::vector<ObjectGuid> guidsToReset;
701 visitor(map, [&](ObjectType*
object)
706 LoadInitializeScript(object);
707 guidsToReset.push_back(object->GetGUID());
714 if (
auto entity =
GetEntityFromMap(std::common_type<ObjectType>{}, map, guid))
728 auto idsToRemove =
static_cast<Base*
>(
this)->GetScriptIDsToRemove(context);
732 ids_removed_.insert(idsToRemove.begin(), idsToRemove.end());
743 ids_removed_.insert(
static_cast<Base*
>(
this)->GetRecentlyAddedScriptIDs().begin(),
744 static_cast<Base*
>(
this)->GetRecentlyAddedScriptIDs().end());
770template<
typename Base>
773 Creature, CreatureScript, Base
777template<
typename Base>
780 GameObject, GameObjectScript, Base
784template<
typename Base>
787 AreaTrigger, AreaTriggerEntityScript, Base
791template<
typename Base>
794 Conversation, ConversationScript, Base
799template<
typename Base>
804template<
typename Base>
813 auto const bounds =
static_cast<Base*
>(
this)->_ids_of_contexts.equal_range(context);
815 if ((!swapped) && (bounds.first != bounds.second))
825 if ((!initialize) && swapped)
842template<
typename Base>
851 auto const bounds =
static_cast<Base*
>(
this)->_ids_of_contexts.equal_range(context);
852 if (bounds.first != bounds.second)
871template<
typename Base>
880 auto const bounds =
static_cast<Base*
>(
this)->_ids_of_contexts.equal_range(context);
881 if (bounds.first != bounds.second)
900template<
typename Base>
909 auto const bounds =
static_cast<Base*
>(
this)->_ids_of_contexts.equal_range(context);
910 if (bounds.first != bounds.second)
929template<
typename Base>
938 auto const bounds =
static_cast<Base*
>(
this)->_ids_of_contexts.equal_range(context);
939 if (bounds.first != bounds.second)
958template<
typename Base>
967 auto const bounds =
static_cast<Base*
>(
this)->_ids_of_contexts.equal_range(context);
969 if (bounds.first != bounds.second)
992template<
typename ScriptType>
1000 template<
typename,
typename>
1003 template<
typename,
typename,
typename>
1009 typedef std::unordered_map<
1011 std::unique_ptr<ScriptType>
1020 auto const bounds = _ids_of_contexts.equal_range(context);
1021 for (
auto itr = bounds.first; itr != bounds.second; ++itr)
1022 _scripts.erase(itr->second);
1029 _recently_added_ids.clear();
1034 for (
auto const& script : _scripts)
1035 scripts.erase(script.second->GetName());
1042 ASSERT(_recently_added_ids.empty(),
1043 "Recently added script ids should be empty here!");
1046 _ids_of_contexts.clear();
1058 "Tried to call AddScript with a nullpointer!");
1060 "Tried to register a script without being in a valid script context!");
1062 std::unique_ptr<ScriptType> script_ptr(script);
1068 for (
auto const& stored_script : _scripts)
1071 if (stored_script.second->GetName() == script->GetName())
1074 ABORT_MSG(
"Script '%s' already assigned with the same script name, "
1075 "so the script can't work.", script->GetName().c_str());
1085 _scripts.insert(std::make_pair(
id, std::move(script_ptr)));
1086 _ids_of_contexts.insert(std::make_pair(
sScriptMgr->GetCurrentScriptContext(),
id));
1087 _recently_added_ids.insert(
id);
1096 auto const itr = _scripts.find(
id);
1097 if (itr != _scripts.end())
1098 return itr->second.get();
1113 std::unordered_set<uint32> scripts_to_remove;
1115 auto const bounds = _ids_of_contexts.equal_range(context);
1116 for (
auto itr = bounds.first; itr != bounds.second; ++itr)
1117 scripts_to_remove.insert(itr->second);
1119 return scripts_to_remove;
1124 return _recently_added_ids;
1138template<
typename Base>
1160template<
typename ScriptType>
1165 template<
typename,
typename>
1169 typedef std::unordered_multimap<std::string , std::unique_ptr<ScriptType>>
ScriptStoreType;
1178 _scripts.erase(context);
1188 for (
auto const& script : _scripts)
1189 scripts.erase(script.second->GetName());
1207 "Tried to call AddScript with a nullpointer!");
1209 "Tried to register a script without being in a valid script context!");
1211 std::unique_ptr<ScriptType> script_ptr(script);
1213 for (
auto const& entry : _scripts)
1214 if (entry.second.get() == script)
1217 LogDuplicatedScriptPointerError(script, entry.second.get());
1224 _scripts.insert(std::make_pair(
sScriptMgr->GetCurrentScriptContext(), std::move(script_ptr)));
1237#define SCR_REG_MAP(T) ScriptRegistry<T>::ScriptStoreType
1238#define SCR_REG_ITR(T) ScriptRegistry<T>::ScriptStoreIteratorType
1239#define SCR_REG_LST(T) ScriptRegistry<T>::Instance()->GetScripts()
1242#define FOR_SCRIPTS(T, C, E) \
1243 if (!SCR_REG_LST(T).empty()) \
1244 for (SCR_REG_ITR(T) C = SCR_REG_LST(T).begin(); \
1245 C != SCR_REG_LST(T).end(); ++C)
1247#define FOR_SCRIPTS_RET(T, C, E, R) \
1248 if (SCR_REG_LST(T).empty()) \
1251 for (SCR_REG_ITR(T) C = SCR_REG_LST(T).begin(); \
1252 C != SCR_REG_LST(T).end(); ++C)
1254#define FOREACH_SCRIPT(T) \
1255 FOR_SCRIPTS(T, itr, end) \
1259#define GET_SCRIPT(T, I, V) \
1260 T* V = ScriptRegistry<T>::Instance()->GetScriptById(I); \
1264#define GET_SCRIPT_RET(T, I, V, R) \
1265 T* V = ScriptRegistry<T>::Instance()->GetScriptById(I); \
1285 : _scriptCount(0), _scriptIdUpdated(false), _script_loader_callback(nullptr)
1300 &&
"Reload hotswap spell effect for creatures isn't valid!");
1306 TC_LOG_INFO(
"server.loading",
"Loading C++ scripts");
1320 sMapMgr->AddSC_BuiltInScripts();
1324 "Script loader callback wasn't registered!");
1336 std::unordered_set<std::string> unusedScriptNames =
sObjectMgr->GetAllDBScriptNames();
1341 for (std::string
const& scriptName : unusedScriptNames)
1345 if (scriptName.empty())
1348 TC_LOG_ERROR(
"sql.sql",
"Script '{}' is referenced by the database, but does not exist in the core!", scriptName);
1351 TC_LOG_INFO(
"server.loading",
">> Loaded {} C++ scripts in {} ms",
1382 static std::string
const name =
"___static___";
1391std::shared_ptr<ModuleReference>
1394#ifdef TRINITY_API_USE_DYNAMIC_LINKING
1423template<
typename T,
typename O>
1427 for (
auto itr = bounds.first; itr != bounds.second; ++itr)
1430 if (!itr->second.second)
1437 T* script = (tmpscript->*extractor)();
1441 script->_Init(tmpscript->
GetName(), spellId);
1442 if (!script->_Load(objectInvoker))
1448 scriptVector.push_back(script);
1579#define SCR_MAP_BGN(M, V, I, E, C, T) \
1580 if (V->GetEntry() && V->GetEntry()->T()) \
1582 FOR_SCRIPTS(M, I, E) \
1584 MapEntry const* C = I->second->GetEntry(); \
1587 if (C->ID == V->GetId()) \
1590#define SCR_MAP_END \
1601 itr->second->OnCreate(map);
1618 itr->second->OnDestroy(map);
1638 itr->second->OnPlayerEnter(map, player);
1642 itr->second->OnPlayerEnter((
InstanceMap*)map, player);
1656 itr->second->OnPlayerLeave(map, player);
1660 itr->second->OnPlayerLeave((
InstanceMap*)map, player);
1673 itr->second->OnUpdate(map, diff);
1693 return tmpscript->GetInstanceScript(map);
1701 return tmpscript->GetBattlegroundScript(map);
1712 return tmpscript->OnQuestAccept(player, item, quest);
1721 return tmpscript->OnUse(player, item, targets, castId);
1730 return tmpscript->OnExpire(player, proto);
1739 return tmpscript->OnRemove(player, item);
1750 return tmpscript->OnCastItemCombatSpell(player, victim, spellInfo, item);
1763 return tmpscript->GetAI(creature);
1776 return tmpscript->GetAI(gameobject);
1789 return tmpscript->GetAI(areatrigger);
1798 return entered ? tmpscript->OnTrigger(player, trigger) : tmpscript->OnExit(player, trigger);
1811 return tmpscript->GetAI(conversation);
1817 return tmpscript->GetBattlefield(map);
1823 return tmpscript->GetOutdoorPvP(map);
1833 std::move(cmds.begin(), cmds.end(), std::back_inserter(table));
1844 tmpscript->OnChange(weather, state, grade);
1852 tmpscript->OnUpdate(weather, diff);
1892 return tmpscript->OnConditionCheck(condition, sourceInfo);
1901 tmpscript->OnInstall(veh);
1910 tmpscript->OnUninstall(veh);
1919 tmpscript->OnReset(veh);
1929 tmpscript->OnInstallAccessory(veh, accessory);
1939 tmpscript->OnAddPassenger(veh, passenger, seatId);
1949 tmpscript->OnRemovePassenger(veh, passenger);
1957 itr->second->OnUpdate(dynobj, diff);
1966 tmpscript->OnAddPassenger(transport, player);
1975 tmpscript->OnAddCreaturePassenger(transport, creature);
1984 tmpscript->OnRemovePassenger(transport, player);
1992 tmpscript->OnUpdate(transport, diff);
1998 tmpscript->OnRelocate(transport, mapId, x, y, z);
2018 tmpscript->OnCompleted(player, achievement);
2027 return tmpscript->OnCheck(source, target);
2269 bool isDestBank,
uint8 destContainer,
uint8 destSlotId)
2271 FOREACH_SCRIPT(
GuildScript)->OnItemMove(guild, player, pItem, isSrcBank, srcContainer, srcSlotId, isDestBank, destContainer, destSlotId);
2348 tmpscript->OnSceneStart(player, sceneInstanceID, sceneTemplate);
2357 tmpscript->OnSceneTriggerEvent(player, sceneInstanceID, sceneTemplate, triggerName);
2366 tmpscript->OnSceneCancel(player, sceneInstanceID, sceneTemplate);
2375 tmpscript->OnSceneComplete(player, sceneInstanceID, sceneTemplate);
2385 tmpscript->OnQuestStatusChange(player, quest, oldStatus, newStatus);
2394 tmpscript->OnAcknowledgeAutoAccept(player, quest);
2403 tmpscript->OnQuestObjectiveChange(player, quest, objective, oldAmount, newAmount);
2409 ASSERT(worldStateTemplate);
2412 tmpscript->OnValueChange(worldStateTemplate->
Id, oldValue, newValue, map);
2421 tmpscript->OnTrigger(
object, invoker, eventId);
2548template <
class TMap>
2553template <
class TMap>
2559template <
class TMap>
2564template <
class TMap>
2569template <
class TMap>
2574template <
class TMap>
2579template <
class TMap>
2592 TC_LOG_ERROR(
"scripts",
"Invalid WorldMapScript for {}; no such map ID.", mapId);
2595 TC_LOG_ERROR(
"scripts",
"WorldMapScript for map {} is invalid.", mapId);
2606 TC_LOG_ERROR(
"scripts",
"Invalid InstanceMapScript for {}; no such map ID.", mapId);
2609 TC_LOG_ERROR(
"scripts",
"InstanceMapScript for map {} is invalid.", mapId);
2625 TC_LOG_ERROR(
"scripts",
"Invalid BattlegroundMapScript for {}; no such map ID.", mapId);
2628 TC_LOG_ERROR(
"scripts",
"BattlegroundMapScript for map {} is invalid.", mapId);
2739 uint32 const triggerId = trigger->
ID;
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
#define FOREACH_SCRIPT(T)
@ SPELL_HOTSWAP_VISUAL_SPELL_EFFECT
#define SCR_MAP_BGN(M, V, I, E, C, T)
#define GET_SCRIPT_RET(T, I, V, R)
#define GET_SCRIPT(T, I, V)
#define sScriptRegistryCompositum
void CreateSpellOrAuraScripts(uint32 spellId, std::vector< T * > &scriptVector, T *(SpellScriptLoader::*extractor)() const, O *objectInvoker)
#define FOR_SCRIPTS(T, C, E)
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)
AchievementCriteriaScript(char const *name)
~AchievementCriteriaScript()
AchievementScript(char const *name)
virtual void OnCompleted(Player *player, AchievementEntry const *achievement)
virtual void OnCreate(Spell const *creatingSpell)
virtual AreaTriggerAI * GetAI(AreaTrigger *at) const
AreaTriggerEntityScript(char const *name)
~AreaTriggerEntityScript()
virtual bool OnExit(Player *player, AreaTriggerEntry const *trigger)
AreaTriggerScript(char const *name)
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)
virtual void OnAuctionSuccessful(AuctionHouseObject *ah, AuctionPosting *auction)
virtual void OnAuctionExpire(AuctionHouseObject *ah, AuctionPosting *auction)
AuctionHouseScript(char const *name)
BattlefieldScript(char const *name)
virtual BattlegroundScript * GetBattlegroundScript(BattlegroundMap *map) const
BattlegroundMapScript(char const *name, uint32 mapId)
uint32 GetScriptId() const
CommandScript(char const *name)
virtual bool OnConditionCheck(Condition const *condition, ConditionSourceInfo &sourceInfo)
ConditionScript(char const *name)
virtual void OnCreate(Unit *creator)
virtual ConversationAI * GetAI(Conversation *conversation) const
ConversationScript(char const *name)
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)
uint32 GetScriptId() const
bool AIM_Create(CreatureAI *ai=nullptr)
virtual void OnUpdate(DynamicObject *obj, uint32 diff)
DynamicObjectScript(char const *name)
void KillAllEvents(bool force)
void AddEvent(BasicEvent *event, Milliseconds e_time, bool set_addtime=true)
Milliseconds CalculateTime(Milliseconds t_offset) const
virtual void OnTrigger(WorldObject *object, WorldObject *invoker, uint32 eventId)
EventScript(char const *name)
GameObjectScript(char const *name)
GameObjectAI * AI() const
uint32 GetScriptId() const
GroupScript(char const *name)
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)
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)
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)
GuildScript(char const *name)
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)
uint32 GetScriptId() const
bool IsAreaTriggerDone(uint32 id) const
void MarkAreaTriggerDone(uint32 id)
void ResetAreaTriggerDone(uint32 id)
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)
ItemScript(char const *name)
uint32 GetScriptId() const
virtual void OnCreate(TMap *map)
MapScript(MapEntry const *mapEntry)
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()
GameObject * GetGameObject(ObjectGuid const &guid)
Conversation * GetConversation(ObjectGuid const &guid)
AreaTrigger * GetAreaTrigger(ObjectGuid const &guid)
Creature * GetCreature(ObjectGuid const &guid)
static Creature * ToCreature(Object *o)
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)
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)
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)
PlayerScript(char const *name)
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 OnPlayerChoiceResponse(Player *player, uint32 choiceId, uint32 responseId)
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
virtual void OnAcknowledgeAutoAccept(Player *player, Quest const *quest)
virtual void OnQuestObjectiveChange(Player *player, Quest const *quest, QuestObjective const &objective, int32 oldAmount, int32 newAmount)
QuestScript(char const *name)
virtual void OnQuestStatusChange(Player *player, Quest const *quest, QuestStatus oldStatus, QuestStatus newStatus)
uint32 GetScriptId() const
SceneScript(char const *name)
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 OnPlayerChoiceResponse(Player *player, uint32 choiceId, uint32 responseId)
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)
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)
void OnSocketOpen(std::shared_ptr< WorldSocket > socket)
BattlegroundScript * CreateBattlegroundData(BattlegroundMap *map)
std::vector< Trinity::ChatCommands::ChatCommandBuilder > GetChatCommands()
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)
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)
void OnSocketClose(std::shared_ptr< WorldSocket > socket)
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)
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 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 & operator=(DeleteableObjectBase const &)=delete
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()
ScriptRegistryCompositum()
std::unordered_map< std::string, std::string > _scriptnames_to_context
void RemoveUsedScriptsFromContainer(std::unordered_set< std::string > &scripts) final override
virtual void Unload()=0
Unloads the script registry.
ScriptRegistryInterface(ScriptRegistryInterface const &)=delete
ScriptRegistryInterface(ScriptRegistryInterface &&)=delete
virtual void ReleaseContext(std::string const &context)=0
ScriptRegistryInterface & operator=(ScriptRegistryInterface const &)=delete
virtual void SyncScriptNames()=0
Updates the scripts to reflect the current id.
virtual ~ScriptRegistryInterface()
virtual void SwapContext(bool initialize)=0
Injects and updates the changed script objects.
ScriptRegistryInterface()
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()
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)
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.
SpecializedScriptRegistry()
void SyncScriptNames() final override
Updates the scripts to reflect the current id.
void Unload() final override
Unloads the script registry.
void AddScript(ScriptType *script)
ScriptStoreType & GetScripts()
ScriptStoreType::iterator ScriptStoreIteratorType
void ReleaseContext(std::string const &context) final override
std::unordered_multimap< std::string, std::unique_ptr< ScriptType > > ScriptStoreType
void RemoveUsedScriptsFromContainer(std::unordered_set< std::string > &scripts) final override
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 ReleaseContext(std::string const &context) final override
void AddScript(ScriptType *script)
SpecializedScriptRegistry()
ScriptType * GetScriptById(uint32 id)
void Unload() final override
Unloads the script registry.
SpellScriptLoader(char const *name)
virtual SpellScript * GetSpellScript() const
virtual AuraScript * GetAuraScript() const
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)
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)
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)
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)
WorldMapScript(char const *name, uint32 mapId)
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)
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)
virtual void OnValueChange(int32 worldStateId, int32 oldValue, int32 newValue, Map const *map)
uint32 GetScriptId() const
uint32 GetSelectedAIId(Creature const *creature)
std::vector< ChatCommandBuilder > ChatCommandTable
TC_GAME_API void InvalidateCommandMap()