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

C++ - 6 Pages d'Inventaires dans l'Entrepôt


Messages recommandés

Centre de Téléchargement

Hidden Content

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

Bonjour à tous.

Dans ce tutoriel, je vais vous expliquer comment avoir 6 inventaires dans l'entrepôt.

Pour ce faire, vous aurez besoin de : -Source client

                                                                  -Source serveur

                                                                  -Votre client

 

SOURCE CLIENT

 

Révélation

Rendez-vous dans UserInterface (via source sur les files 2016 optimisés) et ouvrez Packet.h.

Recherchez deux fois:

BYTE        bSafePos;

Remplacez deux fois par:

DWORD        bSafePos;

 

Ouvrez ensuite PythonNetworkStream.h.

Recherchez:

bool SendSafeBoxCheckinPacket(TItemPos InventoryPos, BYTE bySafeBoxPos);

Remplacez par:

bool SendSafeBoxCheckinPacket(TItemPos InventoryPos, DWORD bySafeBoxPos);

 

Recherchez:

bool SendSafeBoxCheckoutPacket(BYTE bySafeBoxPos, TItemPos InventoryPos);

Remplacez par:

bool SendSafeBoxCheckoutPacket(DWORD bySafeBoxPos, TItemPos InventoryPos);

 

Ouvrez enfin PythonNetworkStreamPhaseGameItem.c.

Recherchez:

bool CPythonNetworkStream::SendSafeBoxCheckinPacket(TItemPos InventoryPos, BYTE bySafeBoxPos)

Remplacez par:

bool CPythonNetworkStream::SendSafeBoxCheckinPacket(TItemPos InventoryPos, DWORD bySafeBoxPos)

 

Recherchez:

bool CPythonNetworkStream::SendSafeBoxCheckoutPacket(BYTE bySafeBoxPos, TItemPos InventoryPos)

Remplacez par:

bool CPythonNetworkStream::SendSafeBoxCheckoutPacket(DWORD bySafeBoxPos, TItemPos InventoryPos)

 

Nous en avons terminé pour les sources clients, il ne vous reste plus qu'à compiler.

 

SOURCE SERVEUR

 

Révélation

Dans le fichier game, ouvrez input_db.cpp.

Recherchez:

bSize = 3;

Remplacez par:

bSize = 6;

 

Ouvrez packet.h.

Recherchez deux fois:

BYTE	bSafePos;

Remplacez deux fois par:

DWORD	bSafePos;

 

Ouvrez safebox.cpp.

Recherchez:

bool CSafebox::IsEmpty(DWORD dwPos, BYTE bSize)

Remplacez par:

bool CSafebox::IsEmpty(DWORD dwPos, DWORD bSize)

 

Recherchez:

LPITEM CSafebox::GetItem(BYTE bCell)

Remplacez par:

LPITEM CSafebox::GetItem(DWORD bCell)

 

Recherchez:

bool CSafebox::MoveItem(BYTE bCell, BYTE bDestCell, BYTE count)

Remplacez par:

bool CSafebox::MoveItem(DWORD bCell, DWORD bDestCell, DWORD count)

 

Ouvrez safebox.h.

Recherchez:

bool CSafebox::IsEmpty(DWORD dwPos, BYTE bSize)

Remplacez par:

bool CSafebox::IsEmpty(DWORD dwPos, DWORD bSize)

 

Recherchez:

LPITEM CSafebox::GetItem(BYTE bCell)

Remplacez par:

LPITEM CSafebox::GetItem(DWORD bCell)

 

 

Recherchez:

bool CSafebox::MoveItem(BYTE bCell, BYTE bDestCell, BYTE count)

Remplacez par:

bool CSafebox::MoveItem(DWORD bCell, DWORD bDestCell, DWORD count)

 

 

Dans le fichier common, ouvrez tables.h.

Recherchez:

#define SAFEBOX_MAX_NUM

Remplacez toute la ligne par:

#define SAFEBOX_MAX_NUM 270

 

CLIENT

 

Révélation

Dans le fichier root, ouvrez le fichier uisafebox.py.

