So... I chose int type for the level variables (originally its unsigned char) because:
its more than enough maximum level 2147483647
the damage done by the characters (and much more thing) is calculated via they levels, and the type of this variables is int
This is why I recommend to use int type
game/src
char.cpp
Search this:
Code:
void CHARACTER::SetLevel(BYTE level)
Code:
void CHARACTER::SetLevel(int level)
Search this:
Code:
void SetLevel(BYTE level);
Code:
void SetLevel(int level);
Code:
BYTE level;
And replace to this:
Code:
int level;
Search this one:
Code:
void CParty::P2PSetMemberLevel(DWORD pid, BYTE level)
Code:
void CParty::P2PSetMemberLevel(DWORD pid, int level)
Code:
BYTE CParty::GetMemberMaxLevel()
{
BYTE bMax = 0;
Code:
int CParty::GetMemberMaxLevel()
{
int bMax = 0;
Code:
BYTE CParty::GetMemberMinLevel()
{
BYTE bMin = PLAYER_MAX_LEVEL_CONST;
Code:
int CParty::GetMemberMinLevel()
{
int bMin = PLAYER_MAX_LEVEL_CONST;
Code:
void CParty::RequestSetMemberLevel(DWORD pid, BYTE level)
Code:
void CParty::RequestSetMemberLevel(DWORD pid, int level)
Search this:
Code:
BYTE bLevel; (its under typedef struct SMember)
Code:
int bLevel;
Code:
BYTE GetMemberMaxLevel(); BYTE GetMemberMinLevel();
Code:
int GetMemberMaxLevel(); int GetMemberMinLevel();
Code:
void RequestSetMemberLevel(DWORD pid, BYTE level); void P2PSetMemberLevel(DWORD pid, BYTE level);
Code:
void RequestSetMemberLevel(DWORD pid, int level); void P2PSetMemberLevel(DWORD pid, int level);
Find:
Code:
struct FPartyTotaler
{
int total;
Code:
struct FPartyTotaler
{
long total;
Code:
struct FPartyDistributor
{
int total;
LPCHARACTER c;
int x, y;
DWORD _iExp;
int m_iMode;
int m_iMemberCount;
FPartyDistributor(LPCHARACTER center, int member_count, int total, DWORD iExp, int iMode)
Code:
struct FPartyDistributor
{
long total;
LPCHARACTER c;
int x, y;
DWORD _iExp;
int m_iMode;
int m_iMemberCount;
FPartyDistributor(LPCHARACTER center, int member_count, long total, DWORD iExp, int iMode)
Find this:
Code:
extern BYTE PK_PROTECT_LEVEL;
Code:
extern int PK_PROTECT_LEVEL;
Change:
Code:
BYTE PK_PROTECT_LEVEL
Code:
int PK_PROTECT_LEVEL
Well, here you should decide how much is the maximum level you want. You should fill these tables with as much records, as the maximum level. (e.g if you want to have maximum level 300, you need to put 300 records to these tables)
Code:
const DWORD exp_table_euckr[PLAYER_EXP_TABLE_MAX + 1] const DWORD exp_table_common[PLAYER_EXP_TABLE_MAX + 1] const DWORD exp_table_newcibn[PLAYER_EXP_TABLE_MAX + 1 ] const DWORD party_exp_distribute_table[PLAYER_MAX_LEVEL_CONST + 1] const int aiExpLossPercents[PLAYER_EXP_TABLE_MAX + 1]
Edit this:
Code:
void LoginLog(bool isLogin, DWORD dwAccountID, DWORD dwPID, BYTE bLevel, BYTE bJob, DWORD dwPlayTime);
Code:
void LoginLog(bool isLogin, DWORD dwAccountID, DWORD dwPID, int bLevel, BYTE bJob, DWORD dwPlayTime);
Replace this:
Code:
void LogManager::LoginLog(bool isLogin, DWORD dwAccountID, DWORD dwPID, BYTE bLevel, BYTE bJob, DWORD dwPlayTime)
Code:
void LogManager::LoginLog(bool isLogin, DWORD dwAccountID, DWORD dwPID, int bLevel, BYTE bJob, DWORD dwPlayTime)
Replace this:
Code:
typedef struct SGuildMemberPacketData
{
DWORD pid;
BYTE grade;
BYTE is_general;
BYTE job;
BYTE level;
DWORD offer;
BYTE name_flag;
char name[CHARACTER_NAME_MAX_LEN+1];
} TGuildMemberPacketData;
Code:
typedef struct SGuildMemberPacketData
{
DWORD pid;
BYTE byGrade;
BYTE byIsGeneral;
BYTE byJob;
int byLevel;
DWORD dwOffer;
BYTE byNameFlag;
} TGuildMemberPacketData;
Code:
void ChangeMemberData(DWORD pid, DWORD offer, BYTE level, BYTE grade);
Code:
void ChangeMemberData(DWORD pid, DWORD offer, int level, BYTE grade);
Code:
SGuildMember(DWORD pid, BYTE grade, BYTE is_general, BYTE job, BYTE level, DWORD offer_exp, char* name);
Code:
SGuildMember(DWORD pid, BYTE grade, BYTE is_general, BYTE job, int level, DWORD offer_exp, char* name);
Code:
DWORD pid; // player Ĺ×ŔĚşíŔÇ id; primary key BYTE grade; // ±ćµĺ»óŔÇ ÇĂ·ąŔĚľîŔÇ °č±Ţ 1 to 15 (1ŔĚ ÂŻ) BYTE is_general; BYTE job; BYTE level; DWORD offer_exp; // °řÇĺÇŃ °ćÇčġ BYTE _dummy;
Code:
DWORD pid; // player Ĺ×ŔĚşíŔÇ id; primary key BYTE grade; // ±ćµĺ»óŔÇ ÇĂ·ąŔĚľîŔÇ °č±Ţ 1 to 15 (1ŔĚ ÂŻ) BYTE is_general; BYTE job; int level; DWORD offer_exp; // °řÇĺÇŃ °ćÇčġ BYTE _dummy;
Code:
void LevelChange(DWORD pid, BYTE level);
Code:
void LevelChange(DWORD pid, int level);
Find this:
Code:
BYTE level = (BYTE)strtoul(row[4], (char**) NULL, 10);
Code:
int level = (int)strtoul(row[4], (char**) NULL, 10);
Code:
sys_log(0, "GUILD: AddMember PID %u, grade %u, job %u, level %u, offer %u, name %s ptr %p",
Code:
sys_log(0, "GUILD: AddMember PID %u, grade %u, job %u, level %d, offer %u, name %s ptr %p",
Code:
void CGuild::ChangeMemberData(DWORD pid, DWORD offer, BYTE level, BYTE grade)
Code:
void CGuild::ChangeMemberData(DWORD pid, DWORD offer, int level, BYTE grade)
{
TGuildMemberContainer::iterator cit = m_member.find(pid);
if (cit == m_member.end())
return;
cit->second.offer_exp = offer;
cit->second.level = level;
cit->second.grade = grade;
cit->second._dummy = 0;
TPacketGCGuild pack;
TGuildMemberPacketData mbData;
pack.header = HEADER_GC_GUILD;
pack.subheader = GUILD_SUBHEADER_GC_LIST;
pack.size = sizeof(TPacketGCGuild);
pack.size += sizeof(TGuildMemberPacketData);
for (TGuildMemberOnlineContainer::iterator it = m_memberOnline.begin(); it != m_memberOnline.end(); ++it)
{
LPDESC d = (*it)->GetDesc();
if (d)
{
TEMP_BUFFER buf;
buf.write(&pack, sizeof(pack));
mbData.byNameFlag = 0;
mbData.byGrade = cit->second.grade;
mbData.byIsGeneral = cit->second.is_general;
mbData.byJob = cit->second.job;
mbData.byLevel = cit->second.level;
mbData.dwOffer = cit->second.offer_exp;
mbData.pid = cit->second.pid;
buf.write(&mbData, sizeof(TGuildMemberPacketData));
d->Packet(buf.read_peek(), buf.size());
}
}
}
Code:
void CGuild::LevelChange(DWORD pid, BYTE level)
Code:
void CGuild::LevelChange(DWORD pid, int level)
{
TGuildMemberContainer::iterator cit = m_member.find(pid);
if (cit == m_member.end())
return;
cit->second.level = level;
TPacketGuildChangeMemberData gd_guild;
gd_guild.guild_id = GetID();
gd_guild.pid = pid;
gd_guild.offer = cit->second.offer_exp;
gd_guild.grade = cit->second.grade;
gd_guild.level = level;
db_clientdesc->DBPacket(HEADER_GD_GUILD_CHANGE_MEMBER_DATA, 0, &gd_guild, sizeof(gd_guild));
TPacketGCGuild pack;
TGuildMemberPacketData mbData;
pack.header = HEADER_GC_GUILD;
pack.subheader = GUILD_SUBHEADER_GC_LIST;
pack.size = sizeof(TPacketGCGuild);
pack.size += sizeof(TGuildMemberPacketData);
cit->second._dummy = 0;
for (TGuildMemberOnlineContainer::iterator it = m_memberOnline.begin(); it != m_memberOnline.end(); ++it)
{
LPDESC d = (*it)->GetDesc();
if (d)
{
TEMP_BUFFER buf;
buf.write(&pack, sizeof(pack));
mbData.byNameFlag = 0;
mbData.byGrade = cit->second.grade;
mbData.byIsGeneral = cit->second.is_general;
mbData.byJob = cit->second.job;
mbData.byLevel = cit->second.level;
mbData.dwOffer = cit->second.offer_exp;
mbData.pid = cit->second.pid;
buf.write(&mbData, sizeof(TGuildMemberPacketData));
d->Packet(buf.read_peek(), buf.size());
}
}
}
Code:
bool CGuild::OfferExp(LPCHARACTER ch, int amount)
Code:
bool CGuild::OfferExp(LPCHARACTER ch, int amount)
{
TGuildMemberContainer::iterator cit = m_member.find(ch->GetPlayerID());
if (cit == m_member.end())
return false;
if (m_data.exp+amount < m_data.exp)
return false;
if (amount < 0)
return false;
if (ch->GetExp() < (DWORD) amount)
{
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±ćµĺ> Á¦°řÇϰíŔÚ ÇĎ´Â °ćÇčġ°ˇ ł˛Ŕş °ćÇčġş¸´Ů ¸ą˝Ŕ´Ď´Ů."));
return false;
}
if (ch->GetExp() - (DWORD) amount > ch->GetExp())
{
sys_err("Wrong guild offer amount %d by %s[%u]", amount, ch->GetName(), ch->GetPlayerID());
return false;
}
ch->PointChange(POINT_EXP, -amount);
TPacketGuildExpUpdate guild_exp;
guild_exp.guild_id = GetID();
guild_exp.amount = amount / 100;
db_clientdesc->DBPacket(HEADER_GD_GUILD_EXP_UPDATE, 0, &guild_exp, sizeof(guild_exp));
GuildPointChange(POINT_EXP, amount / 100, true);
cit->second.offer_exp += amount / 100;
cit->second._dummy = 0;
TPacketGCGuild pack;
TGuildMemberPacketData mbData;
pack.header = HEADER_GC_GUILD;
pack.subheader = GUILD_SUBHEADER_GC_LIST;
pack.size = sizeof(TPacketGCGuild);
pack.size += sizeof(TGuildMemberPacketData);
for (TGuildMemberOnlineContainer::iterator it = m_memberOnline.begin(); it != m_memberOnline.end(); ++it)
{
LPDESC d = (*it)->GetDesc();
if (d)
{
TEMP_BUFFER buf;
buf.write(&pack, sizeof(pack));
mbData.byNameFlag = 0;
mbData.byGrade = cit->second.grade;
mbData.byIsGeneral = cit->second.is_general;
mbData.byJob = cit->second.job;
mbData.byLevel = cit->second.level;
mbData.dwOffer = cit->second.offer_exp;
mbData.pid = cit->second.pid;
buf.write(&mbData, sizeof(TGuildMemberPacketData));
d->Packet(buf.read_peek(), buf.size());
}
}
SaveMember(ch->GetPlayerID());
TPacketGuildChangeMemberData gd_guild;
gd_guild.guild_id = GetID();
gd_guild.pid = ch->GetPlayerID();
gd_guild.offer = cit->second.offer_exp;
gd_guild.level = ch->GetLevel();
gd_guild.grade = cit->second.grade;
db_clientdesc->DBPacket(HEADER_GD_GUILD_CHANGE_MEMBER_DATA, 0, &gd_guild, sizeof(gd_guild));
return true;
}
Code:
void CGuild::SendListPacket(LPCHARACTER ch)
Code:
void CGuild::SendListPacket(LPCHARACTER ch)
{
/*
List Packet
Header
Count (byte)
[
...
name_flag 1 - Ŕ̸§Ŕ» ş¸ł»´ŔłÄ ľČş¸ł»´ŔłÄ
name CHARACTER_NAME_MAX_LEN+1
] * Count
*/
LPDESC d;
if (!(d=ch->GetDesc()))
return;
TPacketGCGuild pack;
pack.header = HEADER_GC_GUILD;
pack.size = sizeof(TPacketGCGuild);
pack.subheader = GUILD_SUBHEADER_GC_LIST;
pack.size += sizeof(TGuildMemberPacketData) * m_member.size();
TEMP_BUFFER buf;
TGuildMemberPacketData mbData;
buf.write(&pack,sizeof(pack));
char c[CHARACTER_NAME_MAX_LEN+1];
for (TGuildMemberContainer::iterator it = m_member.begin(); it != m_member.end(); ++it)
{
it->second._dummy = 1;
mbData.byNameFlag = 1;
mbData.byGrade = it->second.grade;
mbData.byIsGeneral = it->second.is_general;
mbData.byJob = it->second.job;
mbData.byLevel = it->second.level;
mbData.dwOffer = it->second.offer_exp;
mbData.pid = it->second.pid;
buf.write(&mbData, sizeof(TGuildMemberPacketData));
strlcpy(c, it->second.name.c_str(), MIN(sizeof(c), it->second.name.length() + 1));
buf.write(c, CHARACTER_NAME_MAX_LEN+1 );
if ( test_server )
sys_log(0 ,"name %s job %d ", it->second.name.c_str(), it->second.job );
}
d->Packet(buf.read_peek(), buf.size());
for (TGuildMemberOnlineContainer::iterator it = m_memberOnline.begin(); it != m_memberOnline.end(); ++it)
{
SendLoginPacket(ch, *it);
}
for (TGuildMemberP2POnlineContainer::iterator it = m_memberP2POnline.begin(); it != m_memberP2POnline.end(); ++it)
{
SendLoginPacket(ch, *it);
}
}
Code:
void CGuild::SendListOneToAll(DWORD pid)
Code:
void CGuild::SendListOneToAll(DWORD pid)
{
TPacketGCGuild pack;
pack.header = HEADER_GC_GUILD;
pack.size = sizeof(TPacketGCGuild);
pack.subheader = GUILD_SUBHEADER_GC_LIST;
pack.size += sizeof(TGuildMemberPacketData);
TGuildMemberPacketData mbData;
char c[CHARACTER_NAME_MAX_LEN+1];
memset(c, 0, sizeof(c));
TGuildMemberContainer::iterator cit = m_member.find(pid);
if (cit == m_member.end())
return;
for (TGuildMemberOnlineContainer::iterator it = m_memberOnline.begin(); it!= m_memberOnline.end(); ++it)
{
LPDESC d = (*it)->GetDesc();
if (!d)
continue;
TEMP_BUFFER buf;
buf.write(&pack, sizeof(pack));
cit->second._dummy = 1;
mbData.byNameFlag = 1;
mbData.byGrade = cit->second.grade;
mbData.byIsGeneral = cit->second.is_general;
mbData.byJob = cit->second.job;
mbData.byLevel = cit->second.level;
mbData.dwOffer = cit->second.offer_exp;
mbData.pid = cit->second.pid;
//buf.write(&(cit->second), sizeof(DWORD) * 3 +1);
buf.write(&mbData, sizeof(TGuildMemberPacketData));
buf.write(cit->second.name.c_str(), cit->second.name.length());
buf.write(c, CHARACTER_NAME_MAX_LEN + 1 - cit->second.name.length());
d->Packet(buf.read_peek(), buf.size());
}
}
Code:
SGuildMember::SGuildMember(DWORD pid, BYTE grade, BYTE is_general, BYTE job, BYTE level, DWORD offer_exp, char* name)
Code:
SGuildMember::SGuildMember(DWORD pid, BYTE grade, BYTE is_general, BYTE job, int level, DWORD offer_exp, char* name)
tables.h
Find this:
Code:
BYTE byLevel;
Code:
int byLevel;
Code:
BYTE level;
Code:
int level;
Code:
BYTE level;
Code:
int level;
Code:
BYTE bLevel;
To this:
Code:
int bLevel;
Code:
BYTE bLevel;
To this:
Code:
int bLevel;
Then here set the maximum level:
Code:
PLAYER_EXP_TABLE_MAX = 120, PLAYER_MAX_LEVEL_CONST = 120,
ClientManager.h
Find this:
Code:
struct TPartyInfo
{
BYTE bRole;
BYTE bLevel;
Code:
struct TPartyInfo
{
BYTE bRole;
int bLevel;
Find this:
Code:
"PLAYER_DELETE FAILED LEVEL %u >= DELETE LIMIT %d"
Code:
"PLAYER_DELETE FAILED LEVEL %d >= DELETE LIMIT %d"
Code:
"PLAYER_DELETE FAILED LEVEL %u >= DELETE LIMIT %d"
Code:
"PLAYER_DELETE FAILED LEVEL %d >= DELETE LIMIT %d"
packet.h
Find this:
Code:
BYTE byLevel;
Code:
int byLevel;
Code:
BYTE byLevel;
Code:
int byLevel;
Find this:
Code:
BYTE byLevel;
Code:
int byLevel;
And then, here you are
If you have question(s)/problem(s)/remark(s), feel free to post it here, or send me a PM.
Have a nice day,
Estrella2






