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

C++ - Slot de Personnages Supplémentaires


Messages recommandés

Centre de Téléchargement

Hidden Content

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

Bonjour, Bonsoir

 

Je vous présente aujourd'hui, un petit partage, qui vous permettra d'ajouter des emplacements pour vos personnages.

Ceci est mon premier partage, donc toutes critiques ou autres seront une source d'améliorations.

 

Le tutoriel se base sur l'ordre suivant : Serveur/Client/MySQL

 

Fini de parler, passons au tutoriel :

 

/!\ Serveur /!\

 

Rendez-vous dans Common/length.h

 

Cherchez :

 

  PLAYER_PER_ACCOUNT = 4, 
 

 

Remplacez par :

 

  PLAYER_PER_ACCOUNT = 8, 
 

Rendez-vous maintenant dans Game/src/locale_service.cpp

 

Cherchez :

static void __CheckPlayerSlot(const std::string& service_name)
{
if (PLAYER_PER_ACCOUNT != 4)
{
	printf(" PLAYER_PER_ACCOUNT = %d\n", PLAYER_PER_ACCOUNT);
	exit(0);
}
}
 

 

Remplacez par :

static void __CheckPlayerSlot(const std::string& service_name)
{
if (PLAYER_PER_ACCOUNT != 8)
{
	printf(" PLAYER_PER_ACCOUNT = %d\n", PLAYER_PER_ACCOUNT);
	exit(0);
}
}
 

 

 

Maintenant, allez dans Game/src/char_change_empire.cpp

 

Cherchez :

  	snprintf(szQuery, sizeof(szQuery), 
			"SELECT id, pid1, pid2, pid3, pid4 FROM player_index%s WHERE pid1=%u OR pid2=%u OR pid3=%u OR pid4=%u AND empire=%u", 
			get_table_postfix(), GetPlayerID(), GetPlayerID(), GetPlayerID(), GetPlayerID(), GetEmpire());

	std::auto_ptr msg(DBManager::instance().DirectQuery(szQuery));
 

 

Remplacez par :

        snprintf(szQuery, sizeof(szQuery), 
                               "SELECT id, pid1, pid2, pid3, pid4, pid5, pid6, pid7, pid8 FROM player_index%s WHERE pid1=%u OR pid2=%u OR pid3=%u OR pid4=%u OR pid5=%u OR pid6=%u OR pid7=%u OR pid8=%u AND empire=%u", 
                               get_table_postfix(), GetPlayerID(), GetPlayerID(), GetPlayerID(), GetPlayerID(), GetPlayerID(), GetPlayerID(), GetPlayerID(), GetPlayerID(), GetEmpire());

               std::auto_ptr msg(DBManager::instance().DirectQuery(szQuery));
 

 

 

Toujours dans char_change_empire.cpp

 

Cherchez :

 

		MYSQL_ROW row = mysql_fetch_row(msg->Get()->pSQLResult);

	str_to_number(dwAID, row[0]);
	str_to_number(dwPID[0], row[1]);
	str_to_number(dwPID[1], row[2]);
	str_to_number(dwPID[2], row[3]);
	str_to_number(dwPID[3], row[4]);
 

 

Remplacez par :

                MYSQL_ROW row = mysql_fetch_row(msg->Get()->pSQLResult);

               str_to_number(dwAID, row[0]);
               str_to_number(dwPID[0], row[1]);
               str_to_number(dwPID[1], row[2]);
               str_to_number(dwPID[2], row[3]);
               str_to_number(dwPID[3], row[4]);
               str_to_number(dwPID[4], row[5]);
               str_to_number(dwPID[5], row[6]);
               str_to_number(dwPID[6], row[7]);
               str_to_number(dwPID[7], row[8]);
 

 

 

cherchez ensuite :

		snprintf(szQuery, sizeof(szQuery), "UPDATE player_index%s SET empire=%u WHERE pid1=%u OR pid2=%u OR pid3=%u OR pid4=%u AND empire=%u", 
			get_table_postfix(), empire, GetPlayerID(), GetPlayerID(), GetPlayerID(), GetPlayerID(), GetEmpire());

	std::auto_ptr msg(DBManager::instance().DirectQuery(szQuery));
 

 

 

