gdle/Source/InferredCellData.cpp

201 lines
4.2 KiB
C++
Raw Permalink Normal View History

2018-03-29 17:01:57 -04:00
2019-07-07 20:56:15 +00:00
#include <StdAfx.h>
2018-03-29 17:01:57 -04:00
#include "PhatSDK.h"
#include "InferredCellData.h"
void CInferredCellData::Init()
{
#ifndef PUBLIC_BUILD
SERVER_INFO << "Loading inferred cell data...";
2018-03-29 17:01:57 -04:00
#endif
_data.Destroy();
2019-04-13 18:18:02 +00:00
LoadCacheData(6, 0xcd57fd07, 0x697a2224, _data);
2018-03-29 17:01:57 -04:00
2019-07-07 20:56:15 +00:00
fs::path dataPath(g_pGlobals->GetGameData("Data", "json"));
2018-03-29 17:01:57 -04:00
2019-04-13 18:18:02 +00:00
LoadJsonData(dataPath / "worldspawns.json", _jsonData);
2018-03-29 17:01:57 -04:00
2019-04-13 18:18:02 +00:00
LoadJsonData(dataPath / "encounters.json", _encounters);
// load individual spawn maps to override worldspawns.json
std::mutex mapLock;
2019-07-07 20:56:15 +00:00
PerformLoad(dataPath / "spawnMaps", [&](fs::path path)
{
std::ifstream fs(path);
json jsonData;
bool parsed = false;
CLandBlockExtendedData blockData;
2019-07-07 20:56:15 +00:00
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);
2019-08-03 19:51:55 -05:00
_jsonData.landblocks[blockId].m_sourceFile = path.string();
}
});
2018-03-29 17:01:57 -04:00
#ifndef PUBLIC_BUILD
2019-04-13 18:18:02 +00:00
SERVER_INFO << "Finished loading inferred cell data ("
2019-07-07 20:56:15 +00:00
<< (uint32_t)_data.landblocks.size() << "and" << (uint32_t) _jsonData.landblocks.size()
2019-04-13 18:18:02 +00:00
<< ") encounters" << _encounters.size() << "...";
2018-03-29 17:01:57 -04:00
#endif
}
2019-08-03 19:51:55 -05:00
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;
2019-08-03 19:51:55 -05:00
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;
}
2019-07-07 20:56:15 +00:00
CLandBlockExtendedData *CInferredCellData::GetLandBlockData(uint32_t landblock)
2018-03-29 17:01:57 -04:00
{
CLandBlockExtendedData *data = _jsonData.landblocks.lookup(landblock);
if (!data)
{
data = _data.landblocks.lookup(landblock);
}
return data;
}
2019-08-03 19:51:55 -05:00