diff --git a/engine/server/library/serverGame/src/shared/core/ConfigServerGame.cpp b/engine/server/library/serverGame/src/shared/core/ConfigServerGame.cpp index e42d5eb2..02551b50 100755 --- a/engine/server/library/serverGame/src/shared/core/ConfigServerGame.cpp +++ b/engine/server/library/serverGame/src/shared/core/ConfigServerGame.cpp @@ -491,6 +491,8 @@ void ConfigServerGame::install(void) KEY_BOOL (useOldSuidGenerator, false); + KEY_STRING (serverLoadLevel, "heavy"); + if (data->baseDecayRate <= 1.0f) data->baseDecayRate = 1.0f; diff --git a/engine/server/library/serverGame/src/shared/core/ConfigServerGame.h b/engine/server/library/serverGame/src/shared/core/ConfigServerGame.h index cf7d8a9c..cc173e35 100755 --- a/engine/server/library/serverGame/src/shared/core/ConfigServerGame.h +++ b/engine/server/library/serverGame/src/shared/core/ConfigServerGame.h @@ -575,6 +575,8 @@ class ConfigServerGame int gcwDaysRequiredForGcwRegionDefenderBonus; bool useOldSuidGenerator; + + const char * serverLoadLevel; }; private: @@ -1061,6 +1063,8 @@ class ConfigServerGame static int getGcwDaysRequiredForGcwRegionDefenderBonus(); static bool getUseOldSuidGenerator(); + + static const char * getServerLoadLevel(); }; //----------------------------------------------------------------------- @@ -3696,6 +3700,11 @@ inline bool ConfigServerGame::getUseOldSuidGenerator() { return data->useOldSuidGenerator; } -// ====================================================================== +// ---------------------------------------------------------------------- + +inline const char *ConfigServerGame::getServerLoadLevel() +{ + return data->serverLoadLevel; +} #endif diff --git a/engine/server/library/serverGame/src/shared/core/ServerBuildoutManager.cpp b/engine/server/library/serverGame/src/shared/core/ServerBuildoutManager.cpp index 6cacac9b..53e6063c 100755 --- a/engine/server/library/serverGame/src/shared/core/ServerBuildoutManager.cpp +++ b/engine/server/library/serverGame/src/shared/core/ServerBuildoutManager.cpp @@ -52,7 +52,7 @@ namespace ServerBuildoutManagerNamespace struct BuildoutRow { BuildoutRow(); - BuildoutRow(int64 id, int64 containerId, int cellIndex, Transform const &transform_p, ServerObjectTemplate const *serverTemplate, std::string const &scripts, std::string const &objvars, std::string const & eventRequired); + BuildoutRow(int64 id, int64 containerId, int cellIndex, Transform const &transform_p, ServerObjectTemplate const *serverTemplate, std::string const &scripts, std::string const &objvars, std::string const & eventRequired, std::string const & requiredLoadLevel); BuildoutRow(BuildoutRow const &rhs); ~BuildoutRow(); BuildoutRow &operator=(BuildoutRow const &rhs); @@ -65,6 +65,7 @@ namespace ServerBuildoutManagerNamespace std::string m_objvars; int m_cellIndex; std::string m_eventRequired; + std::string m_requiredLoadLevel; }; // ---------------------------------------------------------------------- @@ -145,6 +146,7 @@ void ServerBuildoutManager::install() void ServerBuildoutManager::onChunkComplete(int nodeX, int nodeZ) { + std::string configuredLoadLevel = ConfigServerGame::getServerLoadLevel(); for (std::vector::iterator i = s_areas.begin(); i != s_areas.end(); ++i) { AreaInfo &areaInfo = *i; @@ -155,6 +157,24 @@ void ServerBuildoutManager::onChunkComplete(int nodeX, int nodeZ) { if (!areaInfo.loaded) loadArea(areaInfo); + + // Before we decide to instantiate the area, make sure we need to actually load it based on the configured server load level. + std::string areaRequiredLevel = areaInfo.buildoutArea.requiredLoadLevel; + if (configuredLoadLevel != "heavy" && !areaRequiredLevel.empty()) { + if(configuredLoadLevel == "medium"){ + // If our configured level is medium, then our area level must be medium or light. + if(areaRequiredLevel != "medium" && areaRequiredLevel != "light") { + DEBUG_REPORT_LOG(true,("Skipping Area %s (index %d) because its load level is %s and the configured load level is %s\n", areaInfo.buildoutArea.areaName.c_str(), areaInfo.buildoutArea.areaIndex, areaRequiredLevel.c_str(), configuredLoadLevel.c_str())); + continue; + } + } + else if(configuredLoadLevel == "light"){ + if(areaRequiredLevel != "light") { + DEBUG_REPORT_LOG(true,("Skipping Area %s (index %d) because its load level is %s and the configured load level is %s\n", areaInfo.buildoutArea.areaName.c_str(), areaInfo.buildoutArea.areaIndex, areaRequiredLevel.c_str(), configuredLoadLevel.c_str())); + continue; + } + } + } instantiateAreaNode(areaInfo, nodeX, nodeZ); } } @@ -580,6 +600,7 @@ void ServerBuildoutManagerNamespace::loadArea(AreaInfo &areaInfo) filename[sizeof(filename) - 1] = '\0'; std::string const & eventRequired = areaInfo.buildoutArea.getRequiredEventName(); + std::string const & requiredLoadLevel = areaInfo.buildoutArea.getRequiredLoadLevel(); if (!eventRequired.empty()) { @@ -764,7 +785,8 @@ void ServerBuildoutManagerNamespace::loadArea(AreaInfo &areaInfo) serverTemplate, areaBuildoutTable.getStringValue(scriptsColumn, buildoutRow), areaBuildoutTable.getStringValue(objvarsColumn, buildoutRow), - eventRequired)); + eventRequired, + requiredLoadLevel)); } objects.insert(objId); @@ -1106,7 +1128,7 @@ ServerBuildoutManagerNamespace::BuildoutRow::BuildoutRow() : // ---------------------------------------------------------------------- -ServerBuildoutManagerNamespace::BuildoutRow::BuildoutRow(int64 id, int64 containerId, int cellIndex, Transform const &transform_p, ServerObjectTemplate const *serverTemplate, std::string const &scripts, std::string const &objvars, std::string const & eventRequired) : +ServerBuildoutManagerNamespace::BuildoutRow::BuildoutRow(int64 id, int64 containerId, int cellIndex, Transform const &transform_p, ServerObjectTemplate const *serverTemplate, std::string const &scripts, std::string const &objvars, std::string const & eventRequired, std::string const & requiredLoadLevel) : m_id(id), m_containerId(containerId), m_transform_p(transform_p), @@ -1114,7 +1136,8 @@ ServerBuildoutManagerNamespace::BuildoutRow::BuildoutRow(int64 id, int64 contain m_scripts(scripts), m_objvars(objvars), m_cellIndex(cellIndex), - m_eventRequired(eventRequired) + m_eventRequired(eventRequired), + m_requiredLoadLevel(requiredLoadLevel) { if (serverTemplate) serverTemplate->addReference(); @@ -1130,7 +1153,8 @@ ServerBuildoutManagerNamespace::BuildoutRow::BuildoutRow(BuildoutRow const &rhs) m_scripts(rhs.m_scripts), m_objvars(rhs.m_objvars), m_cellIndex(rhs.m_cellIndex), - m_eventRequired(rhs.m_eventRequired) + m_eventRequired(rhs.m_eventRequired), + m_requiredLoadLevel(rhs.m_requiredLoadLevel) { if (m_serverTemplate) m_serverTemplate->addReference(); @@ -1157,6 +1181,7 @@ ServerBuildoutManagerNamespace::BuildoutRow &ServerBuildoutManagerNamespace::Bui m_objvars = rhs.m_objvars; m_cellIndex = rhs.m_cellIndex; m_eventRequired = rhs.m_eventRequired; + m_requiredLoadLevel = rhs.m_requiredLoadLevel; if (m_serverTemplate) m_serverTemplate->releaseReference(); diff --git a/engine/server/library/serverGame/src/shared/object/CreatureObject.cpp b/engine/server/library/serverGame/src/shared/object/CreatureObject.cpp index 9eaf0211..8e801159 100755 --- a/engine/server/library/serverGame/src/shared/object/CreatureObject.cpp +++ b/engine/server/library/serverGame/src/shared/object/CreatureObject.cpp @@ -13392,18 +13392,11 @@ void CreatureObject::setGroupMissionCriticalObjects(GroupMissionCriticalObjectSe DEBUG_FATAL(!isAuthoritative(), ("CreatureObject::setGroupMissionCriticalObjects: called on non-authoritative object %s", getDebugInformation(true).c_str())); if (isAuthoritative()) { + m_groupMissionCriticalObjectSet.clear(); //-- Anything that is not in our set, we need to add { for (GroupMissionCriticalObjectSet::const_iterator iter = groupMissionCriticalObjectSet.begin(); iter != groupMissionCriticalObjectSet.end(); ++iter) - if (!m_groupMissionCriticalObjectSet.contains(*iter)) - m_groupMissionCriticalObjectSet.insert(*iter); - } - - //-- Anything that is not in the original set, we need to remove - { - for (GroupMissionCriticalObjectSet::const_iterator iter(m_groupMissionCriticalObjectSet.begin()); iter != m_groupMissionCriticalObjectSet.end(); ++iter) - if (groupMissionCriticalObjectSet.find(*iter) == groupMissionCriticalObjectSet.end()) - m_groupMissionCriticalObjectSet.erase(*iter); + m_groupMissionCriticalObjectSet.insert(*iter); } } } diff --git a/engine/shared/library/sharedGame/src/shared/core/SharedBuildoutAreaManager.cpp b/engine/shared/library/sharedGame/src/shared/core/SharedBuildoutAreaManager.cpp index 66ddbb64..703ef5b8 100755 --- a/engine/shared/library/sharedGame/src/shared/core/SharedBuildoutAreaManager.cpp +++ b/engine/shared/library/sharedGame/src/shared/core/SharedBuildoutAreaManager.cpp @@ -158,6 +158,13 @@ std::string const & BuildoutArea::getRequiredEventName() const return requiredEventName; } +//---------------------------------------------------------------------- + +std::string const & BuildoutArea::getRequiredLoadLevel() const +{ + return requiredLoadLevel; +} + // ====================================================================== bool SharedBuildoutAreaManager::isBuildoutScene(std::string const & sceneName) @@ -263,6 +270,8 @@ void SharedBuildoutAreaManager::install() buildoutArea.internalBuildoutArea = areaListTable.getIntValue("internal", areaRow) != 0; buildoutArea.requiredEventName = areaListTable.getStringValue("eventRequired", areaRow); + + buildoutArea.requiredLoadLevel = areaListTable.getStringValue("requiredLoadLevel", areaRow); } s_buildoutAreas[buildoutScene] = areasForScene; @@ -347,6 +356,9 @@ Vector SharedBuildoutAreaManager::getRelativePositionInArea(std::string const & if(ignoreNonActiveEvents && !boa.requiredEventName.empty()) // Eventually this needs to query the scheduler system and see if the event is currently active. continue; + + if(ignoreNonActiveEvents && !boa.requiredLoadLevel.empty()) + continue; if(boa.isLocationInside(location_w.x, location_w.z) && boa.areaName == sceneAndArea.second) { @@ -561,6 +573,9 @@ BuildoutArea const * SharedBuildoutAreaManager::findBuildoutAreaAtPosition(std:: if(ignoreNonActiveEvents && !buildoutArea.requiredEventName.empty()) continue; + if(ignoreNonActiveEvents && !buildoutArea.requiredLoadLevel.empty()) + continue; + if (buildoutArea.isLocationInside(x, z)) { return &buildoutArea; @@ -585,6 +600,9 @@ BuildoutArea const * SharedBuildoutAreaManager::findBuildoutAreaAtPosition(float if(ignoreNonActiveEvents && !buildoutArea.requiredEventName.empty()) return nullptr; + if(ignoreNonActiveEvents && !buildoutArea.requiredLoadLevel.empty()) + return nullptr; + if (buildoutArea.isLocationInside(x, z)) { return &buildoutArea; diff --git a/engine/shared/library/sharedGame/src/shared/core/SharedBuildoutAreaManager.h b/engine/shared/library/sharedGame/src/shared/core/SharedBuildoutAreaManager.h index 174cd34e..8d4e56fc 100755 --- a/engine/shared/library/sharedGame/src/shared/core/SharedBuildoutAreaManager.h +++ b/engine/shared/library/sharedGame/src/shared/core/SharedBuildoutAreaManager.h @@ -38,6 +38,7 @@ public: Vector getRelativePosition(Vector const & pos_w, bool allowComposite) const; std::string const & getRequiredEventName() const; + std::string const & getRequiredLoadLevel() const; int areaIndex; std::string areaName; @@ -63,6 +64,9 @@ public: // Required Event name for a particular buildout std::string requiredEventName; + + // Required Server level for a particular buildout + std::string requiredLoadLevel; }; // ----------------------------------------------------------------------