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

C++ - Séparer / Équiper les Objets : Item Ring


Messages recommandés

  • Développeur

Centre de Téléchargement

Hidden Content

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

Eeeeeet bonsoir !

 

Bon, je viens de m'amuser à faire un truc cool, c'est de pouvoir séparer tous les items un peu abusés de la boutique (oui, oui)

et d'en faire des types ITEM_RING pour permettre aux joueurs de garder leur anneau d'expérience en plus de profiter des buffs

des items boutique dans le genre Médaille du Héros, Anneau de la joie, Sucette de la force, et j'en passe:

 

Révélation

050139image.png.aa9122f9f506935cca864a51

 

Vous l'avez bien compris, CES items abusés. Enfin bref.

 

En gros, le but de ce "tutoriel" va vous permettre d'équiper ces objets dans les "nouveaux slots" pour anneaux (type CItemData::ITEM_RING).

Avant toute chose, vérifiez que vous possédez bien le système d'anneaux et le type ITEM_RING, c'est une manœuvre importante pour que ça marche.

Commençons sans plus tarder.

 

En premier lieu, on va vérifier le type de nos items dans l'item_proto.txt; avec un tableur de notre choix:

ITEM_VNUM	ITEM_NAME(K)	ITEM_TYPE	SUB_TYPE	SIZE	ANTI_FLAG	FLAG	ITEM_WEAR	IMMUNE	GOLD	SHOP_BUY_PRICE	REFINE	REFINESET	MAGIC_PCT	LIMIT_TYPE0	LIMIT_VALUE0	LIMIT_TYPE1	LIMIT_VALUE1	ADDON_TYPE0	ADDON_VALUE0	ADDON_TYPE1	ADDON_VALUE1	ADDON_TYPE2	ADDON_VALUE2	VALUE0	VALUE1	VALUE2	VALUE3	VALUE4	VALUE5	Specular	SOCKET	ATTU_ADDON	CATEGORY	SUBCATEGORY
71135	Ãʽ´ÞÀÇ ¹ÝÁö	ITEM_RING	0	1	ANTI_DROP | ANTI_SELL | ANTI_STACK	NONE	NONE	NONE	0	0	0	0	0	REAL_TIME	86400	LIMIT_NONE	0	APPLY_NONE	0	APPLY_NONE	0	APPLY_NONE	0	0	0	0	0	0	0	0	0	0	0	0
71136	ÇÒ·ÎÀ© »çÅÁ	ITEM_RING	0	1	ANTI_DROP | ANTI_SELL | ANTI_STACK	NONE	NONE	NONE	0	0	0	0	0	REAL_TIME	86400	LIMIT_NONE	0	APPLY_NONE	0	APPLY_NONE	0	APPLY_NONE	0	0	0	0	0	0	0	0	0	0	0	0
71143	ÇູÀÇ ¹ÝÁö	ITEM_RING	0	1	ANTI_DROP | ANTI_SELL | ANTI_STACK	NONE	NONE	NONE	0	0	0	0	0	REAL_TIME	86400	LIMIT_NONE	0	APPLY_NONE	0	APPLY_NONE	0	APPLY_NONE	0	0	0	0	0	0	0	0	0	0	0	0
71145	¿µ¿øÇÑ »ç¶ûÀÇ ÆÒ´øÆ®	ITEM_RING	0	1	ANTI_DROP | ANTI_SELL | ANTI_STACK	NONE	NONE	NONE	0	0	0	0	0	REAL_TIME	86400	LIMIT_NONE	0	APPLY_NONE	0	APPLY_NONE	0	APPLY_NONE	0	0	0	0	0	0	0	0	0	0	0	0
71148	±Ù¼ºÀÇ ¹ÝÁö	ITEM_RING	0	1	ANTI_DROP | ANTI_SELL | ANTI_STACK	NONE	NONE	NONE	0	0	0	0	0	REAL_TIME	86400	LIMIT_NONE	0	APPLY_NONE	0	APPLY_NONE	0	APPLY_NONE	0	0	0	0	0	0	0	0	0	0	0	0
71149	¸¶¼ºÀÇ ¹ÝÁö	ITEM_RING	0	1	ANTI_DROP | ANTI_SELL | ANTI_STACK	NONE	NONE	NONE	0	0	0	0	0	REAL_TIME	86400	LIMIT_NONE	0	APPLY_NONE	0	APPLY_NONE	0	APPLY_NONE	0	0	0	0	0	0	0	0	0	0	0	0
71158	¿µ¿õÀÇ ÁõÇ¥	ITEM_RING	0	1	ANTI_DROP | ANTI_SELL | ANTI_STACK	NONE	NONE	NONE	0	0	0	0	0	REAL_TIME	86400	LIMIT_NONE	0	APPLY_NONE	0	APPLY_NONE	0	APPLY_NONE	0	0	0	0	0	0	0	0	0	0	0	0

Une fois que tout est bon, vous allez vérifier que votre item se glissera bien dans la case WEAR_RING1 ou 2. Tout ça se trouve dans item.cpp, recherchez:

int CItem::FindEquipCell

