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

Question sur les pets files 2016


huntmaster1327

Question

Bonsoir, alors voilà j'ai quelque question concernant le système de pets des files 2016 de la team FE.

J'ai pu constaté que le pet gagnait de l'xp juste en le renvoyant et le rappelant, je voudrais retirer ceci mais je ne sais pas comment faire.

Je voudrais savoir comment changer la liste des items nécessaires pour faire évoluer le pet (c'est à dire débloquer le pallier 40+).

Et enfin j'aimerais savoir comment changer les bonus que rapportent les pets. 

J'ai déjà regardé côté quest et item proto mais je ne trouve pas alors si quelqu'un pouvait m'indiquer où ça se passe :S

Merci pour vos futures réponses.

 

Version des files : 2016

Domaine (Base de données, Core, etc.) : base de données

Votre niveau (débutant, intermédiaire, avancé) : intermédiaire

 

 

En postant ma demande d'aide, j'affirme avoir lu et accepté le règlement des demandes d'aides.

Lien vers le commentaire
Partager sur d’autres sites

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

Meilleurs contributeurs dans cette question

Meilleurs contributeurs dans cette question

Images postées

Messages recommandés

  • 0
  • Retraité

Elle sert à remplir la table m_dwbonuspet mais ce n'est quand même pas bon, je n'ai pas placé les tables au bon endroit, j'édite ça :

 

remplace :

    int cbonus[3] = { m_pkOwner->GetMaxHP(),  m_pkOwner->GetPoint(POINT_DEF_GRADE), m_pkOwner->GetMaxSP() };
    for (int i = 0; i < 3; ++i) {
        m_pkOwner->AddAffect(AFFECT_NEW_PET, aApplyInfo[m_dwbonuspet[i][0]].bPointType, (int)(cbonus[i]*m_dwbonuspet[i][1]/1000), 0,  60 * 60 * 24 * 365, 0, false);
    }

 

 

par : (rempli le if et la table test !)

    int cbonus[3] = { m_pkOwner->GetMaxHP(),  m_pkOwner->GetPoint(POINT_DEF_GRADE), m_pkOwner->GetMaxSP() };
    if (m_dwVnum == A) // pet de vnum A
        int test[3] = { X, Y, Z}; // numéro des bonus voulu pour le pet de vnum A
    else
        int test[3] = { 1, 15, 17};
        
    for (int i = 0; i < 3; ++i) {
        m_pkOwner->AddAffect(AFFECT_NEW_PET, aApplyInfo[test[i]].bPointType, (int)(cbonus[i]*m_dwbonuspet[i][1]/1000), 0,  60 * 60 * 24 * 365, 0, false);
    }

Lien vers le commentaire
Partager sur d’autres sites

  • 0
  • Retraité

    if (m_dwVnum == A || m_dwVnum == B || m_dwVnum == C) // pet de vnum A, B et C
        int test[3] = { X, Y, Z}; // numéro des bonus voulu pour le pet de vnum A, B et C
    else
        int test[3] = { 1, 15, 17};

 

Il te suffit de compléter un peu pour rajouter des vnums de pet.

X, Y, Z sont à remplacer par des numéros de bonus

Lien vers le commentaire
Partager sur d’autres sites

  • 0
  • Retraité

Non, tous les singes auront les mêmes bonus, mais ils pourront avoir des bonus différents de tous les autres.

Il faut remplacer A, B, C par les vnum des pets (et non l'oeuf) et X, Y, Z par les numéros des bonus que tu souhaites avoir avec

Lien vers le commentaire
Partager sur d’autres sites

  • 0

J'ai testé comme tu m'as dit et voici l'erreur que j'ai lors de la compilation en document ci-joint : 

 

 

 

Voici les lignes 780 à 904 :

 

void CNewPetActor::GiveBuff()
{
//Inizializzo i bonus del NewPetSystem //hp cc e dh
// 559 Affect NewPet
   int cbonus[3] = { m_pkOwner->GetMaxHP(),  m_pkOwner->GetPoint(POINT_DEF_GRADE), m_pkOwner->GetMaxSP() };
   if (m_dwVnum == 55701) // pet de vnum A
       int test[3] = { 1, 59, 78}; // numéro des bonus voulu pour le pet de vnum A
   else
       int test[3] = { 1, 15, 17};
       
   for (int i = 0; i < 3; ++i) {
       m_pkOwner->AddAffect(AFFECT_NEW_PET, aApplyInfo[test[i]].bPointType, (int)(cbonus[i]*m_dwbonuspet[i][1]/1000), 0,  60 * 60 * 24 * 365, 0, false);
   }

//Inizializzo le skill del pet inattive  No 10-17-18 No 0 no -1
//Condizione lv > 81 evo 3 Solo Skill Passive
if (GetLevel() > 81 && m_dwevolution == 3) {
	for (int s = 0; s < 3; s++) {
		switch (m_dwskillslot[s]) {

		/*
			Pet_Skill_Table[m_dwskillslot[s] - 1][0]; //Mi ritorna il type della skill
			Pet_Skill_Table[m_dwskillslot[s] - 1][1]; // Mi ritorna attiva/passiva della skill 
			Pet_Skill_Table[m_dwskillslot[s] - 1][2]; // Mi ritorna il cd della skill
			Pet_Skill_Table[m_dwskillslot[s] - 1][2 + m_dwskill[s]]; //Mi ritorna l'apply della skill
		*/
		case 1: //Resistenza Guerriero 78 Punti				
		case 2: //Resistenza Sura 80
		case 3: //Resistenza Ninja 79
		case 4: //Resistenza Shamani 81
		case 5: //Resistenza Lycan 93
		case 6: //Valore Attacco 53 Punti
		case 7: //Antimagia 92
		case 8: //Velocit?Magia %
		case 9: //Perforazione 16 Punti
		case 11: //Sotto Hp Avv  Punti
		case 12: //Sotto MP Avv Punti
		case 13: // Blocco corp 27 Punti
		case 14: // Riflessione 39 Punti
		case 15: // Drop Yang 44 Punti
		case 16: // Portata Arco 172 Punti
			m_pkOwner->AddAffect(AFFECT_NEW_PET, aApplyInfo[Pet_Skill_Table[m_dwskillslot[s] - 1][0]].bPointType, Pet_Skill_Table[m_dwskillslot[s] - 1][2 + m_dwskill[s]], 0, 60 * 60 * 24 * 365, 0, false);
			break;
		default:
			return;
		}

	}

}

}

void CNewPetActor::ClearBuff()
{
m_pkOwner->RemoveAffect(AFFECT_NEW_PET);
return ;
}

void CNewPetActor::DoPetSkill(int skillslot) {
if (GetLevel() < 82 || m_dwevolution < 3)
	return;
switch (m_dwskillslot[skillslot]) {
case 10: //Rinnovo 20% Hp ripristina
{
	if (get_global_time() - m_pkOwner->GetNewPetSkillCD(0) <= 120) {
		m_pkOwner->ChatPacket(CHAT_TYPE_INFO, "Temps d'attente!%ds", 120 - (get_global_time() - m_pkOwner->GetNewPetSkillCD(0)));
		return;
	}
	if (m_pkOwner->GetHPPct() > 20) {
		m_pkOwner->ChatPacket(CHAT_TYPE_INFO, "Vous pouvez utiliser le skill si vos PV sont inferieurs ?20%!");
		return;
	}
	m_pkOwner->SetNewPetSkillCD(0, get_global_time());
	int perc = number(1, 100);
	m_pkOwner->ChatPacket(CHAT_TYPE_INFO, " %d de %d!", perc, (int)Pet_SKill_TablePerc[0][m_dwskill[skillslot]-1]);
	if (perc > (int)Pet_SKill_TablePerc[0][m_dwskill[skillslot]-1]) {
		m_pkOwner->ChatPacket(CHAT_TYPE_INFO, "Vous avez ?hou?la comp?ence!");
		return;
	}
	int riphp = MIN(m_pkOwner->GetHP() + (int)Pet_Skill_Table[9][2 + m_dwskill[skillslot]], m_pkOwner->GetMaxHP());
	m_pkOwner->PointChange(POINT_HP, riphp);
	m_pkOwner->EffectPacket(SE_HPUP_RED);
}
break;

case 17: //Immortalit?	{
	if (get_global_time() - m_pkOwner->GetNewPetSkillCD(1) <= 120) {
		m_pkOwner->ChatPacket(CHAT_TYPE_INFO, "Temps d'attente %ds", 120 - (get_global_time() - m_pkOwner->GetNewPetSkillCD(1)));
		return;
	}
	m_pkOwner->SetNewPetSkillCD(1, get_global_time());
	int perc = number(1, 100);
	m_pkOwner->ChatPacket(CHAT_TYPE_INFO, " %d de %d!", perc, (int)Pet_SKill_TablePerc[1][m_dwskill[skillslot] - 1]);
	if (perc > (int)Pet_SKill_TablePerc[1][m_dwskill[skillslot] - 1]) {
		m_pkOwner->ChatPacket(CHAT_TYPE_INFO, "Vous avez ?hou?la comp?ence!");
		return;
	}
	m_pkOwner->ChatPacket(CHAT_TYPE_INFO, "Vous devenez immortel!");
	m_pkOwner->SetImmortal(1);
	m_dwslotimm = skillslot;
	m_dwImmTime = get_global_time();
}
break;
case 18: //Come Curare
{
	if (get_global_time() - m_pkOwner->GetNewPetSkillCD(2) <= 120) {
		m_pkOwner->ChatPacket(CHAT_TYPE_INFO, "Temps d'attente %ds", 120 -(get_global_time() - m_pkOwner->GetNewPetSkillCD(2)));
		return;
	}
	m_pkOwner->SetNewPetSkillCD(2, get_global_time());
	int perc = number(1, 100);
	m_pkOwner->ChatPacket(CHAT_TYPE_INFO, " %d de %d!", perc, (int)Pet_SKill_TablePerc[2][m_dwskill[skillslot] - 1]);
	if (perc > (int)Pet_SKill_TablePerc[2][m_dwskill[skillslot] - 1]) {
		m_pkOwner->ChatPacket(CHAT_TYPE_INFO, "Vous avez ?hou?la comp?ence!");
		return;
	}
	m_pkOwner->RemoveBadAffect();
}
break;

default:
	return;
}
}

 

ce serait cette ligne (la 791) qui pose problème, test n'est pas déclarée

        m_pkOwner->AddAffect(AFFECT_NEW_PET, aApplyInfo[test[i]].bPointType, (int)(cbonus[i]*m_dwbonuspet[i][1]/1000), 0,  60 * 60 * 24 * 365, 0, false);

 

ligne 119 je vois ça :

	for (int x = 0; x < 3; ++x) //Inizializzazione bonus del pet
{
	int btype[3] = { 1, 15, 17};
	m_dwbonuspet[x][0] = btype[x];
	m_dwbonuspet[x][1] = 0;
}
}

