AzerothCore 3.3.5a
OpenSource WoW Emulator
Loading...
Searching...
No Matches
ScriptRegistry< TScript > Class Template Reference

#include "ScriptMgr.h"

Public Types

typedef std::map< uint32, TScript * > ScriptMap
 
typedef ScriptMap::iterator ScriptMapIterator
 
typedef std::vector< std::pair< TScript *, std::vector< uint16 > > > ScriptVector
 
typedef ScriptVector::iterator ScriptVectorIterator
 
typedef std::vector< std::vector< TScript * > > EnabledHooksVector
 
typedef EnabledHooksVector::iterator EnabledHooksVectorIterator
 

Static Public Member Functions

static void InitEnabledHooksIfNeeded (uint16 totalAvailableHooks)
 
static void AddScript (TScript *const script, std::vector< uint16 > enabledHooks={})
 
static void AddALScripts ()
 
static void Unload ()
 
static TScript * GetScriptById (uint32 id)
 

Static Public Attributes

static ScriptMap ScriptPointerList
 
static ScriptVector ALScripts
 
static EnabledHooksVector EnabledHooks
 

Static Private Member Functions

static bool _checkMemory (TScript *const script)
 

Static Private Attributes

static uint32 _scriptIdCounter = 0
 

Detailed Description

template<class TScript>
class ScriptRegistry< TScript >

Member Typedef Documentation

◆ EnabledHooksVector

template<class TScript >
typedef std::vector<std::vector<TScript*> > ScriptRegistry< TScript >::EnabledHooksVector

◆ EnabledHooksVectorIterator

template<class TScript >
typedef EnabledHooksVector::iterator ScriptRegistry< TScript >::EnabledHooksVectorIterator

◆ ScriptMap

template<class TScript >
typedef std::map<uint32, TScript*> ScriptRegistry< TScript >::ScriptMap

◆ ScriptMapIterator

template<class TScript >
typedef ScriptMap::iterator ScriptRegistry< TScript >::ScriptMapIterator

◆ ScriptVector

template<class TScript >
typedef std::vector<std::pair<TScript*,std::vector<uint16> > > ScriptRegistry< TScript >::ScriptVector

◆ ScriptVectorIterator

template<class TScript >
typedef ScriptVector::iterator ScriptRegistry< TScript >::ScriptVectorIterator

Member Function Documentation

◆ _checkMemory()

template<class TScript >
static bool ScriptRegistry< TScript >::_checkMemory ( TScript *const  script)
inlinestaticprivate
929 {
930 // See if the script is using the same memory as another script. If this happens, it means that
931 // someone forgot to allocate new memory for a script.
932 for (ScriptMapIterator it = ScriptPointerList.begin(); it != ScriptPointerList.end(); ++it)
933 {
934 if (it->second == script)
935 {
936 LOG_ERROR("scripts", "Script '{}' has same memory pointer as '{}'.",
937 script->GetName(), it->second->GetName());
938
939 return false;
940 }
941 }
942
943 return true;
944 }
#define LOG_ERROR(filterType__,...)
Definition Log.h:145
static ScriptMap ScriptPointerList
Definition ScriptMgr.h:786
ScriptMap::iterator ScriptMapIterator
Definition ScriptMgr.h:776

References LOG_ERROR, and ScriptRegistry< TScript >::ScriptPointerList.

Referenced by ScriptRegistry< TScript >::AddALScripts().

◆ AddALScripts()

template<class TScript >
static void ScriptRegistry< TScript >::AddALScripts ( )
inlinestatic
826 {
827 for (ScriptVectorIterator it = ALScripts.begin(); it != ALScripts.end(); ++it)
828 {
829 TScript* const script = (*it).first;
830
831 script->checkValidity();
832
833 if (script->IsDatabaseBound())
834 {
835 if (!_checkMemory(script))
836 {
837 return;
838 }
839
840 // Get an ID for the script. An ID only exists if it's a script that is assigned in the database
841 // through a script name (or similar).
842 uint32 id = sObjectMgr->GetScriptId(script->GetName().c_str());
843 if (id)
844 {
845 // Try to find an existing script.
846 TScript const* oldScript = nullptr;
847 for (auto iterator = ScriptPointerList.begin(); iterator != ScriptPointerList.end(); ++iterator)
848 {
849 // If the script names match...
850 if (iterator->second->GetName() == script->GetName())
851 {
852 // ... It exists.
853 oldScript = iterator->second;
854 break;
855 }
856 }
857
858 // If the script is already assigned -> delete it!
859 if (oldScript)
860 {
861 for (auto& vIt : EnabledHooks)
862 for (std::size_t i = 0; i < vIt.size(); ++i)
863 if (vIt[i] == oldScript)
864 {
865 vIt.erase(vIt.begin() + i);
866 break;
867 }
868
869 delete oldScript;
870 }
871
872 // Assign new script!
873 ScriptPointerList[id] = script;
874
875 // Increment script count only with new scripts
876 if (!oldScript)
877 {
878 sScriptMgr->IncreaseScriptCount();
879 }
880 }
881 else
882 {
883 // The script uses a script name from database, but isn't assigned to anything.
884 if (script->GetName().find("Smart") == std::string::npos)
885 LOG_ERROR("sql.sql", "Script named '{}' is not assigned in the database.",
886 script->GetName());
887 }
888 }
889 else
890 {
891 for (uint16 v : (*it).second)
892 EnabledHooks[v].emplace_back(script);
893
894 // We're dealing with a code-only script; just add it.
896 sScriptMgr->IncreaseScriptCount();
897 }
898 }
899 }
std::uint32_t uint32
Definition Define.h:107
std::uint16_t uint16
Definition Define.h:108
#define sObjectMgr
Definition ObjectMgr.h:1731
#define sScriptMgr
Definition ScriptMgr.h:769
static EnabledHooksVector EnabledHooks
Definition ScriptMgr.h:791
static bool _checkMemory(TScript *const script)
Definition ScriptMgr.h:928
static uint32 _scriptIdCounter
Definition ScriptMgr.h:947
ScriptVector::iterator ScriptVectorIterator
Definition ScriptMgr.h:779
static ScriptVector ALScripts
Definition ScriptMgr.h:788
STL namespace.

