diff options
| -rw-r--r-- | src/server/game/Maps/Map.cpp | 11 | ||||
| -rw-r--r-- | src/server/game/Maps/Map.h | 1 | ||||
| -rw-r--r-- | src/server/game/Maps/MapInstanced.cpp | 3 | ||||
| -rw-r--r-- | src/server/game/World/World.cpp | 25 | ||||
| -rw-r--r-- | src/server/game/World/World.h | 2 | ||||
| -rw-r--r-- | src/server/scripts/Commands/cs_debug.cpp | 5 | ||||
| -rw-r--r-- | src/server/worldserver/worldserver.conf.dist | 20 | 
7 files changed, 61 insertions, 6 deletions
| diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index da12d8e871a..51554d67c4c 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -132,9 +132,9 @@ void Map::LoadMMap(int gx, int gy)      bool mmapLoadResult = MMAP::MMapFactory::createOrGetMMapManager()->loadMap((sWorld->GetDataPath() + "mmaps").c_str(), GetId(), gx, gy);      if (mmapLoadResult) -        TC_LOG_DEBUG("maps", "MMAP loaded name:%s, id:%d, x:%d, y:%d (mmap rep.: x:%d, y:%d)", GetMapName(), GetId(), gx, gy, gx, gy); +        TC_LOG_DEBUG("mmaps", "MMAP loaded name:%s, id:%d, x:%d, y:%d (mmap rep.: x:%d, y:%d)", GetMapName(), GetId(), gx, gy, gx, gy);      else -        TC_LOG_ERROR("maps", "Could not load MMAP name:%s, id:%d, x:%d, y:%d (mmap rep.: x:%d, y:%d)", GetMapName(), GetId(), gx, gy, gx, gy); +        TC_LOG_ERROR("mmaps", "Could not load MMAP name:%s, id:%d, x:%d, y:%d (mmap rep.: x:%d, y:%d)", GetMapName(), GetId(), gx, gy, gx, gy);  }  void Map::LoadVMap(int gx, int gy) @@ -208,6 +208,13 @@ void Map::LoadMapAndVMap(int gx, int gy)      }  } +void Map::LoadAllCells() +{ +    for (uint32 cellX = 0; cellX < TOTAL_NUMBER_OF_CELLS_PER_MAP; cellX++) +        for (uint32 cellY = 0; cellY < TOTAL_NUMBER_OF_CELLS_PER_MAP; cellY++) +            LoadGrid((cellX + 0.5f - CENTER_GRID_CELL_ID) * SIZE_OF_GRID_CELL, (cellY + 0.5f - CENTER_GRID_CELL_ID) * SIZE_OF_GRID_CELL); +} +  void Map::InitStateMachine()  {      si_GridStates[GRID_STATE_INVALID] = new InvalidState; diff --git a/src/server/game/Maps/Map.h b/src/server/game/Maps/Map.h index 6a917555fb0..6a87a1e3246 100644 --- a/src/server/game/Maps/Map.h +++ b/src/server/game/Maps/Map.h @@ -313,6 +313,7 @@ class TC_GAME_API Map : public GridRefManager<NGridType>          bool GetUnloadLock(const GridCoord &p) const { return getNGrid(p.x_coord, p.y_coord)->getUnloadLock(); }          void SetUnloadLock(const GridCoord &p, bool on) { getNGrid(p.x_coord, p.y_coord)->setUnloadExplicitLock(on); }          void LoadGrid(float x, float y); +        void LoadAllCells();          bool UnloadGrid(NGridType& ngrid, bool pForce);          virtual void UnloadAll(); diff --git a/src/server/game/Maps/MapInstanced.cpp b/src/server/game/Maps/MapInstanced.cpp index e277746290a..12cec6d8633 100644 --- a/src/server/game/Maps/MapInstanced.cpp +++ b/src/server/game/Maps/MapInstanced.cpp @@ -238,6 +238,9 @@ InstanceMap* MapInstanced::CreateInstance(uint32 InstanceId, InstanceSave* save,      bool load_data = save != NULL;      map->CreateInstanceData(load_data); +    if (sWorld->getBoolConfig(CONFIG_INSTANCEMAP_LOAD_GRIDS)) +        map->LoadAllCells(); +      m_InstancedMaps[InstanceId] = map;      return map;  } diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 2babb9121e8..c77bcfb5962 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -653,6 +653,18 @@ void World::LoadConfigSettings(bool reload)      m_bool_configs[CONFIG_PRESERVE_CUSTOM_CHANNELS] = sConfigMgr->GetBoolDefault("PreserveCustomChannels", false);      m_int_configs[CONFIG_PRESERVE_CUSTOM_CHANNEL_DURATION] = sConfigMgr->GetIntDefault("PreserveCustomChannelDuration", 14);      m_bool_configs[CONFIG_GRID_UNLOAD] = sConfigMgr->GetBoolDefault("GridUnload", true); +    m_bool_configs[CONFIG_BASEMAP_LOAD_GRIDS] = sConfigMgr->GetBoolDefault("BaseMapLoadAllGrids", false); +    if (m_bool_configs[CONFIG_BASEMAP_LOAD_GRIDS] && m_bool_configs[CONFIG_GRID_UNLOAD]) +    { +        TC_LOG_ERROR("server.loading", "BaseMapLoadAllGrids enabled, but GridUnload also enabled. GridUnload must be disabled to enable base map pre-loading. Base map pre-loading disabled"); +        m_bool_configs[CONFIG_BASEMAP_LOAD_GRIDS] = false; +    } +    m_bool_configs[CONFIG_INSTANCEMAP_LOAD_GRIDS] = sConfigMgr->GetBoolDefault("InstanceMapLoadAllGrids", false); +    if (m_bool_configs[CONFIG_INSTANCEMAP_LOAD_GRIDS] && m_bool_configs[CONFIG_GRID_UNLOAD]) +    { +        TC_LOG_ERROR("server.loading", "InstanceMapLoadAllGrids enabled, but GridUnload also enabled. GridUnload must be disabled to enable instance map pre-loading. Instance map pre-loading disabled"); +        m_bool_configs[CONFIG_INSTANCEMAP_LOAD_GRIDS] = false; +    }      m_int_configs[CONFIG_INTERVAL_SAVE] = sConfigMgr->GetIntDefault("PlayerSaveInterval", 15 * MINUTE * IN_MILLISECONDS);      m_int_configs[CONFIG_INTERVAL_DISCONNECT_TOLERANCE] = sConfigMgr->GetIntDefault("DisconnectToleranceInterval", 0);      m_bool_configs[CONFIG_STATS_SAVE_ONLY_ON_LOGOUT] = sConfigMgr->GetBoolDefault("PlayerSave.Stats.SaveOnlyOnLogout", true); @@ -2060,6 +2072,19 @@ void World::SetInitialWorldSettings()      TC_LOG_INFO("server.loading", "Loading battle pets info...");      BattlePetMgr::Initialize(); +    // Preload all cells, if required for the base maps +    if (sWorld->getBoolConfig(CONFIG_BASEMAP_LOAD_GRIDS)) +    { +        sMapMgr->DoForAllMaps([](Map* map) +        { +            if (!map->Instanceable()) +            { +                TC_LOG_INFO("server.loading", "Pre-loading base map data for map %u", map->GetId()); +                map->LoadAllCells(); +            } +        }); +    } +      uint32 startupDuration = GetMSTimeDiffToNow(startupBegin);      TC_LOG_INFO("server.worldserver", "World initialized in %u minutes %u seconds", (startupDuration / 60000), ((startupDuration % 60000) / 1000)); diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h index cffab97ed7c..84b1ba556e3 100644 --- a/src/server/game/World/World.h +++ b/src/server/game/World/World.h @@ -177,6 +177,8 @@ enum WorldBoolConfigs      CONFIG_FEATURE_SYSTEM_CHARACTER_UNDELETE_ENABLED,      CONFIG_RESET_DUEL_COOLDOWNS,      CONFIG_RESET_DUEL_HEALTH_MANA, +    CONFIG_BASEMAP_LOAD_GRIDS, +    CONFIG_INSTANCEMAP_LOAD_GRIDS,      BOOL_CONFIG_VALUE_COUNT  }; diff --git a/src/server/scripts/Commands/cs_debug.cpp b/src/server/scripts/Commands/cs_debug.cpp index 05686aa9828..b2094df08ef 100644 --- a/src/server/scripts/Commands/cs_debug.cpp +++ b/src/server/scripts/Commands/cs_debug.cpp @@ -1414,10 +1414,7 @@ public:          if (!map)              map = player->GetMap(); -        for (uint32 cellX = 0; cellX < TOTAL_NUMBER_OF_CELLS_PER_MAP; cellX++) -            for (uint32 cellY = 0; cellY < TOTAL_NUMBER_OF_CELLS_PER_MAP; cellY++) -                map->LoadGrid((cellX + 0.5f - CENTER_GRID_CELL_ID) * SIZE_OF_GRID_CELL, (cellY + 0.5f - CENTER_GRID_CELL_ID) * SIZE_OF_GRID_CELL); - +        map->LoadAllCells();          handler->PSendSysMessage("Cells loaded (mapId: %u)", map->GetId());          return true;      } diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist index 49f05e87222..7f9f59a5209 100644 --- a/src/server/worldserver/worldserver.conf.dist +++ b/src/server/worldserver/worldserver.conf.dist @@ -293,6 +293,25 @@ MaxOverspeedPings = 2  GridUnload = 1  # +#    BaseMapLoadAllGrids +#        Description: Load all grids for base maps upon load. Requires GridUnload to be 0. +#                     This will take around 5GB of ram upon server load, and will take some time +#                     to initially load the server. +#        Default:     0 - (Don't pre-load all base maps, dynamically load as used) +#                     1 - (Preload all grids in all base maps upon load) + +BaseMapLoadAllGrids = 0 + +# +#    InstanceMapLoadAllGrids +#        Description: Load all grids for instance maps upon load. Requires GridUnload to be 0. +#                     Upon loading an instance map, all creatures/objects in the map will be pre-loaded +#        Default:     0 - (Don't pre-load all base maps, dynamically load as used) +#                     1 - (Preload all grids in the instance upon load) + +InstanceMapLoadAllGrids = 0 + +#  #    SocketTimeOutTime  #        Description: Time (in milliseconds) after which a connection being idle on the character  #                     selection screen is disconnected. @@ -3498,6 +3517,7 @@ Logger.server=3,Console Server  Logger.commands.gm=3,Console GM  Logger.sql.sql=5,Console DBErrors  Logger.sql.updates=3,Console Server +Logger.mmaps=3,Server  #Logger.achievement=3,Console Server  #Logger.addon=3,Console Server | 