59fb339653f2d_erreurcompil.jpg.9d06c0b18d76c00719c66f725f1c0685.jpg

Lien vers le commentaire
Partager sur d’autres sites

  • 0
  • Retraité

Oui désolé, mon c++ date un peu....

remplace :

   if (m_dwVnum == 55701) // pet de vnum A
       int test[3] = { 1, 59, 78}; // numéro des bonus voulu pour le pet de vnum A
   else
       int test[3] = { 1, 15, 17};
       
   for (int i = 0; i < 3; ++i) {
       m_pkOwner->AddAffect(AFFECT_NEW_PET, aApplyInfo[test[i]].bPointType, (int)(cbonus[i]*m_dwbonuspet[i][1]/1000), 0,  60 * 60 * 24 * 365, 0, false);
    }

 

par :

   for (int i = 0; i < 3; ++i) {
      if (m_dwVnum == 55701) // pet de vnum A
           int test[3] = { 1, 59, 78}; // numéro des bonus voulu pour le pet de vnum A
           m_pkOwner->AddAffect(AFFECT_NEW_PET, aApplyInfo[test[i]].bPointType, (int)(cbonus[i]*m_dwbonuspet[i][1]/1000), 0,  60 * 60 * 24 * 365, 0, false);
       else
           int test[3] = { 1, 15, 17};
           m_pkOwner->AddAffect(AFFECT_NEW_PET, aApplyInfo[test[i]].bPointType, (int)(cbonus[i]*m_dwbonuspet[i][1]/1000), 0,  60 * 60 * 24 * 365, 0, false);
       }

