CMake: Use inherited dependencies in scripts

* Removes the circular dependency between game <-> scripts
This commit is contained in:
Naios
2016-03-16 15:34:25 +01:00
parent 469f2d3ade
commit 96bc31924a
7 changed files with 65 additions and 122 deletions

View File

@@ -257,4 +257,8 @@ class SmartGameObjectAI : public GameObjectAI
private:
SmartScript mScript;
};
/// Registers scripts required by the SAI scripting system
void AddSC_SmartScripts();
#endif

View File

@@ -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)

View File

@@ -864,6 +864,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();
@@ -1098,6 +1107,8 @@ class ScriptMgr
//atomic op counter for active scripts amount
std::atomic<uint32> _scheduledScripts;
ScriptLoaderCallbackType _script_loader_callback;
};
#endif

View File

@@ -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,130 +21,56 @@ 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
../game/Maps/AreaBoundary.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(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(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/PlayerAI
${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/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/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/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/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}
${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()

View File

@@ -19,7 +19,6 @@
#include "World.h"
void AddSpellsScripts();
void AddSC_SmartScripts();
void AddCommandsScripts();
#ifdef SCRIPTS
@@ -37,7 +36,6 @@ void AddCustomScripts();
void AddScripts()
{
AddSpellsScripts();
AddSC_SmartScripts();
AddCommandsScripts();
#ifdef SCRIPTS
AddWorldScripts();

View File

@@ -39,6 +39,7 @@
#include "InstanceSaveMgr.h"
#include "ObjectAccessor.h"
#include "ScriptMgr.h"
#include "ScriptLoader.h"
#include "OutdoorPvP/OutdoorPvPMgr.h"
#include "BattlegroundMgr.h"
#include "TCSoap.h"
@@ -191,6 +192,7 @@ extern int main(int argc, char** argv)
LoadRealmInfo();
// Initialize the World
sScriptMgr->SetScriptLoader(AddScripts);
sWorld->SetInitialWorldSettings();
// Launch CliRunnable thread