50 : std::false_type { };
102 : std::true_type { };
106 : std::true_type { };
178 "Scriptname was assigned to this context already!");
186 "Given scriptname doesn't exist!");
193 registry->ReleaseContext(context);
200 if (itr->second == context)
209 registry->SwapContext(initialize);
217 registry->RemoveUsedScriptsFromContainer(scripts);
232 >(std::forward<T>(any))
263#define sScriptRegistryCompositum ScriptRegistryCompositum::Instance()
265template<
typename ,
bool >
269template<
class ScriptType>
272 ScriptType, is_script_database_bound<ScriptType>::value>
290 TC_LOG_ERROR(
"scripts",
"Script '{}' has same memory pointer as '{}'.",
291 first->GetName(), second->GetName());
317template<
typename ScriptType,
typename Base>
324template<
typename Base>
331 auto const bounds =
static_cast<Base*
>(
this)->_ids_of_contexts.equal_range(context);
332 ASSERT(bounds.first == bounds.second);
337template<
typename ObjectType,
typename ScriptType,
typename Base>
349 void Visit(std::unordered_map<ObjectGuid, ObjectType*>& objects)
355 void Visit(std::unordered_map<ObjectGuid, O*>&) { }
387 "There is a disabled AI which is still loaded.");
397 "Destroying the AI should never fail here!");
401 "The AI should be null here!");
419 "The AI should be null here!");
426 "The AI should be null here!");
433 "Creating the AI should never fail here!");
457 "The AI should be null here!");
480 auto evaluator = [&](std::unordered_map<ObjectGuid, ObjectType*>& objects)
482 for (
auto object : objects)
486 if (idsToRemove.find(
object.second->GetScriptId()) != idsToRemove.end())
487 visitor(
object.second);
504 std::vector<ObjectGuid> guidsToReset;
508 if (object->AI() && !object->GetGUID().IsEmpty())
509 guidsToReset.push_back(object->GetGUID());
514 if (
auto entity =
GetEntityFromMap(std::common_type<ObjectType>{}, map, guid))
530 std::vector<ObjectGuid> guidsToReset;
534 if (!object->AI() && !object->GetGUID().IsEmpty())
537 LoadInitializeScript(object);
538 guidsToReset.push_back(object->GetGUID());
545 if (
auto entity =
GetEntityFromMap(std::common_type<ObjectType>{}, map, guid))
559 auto idsToRemove =
static_cast<Base*
>(
this)->GetScriptIDsToRemove(context);
563 ids_removed_.insert(idsToRemove.begin(), idsToRemove.end());
574 ids_removed_.insert(
static_cast<Base*
>(
this)->GetRecentlyAddedScriptIDs().begin(),
575 static_cast<Base*
>(
this)->GetRecentlyAddedScriptIDs().end());
593template<
typename Base>
596 Creature, CreatureScript, Base
600template<
typename Base>
603 GameObject, GameObjectScript, Base
607template<
typename Base>
612template<
typename Base>
617template<
typename Base>
626 auto const bounds =
static_cast<Base*
>(
this)->_ids_of_contexts.equal_range(context);
628 if ((!swapped) && (bounds.first != bounds.second))
638 if ((!initialize) && swapped)
655template<
typename Base>
664 auto const bounds =
static_cast<Base*
>(
this)->_ids_of_contexts.equal_range(context);
665 if (bounds.first != bounds.second)
684template<
typename Base>
693 auto const bounds =
static_cast<Base*
>(
this)->_ids_of_contexts.equal_range(context);
695 if (bounds.first != bounds.second)
718template<
typename ScriptType>
726 template<
typename,
typename>
729 template<
typename,
typename,
typename>
735 typedef std::unordered_map<
737 std::unique_ptr<ScriptType>
744 this->BeforeReleaseContext(context);
746 auto const bounds = _ids_of_contexts.equal_range(context);
747 for (
auto itr = bounds.first; itr != bounds.second; ++itr)
748 _scripts.erase(itr->second);
753 this->BeforeSwapContext(initialize);
755 _recently_added_ids.clear();
760 for (
auto const& script : _scripts)
761 scripts.erase(script.second->GetName());
766 this->BeforeUnload();
768 ASSERT(_recently_added_ids.empty(),
769 "Recently added script ids should be empty here!");
772 _ids_of_contexts.clear();
779 "Tried to call AddScript with a nullpointer!");
781 "Tried to register a script without being in a valid script context!");
783 std::unique_ptr<ScriptType> script_ptr(script);
790 for (
auto const& stored_script : _scripts)
793 if (stored_script.second->GetName() == script->GetName())
796 ABORT_MSG(
"Script '%s' already assigned with the same script name, "
797 "so the script can't work.", script->GetName().c_str());
807 _scripts.insert(std::make_pair(
id, std::move(script_ptr)));
808 _ids_of_contexts.insert(std::make_pair(
sScriptMgr->GetCurrentScriptContext(),
id));
809 _recently_added_ids.insert(
id);
817 TC_LOG_ERROR(
"sql.sql",
"Script '{}' exists in the core, but is not referenced by the database!",
830 auto const itr = _scripts.find(
id);
831 if (itr != _scripts.end())
832 return itr->second.get();
847 std::unordered_set<uint32> scripts_to_remove;
849 auto const bounds = _ids_of_contexts.equal_range(context);
850 for (
auto itr = bounds.first; itr != bounds.second; ++itr)
851 scripts_to_remove.insert(itr->second);
853 return scripts_to_remove;
858 return _recently_added_ids;
872template<
typename Base>
894template<
typename ScriptType>
899 template<
typename,
typename>
903 typedef std::unordered_multimap<std::string , std::unique_ptr<ScriptType>>
ScriptStoreType;
910 this->BeforeReleaseContext(context);
912 _scripts.erase(context);
917 this->BeforeSwapContext(initialize);
922 for (
auto const& script : _scripts)
923 scripts.erase(script.second->GetName());
928 this->BeforeUnload();
937 "Tried to call AddScript with a nullpointer!");
939 "Tried to register a script without being in a valid script context!");
941 std::unique_ptr<ScriptType> script_ptr(script);
943 for (
auto const& entry : _scripts)
944 if (entry.second.get() == script)
947 LogDuplicatedScriptPointerError(script, entry.second.get());
954 _scripts.insert(std::make_pair(
sScriptMgr->GetCurrentScriptContext(), std::move(script_ptr)));
967#define SCR_REG_MAP(T) ScriptRegistry<T>::ScriptStoreType
968#define SCR_REG_ITR(T) ScriptRegistry<T>::ScriptStoreIteratorType
969#define SCR_REG_LST(T) ScriptRegistry<T>::Instance()->GetScripts()
972#define FOR_SCRIPTS(T, C, E) \
973 if (!SCR_REG_LST(T).empty()) \
974 for (SCR_REG_ITR(T) C = SCR_REG_LST(T).begin(); \
975 C != SCR_REG_LST(T).end(); ++C)
977#define FOR_SCRIPTS_RET(T, C, E, R) \
978 if (SCR_REG_LST(T).empty()) \
981 for (SCR_REG_ITR(T) C = SCR_REG_LST(T).begin(); \
982 C != SCR_REG_LST(T).end(); ++C)
984#define FOREACH_SCRIPT(T) \
985 FOR_SCRIPTS(T, itr, end) \
989#define GET_SCRIPT(T, I, V) \
990 T* V = ScriptRegistry<T>::Instance()->GetScriptById(I); \
994#define GET_SCRIPT_RET(T, I, V, R) \
995 T* V = ScriptRegistry<T>::Instance()->GetScriptById(I); \
1021 : _scriptCount(0), _script_loader_callback(nullptr)
1036 &&
"Reload hotswap spell effect for creatures isn't valid!");
1042 TC_LOG_INFO(
"server.loading",
"Loading C++ scripts");
1057 "Script loader callback wasn't registered!");
1069 std::unordered_set<std::string> unusedScriptNames(
1076 for (std::string
const& scriptName : unusedScriptNames)
1080 if (scriptName.empty())
1083 TC_LOG_ERROR(
"sql.sql",
"Script '{}' is referenced by the database, but does not exist in the core!", scriptName);
1086 TC_LOG_INFO(
"server.loading",
">> Loaded {} C++ scripts in {} ms",
1103 static std::string
const name =
"___static___";
1112std::shared_ptr<ModuleReference>
1115#ifdef TRINITY_API_USE_DYNAMIC_LINKING
1153 pTempSpell =
sSpellMgr->GetSpellInfo(i);
1227template<
typename T,
typename F,
typename O>
1231 for (
auto itr = bounds.first; itr != bounds.second; ++itr)
1234 if (!itr->second.second)
1241 T* script = (*tmpscript.*extractor)();
1245 script->_Init(&tmpscript->
GetName(), spellId);
1246 if (!script->_Load(objectInvoker))
1252 scriptVector.push_back(script);
1383#define SCR_MAP_BGN(M, V, I, E, C, T) \
1384 if (V->GetEntry() && V->GetEntry()->T()) \
1386 FOR_SCRIPTS(M, I, E) \
1388 MapEntry const* C = I->second->GetEntry(); \
1391 if (C->ID == V->GetId()) \
1394#define SCR_MAP_END \
1405 itr->second->OnCreate(map);
1422 itr->second->OnDestroy(map);
1440 itr->second->OnLoadGridMap(map, gmap, gx, gy);
1444 itr->second->OnLoadGridMap((
InstanceMap*)map, gmap, gx, gy);
1458 itr->second->OnUnloadGridMap(map, gmap, gx, gy);
1462 itr->second->OnUnloadGridMap((
InstanceMap*)map, gmap, gx, gy);
1478 itr->second->OnPlayerEnter(map, player);
1482 itr->second->OnPlayerEnter((
InstanceMap*)map, player);
1496 itr->second->OnPlayerLeave(map, player);
1500 itr->second->OnPlayerLeave((
InstanceMap*)map, player);
1513 itr->second->OnUpdate(map, diff);
1533 return tmpscript->GetInstanceScript(map);
1544 return tmpscript->OnQuestAccept(player, item, quest);
1553 return tmpscript->OnUse(player, item, targets);
1562 return tmpscript->OnExpire(player, proto);
1571 return tmpscript->OnRemove(player, item);
1582 return tmpscript->OnCastItemCombatSpell(player, victim, spellInfo, item);
1590 return tmpscript->GetAI(creature);
1598 return tmpscript->GetAI(gameobject);
1607 return tmpscript->OnTrigger(player, trigger);
1613 return tmpscript->GetBattlefield();
1626 return tmpscript->GetOutdoorPvP();
1636 std::move(cmds.begin(), cmds.end(), std::back_inserter(table));
1647 tmpscript->OnChange(weather, state, grade);
1655 tmpscript->OnUpdate(weather, diff);
1695 return tmpscript->OnConditionCheck(condition, sourceInfo);
1704 tmpscript->OnInstall(veh);
1713 tmpscript->OnUninstall(veh);
1722 tmpscript->OnReset(veh);
1732 tmpscript->OnInstallAccessory(veh, accessory);
1742 tmpscript->OnAddPassenger(veh, passenger, seatId);
1752 tmpscript->OnRemovePassenger(veh, passenger);
1760 itr->second->OnUpdate(dynobj, diff);
1769 tmpscript->OnAddPassenger(transport, player);
1778 tmpscript->OnAddCreaturePassenger(transport, creature);
1787 tmpscript->OnRemovePassenger(transport, player);
1795 tmpscript->OnUpdate(transport, diff);
1801 tmpscript->OnRelocate(transport, waypointId, mapId, x, y, z);
1820 return tmpscript->OnCheck(source, target);
2062 bool isDestBank,
uint8 destContainer,
uint8 destSlotId)
2064 FOREACH_SCRIPT(
GuildScript)->OnItemMove(guild, player, pItem, isSrcBank, srcContainer, srcSlotId, isDestBank, destContainer, destSlotId);
2252template <
class TMap>
2257template <
class TMap>
2263template <
class TMap>
2268template <
class TMap>
2273template <
class TMap>
2278template <
class TMap>
2283template <
class TMap>
2296 TC_LOG_ERROR(
"scripts",
"Invalid WorldMapScript for {}; no such map ID.", mapId);
2299 TC_LOG_ERROR(
"scripts",
"WorldMapScript for map {} is invalid.", mapId);
2308 TC_LOG_ERROR(
"scripts",
"Invalid InstanceMapScript for {}; no such map ID.", mapId);
2311 TC_LOG_ERROR(
"scripts",
"InstanceMapScript for map {} is invalid.", mapId);
2325 TC_LOG_ERROR(
"scripts",
"Invalid BattlegroundMapScript for {}; no such map ID.", mapId);
2328 TC_LOG_ERROR(
"scripts",
"BattlegroundMapScript for map {} is invalid.", mapId);
2415 uint32 const triggerId = trigger->
ID;
@ SELECT_TARGET_ANY_FRIEND
@ SELECT_TARGET_AOE_FRIEND
@ SELECT_TARGET_ANY_ENEMY
@ SELECT_TARGET_SINGLE_FRIEND
@ SELECT_TARGET_SINGLE_ENEMY
@ SELECT_TARGET_AOE_ENEMY
DBCStorage< MapEntry > sMapStore(MapEntryfmt)
#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
void CreateSpellOrAuraScripts(uint32 spellId, std::vector< T * > &scriptVector, F &&extractor, O *objectInvoker)
#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
#define FOR_SCRIPTS(T, C, E)
struct TSpellSummary * SpellSummary
TSpellSummary * SpellSummary
@ SPELL_EFFECT_HEALTH_LEECH
@ SPELL_EFFECT_HEAL_MAX_HEALTH
@ SPELL_EFFECT_HEAL_MECHANICAL
@ SPELL_EFFECT_ENVIRONMENTAL_DAMAGE
@ SPELL_EFFECT_SCHOOL_DAMAGE
@ SPELL_EFFECT_APPLY_AURA
@ TARGET_UNIT_TARGET_PARTY
@ TARGET_DEST_DYNOBJ_ENEMY
@ TARGET_UNIT_CASTER_AREA_PARTY
@ TARGET_UNIT_DEST_AREA_ENEMY
@ TARGET_UNIT_TARGET_ALLY
@ TARGET_UNIT_SRC_AREA_ENEMY
@ TARGET_DEST_TARGET_ENEMY
@ TARGET_UNIT_TARGET_ENEMY
@ TARGET_UNIT_LASTTARGET_AREA_PARTY
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)
AreaTriggerScript(char const *name)
virtual bool OnTrigger(Player *player, AreaTriggerEntry const *trigger)
virtual void OnAuctionAdd(AuctionHouseObject *ah, AuctionEntry *entry)
virtual void OnAuctionRemove(AuctionHouseObject *ah, AuctionEntry *entry)
virtual void OnAuctionExpire(AuctionHouseObject *ah, AuctionEntry *entry)
AuctionHouseScript(char const *name)
virtual void OnAuctionSuccessful(AuctionHouseObject *ah, AuctionEntry *entry)
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 EnterEvadeMode(EvadeReason why=EVADE_REASON_OTHER)
void Visit(std::unordered_map< ObjectGuid, ObjectType * > &objects)
void Visit(std::unordered_map< ObjectGuid, O * > &)
AIFunctionMapWorker(T &&worker)
bool Execute(uint64, uint32) override
AsyncCastHotswapEffectEvent(Unit *owner)
This hook is responsible for swapping Creature and GameObject AI's.
static void InitializeScriptIdsFromSet(std::unordered_set< uint32 > const &idsToRemove)
void BeforeReleaseContext(std::string const &context) final override
Called before the actual context release happens.
static void UnloadResetScript(GameObject *gameobject)
static void UnloadResetScript(Creature *creature)
static void LoadResetScript(Creature *creature)
void BeforeUnload() final override
Called before Unload.
std::unordered_set< uint32 > ids_removed_
static void DestroyScriptIdsFromSet(std::unordered_set< uint32 > const &idsToRemove)
static void LoadInitializeScript(GameObject *gameobject)
static GameObject * GetEntityFromMap(std::common_type< GameObject >, Map *map, ObjectGuid const &guid)
void BeforeSwapContext(bool initialize) override
Called before SwapContext.
static Creature * GetEntityFromMap(std::common_type< Creature >, Map *map, ObjectGuid const &guid)
static void LoadResetScript(GameObject *gameobject)
static void UnloadDestroyScript(GameObject *gameobject)
static void LoadInitializeScript(Creature *creature)
static void UnloadDestroyScript(Creature *creature)
static void VisitObjectsToSwapOnMap(Map *map, std::unordered_set< uint32 > const &idsToRemove, T visitor)
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
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 OnMemberWitdrawMoney(Guild *guild, Player *player, uint32 &amount, bool isRepair)
virtual void OnEvent(Guild *guild, uint8 eventType, ObjectGuid::LowType playerGuid1, ObjectGuid::LowType playerGuid2, uint8 newRank)
virtual void OnRemoveMember(Guild *guild, Player *player, bool isDisbanding, bool isKicked)
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 OnBankEvent(Guild *guild, uint8 eventType, uint8 tabId, ObjectGuid::LowType playerGuid, uint32 itemOrMoney, uint16 itemStackCount, uint8 destTabId)
virtual void OnDisband(Guild *guild)
GuildScript(char const *name)
virtual void OnAddMember(Guild *guild, Player *player, uint8 &plRank)
virtual void OnMemberDepositMoney(Guild *guild, Player *player, uint32 &amount)
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)
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)
Creature * GetCreature(ObjectGuid const &guid)
static Creature * ToCreature(Object *o)
bool OnTrigger(Player *, AreaTriggerEntry const *) final override
virtual bool TryHandleOnce(Player *player, AreaTriggerEntry const *trigger)=0
void ResetAreaTriggerDone(InstanceScript *instance, uint32 triggerId)
OutdoorPvPScript(char const *name)
virtual void OnReputationChange(Player *player, uint32 factionId, int32 &standing, bool incremental)
virtual void OnMoneyChanged(Player *player, int32 &amount)
virtual void OnTalentsReset(Player *player, bool involuntarily)
virtual void OnLevelChanged(Player *player, uint8 oldLevel)
virtual void OnDuelRequest(Player *target, Player *challenger)
virtual void OnMovieComplete(Player *player, uint32 movieId)
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 OnEmote(Player *player, Emote emote)
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 OnMoneyLimit(Player *player, int32 amount)
virtual void OnCreate(Player *player)
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)
PlayerMenu * PlayerTalkClass
bool OnItemUse(Player *player, Item *item, SpellCastTargets const &targets)
void OnPlayerDelete(ObjectGuid guid, uint32 accountId)
void OnPlayerLogin(Player *player, bool firstLogin)
void OnPlayerCreate(Player *player)
void OnBaseGainCalculation(uint32 &gain, uint8 playerLevel, uint8 mobLevel, ContentLevels content)
void OnEmailChange(uint32 accountId)
std::shared_ptr< ModuleReference > AcquireModuleReferenceOfScriptName(std::string const &scriptname) const
void CreateSpellScripts(uint32 spellId, std::vector< SpellScript * > &scriptVector, Spell *invoker) const
void OnGuildAddMember(Guild *guild, Player *player, uint8 &plRank)
void OnOpenStateChange(bool open)
OutdoorPvP * CreateOutdoorPvP(uint32 scriptId)
void OnMovieComplete(Player *player, uint32 movieId)
void OnAuctionSuccessful(AuctionHouseObject *ah, AuctionEntry *entry)
void OnPlayerFreeTalentPointsChanged(Player *player, uint32 newPoints)
void OnLoadGridMap(Map *map, GridMap *gmap, uint32 gx, uint32 gy)
void OnPlayerEmote(Player *player, Emote emote)
void ModifyPeriodicDamageAurasTick(Unit *target, Unit *attacker, uint32 &damage)
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 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 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 OnDynamicObjectUpdate(DynamicObject *dynobj, uint32 diff)
void OnGuildDisband(Guild *guild)
bool OnCriteriaCheck(uint32 scriptId, Player *source, Unit *target)
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 OnAuctionExpire(AuctionHouseObject *ah, AuctionEntry *entry)
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 OnGuildRemoveMember(Guild *guild, Player *player, bool isDisbanding, bool isKicked)
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 OnQuestObjectiveProgress(Player *player, Quest const *quest, uint32 objectiveIndex, uint16 progress)
void OnPlayerSpellCast(Player *player, Spell *spell, bool skipCheck)
void OnPVPKill(Player *killer, Player *killed)
void OnWorldUpdate(uint32 diff)
void ModifySpellDamageTaken(Unit *target, Unit *attacker, int32 &damage)
void OnGroupRateCalculation(float &rate, uint32 count, bool isRaid)
void OnSocketOpen(std::shared_ptr< WorldSocket > const &socket)
GameObjectAI * GetGameObjectAI(GameObject *go)
std::vector< Trinity::ChatCommands::ChatCommandBuilder > GetChatCommands()
Battlefield * CreateBattlefield(uint32 scriptId)
void OnGuildMemberWitdrawMoney(Guild *guild, Player *player, uint32 &amount, bool isRepair)
void OnReset(Vehicle *veh)
void OnPlayerMoneyChanged(Player *player, int32 &amount)
bool OnAreaTrigger(Player *player, AreaTriggerEntry const *trigger)
void OnGroupAddMember(Group *group, ObjectGuid guid)
void OnGroupDisband(Group *group)
void OnZeroDifferenceCalculation(uint8 &diff, uint8 playerLevel)
void OnPlayerMoneyLimit(Player *player, int32 amount)
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 OnPlayerTalentsReset(Player *player, bool involuntarily)
void OnGuildInfoChanged(Guild *guild, const std::string &newInfo)
void OnPlayerKilledByCreature(Creature *killer, Player *killed)
void OnGainCalculation(uint32 &gain, Player *player, Unit *unit)
void OnPlayerLevelChanged(Player *player, uint8 oldLevel)
void OnPlayerSave(Player *player)
void OnPlayerLogout(Player *player)
void OnGivePlayerXP(Player *player, uint32 &amount, Unit *victim)
void OnPlayerDuelRequest(Player *target, Player *challenger)
void OnConfigLoad(bool reload)
void OnMapUpdate(Map *map, uint32 diff)
CreatureAI * GetCreatureAI(Creature *creature)
void OnUnloadGridMap(Map *map, GridMap *gmap, uint32 gx, uint32 gy)
void OnPlayerTextEmote(Player *player, uint32 textEmote, uint32 emoteNum, ObjectGuid guid)
void OnPlayerEnterMap(Map *map, Player *player)
void OnGuildBankEvent(Guild *guild, uint8 eventType, uint8 tabId, ObjectGuid::LowType playerGuid, uint32 itemOrMoney, uint16 itemStackCount, uint8 destTabId)
void OnInstall(Vehicle *veh)
InstanceScript * CreateInstanceData(InstanceMap *map)
void OnGuildMemberDepositMoney(Guild *guild, Player *player, uint32 &amount)
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)
void OnRelocate(Transport *transport, uint32 waypointId, uint32 mapId, float x, float y, float z)
bool OnConditionCheck(Condition const *condition, ConditionSourceInfo &sourceInfo)
void OnPacketReceive(WorldSession *session, WorldPacket const &packet)
void OnCreatureKill(Player *killer, Creature *killed)
void OnGuildCreate(Guild *guild, Player *leader, const std::string &name)
void OnAuctionAdd(AuctionHouseObject *ah, AuctionEntry *entry)
void OnAddCreaturePassenger(Transport *transport, Creature *creature)
void OnPlayerDuelStart(Player *player1, Player *player2)
void OnAuctionRemove(AuctionHouseObject *ah, AuctionEntry *entry)
void OnPasswordChange(uint32 accountId)
void OnSocketClose(std::shared_ptr< WorldSocket > const &socket)
void OnWeatherChange(Weather *weather, WeatherState state, float grade)
bool OnItemExpire(Player *player, ItemTemplate const *proto)
void OnCreateMap(Map *map)
void OnAddPassenger(Vehicle *veh, Unit *passenger, int8 seatId)
void OnPlayerRepop(Player *player)
static ScriptMgr * instance()
std::string const & GetName() const
ScriptObject(char const *name)
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 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 ~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
virtual void BeforeUnload()
Called before Unload.
ScriptRegistrySwapHookBase(ScriptRegistrySwapHookBase const &)=delete
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 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 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 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.
std::array< SpellEffectInfo, MAX_SPELL_EFFECTS > const & GetEffects() const
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 OnAddPassenger(Transport *transport, Player *player)
virtual void OnRelocate(Transport *transport, uint32 waypointId, uint32 mapId, float x, float y, float z)
virtual void OnRemovePassenger(Transport *transport, Player *player)
TransportScript(char const *name)
static void FillAISpellInfo()
virtual void InitializeAI()
static 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)
UnitScript(char const *name)
virtual void ModifyMeleeDamage(Unit *target, Unit *attacker, uint32 &damage)
virtual void ModifySpellDamageTaken(Unit *target, Unit *attacker, int32 &damage)
void ClearUnitState(uint32 f)
void RemoveCharmedBy(Unit *charmer)
Vehicle * GetVehicleKit() const
This hook is responsible for swapping OutdoorPvP's.
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)
Unit * GetBase() const
May be called from scripts.
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.
uint32 GetScriptId() const
std::vector< ChatCommandBuilder > ChatCommandTable
TC_GAME_API void InvalidateCommandMap()