Lien vers le commentaire
Partager sur d’autres sites

  • 0

Je te mets le nouveau message d'erreur ci-joint.

 

Voici ce que j'essaie (j'ajoute des accolades après les conditions) :

	if (m_dwVnum == 55701) {// pet de vnum A
		int test[3] = { 1, 59, 78}; // numéro des bonus voulu pour le pet de vnum A
	m_pkOwner->AddAffect(AFFECT_NEW_PET, aApplyInfo[test[i]].bPointType, (int)(cbonus[i]*m_dwbonuspet[i][1]/1000), 0,  60 * 60 * 24 * 365, 0, false); }
	else {
		int test[3] = { 1, 15, 17};
	m_pkOwner->AddAffect(AFFECT_NEW_PET, aApplyInfo[test[i]].bPointType, (int)(cbonus[i]*m_dwbonuspet[i][1]/1000), 0,  60 * 60 * 24 * 365, 0, false); }
	}

 

Toujours l'erreur du 'test' non déclaré en tous cas ... Je pense pas que ce soit dû aux accolades =/

59fb33967baed_erreurcompil2.jpg.d56ebb8ede8cb47cd41f11821629a368.jpg

Lien vers le commentaire
Partager sur d’autres sites

  • 0

Je tiens à m'excuser pour le triple post ! 