Recherchez:

wnd_height = 130 + 32 * size

Remplacez par:

wnd_height = 140 + 32 * size

 

Recherchez:

def __MakePageButton(self, pageCount):

				[...]
				[...]
				[...]

def SelectPage(self, index):

Remplacez cette fonction par:

def __MakePageButton(self, pageCount):

		self.curPageIndex = 0
		self.pageButtonList = []
		idx_page = ["I", "II", "III", "IV", "V", "VI"]
		idx_pos = [99, 99, 99, 79, 79 ,79]
		#text = "I"
		pos = -int(float(3-1)/2 * 52)
		pos2 = -int(float(3-1)/2 * 52)
		for i in xrange(6):
			button = ui.RadioButton()
			button.SetParent(self)
			button.SetUpVisual("d:/ymir work/ui/game/windows/tab_button_middle_01.sub")
			button.SetOverVisual("d:/ymir work/ui/game/windows/tab_button_middle_02.sub")
			button.SetDownVisual("d:/ymir work/ui/game/windows/tab_button_middle_03.sub")
			button.SetWindowHorizontalAlignCenter()
			button.SetWindowVerticalAlignBottom()
			if i < 3:
				button.SetPosition(pos, idx_pos[i])
				pos += 52
			else:
				button.SetPosition(pos2, idx_pos[i])
				pos2 += 52
			button.SetText(idx_page[i])
			button.SetEvent(lambda arg=i: self.SelectPage(arg))
			button.Show()
			self.pageButtonList.append(button)

			'''if i == 3:
				pos = -int(float(3-1)/2 * 52)
				#pos = -104
			else:
				'''
			
			#text += "I"

		self.pageButtonList[0].Down()

 

Recherchez deux fois:

pageCount = max(1, size / safebox.SAFEBOX_SLOT_Y_COUNT)

Remplacez deux fois par:

pageCount = max(1, 6)

 

Dans le fichier uiscript, ouvrez safeboxwindow.py.

Remplacez tout le contenu par:

import uiScriptLocale

window = {
	"name" : "SafeboxWindow",

	"x" : 100,
	"y" : 20,

	"style" : ("movable", "float",),

	"width" : 176,
	"height" : 250,

	"children" :
	(
		{
			"name" : "board",
			"type" : "board",

			"x" : 0,
			"y" : 0,

			"width" : 176,
			"height" : 250,

			"children" :
			(
				## Title
				{
					"name" : "TitleBar",
					"type" : "titlebar",
					"style" : ("attach",),

					"x" : 8,
					"y" : 7,

					"width" : 161,
					"color" : "yellow",

					"children" :
					(
						{ "name":"TitleName", "type":"text", "x":77, "y":3, "text":uiScriptLocale.SAFE_TITLE, "text_horizontal_align":"center" },
					),
				},

				## Button
				{
					"name" : "ChangePasswordButton",
					"type" : "button",

					"x" : 0,
					"y" : 53,

					"text" : uiScriptLocale.SAFE_CHANGE_PASSWORD,
					"horizontal_align" : "center",
					"vertical_align" : "bottom",

					"default_image" : "d:/ymir work/ui/public/large_button_01.sub",
					"over_image" : "d:/ymir work/ui/public/large_button_02.sub",
					"down_image" : "d:/ymir work/ui/public/large_button_03.sub",
				},
				{
					"name" : "ExitButton",
					"type" : "button",

					"x" : 0,
					"y" : 32,

					"text" : uiScriptLocale.CLOSE,
					"horizontal_align" : "center",
					"vertical_align" : "bottom",

					"default_image" : "d:/ymir work/ui/public/large_button_01.sub",
					"over_image" : "d:/ymir work/ui/public/large_button_02.sub",
					"down_image" : "d:/ymir work/ui/public/large_button_03.sub",
				},

			),
		},
	),
}

 

 

Voici un aperçu IG:

 

Révélation

0644516mxs.png

 

 

Le tutoriel est à présent terminé, j'espère qu'il vous sera utile.

Cordialement.

 

Source: Freakgamers

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

