From 28d8f7f70dcf01b5c849f30846c6b86a11dea7e7 Mon Sep 17 00:00:00 2001 From: Naios Date: Wed, 16 Mar 2016 15:34:25 +0100 Subject: CMake: Use inherited dependencies in scripts * Removes the circular dependency between game <-> scripts (cherry picked from commit 96bc31924a5a418d37bd961ef2880f9072126348) --- src/server/game/AI/SmartScripts/SmartAI.h | 4 + src/server/game/Scripting/ScriptLoader.cpp | 55 ---------- src/server/game/Scripting/ScriptLoader.h | 23 ----- src/server/game/Scripting/ScriptMgr.cpp | 13 ++- src/server/game/Scripting/ScriptMgr.h | 11 ++ src/server/scripts/CMakeLists.txt | 160 +++++++---------------------- src/server/scripts/ScriptLoader.cpp | 53 ++++++++++ src/server/scripts/ScriptLoader.h | 23 +++++ src/server/worldserver/Main.cpp | 2 + 9 files changed, 142 insertions(+), 202 deletions(-) delete mode 100644 src/server/game/Scripting/ScriptLoader.cpp delete mode 100644 src/server/game/Scripting/ScriptLoader.h create mode 100644 src/server/scripts/ScriptLoader.cpp create mode 100644 src/server/scripts/ScriptLoader.h (limited to 'src') diff --git a/src/server/game/AI/SmartScripts/SmartAI.h b/src/server/game/AI/SmartScripts/SmartAI.h index cfc8fbe785d..8454ea3b484 100644 --- a/src/server/game/AI/SmartScripts/SmartAI.h +++ b/src/server/game/AI/SmartScripts/SmartAI.h @@ -257,4 +257,8 @@ class SmartGameObjectAI : public GameObjectAI private: SmartScript mScript; }; + +/// Registers scripts required by the SAI scripting system +void AddSC_SmartScripts(); + #endif diff --git a/src/server/game/Scripting/ScriptLoader.cpp b/src/server/game/Scripting/ScriptLoader.cpp deleted file mode 100644 index ccc4c39ccd1..00000000000 --- a/src/server/game/Scripting/ScriptLoader.cpp +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (C) 2008-2016 TrinityCore - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see . - */ - -#include "ScriptLoader.h" -#include "World.h" - -void AddSpellsScripts(); -void AddSC_SmartScripts(); -void AddCommandsScripts(); - -#ifdef SCRIPTS -void AddWorldScripts(); -void AddEasternKingdomsScripts(); -void AddKalimdorScripts(); -void AddOutlandScripts(); -void AddNorthrendScripts(); -void AddMaelstromScripts(); -void AddEventsScripts(); -void AddPetScripts(); -void AddOutdoorPvPScripts(); -void AddCustomScripts(); -#endif - -void AddScripts() -{ - AddSpellsScripts(); - AddSC_SmartScripts(); - AddCommandsScripts(); -#ifdef SCRIPTS - AddWorldScripts(); - AddEasternKingdomsScripts(); - AddKalimdorScripts(); - AddOutlandScripts(); - AddNorthrendScripts(); - AddMaelstromScripts(); - AddEventsScripts(); - AddPetScripts(); - AddOutdoorPvPScripts(); - AddCustomScripts(); -#endif -} diff --git a/src/server/game/Scripting/ScriptLoader.h b/src/server/game/Scripting/ScriptLoader.h deleted file mode 100644 index 57b62df22d1..00000000000 --- a/src/server/game/Scripting/ScriptLoader.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (C) 2008-2016 TrinityCore - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see . - */ - -#ifndef SC_SCRIPTLOADER_H -#define SC_SCRIPTLOADER_H - -void AddScripts(); - -#endif diff --git a/src/server/game/Scripting/ScriptMgr.cpp b/src/server/game/Scripting/ScriptMgr.cpp index 7e2146b4751..2184899de02 100644 --- a/src/server/game/Scripting/ScriptMgr.cpp +++ b/src/server/game/Scripting/ScriptMgr.cpp @@ -22,10 +22,10 @@ #include "DBCStores.h" #include "ObjectMgr.h" #include "OutdoorPvPMgr.h" -#include "ScriptLoader.h" #include "ScriptSystem.h" #include "Transport.h" #include "Vehicle.h" +#include "SmartAI.h" #include "SpellInfo.h" #include "SpellScript.h" #include "GossipDef.h" @@ -240,7 +240,8 @@ struct TSpellSummary uint8 Effects; // set of enum SelectEffect } *SpellSummary; -ScriptMgr::ScriptMgr() : _scriptCount(0), _scheduledScripts(0) +ScriptMgr::ScriptMgr() + : _scriptCount(0), _scheduledScripts(0), _script_loader_callback(nullptr) { } @@ -261,7 +262,13 @@ void ScriptMgr::Initialize() TC_LOG_INFO("server.loading", "Loading C++ scripts"); FillSpellSummary(); - AddScripts(); + + AddSC_SmartScripts(); + + ASSERT(_script_loader_callback, + "Script loader callback wasn't registered!"); + + _script_loader_callback(); #ifdef SCRIPTS for (std::string const& scriptName : UnusedScriptNames) diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h index fc04b0c7b8b..79c1bc3f60f 100644 --- a/src/server/game/Scripting/ScriptMgr.h +++ b/src/server/game/Scripting/ScriptMgr.h @@ -863,6 +863,15 @@ class ScriptMgr void IncrementScriptCount() { ++_scriptCount; } uint32 GetScriptCount() const { return _scriptCount; } + typedef void(*ScriptLoaderCallbackType)(); + + /// Sets the script loader callback which is invoked to load scripts + /// (Workaround for circular dependency game <-> scripts) + void SetScriptLoader(ScriptLoaderCallbackType script_loader_callback) + { + _script_loader_callback = script_loader_callback; + } + public: /* Unloading */ void Unload(); @@ -1097,6 +1106,8 @@ class ScriptMgr //atomic op counter for active scripts amount std::atomic _scheduledScripts; + + ScriptLoaderCallbackType _script_loader_callback; }; #endif diff --git a/src/server/scripts/CMakeLists.txt b/src/server/scripts/CMakeLists.txt index b89d12b70a8..d0f639cb49a 100644 --- a/src/server/scripts/CMakeLists.txt +++ b/src/server/scripts/CMakeLists.txt @@ -10,11 +10,6 @@ # Enable precompiled headers when using the GCC compiler. -if (USE_SCRIPTPCH) - set(scripts_STAT_PCH_HDR PrecompiledHeaders/ScriptPCH.h) - set(scripts_STAT_PCH_SRC PrecompiledHeaders/ScriptPCH.cpp) -endif () - message(STATUS "SCRIPT PREPARATIONS") macro(PrepareScripts name out) @@ -26,134 +21,57 @@ macro(PrepareScripts name out) message(STATUS " -> Prepared: ${name}") endmacro(PrepareScripts) -set(scripts_STAT_SRCS - ${scripts_STAT_SRCS} - ../game/AI/ScriptedAI/ScriptedEscortAI.cpp - ../game/AI/ScriptedAI/ScriptedCreature.cpp - ../game/AI/ScriptedAI/ScriptedFollowerAI.cpp -) - -PrepareScripts(Spells scripts_STAT_SRCS) -PrepareScripts(Commands scripts_STAT_SRCS) +PrepareScripts(Spells PRIVATE_SOURCES) +PrepareScripts(Commands PRIVATE_SOURCES) if(SCRIPTS) - PrepareScripts(Custom scripts_STAT_SRCS) - PrepareScripts(World scripts_STAT_SRCS) - PrepareScripts(OutdoorPvP scripts_STAT_SRCS) - PrepareScripts(EasternKingdoms scripts_STAT_SRCS) - PrepareScripts(Kalimdor scripts_STAT_SRCS) - PrepareScripts(Outland scripts_STAT_SRCS) - PrepareScripts(Northrend scripts_STAT_SRCS) - PrepareScripts(Maelstrom scripts_STAT_SRCS) - PrepareScripts(Events scripts_STAT_SRCS) - PrepareScripts(Pet scripts_STAT_SRCS) + PrepareScripts(Custom PRIVATE_SOURCES) + PrepareScripts(World PRIVATE_SOURCES) + PrepareScripts(OutdoorPvP PRIVATE_SOURCES) + PrepareScripts(EasternKingdoms PRIVATE_SOURCES) + PrepareScripts(Kalimdor PRIVATE_SOURCES) + PrepareScripts(Outland PRIVATE_SOURCES) + PrepareScripts(Northrend PRIVATE_SOURCES) + PrepareScripts(Maelstrom PRIVATE_SOURCES) + PrepareScripts(Events PRIVATE_SOURCES) + PrepareScripts(Pet PRIVATE_SOURCES) endif() message(STATUS "SCRIPT PREPARATION COMPLETE") message("") -include_directories( - ${CMAKE_SOURCE_DIR}/dep/cppformat - ${CMAKE_SOURCE_DIR}/dep/g3dlite/include - ${CMAKE_SOURCE_DIR}/dep/recastnavigation/Detour/Include - ${CMAKE_SOURCE_DIR}/src/common/ - ${CMAKE_SOURCE_DIR}/src/common/Collision - ${CMAKE_SOURCE_DIR}/src/common/Collision/Management - ${CMAKE_SOURCE_DIR}/src/common/Collision/Maps - ${CMAKE_SOURCE_DIR}/src/common/Collision/Models - ${CMAKE_SOURCE_DIR}/src/common/Configuration - ${CMAKE_SOURCE_DIR}/src/common/Debugging - ${CMAKE_SOURCE_DIR}/src/common/Logging - ${CMAKE_SOURCE_DIR}/src/common/Threading - ${CMAKE_SOURCE_DIR}/src/common/Utilities - ${CMAKE_SOURCE_DIR}/src/server/database/Database - ${CMAKE_SOURCE_DIR}/src/server/game/Accounts - ${CMAKE_SOURCE_DIR}/src/server/game/Achievements - ${CMAKE_SOURCE_DIR}/src/server/game/Addons - ${CMAKE_SOURCE_DIR}/src/server/game/AI - ${CMAKE_SOURCE_DIR}/src/server/game/AI/CoreAI - ${CMAKE_SOURCE_DIR}/src/server/game/AI/ScriptedAI - ${CMAKE_SOURCE_DIR}/src/server/game/AI/SmartScripts - ${CMAKE_SOURCE_DIR}/src/server/game/AuctionHouse - ${CMAKE_SOURCE_DIR}/src/server/game/AuctionHouseBot - ${CMAKE_SOURCE_DIR}/src/server/game/Battlefield - ${CMAKE_SOURCE_DIR}/src/server/game/Battlefield/Zones - ${CMAKE_SOURCE_DIR}/src/server/game/Battlegrounds - ${CMAKE_SOURCE_DIR}/src/server/game/Battlegrounds/Zones - ${CMAKE_SOURCE_DIR}/src/server/game/Chat - ${CMAKE_SOURCE_DIR}/src/server/game/Chat/Channels - ${CMAKE_SOURCE_DIR}/src/server/game/Combat - ${CMAKE_SOURCE_DIR}/src/server/game/Conditions - ${CMAKE_SOURCE_DIR}/src/server/game/DataStores - ${CMAKE_SOURCE_DIR}/src/server/game/DungeonFinding - ${CMAKE_SOURCE_DIR}/src/server/game/Entities/AreaTrigger - ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Corpse - ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Creature - ${CMAKE_SOURCE_DIR}/src/server/game/Entities/DynamicObject - ${CMAKE_SOURCE_DIR}/src/server/game/Entities/GameObject - ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Item - ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Item/Container - ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Object - ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Object/Updates - ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Pet - ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Player - ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Transport - ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Unit - ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Vehicle - ${CMAKE_SOURCE_DIR}/src/server/game/Events - ${CMAKE_SOURCE_DIR}/src/server/game/Globals - ${CMAKE_SOURCE_DIR}/src/server/game/Grids - ${CMAKE_SOURCE_DIR}/src/server/game/Grids/Cells - ${CMAKE_SOURCE_DIR}/src/server/game/Grids/Notifiers - ${CMAKE_SOURCE_DIR}/src/server/game/Groups - ${CMAKE_SOURCE_DIR}/src/server/game/Guilds - ${CMAKE_SOURCE_DIR}/src/server/game/Handlers - ${CMAKE_SOURCE_DIR}/src/server/game/Instances - ${CMAKE_SOURCE_DIR}/src/server/game/Loot - ${CMAKE_SOURCE_DIR}/src/server/game/Mails - ${CMAKE_SOURCE_DIR}/src/server/game/Maps - ${CMAKE_SOURCE_DIR}/src/server/game/Miscellaneous - ${CMAKE_SOURCE_DIR}/src/server/game/Movement - ${CMAKE_SOURCE_DIR}/src/server/game/Movement/MovementGenerators - ${CMAKE_SOURCE_DIR}/src/server/game/Movement/Spline - ${CMAKE_SOURCE_DIR}/src/server/game/Movement/Waypoints - ${CMAKE_SOURCE_DIR}/src/server/game/OutdoorPvP - ${CMAKE_SOURCE_DIR}/src/server/game/Pools - ${CMAKE_SOURCE_DIR}/src/server/game/Quests - ${CMAKE_SOURCE_DIR}/src/server/game/Reputation - ${CMAKE_SOURCE_DIR}/src/server/game/Scripting - ${CMAKE_SOURCE_DIR}/src/server/game/Server - ${CMAKE_SOURCE_DIR}/src/server/game/Server/Packets - ${CMAKE_SOURCE_DIR}/src/server/game/Server/Protocol - ${CMAKE_SOURCE_DIR}/src/server/game/Skills - ${CMAKE_SOURCE_DIR}/src/server/game/Spells - ${CMAKE_SOURCE_DIR}/src/server/game/Spells/Auras - ${CMAKE_SOURCE_DIR}/src/server/game/Support - ${CMAKE_SOURCE_DIR}/src/server/game/Texts - ${CMAKE_SOURCE_DIR}/src/server/game/Tickets - ${CMAKE_SOURCE_DIR}/src/server/game/Tools - ${CMAKE_SOURCE_DIR}/src/server/game/Warden - ${CMAKE_SOURCE_DIR}/src/server/game/Weather - ${CMAKE_SOURCE_DIR}/src/server/game/World - ${CMAKE_SOURCE_DIR}/src/server/ipc - ${CMAKE_SOURCE_DIR}/src/server/shared - ${CMAKE_SOURCE_DIR}/src/server/shared/DataStores - ${CMAKE_SOURCE_DIR}/src/server/shared/Dynamic - ${CMAKE_SOURCE_DIR}/src/server/shared/Dynamic/LinkedReference - ${CMAKE_SOURCE_DIR}/src/server/shared/Packets - ${MYSQL_INCLUDE_DIR} - ${OPENSSL_INCLUDE_DIR} - ${VALGRIND_INCLUDE_DIR} -) +list(APPEND PRIVATE_SOURCES + ${CMAKE_CURRENT_SOURCE_DIR}/ScriptLoader.h + ${CMAKE_CURRENT_SOURCE_DIR}/ScriptLoader.cpp) + +if (USE_SCRIPTPCH) + set(PRIVATE_PCH_HEADER PrecompiledHeaders/ScriptPCH.h) + set(PRIVATE_PCH_SOURCE PrecompiledHeaders/ScriptPCH.cpp) +endif () GroupSources(${CMAKE_CURRENT_SOURCE_DIR}) -add_library(scripts STATIC - ${scripts_STAT_SRCS} - ${scripts_STAT_PCH_SRC} +add_library(scripts + ${PRIVATE_SOURCES} + ${PRIVATE_PCH_SOURCE} ) +target_include_directories(scripts + PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR} + PRIVATE + ${CMAKE_CURRENT_BINARY_DIR}) + +target_link_libraries(scripts + PUBLIC + game) + +set_target_properties(scripts + PROPERTIES + FOLDER + "server") + # Generate precompiled header if (USE_SCRIPTPCH) - add_cxx_pch(scripts ${scripts_STAT_PCH_HDR} ${scripts_STAT_PCH_SRC}) + add_cxx_pch(scripts ${PRIVATE_PCH_HEADER} ${PRIVATE_PCH_SOURCE}) endif() diff --git a/src/server/scripts/ScriptLoader.cpp b/src/server/scripts/ScriptLoader.cpp new file mode 100644 index 00000000000..145977a5f79 --- /dev/null +++ b/src/server/scripts/ScriptLoader.cpp @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2008-2016 TrinityCore + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#include "ScriptLoader.h" +#include "World.h" + +void AddSpellsScripts(); +void AddCommandsScripts(); + +#ifdef SCRIPTS +void AddWorldScripts(); +void AddEasternKingdomsScripts(); +void AddKalimdorScripts(); +void AddOutlandScripts(); +void AddNorthrendScripts(); +void AddMaelstromScripts(); +void AddEventsScripts(); +void AddPetScripts(); +void AddOutdoorPvPScripts(); +void AddCustomScripts(); +#endif + +void AddScripts() +{ + AddSpellsScripts(); + AddCommandsScripts(); +#ifdef SCRIPTS + AddWorldScripts(); + AddEasternKingdomsScripts(); + AddKalimdorScripts(); + AddOutlandScripts(); + AddNorthrendScripts(); + AddMaelstromScripts(); + AddEventsScripts(); + AddPetScripts(); + AddOutdoorPvPScripts(); + AddCustomScripts(); +#endif +} diff --git a/src/server/scripts/ScriptLoader.h b/src/server/scripts/ScriptLoader.h new file mode 100644 index 00000000000..57b62df22d1 --- /dev/null +++ b/src/server/scripts/ScriptLoader.h @@ -0,0 +1,23 @@ +/* + * Copyright (C) 2008-2016 TrinityCore + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#ifndef SC_SCRIPTLOADER_H +#define SC_SCRIPTLOADER_H + +void AddScripts(); + +#endif diff --git a/src/server/worldserver/Main.cpp b/src/server/worldserver/Main.cpp index b26027e8960..5b94521817f 100644 --- a/src/server/worldserver/Main.cpp +++ b/src/server/worldserver/Main.cpp @@ -35,6 +35,7 @@ #include "InstanceSaveMgr.h" #include "ObjectAccessor.h" #include "ScriptMgr.h" +#include "ScriptLoader.h" #include "OutdoorPvP/OutdoorPvPMgr.h" #include "BattlegroundMgr.h" #include "TCSoap.h" @@ -193,6 +194,7 @@ extern int main(int argc, char** argv) LoadRealmInfo(); // Initialize the World + sScriptMgr->SetScriptLoader(AddScripts); sWorld->SetInitialWorldSettings(); // Launch CliRunnable thread -- cgit v1.2.3