J'ai essayé avec les accolades ça semble être ok, voici les messages d'erreurs qui se situent un peu plus bas dans le fichier.

 

le problème semble venir de ces lignes : 

void CNewPetActor::DoPetSkill(int skillslot) {
if (GetLevel() < 82 || m_dwevolution < 3)
	return;
switch (m_dwskillslot[skillslot]) {
case 10: //Rinnovo 20% Hp ripristina
{
	if (get_global_time() - m_pkOwner->GetNewPetSkillCD(0) <= 120) {
		m_pkOwner->ChatPacket(CHAT_TYPE_INFO, "Temps d'attente!%ds", 120 - (get_global_time() - m_pkOwner->GetNewPetSkillCD(0)));
		return;
	}
	if (m_pkOwner->GetHPPct() > 20) {
		m_pkOwner->ChatPacket(CHAT_TYPE_INFO, "Vous pouvez utiliser le skill si vos PV sont inferieurs ?20%!");
		return;
	}
	m_pkOwner->SetNewPetSkillCD(0, get_global_time());
	int perc = number(1, 100);
	m_pkOwner->ChatPacket(CHAT_TYPE_INFO, " %d de %d!", perc, (int)Pet_SKill_TablePerc[0][m_dwskill[skillslot]-1]);
	if (perc > (int)Pet_SKill_TablePerc[0][m_dwskill[skillslot]-1]) {
		m_pkOwner->ChatPacket(CHAT_TYPE_INFO, "Vous avez ?hou?la comp?ence!");
		return;
	}
	int riphp = MIN(m_pkOwner->GetHP() + (int)Pet_Skill_Table[9][2 + m_dwskill[skillslot]], m_pkOwner->GetMaxHP());
	m_pkOwner->PointChange(POINT_HP, riphp);
	m_pkOwner->EffectPacket(SE_HPUP_RED);
}
break;

case 17: //Immortalit?	{
	if (get_global_time() - m_pkOwner->GetNewPetSkillCD(1) <= 120) {
		m_pkOwner->ChatPacket(CHAT_TYPE_INFO, "Temps d'attente %ds", 120 - (get_global_time() - m_pkOwner->GetNewPetSkillCD(1)));
		return;
	}
	m_pkOwner->SetNewPetSkillCD(1, get_global_time());
	int perc = number(1, 100);
	m_pkOwner->ChatPacket(CHAT_TYPE_INFO, " %d de %d!", perc, (int)Pet_SKill_TablePerc[1][m_dwskill[skillslot] - 1]);
	if (perc > (int)Pet_SKill_TablePerc[1][m_dwskill[skillslot] - 1]) {
		m_pkOwner->ChatPacket(CHAT_TYPE_INFO, "Vous avez ?hou?la comp?ence!");
		return;
	}
	m_pkOwner->ChatPacket(CHAT_TYPE_INFO, "Vous devenez immortel!");
	m_pkOwner->SetImmortal(1);
	m_dwslotimm = skillslot;
	m_dwImmTime = get_global_time();
}
break;
case 18: //Come Curare
{
	if (get_global_time() - m_pkOwner->GetNewPetSkillCD(2) <= 120) {
		m_pkOwner->ChatPacket(CHAT_TYPE_INFO, "Temps d'attente %ds", 120 -(get_global_time() - m_pkOwner->GetNewPetSkillCD(2)));
		return;
	}
	m_pkOwner->SetNewPetSkillCD(2, get_global_time());
	int perc = number(1, 100);
	m_pkOwner->ChatPacket(CHAT_TYPE_INFO, " %d de %d!", perc, (int)Pet_SKill_TablePerc[2][m_dwskill[skillslot] - 1]);
	if (perc > (int)Pet_SKill_TablePerc[2][m_dwskill[skillslot] - 1]) {
		m_pkOwner->ChatPacket(CHAT_TYPE_INFO, "Vous avez ?hou?la comp?ence!");
		return;
	}
	m_pkOwner->RemoveBadAffect();
}
break;

default:
	return;
}
}

