Aller au contenu
Top-Metin2.org - Vous êtes à la recherche d'un serveur Metin 2 ? ×
×
×
  • Créer...

C++ - Modifier le niveau maximum


Messages recommandés

Centre de Téléchargement

Hidden Content

    Give reaction to this post to see the hidden content.
( Interne )

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 <fileStore.core_Emoticons>/emoticons/wink.png

 

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

Hidden Content

    Give reaction to this post to see the hidden content.
ou

Hidden Content

    Give reaction to this post to see the hidden content.

- 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 '

Hidden Content

    Give reaction to this post to see the hidden content.
' 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' :

Hidden Content

    Give reaction to this post to see the hidden content.

 

Credit, Source ~masodikbela

 

Pour continuer:

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

 

  • Metin2 Dev 7
  • Good 1
  • Love 17
Lien vers le commentaire
Partager sur d’autres sites

  • 3 mois après...

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 ! :)

Modifié par Nexooh
Faute d'orthographe
Lien vers le commentaire
Partager sur d’autres sites

  • 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.

  • Love 4
Lien vers le commentaire
Partager sur d’autres sites

  • 1 mois après...

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?

 

Modifié par daerian
Lien vers le commentaire
Partager sur d’autres sites

  • 1 mois après...
  • 3 ans après...

Salut, je rencontre un problème, j'ai suivis le tutoriel permettant d'augmenter les lvl de son serveur, seulement, lors de la compilation du client, je rencontre un problème.. lorsque je me connecte au serveur, je voit mon personnage ( sans son armure déjà, alors que de base il en a une d'équipé ) est de plus, avec plus de 500k lvl, lorsque je choisi ce personnage, sa me fait un rollback ( retour a la page de connexion ), je suppose que cela viens du client, car lorsque j'utilise mon ancien client, je voit bien mes levels ainsi que l'armure de mon personnage

 

possible d'avoir de l'aide ? ^^'

 

Lien vers le commentaire
Partager sur d’autres sites



  • brilliantdiscord_widget
  • Flux d'Activité

    1. 21

      Metin2 en 2020 peut-on en parler?

    2. 0

      METIN2Project

    3. 3

      Ressources - UnPack - Metin2 Client - Officiel

    4. 0

      Barre des tâches d'argent étendue

    5. 16

      Redémarrage automatique des channels

    6. 16

      Multi Logo GM / SGM / GA

    7. 0

      comment extraire les fichiers locale.epk locale.eix sur le serveur officiel ?

    8. 2

      Funky-emu.net -> fr.metin2.dev

  • En ligne récemment

    • Aucun utilisateur enregistré regarde cette page.

Information importante

Conditions d’utilisation / Politique de confidentialité / Règles / Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer.