mirror of
https://gitlab.com/Scribble/gdlenhanced.git
synced 2026-08-17 14:23:04 -04:00
167 lines
3.6 KiB
C++
167 lines
3.6 KiB
C++
|
|
#include <StdAfx.h>
|
|
#include "PhatSDK.h"
|
|
#include "InferredCellData.h"
|
|
|
|
void CInferredCellData::Init()
|
|
{
|
|
#ifndef PUBLIC_BUILD
|
|
SERVER_INFO << "Loading inferred cell data...";
|
|
#endif
|
|
|
|
_data.Destroy();
|
|
|
|
LoadCacheData(6, 0xcd57fd07, 0x697a2224, _data);
|
|
|
|
fs::path dataPath(g_pGlobals->GetGameData("Data", "json"));
|
|
|
|
block_flags_map_t &flags = _blockFlags;
|
|
LoadJsonData(dataPath / "restrictedlandblocks.json", [&flags](json &data)
|
|
{
|
|
flags.UnPackJson(data.at("blockFlags"));
|
|
});
|
|
|
|
LoadJsonData(dataPath / "worldspawns.json", _jsonData);
|
|
|
|
LoadJsonData(dataPath / "encounters.json", _encounters);
|
|
|
|
// load individual spawn maps to override worldspawns.json
|
|
RefreshLocalSpawnMapStorage();
|
|
|
|
#ifndef PUBLIC_BUILD
|
|
SERVER_INFO << "Finished loading inferred cell data ("
|
|
<< (uint32_t)_data.landblocks.size() << "and" << (uint32_t) _jsonData.landblocks.size()
|
|
<< ") encounters" << _encounters.size() << "...";
|
|
#endif
|
|
}
|
|
|
|
bool CInferredCellData::RefreshLocalSpawnMapStorage()
|
|
{
|
|
return LoadLocalSpawnMapStorage(true);
|
|
}
|
|
|
|
bool CInferredCellData::RefreshLocalSpawnMap(uint32_t landblock)
|
|
{
|
|
return LoadLocalSpawnMap(landblock);
|
|
}
|
|
|
|
bool CInferredCellData::LoadLocalSpawnMapStorage(bool refresh)
|
|
{
|
|
fs::path dataPath = g_pGlobals->GetGameData("Data", "json");
|
|
|
|
// load individual spawn maps to override worldspawns.json
|
|
std::mutex mapLock;
|
|
PerformLoad(dataPath / "spawnMaps", [&](fs::path path)
|
|
{
|
|
std::ifstream fs(path);
|
|
|
|
json jsonData;
|
|
bool parsed = false;
|
|
CLandBlockExtendedData blockData;
|
|
uint32_t blockId = 0;
|
|
try
|
|
{
|
|
fs >> jsonData;
|
|
|
|
json::const_iterator end = jsonData.end();
|
|
json::const_iterator key = jsonData.find("key");
|
|
json::const_iterator val = jsonData.find("value");
|
|
|
|
if (key != end)
|
|
{
|
|
blockId = *key;
|
|
|
|
if (val != end)
|
|
parsed = blockData.UnPackJson(*val);
|
|
}
|
|
}
|
|
catch (std::exception &ex)
|
|
{
|
|
LOG_PRIVATE(Data, Error, "Failed to parse spawn map file %s\n", path.string().c_str());
|
|
}
|
|
|
|
fs.close();
|
|
|
|
if (parsed)
|
|
{
|
|
std::scoped_lock lock(mapLock);
|
|
_jsonData.landblocks.insert_or_assign(blockId, blockData);
|
|
_jsonData.landblocks[blockId].m_sourceFile = path.string();
|
|
}
|
|
|
|
});
|
|
|
|
return true;
|
|
}
|
|
|
|
bool CInferredCellData::LoadLocalSpawnMap(uint32_t landblock)
|
|
{
|
|
uint32_t landcell = landblock << 16;
|
|
|
|
auto existing = _jsonData.landblocks.find(landcell);
|
|
if (existing != _jsonData.landblocks.end())
|
|
{
|
|
fs::path path = _jsonData.landblocks[landcell].m_sourceFile.c_str();
|
|
|
|
std::mutex mapLock;
|
|
|
|
std::ifstream fs(path);
|
|
|
|
json jsonData;
|
|
bool parsed = false;
|
|
CLandBlockExtendedData blockData;
|
|
uint32_t blockId = 0;
|
|
try
|
|
{
|
|
fs >> jsonData;
|
|
|
|
json::const_iterator end = jsonData.end();
|
|
json::const_iterator key = jsonData.find("key");
|
|
json::const_iterator val = jsonData.find("value");
|
|
|
|
if (key != end)
|
|
{
|
|
blockId = *key;
|
|
|
|
if (val != end)
|
|
parsed = blockData.UnPackJson(*val);
|
|
}
|
|
}
|
|
catch (std::exception &ex)
|
|
{
|
|
LOG_PRIVATE(Data, Error, "Failed to parse spawn map file %s\n", path.string().c_str());
|
|
return false;
|
|
}
|
|
|
|
fs.close();
|
|
|
|
if (parsed)
|
|
{
|
|
std::scoped_lock lock(mapLock);
|
|
_jsonData.landblocks.insert_or_assign(blockId, blockData);
|
|
_jsonData.landblocks[blockId].m_sourceFile = path.string();
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool CInferredCellData::FindSpawnMap(uint32_t landblock)
|
|
{
|
|
return _jsonData.landblocks[landblock].m_sourceFile.size() > 0;
|
|
}
|
|
|
|
CLandBlockExtendedData *CInferredCellData::GetLandBlockData(uint32_t landblock)
|
|
{
|
|
CLandBlockExtendedData *data = _jsonData.landblocks.lookup(landblock);
|
|
|
|
if (!data)
|
|
{
|
|
data = _data.landblocks.lookup(landblock);
|
|
}
|
|
|
|
return data;
|
|
}
|
|
|
|
|