Je vais essayer de mettre toute ceci en commentaire :

	case 18: //Come Curare
{
	if (get_global_time() - m_pkOwner->GetNewPetSkillCD(2) <= 120) {
		m_pkOwner->ChatPacket(CHAT_TYPE_INFO, "Temps d'attente %ds", 120 -(get_global_time() - m_pkOwner->GetNewPetSkillCD(2)));
		return;
	}
	m_pkOwner->SetNewPetSkillCD(2, get_global_time());
	int perc = number(1, 100);
	m_pkOwner->ChatPacket(CHAT_TYPE_INFO, " %d de %d!", perc, (int)Pet_SKill_TablePerc[2][m_dwskill[skillslot] - 1]);
	if (perc > (int)Pet_SKill_TablePerc[2][m_dwskill[skillslot] - 1]) {
		m_pkOwner->ChatPacket(CHAT_TYPE_INFO, "Vous avez ?hou?la comp?ence!");
		return;
	}
	m_pkOwner->RemoveBadAffect();
}
break;

edit : j'ai réussi à compiler, il manquait une accolade dans le code précédent au début de la case 17, cependant les bonus affichés pour le singe sont toujours identiques .. mais il a l'air de ne plus donner de bonus excepté les pv.

59fb33969a1fa_erreurcompil3.jpg.ee56cf78042bea381ce03af26e87026f.jpg

Lien vers le commentaire
Partager sur d’autres sites

  • 0
  • Retraité

D'accord, je me suis mal exprimé.

C'est le vnum du monstre que tu dois mettre, pas celui de l'objet qui te permet de l'invoquer.

Normalement, pour le petit singe c'est le vnum 34041, c'est ce nombre qui doit apparaître dans les sources.

Lien vers le commentaire
Partager sur d’autres sites

  • 0

    int cbonus[3] = { m_pkOwner->GetMaxHP(),  m_pkOwner->GetPoint(POINT_DEF_GRADE), m_pkOwner->GetMaxSP() };
for (int i = 0; i < 3; ++i) {
	if (m_dwVnum == 34041) {// pet de vnum A
		int test[3] = { 1, 59, 78}; // numéro des bonus voulu pour le pet de vnum A
	m_pkOwner->AddAffect(AFFECT_NEW_PET, aApplyInfo[test[i]].bPointType, (int)(cbonus[i]*m_dwbonuspet[i][1]/1000), 0,  60 * 60 * 24 * 365, 0, false); }
	else {
		int test[3] = { 1, 15, 17};
	m_pkOwner->AddAffect(AFFECT_NEW_PET, aApplyInfo[test[i]].bPointType, (int)(cbonus[i]*m_dwbonuspet[i][1]/1000), 0,  60 * 60 * 24 * 365, 0, false); }
	}

