gdle/Source/RecipeFactory.cpp

185 lines
4.7 KiB
C++
Raw Permalink Normal View History

2019-07-07 20:56:15 +00:00
#include <StdAfx.h>
2018-07-14 12:30:30 -07:00
#include "RecipeFactory.h"
2018-07-14 23:19:27 -07:00
#include "InferredPortalData.h"
2018-07-14 12:30:30 -07:00
RecipeFactory::RecipeFactory()
{
}
RecipeFactory::~RecipeFactory()
{
}
void RecipeFactory::Reset()
{
}
void RecipeFactory::Initialize()
{
CStopWatch watch;
2019-01-02 22:23:27 -06:00
WINLOG(Data, Normal, "Loading recipes...\n");
SERVER_INFO << "Loading recipes...";
2018-07-14 12:30:30 -07:00
json precursorData;
2019-07-07 20:56:15 +00:00
std::ifstream rpcStream(g_pGlobals->GetGameFile("Data/json/recipeprecursors.json"));
2018-07-14 12:30:30 -07:00
if (rpcStream.is_open())
{
rpcStream >> precursorData;
rpcStream.close();
}
json recipeData;
2019-07-07 20:56:15 +00:00
std::ifstream rcStream(g_pGlobals->GetGameFile("Data/json/recipes.json"));
2018-07-14 12:30:30 -07:00
if (rcStream.is_open())
{
rcStream >> recipeData;
rcStream.close();
}
2019-01-07 12:37:32 -06:00
precursor_list_t jsonPrecursors;
recipe_list_t jsonRecipes;
if(precursorData.size() > 0)
2019-01-07 12:37:32 -06:00
jsonPrecursors.UnPackJson(precursorData);
2019-01-02 22:23:27 -06:00
if (recipeData.size() > 0)
jsonRecipes.UnPackJson(recipeData);
// load individual file overrides
LoadOverrides(jsonPrecursors, jsonRecipes);
2019-01-07 12:37:32 -06:00
if(jsonPrecursors.size() > 0)
UpdateCraftTableData(jsonPrecursors);
2018-07-24 18:43:16 -07:00
2019-01-07 12:37:32 -06:00
if (jsonRecipes.size() > 0)
UpdateExitingRecipes(jsonRecipes);
double elapsed = watch.GetElapsed();
2019-01-02 22:23:27 -06:00
WINLOG(Data, Normal, "Finished loading recipes in %fs\n", elapsed);
SERVER_INFO << "Finished loading recipes in " << elapsed;
2018-07-14 12:30:30 -07:00
}
2018-07-14 15:16:26 -07:00
2019-01-07 12:37:32 -06:00
void RecipeFactory::UpdateCraftTableData(precursor_list_t &precursors)
2018-07-14 15:16:26 -07:00
{
// for each precursor see if it exists in the table
2019-01-07 12:37:32 -06:00
for (auto pc : precursors)
2018-07-14 23:19:27 -07:00
{
2019-07-07 20:56:15 +00:00
uint64_t toolTarget = ((uint64_t)pc.Tool << 32) | pc.Target;
2019-01-07 12:37:32 -06:00
g_pPortalDataEx->_craftTableData._precursorMap[toolTarget] = pc.RecipeID;
2018-07-14 23:19:27 -07:00
}
}
2019-01-07 12:37:32 -06:00
void RecipeFactory::UpdateExitingRecipes(recipe_list_t &recipes)
{
2019-01-07 12:37:32 -06:00
for (auto pc : recipes)
2018-07-24 18:43:16 -07:00
{
2019-07-07 20:56:15 +00:00
uint32_t recipeIdToUpdate = pc._recipeID;
2019-01-07 12:37:32 -06:00
g_pPortalDataEx->_craftTableData._operations[recipeIdToUpdate] = GetCraftOpertionFromNewRecipe(&pc);
2018-07-24 18:43:16 -07:00
}
2018-07-14 23:19:27 -07:00
}
2018-07-14 15:16:26 -07:00
2018-07-14 23:19:27 -07:00
CCraftOperation RecipeFactory::GetCraftOpertionFromNewRecipe(JsonCraftOperation * recipe)
{
CCraftOperation co;
co._dataID = recipe->_dataID;
co._difficulty = recipe->_difficulty;
co._failAmount = recipe->_failAmount;
co._failMessage = recipe->_failMessage;
co._failureConsumeTargetAmount = recipe->_failureConsumeTargetAmount;
co._failureConsumeTargetChance = recipe->_failureConsumeTargetChance;
co._failureConsumeTargetMessage = recipe->_failureConsumeTargetMessage;
co._failureConsumeToolAmount = recipe->_failureConsumeToolAmount;
co._failureConsumeToolChance = recipe->_failureConsumeToolChance;
co._failureConsumeToolMessage = recipe->_failureConsumeToolMessage;
co._failWcid = recipe->_failWcid;
for (int m = 0; m < 8; m++)
{
co._mods[m] = recipe->_mods[m];
}
for (int r = 0; r < 3; r++)
{
co._requirements[r] = recipe->_requirements[r];
}
co._skill = recipe->_skill;
co._SkillCheckFormulaType = recipe->_SkillCheckFormulaType;
co._successAmount = recipe->_successAmount;
co._successConsumeTargetAmount = recipe->_successConsumeTargetAmount;
co._successConsumeTargetChance = recipe->_successConsumeTargetChance;
co._successConsumeTargetMessage = recipe->_successConsumeTargetMessage;
co._successConsumeToolAmount = recipe->_successConsumeToolAmount;
co._successConsumeToolChance = recipe->_successConsumeToolChance;
co._successConsumeToolMessage = recipe->_successConsumeToolMessage;
co._successMessage = recipe->_successMessage;
co._successWcid = recipe->_successWcid;
return co;
2018-07-14 15:16:26 -07:00
}
void RecipeFactory::LoadOverrides(precursor_list_t &precursors, recipe_list_t &recipes)
{
std::mutex recipeLock;
std::mutex precursorLock;
2019-07-07 20:56:15 +00:00
fs::path root = g_pGlobals->GetGameData("Data", "json");
PerformLoad(root / "recipes", [&](fs::path path)
{
std::ifstream fs(path);
json jsonData;
bool parsed = false;
2019-07-07 20:56:15 +00:00
//uint32_t blockId = 0;
try
{
fs >> jsonData;
2019-07-07 20:56:15 +00:00
uint32_t recipeId = 0;
json::const_iterator end = jsonData.end();
json::const_iterator key = jsonData.find("key");
json::const_iterator val = jsonData.find("recipe");
json::const_iterator pre = jsonData.find("precursors");
if (key != end)
{
recipeId = *key;
if (val != end)
{
JsonCraftOperation op;
if (op.UnPackJson(*val))
{
std::scoped_lock lock(recipeLock);
recipes.push_back(op);
}
}
if (pre != end && pre->is_array())
{
for (auto pc : *pre)
{
json::const_iterator tool = pc.find("tool");
json::const_iterator target = pc.find("target");
if (tool != pc.end() && target != pc.end())
{
std::scoped_lock lock(precursorLock);
CraftPrecursor precursor(recipeId, *tool, *target);
precursors.push_back(precursor);
}
}
}
}
}
catch (std::exception &ex)
{
LOG_PRIVATE(Data, Error, "Failed to parse recipe file %s\n", path.string().c_str());
}
fs.close();
});
}