Sursa metin are nivelul limitat la 255, deoarece se foloseste BYTE pentru variabile. (care are valoarea maxima 255)
Vom schimba acest lucru si vom muta pe int, astfel nivelul maxim pe care il vei putea seta va fi de: 2147483647
*Poze / Video:
- 05-29-2025, 13-38-48.png (350.11 KiB) Vizualizat de 655 ori
Video tutorial implementare (daca nu va descurcati):
Tutorial:
Deschidem char.cpp si cautam:
Cod: Selectaţi tot
void CHARACTER::SetLevel(BYTE level)
la acest mesaj și conținutul se va afișa automat.Deschidem char.h si cautam:
Cod: Selectaţi tot
void SetLevel(BYTE level);
la acest mesaj și conținutul se va afișa automat.Dupa cautam:
Cod: Selectaţi tot
BYTE level;(e sub asta: typedef struct character_point)
Inlocuim cu:
la acest mesaj și conținutul se va afișa automat.Deschidem party.cpp si cautam:
Cod: Selectaţi tot
void CParty::P2PSetMemberLevel(DWORD pid, BYTE level)
la acest mesaj și conținutul se va afișa automat.Cautam asta:
Cod: Selectaţi tot
BYTE CParty::GetMemberMaxLevel()
{
BYTE bMax = 0;
la acest mesaj și conținutul se va afișa automat.Cautam:
Cod: Selectaţi tot
BYTE CParty::GetMemberMinLevel()
{
BYTE bMin = PLAYER_MAX_LEVEL_CONST;
la acest mesaj și conținutul se va afișa automat.Cautam:
Cod: Selectaţi tot
void CParty::RequestSetMemberLevel(DWORD pid, BYTE level)
la acest mesaj și conținutul se va afișa automat.Deschidem party.h si cautam:
Cod: Selectaţi tot
BYTE bLevel;Inlocuim cu:(este sub: typedef struct SMember)
la acest mesaj și conținutul se va afișa automat.Cautam:
Cod: Selectaţi tot
BYTE GetMemberMaxLevel();
BYTE GetMemberMinLevel();
la acest mesaj și conținutul se va afișa automat.Cautam:
Cod: Selectaţi tot
void RequestSetMemberLevel(DWORD pid, BYTE level);
void P2PSetMemberLevel(DWORD pid, BYTE level);
la acest mesaj și conținutul se va afișa automat.Deschidem char_battle.cpp si cautam:
Cod: Selectaţi tot
struct FPartyTotaler
{
int total;
la acest mesaj și conținutul se va afișa automat.Cautam:
Cod: Selectaţi tot
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)
la acest mesaj și conținutul se va afișa automat.Deschidem config.h si cautam:
Cod: Selectaţi tot
extern BYTE PK_PROTECT_LEVEL;
la acest mesaj și conținutul se va afișa automat.Deschidem locale_service.cpp si cautam:
Cod: Selectaţi tot
BYTE PK_PROTECT_LEVEL
la acest mesaj și conținutul se va afișa automat.Deschidem constants.cpp si cautam:
Cod: Selectaţi tot
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]Completam tabelele cu cat e nivelul maxim. Daca avem nivel maixm 300, punem 300 valori.
Deschidem log.h si cautam:
Cod: Selectaţi tot
void LoginLog(bool isLogin, DWORD dwAccountID, DWORD dwPID, BYTE bLevel, BYTE bJob, DWORD dwPlayTime);
la acest mesaj și conținutul se va afișa automat.Deschidem log.cpp si cautam:
Cod: Selectaţi tot
void LogManager::LoginLog(bool isLogin, DWORD dwAccountID, DWORD dwPID, BYTE bLevel, BYTE bJob, DWORD dwPlayTime)
la acest mesaj și conținutul se va afișa automat.Deschidem guild.h si cautam:
Cod: Selectaţi tot
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;
la acest mesaj și conținutul se va afișa automat.Cautam:
Cod: Selectaţi tot
void ChangeMemberData(DWORD pid, DWORD offer, BYTE level, BYTE grade);
la acest mesaj și conținutul se va afișa automat.Cautam:
Cod: Selectaţi tot
SGuildMember(DWORD pid, BYTE grade, BYTE is_general, BYTE job, BYTE level, DWORD offer_exp, char* name);
la acest mesaj și conținutul se va afișa automat.Cautam:
Cod: Selectaţi tot
DWORD pid; // player Ĺ×ŔĚşíŔÇ id; primary key
BYTE grade; // ±ćµĺ»óŔÇ ÇĂ·ąŔĚľîŔÇ °č±Ţ 1 to 15 (1ŔĚ ÂŻ)
BYTE is_general;
BYTE job;
BYTE level;
DWORD offer_exp; // °řÇĺÇŃ °ćÇčġ
BYTE _dummy;
la acest mesaj și conținutul se va afișa automat.Cautam:
Cod: Selectaţi tot
void LevelChange(DWORD pid, BYTE level);
la acest mesaj și conținutul se va afișa automat.Deschidem guild.cpp si cautam:
Cod: Selectaţi tot
BYTE level = (BYTE)strtoul(row[4], (char**) NULL, 10);
la acest mesaj și conținutul se va afișa automat.Cautam:
Cod: Selectaţi tot
sys_log(0, "GUILD: AddMember PID %u, grade %u, job %u, level %u, offer %u, name %s ptr %p",
la acest mesaj și conținutul se va afișa automat.Cautam:
Cod: Selectaţi tot
void CGuild::ChangeMemberData(DWORD pid, DWORD offer, BYTE level, BYTE grade)
la acest mesaj și conținutul se va afișa automat.Cautam:
Cod: Selectaţi tot
void CGuild::LevelChange(DWORD pid, BYTE level)
la acest mesaj și conținutul se va afișa automat.Cautam:
Cod: Selectaţi tot
bool CGuild::OfferExp(LPCHARACTER ch, int amount)
la acest mesaj și conținutul se va afișa automat.Cautam:
Cod: Selectaţi tot
void CGuild::SendListPacket(LPCHARACTER ch)
la acest mesaj și conținutul se va afișa automat.Cautam:
Cod: Selectaţi tot
void CGuild::SendListOneToAll(DWORD pid)
la acest mesaj și conținutul se va afișa automat.Cautam:
Cod: Selectaţi tot
SGuildMember::SGuildMember(DWORD pid, BYTE grade, BYTE is_general, BYTE job, BYTE level, DWORD offer_exp, char* name)
la acest mesaj și conținutul se va afișa automat.Deschidem tables.h din common si cautam:
Cod: Selectaţi tot
BYTE byLevel;
la acest mesaj și conținutul se va afișa automat.Cautam:
Cod: Selectaţi tot
BYTE level;
la acest mesaj și conținutul se va afișa automat.Cautam:
Cod: Selectaţi tot
BYTE level;
la acest mesaj și conținutul se va afișa automat.Cautam:
Cod: Selectaţi tot
BYTE bLevel;(este sub: typedef struct SPacketPartySetMemberLevel)
Inlocuim cu:
la acest mesaj și conținutul se va afișa automat.Cautam:
Cod: Selectaţi tot
BYTE bLevel;(este sub: typedef struct SPacketDGGuildMember)
Inlocuim cu:
Cod: Selectaţi tot
int bLevel;Cod: Selectaţi tot
PLAYER_EXP_TABLE_MAX = 120,
PLAYER_MAX_LEVEL_CONST = 120,Cod: Selectaţi tot
struct TPartyInfo
{
BYTE bRole;
BYTE bLevel;
la acest mesaj și conținutul se va afișa automat.Deschidem ClientManager.cpp si cautam in void CClientManager::SendPartyOnSetup(CPeer* pkPeer):
Cod: Selectaţi tot
pkPeer->Encode(&it_member->second.bLevel, sizeof(BYTE));
la acest mesaj și conținutul se va afișa automat.Deschidem ClientManagerPlayer.cpp si cautam:
Cod: Selectaţi tot
"PLAYER_DELETE FAILED LEVEL %u >= DELETE LIMIT %d"
la acest mesaj și conținutul se va afișa automat.Cautam (x2):
Cod: Selectaţi tot
"PLAYER_DELETE FAILED LEVEL %u >= DELETE LIMIT %d"
la acest mesaj și conținutul se va afișa automat.In sursa binary, deschidem packet.h si cautam:
Cod: Selectaţi tot
BYTE byLevel;
la acest mesaj și conținutul se va afișa automat.Cautam:
Cod: Selectaţi tot
BYTE byLevel;
la acest mesaj și conținutul se va afișa automat.Deschidem PythonGuild.h si cautam:
Cod: Selectaţi tot
BYTE byLevel;
la acest mesaj și conținutul se va afișa automat.Si nu in ultimul rand, mergem in Navicat -> player -> player -> Design table -> Editam coloana level si setam din type tinyint in int si la size extindem la 3/4 (in functie de caz)
Cam atat
Acum va trebui sa editati in constants.cpp EXP pentru fiecare nivel, va las un exemplu atasat mai jos:
la acest mesaj și conținutul se va afișa automat.




