else if ( strType == "limit" )
{
int iMinLevel = 0;
int iMaxLevel = 999; // Varsayılan maksimum level
// min_level kontrolü (zorunlu)
if ( !loader.GetTokenInteger("min_level", &iMinLevel) )
{
// Eski format için geriye dönük uyumluluk
if ( !loader.GetTokenInteger("level_limit", &iMinLevel) )
{
sys_err("ReadMonsterDropItemGroup : Syntax error %s : no min_level, node %s", c_pszFileName, stName.c_str());
loader.SetParentNode();
return false;
}
else
{
sys_log(0, "Using legacy level_limit as min_level: %d for node %s", iMinLevel, stName.c_str());
}
}
// max_level kontrolü (opsiyonel)
if (loader.GetTokenInteger("max_level", &iMaxLevel))
{
sys_log(0, "Level range: %d - %d for node %s", iMinLevel, iMaxLevel, stName.c_str());
}
else
{
sys_log(0, "Using only min_level: %d (no upper limit) for node %s", iMinLevel, stName.c_str());
}
// Min level kontrolü
if (iMinLevel < 1)
{
sys_err("ReadMonsterDropItemGroup : Invalid min_level %d, node %s", iMinLevel, stName.c_str());
loader.SetParentNode();
return false;
}
CLevelItemGroup* pkLevelItemGroup = M2_NEW CLevelItemGroup(iMinLevel, iMaxLevel);
for ( int k=1; k < 256; k++ )
{
char buf[4];
snprintf(buf, sizeof(buf), "%d", k);
if ( loader.GetTokenVector(buf, &pTok) )
{
std::string& name = pTok->at(0);
DWORD dwItemVnum = 0;
if (!GetValidVnum(name.c_str(), dwItemVnum)
&& !GetVnumByOriginalName(name.c_str(), dwItemVnum))
{
sys_err("ReadDropItemGroup : there is no item %s : node %s", name.c_str(), stName.c_str());
M2_DELETE(pkLevelItemGroup);
return false;
}
int iCount = 0;
str_to_number(iCount, pTok->at(1).c_str());
if (iCount < 1)
{
sys_err("ReadMonsterDropItemGroup : there is no count for item %s : node %s", name.c_str(), stName.c_str());
M2_DELETE(pkLevelItemGroup);
return false;
}
float fPct = atof(pTok->at(2).c_str());
DWORD dwPct = (DWORD)(10000.0f * fPct);
sys_log(0," name %s pct %d count %d", name.c_str(), dwPct, iCount);
pkLevelItemGroup->AddItem(dwItemVnum, dwPct, iCount);
continue;
}
break;
}
m_map_pkLevelItemGroup.emplace(iMobVnum, pkLevelItemGroup);
}