Jump to content

C++ - Modifier le niveau maximum


Recommended Posts

 

Niveau requis Intermédiaire

Temps estimé : Entre 25 et 30 minutes

 

Bonjour j'ai vue ce partage sur d'autre forum mais pas ici, donc je vous en fais une petite traduction ici pour les moins bilingue d'entre nous ;)

 

Dans le tutoriel il y est utilisé la variable "int" car elle propose une limite de 2147483647 niveau pour cette utilisation ce qui semble bien plus que suffisant c'est pourquoi l'auteur du post recommande cette variable.

 

Bref j'imagine que je n'ai pas vraiment de vous expliquer en quoi consiste ce tuto, voici un petit screen du résultat :

Révélation

1209400112-003938.jpg

Pré-requis:

- Les sources de votre serveur

- Les sources de votre client

- Un accès ftp via FileZilla ou WinSCP

- Un accès BDD via Navicat

 

I. Partie /Srcs/Server/game/

Révélation

 

char.cpp

Révélation

Cherchez :


void CHARACTER::SetLevel(BYTE level)

Et remplacez par :


void CHARACTER::SetLevel(int level)

 

char.h

Révélation

Cherchez :


void			SetLevel(BYTE level);

Et remplacez par :


void			SetLevel(int level);

Recherchez (dans typedef struct character_point) :


BYTE			level;

Remplacez le par :


int			level;

 

party.cpp

Révélation

Cherchez :


void CParty::P2PSetMemberLevel(DWORD pid, BYTE level)

Remplacez le par :


void CParty::P2PSetMemberLevel(DWORD pid, int level)

Recherchez :


BYTE CParty::GetMemberMaxLevel()
{
	BYTE bMax = 0;

Remplacez :


int CParty::GetMemberMaxLevel()
{
	int bMax = 0;

Cherchez :


BYTE CParty::GetMemberMinLevel()
{
	BYTE bMin = PLAYER_MAX_LEVEL_CONST;

Remplacez par :


int CParty::GetMemberMinLevel()
{
	int bMin = PLAYER_MAX_LEVEL_CONST;

Enfin recherchez :


void CParty::RequestSetMemberLevel(DWORD pid, BYTE level)

Et remplacez par :


void CParty::RequestSetMemberLevel(DWORD pid, int level)

 

party.h

Révélation

Recherche ceci (dans typedef struct SMember) :


BYTE	bLevel;

Et remplacez par :


int	bLevel;

Recherchez :


		BYTE		GetMemberMaxLevel();
		BYTE		GetMemberMinLevel();

Remplacez par :


		int		GetMemberMaxLevel();
		int		GetMemberMinLevel();

Recherchez :


		void		RequestSetMemberLevel(DWORD pid, BYTE level);
		void		P2PSetMemberLevel(DWORD pid, BYTE level);

Remplacez par :


		void		RequestSetMemberLevel(DWORD pid, int level);
		void		P2PSetMemberLevel(DWORD pid, int level);

 

char_battle.cpp

Révélation

Cherchez :


	struct FPartyTotaler
	{
		int		total;

Et remplacez par :


	struct FPartyTotaler
	{
		long		total;

Maintenant modifiez :


	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) 

Comme ça :


	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) 

 

config.h

Révélation

Cherchez ceci :


extern BYTE	PK_PROTECT_LEVEL;

Et modifiez comme ceci :


extern int	PK_PROTECT_LEVEL;

 

locale_service.cpp

Révélation

Modifiez :


BYTE PK_PROTECT_LEVEL

Comme ça :


int PK_PROTECT_LEVEL

 

constants.cpp 

Révélation

Pour ce fichier c'est un peu différent, ouvrez le et recherchez :


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]

En voyant ce qui est sous ses lignes vous comprendrez très vite comment cela fonctionne, il suffit d'ajouter autant de ligne que de niveau voulu, utilisez les lignes déjà présentes pour en ajouter et ajouter des niveaux (je partage un fichier 'constants.cpp' avec les niveaux ajouté jusqu'au "lv 1000" pour vous aider).

log.h

Révélation

Editez :


void		LoginLog(bool isLogin, DWORD dwAccountID, DWORD dwPID, BYTE bLevel, BYTE bJob, DWORD dwPlayTime);

Comme ceci :


void		LoginLog(bool isLogin, DWORD dwAccountID, DWORD dwPID, int bLevel, BYTE bJob, DWORD dwPlayTime);

 

log.cpp

Révélation

Cherchez :


void LogManager::LoginLog(bool isLogin, DWORD dwAccountID, DWORD dwPID, BYTE bLevel, BYTE bJob, DWORD dwPlayTime)

Remplacez par :


void LogManager::LoginLog(bool isLogin, DWORD dwAccountID, DWORD dwPID, int bLevel, BYTE bJob, DWORD dwPlayTime)

 

guild.h

Révélation

Recherchez :


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;

Et remplacez par :


typedef struct SGuildMemberPacketData
{   
	DWORD pid;
	BYTE byGrade;
	BYTE byIsGeneral;
	BYTE byJob;
	int	 byLevel;
	DWORD dwOffer;
	BYTE byNameFlag;
} TGuildMemberPacketData;

Cherchez :


void		ChangeMemberData(DWORD pid, DWORD offer, BYTE level, BYTE grade);

Remplacez par :


void		ChangeMemberData(DWORD pid, DWORD offer, int level, BYTE grade);

Cherchez :


SGuildMember(DWORD pid, BYTE grade, BYTE is_general, BYTE job, BYTE level, DWORD offer_exp, char* name);

Modifiez comme ça :


SGuildMember(DWORD pid, BYTE grade, BYTE is_general, BYTE job, int level, DWORD offer_exp, char* name);

Cherchez :


	DWORD pid; // player 테이블의 id; primary key
	BYTE grade; // 길드상의 플레이어의 계급 1 to 15 (1이 짱)
	BYTE is_general;
	BYTE job;
	BYTE level;
	DWORD offer_exp; // 공헌한 경험치
	BYTE _dummy;

Et remplacez :


	DWORD pid; // player 테이블의 id; primary key
	BYTE grade; // 길드상의 플레이어의 계급 1 to 15 (1이 짱)
	BYTE is_general;
	BYTE job;
	int level;
	DWORD offer_exp; // 공헌한 경험치
	BYTE _dummy;

Ceci :


void		LevelChange(DWORD pid, BYTE level);

Par cela :


void		LevelChange(DWORD pid, int level);

 

guild.cpp

Révélation

Cherchez :


BYTE level = (BYTE)strtoul(row[4], (char**) NULL, 10);

Remplacez le par :


int level = (int)strtoul(row[4], (char**) NULL, 10);

Cherchez :


sys_log(0, "GUILD: AddMember PID %u, grade %u, job %u, level %u, offer %u, name %s ptr %p",

Et modifiez comme ceci :


sys_log(0, "GUILD: AddMember PID %u, grade %u, job %u, level %d, offer %u, name %s ptr %p",

Trouvez cette fonction :


void CGuild::ChangeMemberData(DWORD pid, DWORD offer, BYTE level, BYTE grade)

Et remplacez la entièrement par :


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());
		}
	}
}