Merci du partage :)

 

Ayant implanté ce système sur ma source récemment, j'avais remarqué un bug assez gênant.

Je vous le fais parvenir avec le FIX ci-dessous car je suis une âme charitable :rire:

 

Dans la dernière page, les 15 derniers slots ne fonctionnait pas, je me demanda alors pourquoi celles-ci refusaient de coopérer :S.

J'ai commencé à effectuer une série de test sans succès. Après quelques minutes de recherche, j'en suis arrivé à conclure qu'uniquement les 15 derniers slots ne fonctionnaient pas !

 

Manœuvre numéro 1:

 

- J'ai compté le nombre de slot qu'il y avais par page (45)

 

Manœuvre numéro 2:

- J'ai effectué le calcul suivant : " 45 (slots) x6 (page) " obtenant un résultat de 270 !

Sur le tutoriel, l'auteur utilise la fonction DWORD, cependant la valeur maximal de DWORD est égale à 255.

 

Manœuvre numéro 3:

 

- J'ai upgrade DWORD en int

 

 

Conclusion, vous devez juste upgrade le système de DWORD en int :P

 

Ravis de vous avoir aider ;)

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

Il y a 4 heures, Gaara a dit :

Merci du partage

 

Ayant implanté ce système sur ma source récemment, j'avais remarqué un bug assez gênant.

Je vous le fais parvenir avec le FIX ci-dessous car je suis une âme charitable :rire:

 

Dans la dernière page, les 15 derniers slots ne fonctionnait pas, je me demanda alors pourquoi celles-ci refusaient de coopérer .

J'ai commencé à effectuer une série de test sans succès. Après quelques minutes de recherche, j'en suis arrivé à conclure qu'uniquement les 15 derniers slots ne fonctionnaient pas !

 

Manœuvre numéro 1:

 

- J'ai compté le nombre de slot qu'il y avais par page (45)

 

Manœuvre numéro 2:

- J'ai effectué le calcul suivant : " 45 (slots) x6 (page) " obtenant un résultat de 270 !

Sur le tutoriel, l'auteur utilise la fonction DWORD, cependant la valeur maximal de DWORD est égale à 255.

 

Manœuvre numéro 3:

 

- J'ai upgrade DWORD en int

 

 

Conclusion, vous devez juste upgrade le système de DWORD en int

 

Ravis de vous avoir aider

 

Faux, faux et archi faux !

 

Le tutoriel fait bien changer le type d'origine BYTE en DWORD.

 

La valeur max d'un BYTE (1 octet soit 8 bits) est bien de 255

Mais un DWORD est un unsigned long (8 octets soit 32 bits) donc sa valeur max est de 4294967295

 

Sinon tu as quand même raison sur la multiplication 45*6 = 270.

 

Bay'

Lien vers le commentaire
Partager sur d’autres sites