J'ai mis comme ça, je compile et je te tiens au jus. Merci ^^

Lien vers le commentaire
Partager sur d’autres sites

  • 0

ça fonctionne niquel, j'ai bien des bonus propres au singe, parcontre l'affichage n'est pas bon du tout, j'imagine que ça se passe côté client ?

Et j'aimerais maintenant modifier les valeurs que donnent les pets, comment faire ?

Merci à toi ça avance en tous cas ^^

 

Edit : à mon avis ça vient de ça :

int cbonus[3] = { m_pkOwner->GetMaxHP(),  m_pkOwner->GetPoint(POINT_DEF_GRADE), m_pkOwner->GetMaxSP() };

Lien vers le commentaire
Partager sur d’autres sites

  • 0
  • Retraité

Super, pour l'affichage, j'imagine que c'est côté client, encore une fois je connais rien à ce système... (je regarderai)

 

pour la puissance des bonus, tu as presque bon, ça vient de :

(int)(cbonus*m_dwbonuspet[1]/1000)

 

 

donc il y a bien cbonus mais aussi m_dwbonuspet

le plus simple sera cbonus, à toi de voir ce que tu veux comme puissance

Lien vers le commentaire
Partager sur d’autres sites

  • 0

Non à mon avis c'est ça qui est responsable du mauvais affichage :

int cbonus[3] = { m_pkOwner->GetMaxHP(),  m_pkOwner->GetPoint(POINT_DEF_GRADE), m_pkOwner->GetMaxSP() };

 

ça a l'air compliqué à calculer tout ça, si je veux mettre 5000 pv par exemple, il faut que je modifie mon cbonus pour que ça face x*y/1000 = 5000 ?

Pareil si je veux une valeur de 50 en dh par exemple ? x*y/1000 = 50 ?

Lien vers le commentaire
Partager sur d’autres sites

  • 0

Bon ben retour au collège/lycée, des petites équations et ça devrait aller, parcontre j'ai un dernier soucis, mes pets prennent toujours 2 lvl à chaque utilisation ^^'

 

Edit : c'est pas possible de modifier le code pour simplifier le calcul ? par exemple (int)(cbonus*m_dwbonuspet[1]/1000)

 

le remplacer par : (int)(cbonus*m_dwbonuspet[1])

 

Et aussi c'est quoi toute la succession ", 0, 60 * 60 * 24 * 365, 0, false" sur la même ligne ?

 

Edit 2 : cbonus a pour valeur :

m_pkOwner->GetMaxHP(),  m_pkOwner->GetPoint(POINT_DEF_GRADE), m_pkOwner->GetMaxSP() 

Grosso modo je sais pas sur quoi me baser pour avoir une valeur ?

En fait je vois pas du tout comment je peux calculer ça =/

Lien vers le commentaire
Partager sur d’autres sites

  • 0
  • Retraité

Tu peux le modifier comme tu veux.

Tu peux par exemple, remplacer

 

int cbonus[3] = { m_pkOwner->GetMaxHP(),  m_pkOwner->GetPoint(POINT_DEF_GRADE), m_pkOwner->GetMaxSP() };

 

par

int cbonus[3] = { GetLevel()*60,  GetLevel()/1.5, GetLevel()/1.5 };

 

et remplacer :

(int)(cbonus*m_dwbonuspet[1]/1000)

par

(int)cbonus

On aura 60pv, 0.66% de dh, 0.66% de cc par niveau du pet, soit environ 4800pv, 50% de cc et de dh au niveau 80

 

 

", 0, 60 * 60 * 24 * 365, 0, false"

C'est les paramètres pour le bonus. C'est un peu compliqué d'expliquer tout ça ici, le seul qui peut éventuellement être intéressant c'est que 60*60*24*365 est la durée du bonus.

 

edit : tu as encore raison, c'est GetLevel() non Get_Level()...

Lien vers le commentaire
Partager sur d’autres sites

Invité
Ce sujet ne peut plus recevoir de nouvelles réponses.


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