else if (GetType() == ITEM_RING)
{
	if (ch->GetWear(WEAR_RING1))
		return WEAR_RING2;
	else
		return WEAR_RING1;
}

Vérifiez que ce bloc de texte existe déjà, si non, collez-le après ceci:

else if (GetSubType() == COSTUME_MOUNT)
			return WEAR_COSTUME_MOUNT;
	}

 

Ensuite il faut rajouter une condition pour éviter que l'utilisateur équipe deux objets qui donnent le même set de buffs. Ça se passe ici, à la fin de la fonction:

bool CHARACTER::CanEquipNow(const LPITEM item, const TItemPos& srcCell, const TItemPos& destCell) dans le fichier char_item.cpp:

	if (item->GetType() & ITEM_RING)
	{
		if ((GetWear(WEAR_RING1) && GetWear(WEAR_RING1)->IsSameSpecialGroup(item)) ||
			(GetWear(WEAR_RING2) && GetWear(WEAR_RING2)->IsSameSpecialGroup(item)))
		{
			ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Vous ne pouvez pas equiper deux anneaux identiques a la fois."));
			return false;
		}
	}

	return true;
}

Cela empêchera les joueurs d'équiper un objet possédant le même SpecialGroup().

 

Ensuite, les SpecialGroup à rajouter, il faut aller dans /usr/metin2/share/locale/country/special_item_group.txt:

Group 스폐셜
{
	Vnum	10050
	type	SPECIAL
	1	71148	100000	1
	2	71149	100001	1
	3	71158	100002	1
	4	71135	100003	1
	5	71136	100003	1
	6	71143	100004	1
	7	71145	100005	1
}

Group 속성
{				
	Vnum	100000
	type	ATTR		
	1	66	30	
	2	78	20	
	3	79	20	
	4	63	30	
	5	69	10	
	6	70	10	
	effect	"d:\ymir work\effect\etc\buff\buff_item5.mse"
}				
				
Group 속성2				
{				
	Vnum	100001
	type	ATTR		
	1	66	30	
	2	80	20	
	3	81	20	
	4	63	30	
	5	69	10	
	6	70	10	
	effect	"d:\ymir work\effect\etc\buff\buff_item5.mse"		
}				
				
Group 속성3				
{				
	Vnum	100002
	type	ATTR
	1	66	50
	2	7	20
	3	9	20
	4	64	30
	5	69	10
	6	70	10
	7	84	5
	effect	"d:\ymir work\effect\etc\buff\buff_symbol1.mse"
}

Group 속성4				
{				
	Vnum	100003		
	type	ATTR		
	1	66	50	
	2	7	20	
	3	9	20	
	4	64	30	
	5	69	10	
	6	70	10	
	7	84	5	
}				
				
Group 속성5				
{				
	Vnum	100004		
	type	ATTR		
	1	66	50	
	2	7	20	
	3	9	20	
	4	63	30	
	5	69	10	
	6	70	10	
	7	84	5	
}				
				
Group 속성6				
{				
	Vnum	100005		
	type	ATTR		
	1	66	30	
	2	7	10	
	3	9	10	
	4	63	10	
	5	69	5	
	6	70	5	
	7	84	5	
}

Bien entendu, vérifiez que vous ne les avez pas déjà.

 

Et enfin, le plus gros du travail, il faut rajouter la fonction qui permettra d'appliquer les buffs du special_item_group. Tout ça se trouve dans item.cpp,

à la fin de la fonction void CItem::ModifyPoints(bool bAdd), juste après le break; rajoutez:

case ITEM_RING:
	{
		if (0 != GetSpecialGroup())
		{
			const CSpecialItemGroup* pItemGroup = ITEM_MANAGER::instance().GetSpecialItemGroup(GetSpecialGroup());
			if (pItemGroup == NULL)
				break;
			DWORD dwAttrVnum = pItemGroup->GetAttrVnum(GetVnum());
			const CSpecialAttrGroup* pAttrGroup = ITEM_MANAGER::instance().GetSpecialAttrGroup(dwAttrVnum);
			if (pAttrGroup == NULL)
				break;
			for (itertype(pAttrGroup->m_vecAttrs) it = pAttrGroup->m_vecAttrs.begin(); it != pAttrGroup->m_vecAttrs.end(); it++)
				m_pOwner->ApplyPoint(it->apply_type, bAdd ? it->apply_value : -it->apply_value);
		}
	}
	break;

 

Voilà tout ! Compilez, relancez, testez !

Si , vous voulez me faire part de bugs ou oublis de ma part faites-moi-le savoir sur ce sujet, et si vous avez des questions: direction A/Q/S !

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

  • Réponses 5
  • Créé
  • Dernière réponse

Meilleurs contributeurs dans ce sujet

  • Développeur
Il y a 15 heures, Kameyu a dit :

Avant toute chose, vérifiez que vous possédez bien le système d'anneaux et le type ITEM_RING, c'est une manœuvre importante pour que ça marche.

 

Il y a 6 heures, ASIKOO a dit :

C'est nul, c'est moche et inutile !

Merci mon petit Kameyu, j'arriveee <3

 

Vous pouvez arrêter de spammer sur mon topic svp merci

Modifié par Kameyu
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.