Dans l'état actuel, le tutoriel ne permet pas de faire ce qu'il dit. Les quinze derniers slots ne marchent pas (j'ai déjà testé avec la source elle-même). On peut à la limite le modifier pour faire 5 pages, sinon il faudra changer d'autres choses.

Lien vers le commentaire
Partager sur d’autres sites

  • Développeur
Le 24/06/2018 à 12:24, Baymax a dit :

La valeur max d'un BYTE (1 octet soit 8 bits) est bien de 255

Mais un DWORD est un unsigned long (8 octets soit 32 bits) donc sa valeur max est de 4294967295

 

J'avais pas vu ton message, j'allais le dire :D.

 

C'est un BYTE (unsigned char) qui vaut 255. Un WORD fait d'ailleurs largement l'affaire plutôt qu'un int.

 

Petit rappel de tailles (on va comparer des bits, oui) :

BIT = 1 bit (forcément: 0 à 1)

NIBBLE = 4 bits (0 à 15) (qu'on appelle demi-octet ou quartet)

BYTE (unsigned char) = 8 bits (0 à 255) (qu'on appelle un octet)

WORD (unsigned short) = 16 bits (0 à 65 535)

DWORD (unsigned int) = 32 bits (0 à 4 294 967 295)

QWORD (unsigned double) = 64 bits (0 à 18 446 744 073 709 551 615)

 

La bise!

 

Lien vers le commentaire
Partager sur d’autres sites

  • Robot
Le 25/06/2018 à 17:41, Kameyu a dit :

 

J'avais pas vu ton message, j'allais le dire :D.

 

C'est un BYTE (unsigned char) qui vaut 255. Un WORD fait d'ailleurs largement l'affaire plutôt qu'un int.

 

Petit rappel de tailles (on va comparer des bits, oui) :

BIT = 1 bit (forcément: 0 à 1)

NIBBLE = 4 bits (0 à 15) (qu'on appelle demi-octet ou quartet)

BYTE (unsigned char) = 8 bits (0 à 255) (qu'on appelle un octet)

WORD (unsigned short) = 16 bits (0 à 65 535)

DWORD (unsigned int) = 32 bits (0 à 4 294 967 295)

QWORD (unsigned double) = 64 bits (0 à 18 446 744 073 709 551 615)

 

La bise!

 

 C'est vrai, mais à ta place, j'aurais mis le bit et le nibble à côté, ils ne se traitent pas de la même façon et n'ont pas de "type de variable" prédéfini comme les autres. 

Pour en revenir au sujet, je l'avais déjà installé, et effectivement, il y a quelques modifications à faire pour le rendre entièrement fonctionnel.

 

Le 25/06/2018 à 09:44, Takuma a dit :

Dans l'état actuel, le tutoriel ne permet pas de faire ce qu'il dit. Les quinze derniers slots ne marchent pas (j'ai déjà testé avec la source elle-même). On peut à la limite le modifier pour faire 5 pages, sinon il faudra changer d'autres choses.

 

Si tu veux mettre cinq pages, il faudra aussi changer des choses au niveau des sources comme les tailles dans l'input_db etc, par exemple.

Il faudra en plus adapter la partie Python. Et ne pas faire seulement la partie Python.

french_banner.gif

Lien vers le commentaire
Partager sur d’autres sites

  • Développeur
Il y a 5 heures, Akihira a dit :

 C'est vrai, mais à ta place, j'aurais mis le bit et le nibble à côté, ils ne se traitent pas de la même façon et n'ont pas de "type de variable" prédéfini comme les autres. 

Pour en revenir au sujet, je l'avais déjà installé, et effectivement, il y a quelques modifications à faire pour le rendre entièrement fonctionnel.

 

C'est un rappel des tailles, pas des variables utilisées :). Mais oui en effet, en application ils ne s'utilisent pas de la même manière.

Je les ai tout de même rajoutés pour le point culture, n'oublions pas la devise de Funky-Emulation.

 

Edit: Tu noteras que c'est pour cette raison que je n'ai pas rajouté de types, car ils n'en possèdent simplement pas en C++.

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

  • 2 semaines après...

Bonjour.

 

Merci d'avoir remarqué ce problème, je ne l'avais personnellement pas identifié lorsque j'avais implanté ce système sur mon serveur. Cependant, actuellement, étant donné que je n'ai plus de serveur sous la main, il m'est impossible d'effectuer des modifications et de les tester pour tenter de régler ce problème. Il est donc libre aux administrateurs d'accepter ce partage ou non.

 

Cordialement

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

  • Développeur

Le fix est fonctionnel dans tous les cas, c'est juste qu'au lieu d'utiliser un int (ou un DWORD), on préfèrera utiliser un WORD qui prend moins d'espace mémoire.

Bien que ce soit toujours fonctionnel, il faut savoir travailler efficacement avec la mémoire :).

Lien vers le commentaire
Partager sur d’autres sites

  • 1 mois après...


  • brilliantdiscord_widget
  • Flux d'Activité

    1. 6

      problème de connexion à mon serveur local (je suis débutant dans ce genre d'entreprise )

    2. 2

      problème de lancement serveur

    3. 9
    4. 0

      [PVM/PVP] ATLAX2 - EASY PLAY

    5. 2

      problème de lancement serveur

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.