Remplacez par :

                snprintf(szQuery, sizeof(szQuery), "UPDATE player_index%s SET empire=%u WHERE pid1=%u OR pid2=%u OR pid3=%u OR pid4=%u OR pid5=%u OR pid6=%u OR pid7=%u OR pid8=%u AND empire=%u", 
                               get_table_postfix(), empire, GetPlayerID(), GetPlayerID(), GetPlayerID(), GetPlayerID(), GetPlayerID(), GetPlayerID(), GetPlayerID(), GetPlayerID(), GetEmpire());

               std::auto_ptr msg(DBManager::instance().DirectQuery(szQuery));
 

 

 

Cherchez :

DWORD CHARACTER::GetAID() const
{
char szQuery[1024+1];
DWORD dwAID = 0;

snprintf(szQuery, sizeof(szQuery), "SELECT id FROM player_index%s WHERE pid1=%u OR pid2=%u OR pid3=%u OR pid4=%u AND empire=%u", 
		get_table_postfix(), GetPlayerID(), GetPlayerID(), GetPlayerID(), GetPlayerID(), GetEmpire());

SQLMsg* pMsg = DBManager::instance().DirectQuery(szQuery);
 

 

 

Remplacez par :

DWORD CHARACTER::GetAID() const
{
       char szQuery[1024+1];
       DWORD dwAID = 0;

       snprintf(szQuery, sizeof(szQuery), "SELECT id FROM player_index%s WHERE pid1=%u OR pid2=%u OR pid3=%u OR pid4=%u OR pid5=%u OR pid6=%u OR pid7=%u OR pid8=%u AND empire=%u", 
                       get_table_postfix(), GetPlayerID(), GetPlayerID(), GetPlayerID(), GetPlayerID(), GetPlayerID(), GetPlayerID(), GetPlayerID(), GetPlayerID(), GetEmpire());

       SQLMsg* pMsg = DBManager::instance().DirectQuery(szQuery);
 

 

 

Maintenant, rendez-vous dans db/src/clientmanager.cpp

 

Cherchez :

void CClientManager::QUERY_EMPIRE_SELECT(CPeer * pkPeer, DWORD dwHandle, TEmpireSelectPacket * p)
{
char szQuery[QUERY_MAX_LEN];

snprintf(szQuery, sizeof(szQuery), "UPDATE player_index%s SET empire=%u WHERE id=%u", GetTablePostfix(), p->bEmpire, p->dwAccountID);
delete CDBManager::instance().DirectQuery(szQuery);

sys_log(0, "EmpireSelect: %s", szQuery);
{
	snprintf(szQuery, sizeof(szQuery),
			"SELECT pid1, pid2, pid3, pid4 FROM player_index%s WHERE id=%u", GetTablePostfix(), p->dwAccountID);

	std::auto_ptr pmsg(CDBManager::instance().DirectQuery(szQuery));

	SQLResult * pRes = pmsg->Get();
 

 

 

Remplacez par :

void CClientManager::QUERY_EMPIRE_SELECT(CPeer * pkPeer, DWORD dwHandle, TEmpireSelectPacket * p)
{
       char szQuery[QUERY_MAX_LEN];

       snprintf(szQuery, sizeof(szQuery), "UPDATE player_index%s SET empire=%u WHERE id=%u", GetTablePostfix(), p->bEmpire, p->dwAccountID);
       delete CDBManager::instance().DirectQuery(szQuery);

       sys_log(0, "EmpireSelect: %s", szQuery);
       {
               snprintf(szQuery, sizeof(szQuery), 
                               "SELECT pid1, pid2, pid3, pid4, pid5, pid6, pid7, pid8 FROM player_index%s WHERE id=%u", GetTablePostfix(), p->dwAccountID);

               std::auto_ptr pmsg(CDBManager::instance().DirectQuery(szQuery));

               SQLResult * pRes = pmsg->Get();
 

 

 

Cherchez :

 

void CClientManager::ChangeMonarchLord(CPeer * peer, DWORD dwHandle, TPacketChangeMonarchLord* info)
{
char szQuery[1024];
snprintf(szQuery, sizeof(szQuery), 
		"SELECT a.name, NOW() FROM player%s AS a, player_index%s AS b WHERE (a.account_id=b.id AND a.id=%u AND b.empire=%u) AND "
	    "(b.pid1=%u OR b.pid2=%u OR b.pid3=%u OR b.pid4=%u)", 
		GetTablePostfix(), GetTablePostfix(), info->dwPID, info->bEmpire,
	   	info->dwPID, info->dwPID, info->dwPID, info->dwPID);

SQLMsg * pMsg = CDBManager::instance().DirectQuery(szQuery, SQL_PLAYER);
 

 

 

Remplacez par :

void CClientManager::ChangeMonarchLord(CPeer * peer, DWORD dwHandle, TPacketChangeMonarchLord* info)
{
       char szQuery[1024];
       snprintf(szQuery, sizeof(szQuery),
                       "SELECT a.name, NOW() FROM player%s AS a, player_index%s AS b WHERE (a.account_id=b.id AND a.id=%u AND b.empire=%u) AND "
                   "(b.pid1=%u OR b.pid2=%u OR b.pid3=%u OR b.pid4=%u OR b.pid5=%u OR b.pid6=%u OR b.pid7=%u OR b.pid8=%u)", GetTablePostfix(), GetTablePostfix(), info->dwPID, info->bEmpire, info->dwPID, info->dwPID, info->dwPID, info->dwPID, info->dwPID, info->dwPID, info->dwPID, info->dwPID);

       SQLMsg * pMsg = CDBManager::instance().DirectQuery(szQuery, SQL_PLAYER);
 

 

 

 

Rendez-vous ensuite dans db/src/clientmanagerlogin.cpp

 

Cherchez :

 void CClientManager::QUERY_LOGIN_BY_KEY(CPeer * pkPeer, DWORD dwHandle, TPacketGDLoginByKey * p)
 

 

 

Ensuite, trouvez les lignes :

	sys_log(0, "LOGIN_BY_KEY success %s %lu %s", r.login, p->dwLoginKey, info->ip);
char szQuery[QUERY_MAX_LEN];
snprintf(szQuery, sizeof(szQuery), "SELECT pid1, pid2, pid3, pid4, empire FROM player_index%s WHERE id=%u", GetTablePostfix(), r.id);
CDBManager::instance().ReturnQuery(szQuery, QID_LOGIN_BY_KEY, pkPeer->GetHandle(), info);
 

 

Remplacez par :

        sys_log(0, "LOGIN_BY_KEY success %s %lu %s", r.login, p->dwLoginKey, info->ip);
       char szQuery[QUERY_MAX_LEN];
       snprintf(szQuery, sizeof(szQuery), "SELECT pid1, pid2, pid3, pid4, pid5, pid6, pid7, pid8, empire FROM player_index%s WHERE id=%u", GetTablePostfix(), r.id);
       CDBManager::instance().ReturnQuery(szQuery, QID_LOGIN_BY_KEY, pkPeer->GetHandle(), info);
 

 

 

Cherchez ensuite :

 

void CClientManager::RESULT_LOGIN_BY_KEY(CPeer * peer, SQLMsg * msg)
 

 

 

Trouvez les lignes :

	if (msg->Get()->uiNumRows == 0)
{
	DWORD account_id = info->pAccountTable->id;
	char szQuery[QUERY_MAX_LEN];
	snprintf(szQuery, sizeof(szQuery), "SELECT pid1, pid2, pid3, pid4, empire FROM player_index%s WHERE id=%u", GetTablePostfix(), account_id);
	std::auto_ptr pMsg(CDBManager::instance().DirectQuery(szQuery, SQL_PLAYER));
 

 

Et remplacez par :

        if (msg->Get()->uiNumRows == 0)
       {
               DWORD account_id = info->pAccountTable->id;
               char szQuery[QUERY_MAX_LEN];
               snprintf(szQuery, sizeof(szQuery), "SELECT pid1, pid2, pid3, pid4, pid5, pid6, pid7, pid8, empire FROM player_index%s WHERE id=%u", GetTablePostfix(), account_id);
               std::auto_ptr pMsg(CDBManager::instance().DirectQuery(szQuery, SQL_PLAYER));
 

Maintenant, cherchez :

void CClientManager::RESULT_PLAYER_INDEX_CREATE(CPeer * pkPeer, SQLMsg * msg)
 

 

Trouvez les lignes :

	char szQuery[QUERY_MAX_LEN];
snprintf(szQuery, sizeof(szQuery), "SELECT pid1, pid2, pid3, pid4, empire FROM player_index%s WHERE id=%u", GetTablePostfix(), info->pAccountTable->id);
CDBManager::instance().ReturnQuery(szQuery, QID_LOGIN_BY_KEY, pkPeer->GetHandle(), info);
 

 

Remplacez par :

        char szQuery[QUERY_MAX_LEN];
       snprintf(szQuery, sizeof(szQuery), "SELECT pid1, pid2, pid3, pid4, pid5, pid6, pid7, pid8, empire FROM player_index%s WHERE id=%u", GetTablePostfix(), info->pAccountTable->id);
       CDBManager::instance().ReturnQuery(szQuery, QID_LOGIN_BY_KEY, pkPeer->GetHandle(), info);
 

 

 

/!\ Client /!\

 

Rendez-vous dans Client/UserInterface/Packet.h

 

Cherchez :

	PLAYER_PER_ACCOUNT3 = 3,
PLAYER_PER_ACCOUNT4 = 4,
 

 

 

Remplacez par :

	PLAYER_PER_ACCOUNT3 = 7,
PLAYER_PER_ACCOUNT4 = 8,
 

 

 

Rendez-vous maintenant dans Pack/root/introselect.py

 

Cherchez :

	SLOT_COUNT = 4
 

 

 

Remplacez par :

	SLOT_COUNT = 8
 

 

 

 

Cherchez :

	SLOT_ROTATION = [135.0, 225.0, 315.0, 45.0]
 

 

 

Remplacez par :

	SLOT_ROTATION = [135.0, 180.0, 225.0, 270.0, 315.0, 360.0, 45.0, 90.0]
 

 

Cherchez :

		chr.DeleteInstance(0)
	chr.DeleteInstance(1)
	chr.DeleteInstance(2)
	chr.DeleteInstance(3)
 

 

Remplacez par :

                chr.DeleteInstance(0)
               chr.DeleteInstance(1)
               chr.DeleteInstance(2)
               chr.DeleteInstance(3)
               chr.DeleteInstance(4)
               chr.DeleteInstance(5)
               chr.DeleteInstance(6)
               chr.DeleteInstance(7)
 

 

 

Cherchez :

indexArray = (3, 2, 1, 0)
 

 

Remplacez par :

indexArray = (8, 7, 6, 5, 4, 3, 2, 1, 0)
 

 

 

Cherchez :

	def OnKeyDown(self, key):

	if 1 == key:
		self.ExitSelect()
	if 2 == key:
		self.SelectSlot(0)
	if 3 == key:
		self.SelectSlot(1)
	if 4 == key:
		self.SelectSlot(2)
	if 5 == key:
		self.SelectSlot(3)
 

 

Remplacez par :

        def OnKeyDown(self, key):

               if 1 == key:
                       self.ExitSelect()
               if 2 == key:
                       self.SelectSlot(0)
               if 3 == key:
                       self.SelectSlot(1)
               if 4 == key:
                       self.SelectSlot(2)
               if 5 == key:
                       self.SelectSlot(3)
               if 6 == key:
                       self.SelectSlot(4) 
               if 7 == key:
                       self.SelectSlot(5) 
               if 8 == key:
                       self.SelectSlot(6) 
               if 9 == key:
                       self.SelectSlot(7)
 

 

 

/!\ MySQL /!\

 

Rendez-vous dans Player/Player_index

 

Modifiez :

  `id` int(11) NOT NULL DEFAULT '0',
 `pid1` int(11) NOT NULL DEFAULT '0',
 `pid2` int(11) NOT NULL DEFAULT '0',
 `pid3` int(11) NOT NULL DEFAULT '0',
 `pid4` int(11) NOT NULL DEFAULT '0',
 `empire` tinyint(4) NOT NULL DEFAULT '0',
 

 

Par :

  `id` int(11) NOT NULL DEFAULT '0',
 `pid1` int(11) NOT NULL DEFAULT '0',
 `pid2` int(11) NOT NULL DEFAULT '0',
 `pid3` int(11) NOT NULL DEFAULT '0',
 `pid4` int(11) NOT NULL DEFAULT '0',
 `pid5` int(11) NOT NULL DEFAULT '0',
 `pid6` int(11) NOT NULL DEFAULT '0',
 `pid7` int(11) NOT NULL DEFAULT '0',
 `pid8` int(11) NOT NULL DEFAULT '0',
 `empire` tinyint(4) NOT NULL DEFAULT '0',
 

 

 

Voilà, vous venez d'ajouter des emplacements supplémentaire sur vos comptes.

 

Aperçu ?

 

 

214232B02129.jpg

 

Le screen du système comporte les 8 emplacements.

Je vous conseil de mettre 6 emplacements pour éviter une "surcharge" des personnages.

 

Bien entendu, si quelqu'un souhaite modifier/corriger les codes, je suis d'accord car je ne suis pas trop calé niveau sources.

 

 

 

Source : Turkmmo

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

  • 2 ans après...

Oui voilà @ASIKOO, l’interface n’est pas la même du coup la partie Client n’est pas adapté.. j’ai remarqué que le client FE possède déjà #chr.DeleteInstance(4) quand je supprime tout les # le client crach.. malheureusement je ne suis pas sur mon PC pour le syserr.

 

@DixN, inscription il a quelque heure avec ton premier message.. j’imagine pas là suite.. 

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Inscription récente ne veut pas forcement dire membre récent. Les remarques de ce genre ont s'en passe.

Le tutoriel publié sur Turkmmo est repris par plusieurs personnes, que se soit "Vanithys" pour le partagé ici ou d'autre connaissance qui ont réalisé l'ajout de ce "système" m'ont dit n'avoir eu aucuns problèmes avec les files 2016 en suivant le tutoriel ici présent, d'où ma réponse sur ce sujet.

 

Cordialement,

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

J'ai lus ton ancien message, je ne travail que très rarement sur les files FE donc je ne peut pas te venir en aide sur ce sujet, ne connaissant pas les changements entre ceux-ci et les files 2014 classique. 

 

Ensuite, tu parle de crash client lorsque tu supprime les #, hors sur le tutoriel présent, il n'est indiquer nul part de supprimé les # mais uniquement de remplacer les choses indiqué.

Si ta question n'est pas celle-ci, essai d'expliquer au mieux ton problème.

 

Cordialement,

Lien vers le commentaire
Partager sur d’autres sites

J'ai dit le contraire ? je ne pense pas.

Le problème étant que je te demande des détails sur le problème que tu as ainsi que la parti du tutoriel qui te bloque.

Déjà pour suivre ce que tu dit, c'est la partie client qui te bloque niveau interface mais ? as tu des détails supplémentaire à donné ?.

Lien vers le commentaire
Partager sur d’autres sites



  • brilliantdiscord_widget
  • Flux d'Activité

    1. 37
    2. 21

      Metin2 en 2020 peut-on en parler?

    3. 0

      METIN2Project

    4. 3

      Ressources - UnPack - Metin2 Client - Officiel

    5. 0

      Barre des tâches d'argent étendue

    6. 16

      Redémarrage automatique des channels

    7. 16

      Multi Logo GM / SGM / GA

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