Pareil pour celle ci :


void CGuild::LevelChange(DWORD pid, BYTE level)

Remplacez la par :


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());
		}
	}
}

Celle ci aussi :


bool CGuild::OfferExp(LPCHARACTER ch, int amount)

Par ceci :


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;
}

Idem pour celle la :


void CGuild::SendListPacket(LPCHARACTER ch)

Par ça :


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();
    pack.size += (CHARACTER_NAME_MAX_LEN + 1) * 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);
	}

}

Promis c'est bientôt fini pour ce fichier :


void CGuild::SendListOneToAll(DWORD pid)

Remplacez par ceci :


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());
	}
}

Pour terminer cherchez :


SGuildMember::SGuildMember(DWORD pid, BYTE grade, BYTE is_general, BYTE job, BYTE level, DWORD offer_exp, char* name)

Et remplacez par :


SGuildMember::SGuildMember(DWORD pid, BYTE grade, BYTE is_general, BYTE job, int level, DWORD offer_exp, char* name)

 

 

 

II. Partie /Srcs/Server/common/

Révélation

 

table.h

Révélation

Cherchez :


BYTE		byLevel;

Remplacez par :


int		byLevel;

Recherchez :


BYTE	level;

Par :


int	level;

Cherchez ceci :


BYTE level;

Remplacez par cela :


int level;

Cherchez (dans typedef struct SPacketPartySetMemberLevel) :


BYTE	bLevel;

Et remplacez par :


int	bLevel;

Recherchez (dans typedef struct SpacketDGGuildMember) :


BYTE	bLevel;

Remplacez le par :


int	bLevel;

 

 

lenght.h

Révélation

Recherchez ces deux lignes et remplacez 'LVL' par le nombre de niveau que vous avez configuré plus tôt :


	PLAYER_EXP_TABLE_MAX	= LVL,
	PLAYER_MAX_LEVEL_CONST	= LVL,

 

 

 

