Common Drop Item - Json

  • Konuyu başlatan Konuyu başlatan H4ZEJ
  • Başlangıç tarihi Başlangıç tarihi
  • Cevaplar Cevaplar 10
  • Görüntüleme Görüntüleme 1K

ROHAN2 WORLD 1-120 TR TİPİ OFFICIAL YOHARA, BALATHOR VE AMON! 80. GÜNÜNDE! +10.000 ONLİNE! HİLE VE BOT %100 ENGELLİ HEMEN TIKLA!

orijinali kafa yedirtir.

Açıklama
Common_drop_item.txt yerine common_drop_item.json kullanmanızı sağlayan sistemdir.


[CODE lang="cpp" title="nlonmann c++20"]
bool ITEM_MANAGER::ReadCommonDropItemFile(const char* c_pszFileName)
{
FILE* fp = fopen(c_pszFileName, "rb");
if (!fp)
{
sys_err("Cannot open %s", c_pszFileName);
return false;
}

std::string content;
{
fseek(fp, 0, SEEK_END);
long sz = ftell(fp);
fseek(fp, 0, SEEK_SET);

if (sz < 0)
{
fclose(fp);
sys_err("COMMON_DROP_ITEM(JSON): ftell failed (%s)", c_pszFileName);
return false;
}

content.resize((size_t)sz);
if (sz > 0)
{
size_t rd = fread(content.data(), 1, (size_t)sz, fp);
if (rd != (size_t)sz)
{
fclose(fp);
sys_err("COMMON_DROP_ITEM(JSON): fread failed (%s)", c_pszFileName);
return false;
}
}
}
fclose(fp);

nlohmann::json doc;
try
{
doc = nlohmann::json:arse(content);
}
catch (const std::exception& e)
{
sys_err("COMMON_DROP_ITEM(JSON): parse error in %s (%s)", c_pszFileName, e.what());
return false;
}

if (!doc.is_array())
{
sys_err("COMMON_DROP_ITEM(JSON): root must be array (%s)", c_pszFileName);
return false;
}

std::array<std::vector<CItemDropInfo>, MOB_RANK_MAX_NUM> tmpDrop;

for (size_t idx = 0; idx < doc.size(); ++idx)
{
const auto& obj = doc[idx];

if (!obj.is_object())
{
sys_err("COMMON_DROP_ITEM(JSON): element %u is not object", (unsigned)idx);
return false;
}

if (!obj.contains("rank") || !obj.contains("min_level") || !obj.contains("max_level") ||
!obj.contains("item_vnum") || !obj.contains("percent"))
{
sys_err("COMMON_DROP_ITEM(JSON): element %u missing field", (unsigned)idx);
return false;
}

if (!obj["rank"].is_number_integer() ||
!obj["min_level"].is_number_integer() ||
!obj["max_level"].is_number_integer() ||
!obj["item_vnum"].is_number_integer() ||
!(obj["percent"].is_number_float() || obj["percent"].is_number_integer()))
{
sys_err("COMMON_DROP_ITEM(JSON): element %u invalid field type", (unsigned)idx);
return false;
}

int rank = obj["rank"].get<int>();
int lvStart = obj["min_level"].get<int>();
int lvEnd = obj["max_level"].get<int>();
DWORD itemVnum = (DWORD)obj["item_vnum"].get<int>();
double fPercent = obj["percent"].get<double>();

if (rank < 0 || rank >= MOB_RANK_MAX_NUM)
{
sys_err("COMMON_DROP_ITEM(JSON): element %u invalid rank %d", (unsigned)idx, rank);
return false;
}

if (lvStart == 0)
continue;

if (lvEnd < lvStart)
{
sys_err("COMMON_DROP_ITEM(JSON): element %u invalid level range %d~%d", (unsigned)idx, lvStart, lvEnd);
return false;
}

const TItemTable* pTable = ITEM_MANAGER::instance().GetTable(itemVnum);
if (!pTable)
{
sys_err("COMMON_DROP_ITEM(JSON): element %u invalid item_vnum %u", (unsigned)idx, itemVnum);
return false;
}

long long pctLL = llround(fPercent * 10000.0);
if (pctLL < 0)
{
sys_err("COMMON_DROP_ITEM(JSON): element %u invalid percent %f", (unsigned)idx, fPercent);
return false;
}
DWORD dwPct = (DWORD)pctLL;

tmpDrop[rank].emplace_back(CItemDropInfo(lvStart, lvEnd, dwPct, itemVnum));

sys_log(0, "COMMON_DROP_ITEM(JSON): rank %d lv %d~%d vnum %u percent %f (dwPct=%u)",
rank, lvStart, lvEnd, itemVnum, fPercent, dwPct);
}

for (int i = 0; i < MOB_RANK_MAX_NUM; ++i)
{
auto& src = tmpDrop;
std::sort(src.begin(), src.end());

auto& dst = g_vec_pkCommonDropItem;
dst.swap(src);

sys_log(0, "COMMON_DROP_ITEM(JSON): rank %d count %zu", i, dst.size());
}

return true;
}
[/CODE]
 

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)