52#include <unordered_map>
58 : std::false_type { };
102 : std::true_type { };
106 : std::true_type { };
110 : std::true_type { };
114 : std::true_type { };
118 : std::true_type { };
122 : std::true_type { };
126 : std::true_type { };
130 : std::true_type { };
134 : std::true_type { };
138 : std::true_type { };
142 : std::true_type { };
217 "Scriptname was assigned to this context already!");
225 "Given scriptname doesn't exist!");
232 registry->ReleaseContext(context);
239 if (itr->second == context)
248 registry->SwapContext(initialize);
256 registry->RemoveUsedScriptsFromContainer(scripts);
268 registry->SyncScriptNames();
277 >(std::forward<T>(any))
308#define sScriptRegistryCompositum ScriptRegistryCompositum::Instance()
310template<
typename ,
bool >
314template<
class ScriptType>
317 ScriptType, is_script_database_bound<ScriptType>::value>
335 TC_LOG_ERROR(
"scripts",
"Script '{}' has same memory pointer as '{}'.",
336 first->GetName(), second->GetName());
365template<
typename ScriptType,
typename Base>
371template<
typename Base>
378 auto const bounds =
static_cast<Base*
>(
this)->_ids_of_contexts.equal_range(context);
379 ASSERT(bounds.first == bounds.second);
384template<
typename ObjectType,
typename ScriptType,
typename Base>
396 void Visit(std::unordered_map<ObjectGuid, ObjectType*>& objects)
402 void Visit(std::unordered_map<ObjectGuid, O*>&) { }
434 "There is a disabled AI which is still loaded.");
444 "Destroying the AI should never fail here!");
448 "The AI should be null here!");
466 "The AI should be null here!");
484 "The AI should be null here!");
491 "The AI should be null here!");
498 "Creating the AI should never fail here!");
522 "The AI should be null here!");
536 "The AI should be null here!");
563 return [&idsToRemove](
Map* map,
auto&& visitor)
565 auto evaluator = [&](std::unordered_map<ObjectGuid, ObjectType*>& objects)
567 for (
auto object : objects)
571 uint32 aiId =
object.second->AI() ?
object.second->AI()->GetId() : 0;
572 if (idsToRemove.find(aiId) != idsToRemove.end() || (aiId == 0 &&
object.second->GetScriptId()))
573 visitor(
object.second);
577 AIFunctionMapWorker<
typename std::decay<
decltype(evaluator)>::type> worker(std::move(evaluator));
586 return [](
Map* map,
auto&& visitor)
588 auto evaluator = [&](std::unordered_map<ObjectGuid, ObjectType*>& objects)
590 for (
auto object : objects)
592 if (
object.second->AI())
594 ASSERT(
object.second->AI()->GetId());
596 uint32 aiId =
object.second->AI()->GetId();
601 if (aiId == scriptId)
607 if (!
sObjectMgr->IsScriptDatabaseBound(scriptId)
614 visitor(
object.second);
617 visitor(
object.second);
621 AIFunctionMapWorker<
typename std::decay<
decltype(evaluator)>::type> worker(std::move(evaluator));
634 std::vector<ObjectGuid> guidsToReset;
636 visitor(map, [&](ObjectType*
object)
639 guidsToReset.push_back(object->GetGUID());
644 if (
auto entity =
GetEntityFromMap(std::common_type<ObjectType>{}, map, guid))
648 visitor(map, [&](ObjectType*
object)
661 std::vector<ObjectGuid> guidsToReset;
663 visitor(map, [&](ObjectType*
object)
668 LoadInitializeScript(object);
669 guidsToReset.push_back(object->GetGUID());
676 if (
auto entity =
GetEntityFromMap(std::common_type<ObjectType>{}, map, guid))
690 auto idsToRemove =
static_cast<Base*
>(
this)->GetScriptIDsToRemove(context);
694 ids_removed_.insert(idsToRemove.begin(), idsToRemove.end());
705 ids_removed_.insert(
static_cast<Base*
>(
this)->GetRecentlyAddedScriptIDs().begin(),
706 static_cast<Base*
>(
this)->GetRecentlyAddedScriptIDs().end());
732template<
typename Base>
735 Creature, CreatureScript, Base
739template<
typename Base>
742 GameObject, GameObjectScript, Base
746template<
typename Base>
749 AreaTrigger, AreaTriggerEntityScript, Base
753template<
typename Base>
758template<
typename Base>
763template<
typename Base>
772 auto const bounds =
static_cast<Base*
>(
this)->_ids_of_contexts.equal_range(context);
774 if ((!swapped) && (bounds.first != bounds.second))
784 if ((!initialize) && swapped)
801template<
typename Base>
810 auto const bounds =
static_cast<Base*
>(
this)->_ids_of_contexts.equal_range(context);
811 if (bounds.first != bounds.second)
830template<
typename Base>
839 auto const bounds =
static_cast<Base*
>(
this)->_ids_of_contexts.equal_range(context);
840 if (bounds.first != bounds.second)
859template<
typename Base>
868 auto const bounds =
static_cast<Base*
>(
this)->_ids_of_contexts.equal_range(context);
869 if (bounds.first != bounds.second)
888template<
typename Base>
897 auto const bounds =
static_cast<Base*
>(
this)->_ids_of_contexts.equal_range(context);
899 if (bounds.first != bounds.second)
922template<
typename ScriptType>
930 template<
typename,
typename>
933 template<
typename,
typename,
typename>
939 typedef std::unordered_map<
941 std::unique_ptr<ScriptType>
950 auto const bounds = _ids_of_contexts.equal_range(context);
951 for (
auto itr = bounds.first; itr != bounds.second; ++itr)
952 _scripts.erase(itr->second);
959 _recently_added_ids.clear();
964 for (
auto const& script : _scripts)
965 scripts.erase(script.second->GetName());
972 ASSERT(_recently_added_ids.empty(),
973 "Recently added script ids should be empty here!");
976 _ids_of_contexts.clear();
988 "Tried to call AddScript with a nullpointer!");
990 "Tried to register a script without being in a valid script context!");
992 std::unique_ptr<ScriptType> script_ptr(script);
998 for (
auto const& stored_script : _scripts)
1001 if (stored_script.second->GetName() == script->GetName())
1004 ABORT_MSG(
"Script '%s' already assigned with the same script name, "
1005 "so the script can't work.", script->GetName().c_str());
1015 _scripts.insert(std::make_pair(
id, std::move(script_ptr)));
1016 _ids_of_contexts.insert(std::make_pair(
sScriptMgr->GetCurrentScriptContext(),
id));
1017 _recently_added_ids.insert(
id);
1026 auto const itr = _scripts.find(
id);
1027 if (itr != _scripts.end())
1028 return itr->second.get();
1043 std::unordered_set<uint32> scripts_to_remove;
1045 auto const bounds = _ids_of_contexts.equal_range(context);
1046 for (
auto itr = bounds.first; itr != bounds.second; ++itr)
1047 scripts_to_remove.insert(itr->second);
1049 return scripts_to_remove;
1054 return _recently_added_ids;
1068template<
typename Base>
1090template<
typename ScriptType>
1095 template<
typename,
typename>
1099 typedef std::unordered_multimap<std::string , std::unique_ptr<ScriptType>>
ScriptStoreType;
1108 _scripts.erase(context);
1118 for (
auto const& script : _scripts)
1119 scripts.erase(script.second->GetName());
1137 "Tried to call AddScript with a nullpointer!");
1139 "Tried to register a script without being in a valid script context!");
1141 std::unique_ptr<ScriptType> script_ptr(script);
1143 for (
auto const& entry : _scripts)
1144 if (entry.second.get() == script)
1147 LogDuplicatedScriptPointerError(script, entry.second.get());
1154 _scripts.insert(std::make_pair(
sScriptMgr->GetCurrentScriptContext(), std::move(script_ptr)));
1167#define SCR_REG_MAP(T) ScriptRegistry<T>::ScriptStoreType
1168#define SCR_REG_ITR(T) ScriptRegistry<T>::ScriptStoreIteratorType
1169#define SCR_REG_LST(T) ScriptRegistry<T>::Instance()->GetScripts()
1172#define FOR_SCRIPTS(T, C, E) \
1173 if (!SCR_REG_LST(T).empty()) \
1174 for (SCR_REG_ITR(T) C = SCR_REG_LST(T).begin(); \
1175 C != SCR_REG_LST(T).end(); ++C)
1177#define FOR_SCRIPTS_RET(T, C, E, R) \
1178 if (SCR_REG_LST(T).empty()) \
1181 for (SCR_REG_ITR(T) C = SCR_REG_LST(T).begin(); \
1182 C != SCR_REG_LST(T).end(); ++C)
1184#define FOREACH_SCRIPT(T) \
1185 FOR_SCRIPTS(T, itr, end) \
1189#define GET_SCRIPT(T, I, V) \
1190 T* V = ScriptRegistry<T>::Instance()->GetScriptById(I); \
1194#define GET_SCRIPT_RET(T, I, V, R) \
1195 T* V = ScriptRegistry<T>::Instance()->GetScriptById(I); \
1215 : _scriptCount(0), _scriptIdUpdated(false), _script_loader_callback(nullptr)
1230 &&
"Reload hotswap spell effect for creatures isn't valid!");
1236 TC_LOG_INFO(
"server.loading",
"Loading C++ scripts");
1250 sMapMgr->AddSC_BuiltInScripts();
1254 "Script loader callback wasn't registered!");
1266 std::unordered_set<std::string> unusedScriptNames =
sObjectMgr->GetAllDBScriptNames();
1271 for (std::string
const& scriptName : unusedScriptNames)
1275 if (scriptName.empty())
1278 TC_LOG_ERROR(
"sql.sql",
"Script '{}' is referenced by the database, but does not exist in the core!", scriptName);
1281 TC_LOG_INFO(
"server.loading",
">> Loaded {} C++ scripts in {} ms",
1312 static std::string
const name =
"___static___";
1321std::shared_ptr<ModuleReference>
1324#ifdef TRINITY_API_USE_DYNAMIC_LINKING
1353template<
typename T,
typename O>
1357 for (
auto itr = bounds.first; itr != bounds.second; ++itr)
1360 if (!itr->second.second)
1367 T* script = (tmpscript->*extractor)();
1371 script->_Init(tmpscript->
GetName(), spellId);
1372 if (!script->_Load(objectInvoker))
1378 scriptVector.push_back(script);
1509#define SCR_MAP_BGN(M, V, I, E, C, T) \
1510 if (V->GetEntry() && V->GetEntry()->T()) \
1512 FOR_SCRIPTS(M, I, E) \
1514 MapEntry const* C = I->second->GetEntry(); \
1517 if (C->ID == V->GetId()) \
1520#define SCR_MAP_END \
1531 itr->second->OnCreate(map);
1548 itr->second->OnDestroy(map);
1568 itr->second->OnPlayerEnter(map, player);
1572 itr->second->OnPlayerEnter((
InstanceMap*)map, player);
1586 itr->second->OnPlayerLeave(map, player);
1590 itr->second->OnPlayerLeave((
InstanceMap*)map, player);
1603 itr->second->OnUpdate(map, diff);
1623 return tmpscript->GetInstanceScript(map);
1634 return tmpscript->OnQuestAccept(player, item, quest);
1643 return tmpscript->OnUse(player, item, targets, castId);
1652 return tmpscript->OnExpire(player, proto);
1661 return tmpscript->OnRemove(player, item);
1672 return tmpscript->OnCastItemCombatSpell(player, victim, spellInfo, item);
1685 return tmpscript->GetAI(creature);
1698 return tmpscript->GetAI(gameobject);
1711 return tmpscript->GetAI(areatrigger);
1720 return entered ? tmpscript->OnTrigger(player, trigger) : tmpscript->OnExit(player, trigger);
1726 return tmpscript->GetBattlefield(map);
1739 return tmpscript->GetOutdoorPvP(map);
1749 std::move(cmds.begin(), cmds.end(), std::back_inserter(table));
1760 tmpscript->OnChange(weather, state, grade);
1768 tmpscript->OnUpdate(weather, diff);
1808 return tmpscript->OnConditionCheck(condition, sourceInfo);
1817 tmpscript->OnInstall(veh);
1826 tmpscript->OnUninstall(veh);
1835 tmpscript->OnReset(veh);
1845 tmpscript->OnInstallAccessory(veh, accessory);
1855 tmpscript->OnAddPassenger(veh, passenger, seatId);
1865 tmpscript->OnRemovePassenger(veh, passenger);
1873 itr->second->OnUpdate(dynobj, diff);
1882 tmpscript->OnAddPassenger(transport, player);
1891 tmpscript->OnAddCreaturePassenger(transport, creature);
1900 tmpscript->OnRemovePassenger(transport, player);
1908 tmpscript->OnUpdate(transport, diff);
1914 tmpscript->OnRelocate(transport, mapId, x, y, z);
1934 tmpscript->OnCompleted(player, achievement);
1943 return tmpscript->OnCheck(source, target);
2185 bool isDestBank,
uint8 destContainer,
uint8 destSlotId)
2187 FOREACH_SCRIPT(
GuildScript)->OnItemMove(guild, player, pItem, isSrcBank, srcContainer, srcSlotId, isDestBank, destContainer, destSlotId);
2263 tmpscript->OnConversationCreate(conversation, creator);
2271 tmpscript->OnConversationStart(conversation);
2280 tmpscript->OnConversationLineStarted(conversation, lineId, sender);
2288 tmpscript->OnConversationUpdate(conversation, diff);
2298 tmpscript->OnSceneStart(player, sceneInstanceID, sceneTemplate);
2307 tmpscript->OnSceneTriggerEvent(player, sceneInstanceID, sceneTemplate, triggerName);
2316 tmpscript->OnSceneCancel(player, sceneInstanceID, sceneTemplate);
2325 tmpscript->OnSceneComplete(player, sceneInstanceID, sceneTemplate);
2335 tmpscript->OnQuestStatusChange(player, quest, oldStatus, newStatus);
2344 tmpscript->OnAcknowledgeAutoAccept(player, quest);
2353 tmpscript->OnQuestObjectiveChange(player, quest, objective, oldAmount, newAmount);
2359 ASSERT(worldStateTemplate);
2362 tmpscript->OnValueChange(worldStateTemplate->
Id, oldValue, newValue, map);
2371 tmpscript->OnTrigger(
object, invoker, eventId);
2498template <
class TMap>
2503template <
class TMap>
2509template <
class TMap>
2514template <
class TMap>
2519template <
class TMap>
2524template <
class TMap>
2529template <
class TMap>
2542 TC_LOG_ERROR(
"scripts",
"Invalid WorldMapScript for {}; no such map ID.", mapId);
2545 TC_LOG_ERROR(
"scripts",
"WorldMapScript for map {} is invalid.", mapId);
2556 TC_LOG_ERROR(
"scripts",
"Invalid InstanceMapScript for {}; no such map ID.", mapId);
2559 TC_LOG_ERROR(
"scripts",
"InstanceMapScript for map {} is invalid.", mapId);
2575 TC_LOG_ERROR(
"scripts",
"Invalid BattlegroundMapScript for {}; no such map ID.", mapId);
2578 TC_LOG_ERROR(
"scripts",
"BattlegroundMapScript for map {} is invalid.", mapId);
2684 uint32 const triggerId = trigger->
ID;
DB2Storage< MapEntry > sMapStore("Map.db2", &MapLoadInfo::Instance)
#define TC_LOG_ERROR(filterType__,...)
#define TC_LOG_INFO(filterType__,...)
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)
BattlegroundMapScript(char const *name, uint32 mapId)
BattlegroundScript(char const *name)
CommandScript(char const *name)
virtual bool OnConditionCheck(Condition const *condition, ConditionSourceInfo &sourceInfo)
ConditionScript(char const *name)
virtual void OnConversationStart(Conversation *conversation)
ConversationScript(char const *name)
virtual void OnConversationCreate(Conversation *conversation, Unit *creator)
virtual void OnConversationUpdate(Conversation *conversation, uint32 diff)
virtual void OnConversationLineStarted(Conversation *conversation, uint32 lineId, Player *sender)
uint32 GetScriptId() const
virtual void EnterEvadeMode(EvadeReason why=EvadeReason::Other)
void Visit(std::unordered_map< ObjectGuid, O * > &)
AIFunctionMapWorker(T &&worker)
void Visit(std::unordered_map< ObjectGuid, ObjectType * > &objects)
bool Execute(uint64, uint32) override
AsyncCastHotswapEffectEvent(Unit *owner)
This hook is responsible for swapping Creature, GameObject and AreaTrigger AI's.
static void LoadInitializeScript(Creature *creature)
static auto VisitObjectsToSwapOnMap(std::unordered_set< uint32 > const &idsToRemove)
static void LoadInitializeScript(GameObject *gameobject)
static AreaTrigger * GetEntityFromMap(std::common_type< AreaTrigger >, Map *map, ObjectGuid const &guid)
static void UnloadResetScript(GameObject *gameobject)
static void UnloadDestroyScript(AreaTrigger *at)
static void UnloadResetScript(AreaTrigger *at)
void BeforeUnload() final override
Called before Unload.
static void LoadResetScript(GameObject *gameobject)
static void LoadResetScript(Creature *creature)
static GameObject * GetEntityFromMap(std::common_type< GameObject >, Map *map, ObjectGuid const &guid)
static void UnloadDestroyScript(Creature *creature)
static void UnloadResetScript(Creature *creature)
static Creature * GetEntityFromMap(std::common_type< Creature >, Map *map, ObjectGuid const &guid)
std::unordered_set< uint32 > ids_removed_
static void DestroyScriptIdsWithVisitor(T &&visitor)
static void LoadInitializeScript(AreaTrigger *at)
void BeforeReleaseContext(std::string const &context) final override
Called before the actual context release happens.
void BeforeSwapContext(bool initialize) override
Called before SwapContext.
static void InitializeScriptIdsWithVisitor(T &&visitor)
void OnScriptNamesSync() final override
Called manually to sync scriptnames.
static void LoadResetScript(AreaTrigger *at)
static auto VisitObjectsWhereIdWasUpdated()
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)
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)
Battleground * CreateBattleground(BattlegroundTypeId typeId)
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)
std::vector< Trinity::ChatCommands::ChatCommandBuilder > GetChatCommands()
OutdoorPvP * CreateOutdoorPvP(uint32 scriptId, Map *map)
void OnAuctionSuccessful(AuctionHouseObject *ah, AuctionPosting *auction)
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)
void OnConversationUpdate(Conversation *conversation, uint32 diff)
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 OnConversationStart(Conversation *conversation)
void OnInstall(Vehicle *veh)
InstanceScript * CreateInstanceData(InstanceMap *map)
void OnConversationCreate(Conversation *conversation, Unit *creator)
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 OnConversationLineStarted(Conversation *conversation, uint32 lineId, Player *sender)
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 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()