From 0b5c03f66b0ce82add6a9d2f8df89e67c936f21f Mon Sep 17 00:00:00 2001 From: Spp- Date: Wed, 27 Jul 2011 14:52:59 +0200 Subject: Core/Scripts: ScriptRegistry is no longer the part of ScriptMgr public interface, it is not required by caller side. Also remove extra function call to GetScriptId in scripts --- src/server/game/Scripting/ScriptMgr.cpp | 197 +++++++++++++++++++++++--------- 1 file changed, 146 insertions(+), 51 deletions(-) (limited to 'src/server/game/Scripting/ScriptMgr.cpp') diff --git a/src/server/game/Scripting/ScriptMgr.cpp b/src/server/game/Scripting/ScriptMgr.cpp index af301738f20..f551b268b3a 100755 --- a/src/server/game/Scripting/ScriptMgr.cpp +++ b/src/server/game/Scripting/ScriptMgr.cpp @@ -17,6 +17,7 @@ */ #include "ScriptPCH.h" +#include "ScriptMgr.h" #include "Config.h" #include "DatabaseEnv.h" #include "DBCStores.h" @@ -26,6 +27,100 @@ #include "ScriptSystem.h" #include "Transport.h" +// This is the global static registry of scripts. +template +class ScriptRegistry +{ + // Counter used for code-only scripts. + static uint32 _scriptIdCounter; + +public: + typedef std::map ScriptMap; + typedef typename ScriptMap::iterator ScriptMapIterator; + + // The actual list of scripts. This will be accessed concurrently, so it must not be modified + // after server startup. + static ScriptMap ScriptPointerList; + + static void AddScript(TScript* const script) + { + ASSERT(script); + + // See if the script is using the same memory as another script. If this happens, it means that + // someone forgot to allocate new memory for a script. + for (ScriptMapIterator it = ScriptPointerList.begin(); it != ScriptPointerList.end(); ++it) + { + if (it->second == script) + { + sLog->outError("Script '%s' has same memory pointer as '%s'.", + script->GetName().c_str(), it->second->GetName().c_str()); + + return; + } + } + + if (script->IsDatabaseBound()) + { + // Get an ID for the script. An ID only exists if it's a script that is assigned in the database + // through a script name (or similar). + uint32 id = sObjectMgr->GetScriptId(script->GetName().c_str()); + if (id) + { + // Try to find an existing script. + bool existing = false; + for (ScriptMapIterator it = ScriptPointerList.begin(); it != ScriptPointerList.end(); ++it) + { + // If the script names match... + if (it->second->GetName() == script->GetName()) + { + // ... It exists. + existing = true; + break; + } + } + + // If the script isn't assigned -> assign it! + if (!existing) + { + ScriptPointerList[id] = script; + sScriptMgr->IncrementScriptCount(); + } + else + { + // If the script is already assigned -> delete it! + sLog->outError("Script '%s' already assigned with the same script name, so the script can't work.", + script->GetName().c_str()); + + ASSERT(false); // Error that should be fixed ASAP. + } + } + else + { + // The script uses a script name from database, but isn't assigned to anything. + if (script->GetName().find("example") == std::string::npos && script->GetName().find("Smart") == std::string::npos) + sLog->outErrorDb("Script named '%s' does not have a script name assigned in database.", + script->GetName().c_str()); + } + } + else + { + // We're dealing with a code-only script; just add it. + ScriptPointerList[_scriptIdCounter++] = script; + sScriptMgr->IncrementScriptCount(); + } + } + + // Gets a script by its ID (assigned by ObjectMgr). + static TScript* GetScriptById(uint32 id) + { + ScriptMapIterator it = ScriptPointerList.find(id); + if (it != ScriptPointerList.end()) + return it->second; + + return NULL; + } +}; + // Utility macros to refer to the script registry. #define SCR_REG_MAP(T) ScriptRegistry::ScriptMap #define SCR_REG_ITR(T) ScriptRegistry::ScriptMapIterator @@ -1290,25 +1385,25 @@ void ScriptMgr::OnGroupDisband(Group* group) SpellScriptLoader::SpellScriptLoader(const char* name) : ScriptObject(name) { - ScriptMgr::ScriptRegistry::AddScript(this); + ScriptRegistry::AddScript(this); } ServerScript::ServerScript(const char* name) : ScriptObject(name) { - ScriptMgr::ScriptRegistry::AddScript(this); + ScriptRegistry::AddScript(this); } WorldScript::WorldScript(const char* name) : ScriptObject(name) { - ScriptMgr::ScriptRegistry::AddScript(this); + ScriptRegistry::AddScript(this); } FormulaScript::FormulaScript(const char* name) : ScriptObject(name) { - ScriptMgr::ScriptRegistry::AddScript(this); + ScriptRegistry::AddScript(this); } WorldMapScript::WorldMapScript(const char* name, uint32 mapId) @@ -1317,7 +1412,7 @@ WorldMapScript::WorldMapScript(const char* name, uint32 mapId) if (GetEntry() && !GetEntry()->IsContinent()) sLog->outError("WorldMapScript for map %u is invalid.", mapId); - ScriptMgr::ScriptRegistry::AddScript(this); + ScriptRegistry::AddScript(this); } InstanceMapScript::InstanceMapScript(const char* name, uint32 mapId) @@ -1326,7 +1421,7 @@ InstanceMapScript::InstanceMapScript(const char* name, uint32 mapId) if (GetEntry() && !GetEntry()->IsDungeon()) sLog->outError("InstanceMapScript for map %u is invalid.", mapId); - ScriptMgr::ScriptRegistry::AddScript(this); + ScriptRegistry::AddScript(this); } BattlegroundMapScript::BattlegroundMapScript(const char* name, uint32 mapId) @@ -1335,140 +1430,140 @@ BattlegroundMapScript::BattlegroundMapScript(const char* name, uint32 mapId) if (GetEntry() && !GetEntry()->IsBattleground()) sLog->outError("BattlegroundMapScript for map %u is invalid.", mapId); - ScriptMgr::ScriptRegistry::AddScript(this); + ScriptRegistry::AddScript(this); } ItemScript::ItemScript(const char* name) : ScriptObject(name) { - ScriptMgr::ScriptRegistry::AddScript(this); + ScriptRegistry::AddScript(this); } CreatureScript::CreatureScript(const char* name) : ScriptObject(name) { - ScriptMgr::ScriptRegistry::AddScript(this); + ScriptRegistry::AddScript(this); } GameObjectScript::GameObjectScript(const char* name) : ScriptObject(name) { - ScriptMgr::ScriptRegistry::AddScript(this); + ScriptRegistry::AddScript(this); } AreaTriggerScript::AreaTriggerScript(const char* name) : ScriptObject(name) { - ScriptMgr::ScriptRegistry::AddScript(this); + ScriptRegistry::AddScript(this); } BattlegroundScript::BattlegroundScript(const char* name) : ScriptObject(name) { - ScriptMgr::ScriptRegistry::AddScript(this); + ScriptRegistry::AddScript(this); } OutdoorPvPScript::OutdoorPvPScript(const char* name) : ScriptObject(name) { - ScriptMgr::ScriptRegistry::AddScript(this); + ScriptRegistry::AddScript(this); } CommandScript::CommandScript(const char* name) : ScriptObject(name) { - ScriptMgr::ScriptRegistry::AddScript(this); + ScriptRegistry::AddScript(this); } WeatherScript::WeatherScript(const char* name) : ScriptObject(name) { - ScriptMgr::ScriptRegistry::AddScript(this); + ScriptRegistry::AddScript(this); } AuctionHouseScript::AuctionHouseScript(const char* name) : ScriptObject(name) { - ScriptMgr::ScriptRegistry::AddScript(this); + ScriptRegistry::AddScript(this); } ConditionScript::ConditionScript(const char* name) : ScriptObject(name) { - ScriptMgr::ScriptRegistry::AddScript(this); + ScriptRegistry::AddScript(this); } VehicleScript::VehicleScript(const char* name) : ScriptObject(name) { - ScriptMgr::ScriptRegistry::AddScript(this); + ScriptRegistry::AddScript(this); } DynamicObjectScript::DynamicObjectScript(const char* name) : ScriptObject(name) { - ScriptMgr::ScriptRegistry::AddScript(this); + ScriptRegistry::AddScript(this); } TransportScript::TransportScript(const char* name) : ScriptObject(name) { - ScriptMgr::ScriptRegistry::AddScript(this); + ScriptRegistry::AddScript(this); } AchievementCriteriaScript::AchievementCriteriaScript(const char* name) : ScriptObject(name) { - ScriptMgr::ScriptRegistry::AddScript(this); + ScriptRegistry::AddScript(this); } PlayerScript::PlayerScript(const char* name) : ScriptObject(name) { - ScriptMgr::ScriptRegistry::AddScript(this); + ScriptRegistry::AddScript(this); } GuildScript::GuildScript(const char* name) : ScriptObject(name) { - ScriptMgr::ScriptRegistry::AddScript(this); + ScriptRegistry::AddScript(this); } GroupScript::GroupScript(const char* name) : ScriptObject(name) { - ScriptMgr::ScriptRegistry::AddScript(this); + ScriptRegistry::AddScript(this); } -// Instantiate static members of ScriptMgr::ScriptRegistry. -template std::map ScriptMgr::ScriptRegistry::ScriptPointerList; -template uint32 ScriptMgr::ScriptRegistry::_scriptIdCounter = 0; +// Instantiate static members of ScriptRegistry. +template std::map ScriptRegistry::ScriptPointerList; +template uint32 ScriptRegistry::_scriptIdCounter = 0; // Specialize for each script type class like so: -template class ScriptMgr::ScriptRegistry; -template class ScriptMgr::ScriptRegistry; -template class ScriptMgr::ScriptRegistry; -template class ScriptMgr::ScriptRegistry; -template class ScriptMgr::ScriptRegistry; -template class ScriptMgr::ScriptRegistry; -template class ScriptMgr::ScriptRegistry; -template class ScriptMgr::ScriptRegistry; -template class ScriptMgr::ScriptRegistry; -template class ScriptMgr::ScriptRegistry; -template class ScriptMgr::ScriptRegistry; -template class ScriptMgr::ScriptRegistry; -template class ScriptMgr::ScriptRegistry; -template class ScriptMgr::ScriptRegistry; -template class ScriptMgr::ScriptRegistry; -template class ScriptMgr::ScriptRegistry; -template class ScriptMgr::ScriptRegistry; -template class ScriptMgr::ScriptRegistry; -template class ScriptMgr::ScriptRegistry; -template class ScriptMgr::ScriptRegistry; -template class ScriptMgr::ScriptRegistry; -template class ScriptMgr::ScriptRegistry; -template class ScriptMgr::ScriptRegistry; -template class ScriptMgr::ScriptRegistry; +template class ScriptRegistry; +template class ScriptRegistry; +template class ScriptRegistry; +template class ScriptRegistry; +template class ScriptRegistry; +template class ScriptRegistry; +template class ScriptRegistry; +template class ScriptRegistry; +template class ScriptRegistry; +template class ScriptRegistry; +template class ScriptRegistry; +template class ScriptRegistry; +template class ScriptRegistry; +template class ScriptRegistry; +template class ScriptRegistry; +template class ScriptRegistry; +template class ScriptRegistry; +template class ScriptRegistry; +template class ScriptRegistry; +template class ScriptRegistry; +template class ScriptRegistry; +template class ScriptRegistry; +template class ScriptRegistry; +template class ScriptRegistry; // Undefine utility macros. #undef GET_SCRIPT_RET -- cgit v1.2.3