EditClient_Debug
Still am translating error messages into English right now so I haven't tried too much but for those who are just wondering what the thing looks like here is the link.
Check your task manager after using it and close ClientEdit, there is a bug where it doesn't close right. Also I know for a fact right now all of its functions are not in enabled / working correctly so its worthless to leechers

Operators Login is not tested yet either, Let me know how that goes.
credit to lifestream for releasing the files
Same rules as he stated for the program:
Any illegal claim/attempt to sell it to someone is not allowed.
If you want to see this thing improved here is an error from the conversion to 2013 visual studio process. With enough spare time I could fix it myself but this way its a community based project :)
'sqrt' : ambiguous call to overloaded function
in AnalysisAvatorData.cpp
pGeneral->cntExpWp[i].dwCnt = pData->dbStat.m_dwDamWpCnt[i];
//need to fix the line below its the second sqrt but currently can't think of a rewrite for it
pGeneral->cntExpWp[i].nLv = (BYTE)sqrt( ((pData->dbStat.m_dwDamWpCnt[i]+1)/1000) + sqrt(pData->dbStat.m_dwDamWpCnt[i]+1) );
@
likertuban Carried over from lifestream's release
m_dwDamWpCnt is defined in characterdb.h
struct _STAT_DB_BASE
{
enum { DATAPOS_WPCNT = 0,
DATAPOS_SUFF = DATAPOS_WPCNT+WP_CLASS_NUM,
DATAPOS_SHLD = DATAPOS_SUFF+1,
DATAPOS_SKILL = DATAPOS_SHLD+1,
DATAPOS_FORCE = DATAPOS_SKILL+max_skill_num,
DATAPOS_MAKE = DATAPOS_FORCE+force_mastery_num,
DATAPOS_SPECIAL = DATAPOS_MAKE+MI_CLASS_NUM };
DWORD m_dwDamWpCnt[WP_CLASS_NUM]; //5
DWORD m_dwSufferDamCnt;
DWORD m_dwShieldDamCnt;
DWORD m_dwSkillCum[max_skill_num]; //48
DWORD m_dwForceCum[force_mastery_num]; //24
DWORD m_dwMakeCum[MI_CLASS_NUM]; //3
DWORD m_dwSpecialCum;
_STAT_DB_BASE(){ Init(); }
void Init(){
memset(this, 0, sizeof(*this));
};
static int GetStatIndex(BYTE byMasteryClass, BYTE byIndex)
{
int nStatIndex = -1;
switch(byMasteryClass)
{
case mastery_code_weapon: nStatIndex = _STAT_DB_BASE::DATAPOS_WPCNT + byIndex; break;
case mastery_code_suffer: nStatIndex = _STAT_DB_BASE::DATAPOS_SUFF; break;
case mastery_code_shield: nStatIndex = _STAT_DB_BASE::DATAPOS_SHLD; break;
case mastery_code_skill: nStatIndex = _STAT_DB_BASE::DATAPOS_SKILL + byIndex; break;
case mastery_code_force: nStatIndex = _STAT_DB_BASE::DATAPOS_FORCE + byIndex; break;
case mastery_code_make: nStatIndex = _STAT_DB_BASE::DATAPOS_MAKE + byIndex; break;
case mastery_code_special: nStatIndex = _STAT_DB_BASE::DATAPOS_SPECIAL; break;
}
return nStatIndex;
}
static bool IsRangePerMastery(BYTE byMasteryClass, BYTE byIndex)
{
switch(byMasteryClass)
{
case mastery_code_weapon: if(byIndex < WP_CLASS_NUM) return true;
case mastery_code_suffer: if(byIndex == 0) return true;
case mastery_code_shield: if(byIndex == 0) return true;
case mastery_code_skill: if(byIndex < max_skill_num) return true;
case mastery_code_force: if(byIndex < force_mastery_num) return true;
case mastery_code_make: if(byIndex < MI_CLASS_NUM) return true;
case mastery_code_special: if(byIndex == 0) return true;
}
return false;
}
};