Problème pour fixer une quête
Apparemment ça ne fait que renvoyer un SMSG_QUEST_POI_QUERY_RESPONSE pour afficher les POI sur la carte, rien qui pourrait expliquer pourquoi la quête est validé :/.
Pour la gestion des flags des gameobject je trouve pratiquement rien dans le core, je pense donc que la majorité ce fait côté client (Branruz si tu peux confirmer, tu t'y connais surement bien mieux que moi là dedans).
(14-06-2011 16:40)Sadikum a écrit :  Apparemment ça ne fait que renvoyer un SMSG_QUEST_POI_QUERY_RESPONSE pour afficher les POI sur la carte,
rien qui pourrait expliquer pourquoi la quête est validé :/.
Oui, c'etait au cas zou

(14-06-2011 16:40)Sadikum a écrit :  Pour la gestion des flags des gameobject je trouve pratiquement rien dans le
core, je pense donc que la majorité ce fait côté client (Branruz si tu peux
confirmer, tu t'y connais surement bien mieux que moi là dedans).
Si je colle autre chose que le flag 32, je ne recois plus aucun message client
quelque soit les actions sur le Gob. (ou sur l'item)

en fait, le client va envoyer un message vers le serveur en fonction
des flags que tu donne au Gob (et/ou Byte et Type).
La gestion est ensuite faite niveau core. (CMSG_USE_ITEM pour moi)

Edit: Verifie bien que tu n'a pas l'item requis dans ta base pour la quete 9391.
Item = 23480 (pour moi c les colonnes ReqOrRecItemId)
sinon tu va ptet valider la quete en recevant la torche,
pour le reste, il faut scripter sur l'utilisation de l'item.
Bon, alors si j'enlève dans la base de données l'ID du gameobject au champ "ReqKillMobOrGOId1" :

Par défaut : ReqKillMobOrGOId1 = -181579

L'objectif n'est pas validé, donc je peux le faire ensuite via un gameobject script (fonction OnActivate). Mais sur UDB c'est pareil (niveau champ) (et le flag = 4), je pense que ces quêtes doivent fonctionner sous MaNGOS/Trinity... donc c'est quand même bizarre Hihi

EDIT: En fait je vais faire un script dummy, c'est plus dans la norme il me semble
(18-06-2011 16:53)SgT-Fatality a écrit :  Bon, alors si j'enlève dans la base de données l'ID du gameobject au champ "ReqKillMobOrGOId1" :

Par défaut : ReqKillMobOrGOId1 = -181579

L'objectif n'est pas validé, donc je peux le faire ensuite via un gameobject script (fonction OnActivate). Mais sur UDB c'est pareil (niveau champ) (et le flag = 4), je pense que ces quêtes doivent fonctionner sous MaNGOS/Trinity... donc c'est quand même bizarre Hihi

EDIT: En fait je vais faire un script dummy, c'est plus dans la norme il me semble
A tient, j'aurais plutot virer l'item.
J'ai 1887 comme dummy pour le spell 29384 (Allumer les balises)
Hello, quelques news, j'ai essayé de faire un fix (et pour changer cela ne fonctionne pas Pirate )

J'ai fait un script Dummy Aura :

[code=cpp]
bool MarkingThePath(uint32 i, Aura * pAura, bool apply)
{
if(!apply) return true;

Player *pPlayer = pAura->GetPlayerCaster();
if(!pPlayer) return true;

QuestLogEntry *pQuest = pPlayer->GetQuestLogForEntry(9391);
if(!pQuest) return true;

if(pQuest->GetMobCount(0) < pQuest->GetQuest()->required_mobcount[0])
{
GameObject *pBeacon = pPlayer->GetMapMgr()->GetInterface()->GetGameObjectNearestCoords(pPlayer->GetPositionX(), pPlayer->GetPositionY(), pPlayer->GetPositionZ());

if(pBeacon)
{
pQuest->SetMobCount(0, pQuest->GetMobCount(0) + 1);
pQuest->SendUpdateAddKill(0);
pQuest->UpdatePlayerFields();
Log.Notice("DUMMY", "Mise a jour des objectifs 0");

return true;
}
}

if(pQuest->GetMobCount(1) < pQuest->GetQuest()->required_mobcount[1])
{
GameObject *pBeacon = pPlayer->GetMapMgr()->GetInterface()->GetGameObjectNearestCoords(pPlayer->GetPositionX(), pPlayer->GetPositionY(), pPlayer->GetPositionZ());

if(pBeacon)
{
pQuest->SetMobCount(1, pQuest->GetMobCount(1) + 1);
pQuest->SendUpdateAddKill(1);
pQuest->UpdatePlayerFields();
Log.Notice("DUMMY", "Mise a jour des objectifs 1");

return true;
}
}

if(pQuest->GetMobCount(2) < pQuest->GetQuest()->required_mobcount[2])
{
GameObject *pBeacon = pPlayer->GetMapMgr()->GetInterface()->GetGameObjectNearestCoords(pPlayer->GetPositionX(), pPlayer->GetPositionY(), pPlayer->GetPositionZ());

if(pBeacon)
{
pQuest->SetMobCount(2, pQuest->GetMobCount(2) + 1);
pQuest->SendUpdateAddKill(2);
pQuest->UpdatePlayerFields();
Log.Notice("DUMMY", "Mise a jour des objectifs 2");

return true;
}
}
return true;
}
[/code]

Le script est bien activé lorsque le joueur active le gameobject et que le spell est lancé, mais l'objectif n'est pas validé ! Pourtant la fonction "SendUpdateAddKill" (et les autres) sont bien lancée (test via message de debug) alors est-ce que le problème viendrait du faite que j'ai enlevé justement l'ID des Gobjects dans la base de données et qu'il y aura une erreur lors de l'envoi du paquet de la fonction "SendUpdateAddKill" :

[code=cpp]
WorldPacket data(32);
data.SetOpcode(SMSG_QUESTUPDATE_ADD_KILL);
data << questid << entry << count << tcount << guid;
plr->GetSession()->SendPacket(&data);
[/code]

Car dans mon cas l'entry == 0...

Merci et bonne soirée,
Sgt
Oui je pense que c'est ça il faut que toujours que tu est l'entry dans la table, sinon pour le core (et donc dans le packet envoyé) il n'y a pas vraiment d'objectif à compléter :/.

Au faite ton "pBeacon" est inutile puisqu'il cherche simplement le gameobject le plus proche (n'importe quel gameobject), il retournera donc true la plupart du temps, à moins que tu te trouve dans un endroit où il n'y a vraiment aucun gameobject aux alentours.
(22-06-2011 22:25)Sadikum a écrit :  Oui je pense que c'est ça il faut que toujours que tu est l'entry dans la table, sinon pour le core (et donc dans le packet envoyé) il n'y a pas vraiment d'objectif à compléter :/.

Au faite ton "pBeacon" est inutile puisqu'il cherche simplement le gameobject le plus proche (n'importe quel gameobject), il retournera donc true la plupart du temps, à moins que tu te trouve dans un endroit où il n'y a vraiment aucun gameobject aux alentours.

D'accord, je vais essayer "d'hardcoder" l'envoie de l'entry (car si je l'ajoute dans la table l'objectif est validé directement, mais il faudrait que j'essaie plutôt d'intercepter cet auto-validage, enfin bref je vais essayer les deux solutions pour voir le résultat).

Sinon pour le pBeacon je prends le gameobject le plus proche pour faire les tests Clin

D'ailleurs, est-ce que tu aurais une idée pour coder le fix d'une manière plus... esthétique ? (Car théoriquement je devrais tester dans chaque condition les 3 gameobjects pour savoir sur lequel le joueur a cliqué)

Bonne journée,
Sgt
Voici plus ou moins comment je l'aurais fait :

[code=cpp]#include "../Common/EasyFunctions.h"

bool MarkingThePath(uint32 i, Aura * pAura, bool apply)
{
if (!apply) return true;

Player * pPlayer = pAura->GetPlayerCaster();
if (pPlayer == NULL) return true;

QuestLogEntry * pQuest = pPlayer->GetQuestLogForEntry( 9391 );
if (pQuest == NULL) return true;

GameObject * pBeacon = NULL;
float ClosestDist = 999999.0f;
float CurrentDist = 0.0f;
for (set<Object*>::iterator iter = pObj->GetInRangeSetBegin(); iter != pObj->GetInRangeSetEnd(); ++iter)
{
CurrentDist = (*iter)->CalcDistance( pObj );
if (CurrentDist < ClosestDist && (*iter)->IsGameObject() )
{
if ((*iter)->GetEntry() == 181579 || (*iter)->GetEntry() == 181580 || (*iter)->GetEntry() == 181581)
{
ClosestDist = CurrentDist;
pBeacon = TO_GAMEOBJECT( (*iter) );
}
}
}

if (pBeacon == NULL) return true;

if (pBeacon->GetEntry() == 181581)
{
sEAS.KillMobForQuest( pPlayer, pQuest, 0 );
Log.Notice("DUMMY", "Mise a jour des objectifs 0");
}
else if (pBeacon->GetEntry() == 181580)
{
sEAS.KillMobForQuest( pPlayer, pQuest, 1 );
Log.Notice("DUMMY", "Mise a jour des objectifs 1");
}
else if (pBeacon->GetEntry() == 181579)
{
sEAS.KillMobForQuest( pPlayer, pQuest, 2 );
Log.Notice("DUMMY", "Mise a jour des objectifs 2");
}

return true;
}[/code]

Tu peut aussi inclure EasyFunctions.h dans le Setup si tu ne veux pas le faire dans le fichier, j'utilise sa fonction KillMobForQuest qui nous fait gagner des lignes et je toruve le code plus clair comme ça.
J'ai aussi ajouté la recherche du gameobject le plus proche entre les trois requis pour la quête et en fonction du plus proche c'est le bon objectif qui est validé.

Pour le problème de mettre les gameobject dans la table, essaye voir en les mettant mais en remplissant ReqCastSpellId1, ReqCastSpellId2 et ReqCastSpellId3 avec 29384.

Aussi actuellement tu peux lancer le sort n'importe où non ? Essaye voir avec cette requête :
[code=sql]DELETE FROM `SpellTargetConstraints` WHERE `SpellID` = '29384';
INSERT INTO `SpellTargetConstraints` VALUES ('29384', '1', '181579'), ('29384', '1', '181580'), ('29384', '1', '181581');[/code]
Je n'ai jamais utilisé ArcEmu, mais juste comme ça :
1) Ajouter script au GameObject
2) Dans le script, faire un équivalent à ceci :
Code :
#define SPELL_ACTIVATE_QUEST 98834 // Remplacer par l'ID du Spell
        void SpellHit(Unit* caster, const SpellEntry *spell)
        {
            if (spell->Id == SPELL_ACTIVATE_QUEST)
            {
                  // Code à executer quand on lance le spell sur le GOB
            }
        }

Bon j'suis pas sur, mais ptet une piste
As-tu lu tous les messages d'avant ?

Retourner en haut Accueil