III. Partie /Srcs/Server/db/

Révélation

ClientManager.h

Révélation

Cherchez :


	struct TPartyInfo
	{
	    BYTE bRole;
	    BYTE bLevel;

Et remplacez par :


	struct TPartyInfo
	{
	    BYTE bRole;
	    int bLevel;

 

ClientManager.cpp

Révélation

Cherchez (dans void CClientManager::SendPartyOnSetup(CPeer* pkPeer) ) :


pkPeer->Encode(&it_member->second.bLevel, sizeof(BYTE));

Et remplacez par :


pkPeer->Encode(&it_member->second.bLevel, sizeof(int));

 

ClientManagerPlayer.cpp

Révélation

Recherchez :


"PLAYER_DELETE FAILED LEVEL %u >= DELETE LIMIT %d"

Et modifiez comme ceci :


"PLAYER_DELETE FAILED LEVEL %d >= DELETE LIMIT %d"

Cherchez ensuite :


"PLAYER_DELETE FAILED LEVEL %u >= DELETE LIMIT %d"

Et modifiez les deux lignes comme :


"PLAYER_DELETE FAILED LEVEL %d >= DELETE LIMIT %d"

 

 

 

IV. Parti /SrcsClient/UserInterface/

Révélation

packet.h

Révélation

Recherchez :


BYTE                byLevel;

Remplacez par :


int                byLevel;

Et ceci :


BYTE byLevel;

Remplacez le par :


int byLevel;

 

PythonGuild.h

Révélation

Cherchez :


BYTE byLevel;

Et remplacez par :


int byLevel;

 

 

Pour finir dirigez vous vers Navicat, ouvrez votre bdd 'player' faites clique droit sur la table 'player', selectionnez "Design Table", déscendez a la ligne 'level', dans la colonne 'Type' modifiez en 'int' et dans la colonne 'Length' modifiez le chiffre et mettez '5' pour etre tranquille.

 

Le fichier 'constants.cpp' : ICI / FE

 

Credit, Source ~masodikbela

 

Pour continuer:

Vous n'avez plus qu'a compiler et modifier le niveau max de vos files : Modifier le level maximum

 

  • Like 8

013344signature-forum.png

Link to post
Il y a 1 heure, Takuma a dit :

Merci !

Mais un short aurait pas suffit ? 32k de lv ça parait déjà suffisant U_u 

Comme je le dis dans le post je n'en suis pas l'auteur.

013344signature-forum.png

Link to post
  • 3 months later...

Salut,

 

Je suis ce joli tutoriel pour commencer à toucher aux sources, mais je bute à l'étape "Partie /SrcsClient/UserInterface".

De quoi s'agit-il au juste ?

 

J'ai essayé de passer outre, étant donné que je n'ai trouvé aucun des deux fichiers mentionnés, mais je me retrouve avec des choses bizarres à la connexion au client (j'aurai tenté !).

 

Merci pour votre aide ! :)

Edited by Nexooh
Faute d'orthographe (see edit history)
Link to post
  • Administrateur
il y a 7 minutes, Nexooh a dit :

Salut,

 

Je suis ce joli tutoriel pour commencer à toucher aux sources, mais je bute à l'étape "Partie /SrcsClient/UserInterface".

De quoi s'agit-il au juste ?

 

J'ai essayé de passer outre, étant donné que je n'ai trouvé aucun des deux fichiers mentionnés, mais je me retrouve avec des choses bizarres à la connexion au client (j'aurai tenté !).

 

Merci pour votre aide ! :)

 

Tu as les sources serveur, tu as les sources client.

Les sources client se compilent avec Visual Studio 2013 ou 2019 selon les sources utilisés.

  • Like 3

logo.png

 

miaw-network.png
 

Link to post
  • 1 month later...
Posted (edited)

Salut,

 

Après  plusieurs re vérification des fichier pour voir si j'ai oublier quelque chose je me retrouve toujours avec le level bloqué a 255 au lancement du serveur dans la console,

j'ai pourtant bien modifier  le level dans lenght, constants ainsi que dans tous les channel et le game99 et je n'ai aucune erreur de compilation de game et db.

 

Quelqu'un aurait une idée de ce que j'aurai pu oublier?

 

Edited by daerian (see edit history)
Link to post
  • 1 month later...

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


×
×
  • Create New...

Important Information

Terms of Use / Privacy Policy / Guidelines / We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.