References ScriptRegistry< TScript >::_checkMemory(), ScriptRegistry< TScript >::_scriptIdCounter, ScriptRegistry< TScript >::ALScripts, ScriptRegistry< TScript >::EnabledHooks, LOG_ERROR, ScriptRegistry< TScript >::ScriptPointerList, sObjectMgr, and sScriptMgr.

◆ AddScript()

template<class TScript >
static void ScriptRegistry< TScript >::AddScript ( TScript *const  script,
std::vector< uint16 >  enabledHooks = {} 
)
inlinestatic
798 {})
799 {
800 ASSERT(script);
801
802 if (!_checkMemory(script))
803 return;
804
805 if (EnabledHooks.empty())
806 InitEnabledHooksIfNeeded(script->GetTotalAvailableHooks());
807
808 if (script->isAfterLoadScript())
809 {
810 ALScripts.emplace_back(script, std::move(enabledHooks));
811 }
812 else
813 {
814 script->checkValidity();
815
816 for (uint16 v : enabledHooks)
817 EnabledHooks[v].emplace_back(script);
818
819 // We're dealing with a code-only script; just add it.
821 sScriptMgr->IncreaseScriptCount();
822 }
823 }
#define ASSERT
Definition Errors.h:68
static void InitEnabledHooksIfNeeded(uint16 totalAvailableHooks)
Definition ScriptMgr.h:793

Referenced by AccountScript::AccountScript(), AchievementCriteriaScript::AchievementCriteriaScript(), AchievementScript::AchievementScript(), ALEScript::ALEScript(), AllBattlegroundScript::AllBattlegroundScript(), AllCommandScript::AllCommandScript(), AllCreatureScript::AllCreatureScript(), AllGameObjectScript::AllGameObjectScript(), AllItemScript::AllItemScript(), AllMapScript::AllMapScript(), AllSpellScript::AllSpellScript(), AreaTriggerScript::AreaTriggerScript(), ArenaScript::ArenaScript(), ArenaTeamScript::ArenaTeamScript(), AuctionHouseScript::AuctionHouseScript(), BattlefieldScript::BattlefieldScript(), BattlegroundMapScript::BattlegroundMapScript(), BattlegroundScript::BattlegroundScript(), CommandScript::CommandScript(), ConditionScript::ConditionScript(), CreatureScript::CreatureScript(), DatabaseScript::DatabaseScript(), DynamicObjectScript::DynamicObjectScript(), FormulaScript::FormulaScript(), GameEventScript::GameEventScript(), GameObjectScript::GameObjectScript(), GlobalScript::GlobalScript(), GroupScript::GroupScript(), GuildScript::GuildScript(), InstanceMapScript::InstanceMapScript(), ItemScript::ItemScript(), LootScript::LootScript(), MailScript::MailScript(), MiscScript::MiscScript(), ModuleScript::ModuleScript(), MovementHandlerScript::MovementHandlerScript(), OutdoorPvPScript::OutdoorPvPScript(), PetScript::PetScript(), PlayerScript::PlayerScript(), ServerScript::ServerScript(), SessionScript::SessionScript(), SpellScriptLoader::SpellScriptLoader(), TicketScript::TicketScript(), TransportScript::TransportScript(), UnitScript::UnitScript(), VehicleScript::VehicleScript(), WeatherScript::WeatherScript(), WorldMapScript::WorldMapScript(), WorldObjectScript::WorldObjectScript(), and WorldScript::WorldScript().

◆ GetScriptById()

◆ InitEnabledHooksIfNeeded()

template<class TScript >
static void ScriptRegistry< TScript >::InitEnabledHooksIfNeeded ( uint16  totalAvailableHooks)
inlinestatic

◆ Unload()

template<class TScript >
static void ScriptRegistry< TScript >::Unload ( )
inlinestatic
905 {
906 for (auto const& [scriptID, script] : ScriptPointerList)
907 delete script;
908
909 ScriptPointerList.clear();
910
911 for (auto& hookScripts : EnabledHooks)
912 hookScripts.clear();
913 }

References ScriptRegistry< TScript >::EnabledHooks, and ScriptRegistry< TScript >::ScriptPointerList.

Referenced by TEST(), and ScriptMgr::Unload().

Member Data Documentation

◆ _scriptIdCounter

template<class TScript >
uint32 ScriptRegistry< TScript >::_scriptIdCounter = 0
staticprivate

◆ ALScripts

template<class TScript >
std::vector< std::pair< TScript *, std::vector< uint16 > > > ScriptRegistry< TScript >::ALScripts
static

◆ EnabledHooks

template<class TScript >
std::vector< std::vector< TScript * > > ScriptRegistry< TScript >::EnabledHooks
static

◆ ScriptPointerList


The documentation for this class was generated from the following file: