[Resolu] Problème scriptdev2 Gossip
Bonjours,

Le système de gossip ayant changer un de mes script ne fonctionne plus correctement, par exemple lorsque je clique sur suivant et bien les choix ne font que s'additionner et même quand l'on clique sur menu principale sa ne nettoie pas al fenêtre de chat du pnj et défoix une petite fenêtre rouge apparait avec écrit : Thos NPC too many quest and/ or gossip options.
voici un screen pour illustré ceci :
[Image: mini_376064Sanstitre.png]

donc pouvez vous m'aidez voici le script :
Code :
#include "precompiled.h"
#include <sstream>
#include "sc_gossip.h"
#include "sc_creature.h"

#define NEXT_PAGE  "-> Page suivante"
#define PREV_PAGE  "<- Page precedente"
#define MAIN_MENU  "<= [Menu Principal]"

using namespace std;
using namespace SD2P_NAMESPACE;
using namespace SD2P_NAMESPACE::SD2P_RECOMPENSE_NAMESPACE;


namespace
{
    enum
    {
        // npc_text
        NPC_TEXT_NOTHING        = 100100,
        NPC_TEXT_INVITEC        = 100101,
        NPC_TEXT_INVITER        = 100102,
        NPC_TEXT_VALID          = 100103,

        // Divers.
        GOSSIP_ACHAT            = GOSSIP_ACTION_INFO_DEF + 1,
        GOSSIP_NEXT_PAGEC       = GOSSIP_ACTION_INFO_DEF + 2,
        GOSSIP_PREV_PAGEC       = GOSSIP_ACTION_INFO_DEF + 3,
        GOSSIP_NEXT_PAGEI       = GOSSIP_ACTION_INFO_DEF + 4,
        GOSSIP_PREV_PAGEI       = GOSSIP_ACTION_INFO_DEF + 5,
        GOSSIP_SHOW_ITEMS       = GOSSIP_ACTION_INFO_DEF + 6,
        GOSSIP_CONFIRM          = GOSSIP_ACTION_INFO_DEF + 7,
        GOSSIP_QUIT             = GOSSIP_ACTION_INFO_DEF + 8,
        GOSSIP_MAIN_MENU        = GOSSIP_ACTION_INFO_DEF + 9,
    };

    ListPage PageCat, PageItem, CatSelect;


    // En cas d'erreur interne (produite uniquement en cas de reload
    // durant une transaction d'un joueur), reinitialisation de l'interface.
    void AffichErreur(Player * const pPlayer, Creature * const pCreature)
    {
        pPlayer->SEND_GOSSIP_MENU(NPC_TEXT_NOTHING, pCreature->GetObjectGuid());
    }

    // Fonction permettant de faire un lancer de des en fonction d'une probabilite.
    bool GagneJet(const uint8 &SuccesProbability)
    {
        return urand(1, 100) <= SuccesProbability;
    }

    // Fonction d'affichage des categories
    void AffichCat(Player * const pPlayer, Creature * const pCreature)
    {
        const Vendor * pVendor = GetVendor(pCreature->GetEntry());
        if (!pVendor || pVendor->m_VCategories.empty())
        {
            AffichErreur(pPlayer, pCreature);
            return;
        }

        Vendor::VCategorie_t VCat = pVendor->m_VCategories;
        Vendor::VCategorie_t::size_type i = PageCat[pPlayer] * NB_ITEM_PAGE;

        // Affichage Page Precedente.
        if (PageCat[pPlayer] > 0)
            pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_TALK, PREV_PAGE, GOSSIP_PREV_PAGEC, 0);

        for ( ; i < VCat.size() && i < (NB_ITEM_PAGE * (PageCat[pPlayer] + 1)); ++i)
        {
            const Categorie * pCat = GetCategorie(VCat[i]);
            if (!pCat)
            {
                AffichErreur(pPlayer, pCreature);
                return;
            }

            pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_TALK, pCat->GetName().c_str(), GOSSIP_SHOW_ITEMS, i);
        }

        // Affichage Page Suivante.
        if (i < VCat.size())
            pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_TALK, NEXT_PAGE, GOSSIP_NEXT_PAGEC, 0);

        pPlayer->SEND_GOSSIP_MENU(NPC_TEXT_INVITEC, pCreature->GetObjectGuid());
    }

    // Fonction d'affichage des items d'une categorie
    void AffichItem(Player * const pPlayer, Creature * const pCreature)
    {
        const Vendor * pVendor = GetVendor(pCreature->GetEntry());
        if (!pVendor || pVendor->m_VCategories.empty())
        {
            AffichErreur(pPlayer, pCreature);
            return;
        }

        Vendor::VCategorie_t VCat = pVendor->m_VCategories;
        Categorie::VIRecompense_t::size_type i = PageItem[pPlayer] * NB_ITEM_PAGE;

        const Categorie * pCat = GetCategorie(VCat[CatSelect[pPlayer]]);
        if (!pCat)
        {
            AffichErreur(pPlayer, pCreature);
            return;
        }
    
        // Affichage Page Precedente.
        if (PageItem[pPlayer] > 0)
            pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_TALK, PREV_PAGE, GOSSIP_PREV_PAGEI, 0);

        for ( ; i < pCat->size() && i < (NB_ITEM_PAGE * (PageItem[pPlayer] + 1)); ++i)
        {
            const ItemRecompense * pRec = pCat->GetItem(i);
            if (!pRec)
            {
                AffichErreur(pPlayer, pCreature);
                return;
            }

            const ItemSD2P * pItem = GetItemSD2P(pRec->m_Entry);
            if (!pItem)
            {
                AffichErreur(pPlayer, pCreature);
                return;
            }

            pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_2, pItem->m_Name.c_str(), GOSSIP_CONFIRM, i);
        }

        // Affichage Page Suivante.
        if (i < pCat->size())
            pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_TALK, NEXT_PAGE, GOSSIP_NEXT_PAGEI, 0);

        // Affichage lien vers menu Principal.
        if (VCat.size() > 1)
            pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_TALK, MAIN_MENU, GOSSIP_MAIN_MENU, 0);

        pPlayer->SEND_GOSSIP_MENU(NPC_TEXT_INVITER, pCreature->GetObjectGuid());
    }
(28-07-2011 18:59)Darkblue a écrit :  Bonjours,

Le système de gossip ayant changer un de mes script ne fonctionne plus correctement, par exemple lorsque je clique sur suivant et bien les choix ne font que s'additionner et même quand l'on clique sur menu principale sa ne nettoie pas al fenêtre de chat du pnj et défoix une petite fenêtre rouge apparait avec écrit : Thos NPC too many quest and/ or gossip options.
voici un screen pour illustré ceci :
[Image: mini_376064Sanstitre.png]

donc pouvez vous m'aidez voici le script :
Code :
#include "precompiled.h"
#include <sstream>
#include "sc_gossip.h"
#include "sc_creature.h"

#define NEXT_PAGE  "-> Page suivante"
#define PREV_PAGE  "<- Page precedente"
#define MAIN_MENU  "<= [Menu Principal]"

using namespace std;
using namespace SD2P_NAMESPACE;
using namespace SD2P_NAMESPACE::SD2P_RECOMPENSE_NAMESPACE;


namespace
{
    enum
    {
        // npc_text
        NPC_TEXT_NOTHING        = 100100,
        NPC_TEXT_INVITEC        = 100101,
        NPC_TEXT_INVITER        = 100102,
        NPC_TEXT_VALID          = 100103,

        // Divers.
        GOSSIP_ACHAT            = GOSSIP_ACTION_INFO_DEF + 1,
        GOSSIP_NEXT_PAGEC       = GOSSIP_ACTION_INFO_DEF + 2,
        GOSSIP_PREV_PAGEC       = GOSSIP_ACTION_INFO_DEF + 3,
        GOSSIP_NEXT_PAGEI       = GOSSIP_ACTION_INFO_DEF + 4,
        GOSSIP_PREV_PAGEI       = GOSSIP_ACTION_INFO_DEF + 5,
        GOSSIP_SHOW_ITEMS       = GOSSIP_ACTION_INFO_DEF + 6,
        GOSSIP_CONFIRM          = GOSSIP_ACTION_INFO_DEF + 7,
        GOSSIP_QUIT             = GOSSIP_ACTION_INFO_DEF + 8,
        GOSSIP_MAIN_MENU        = GOSSIP_ACTION_INFO_DEF + 9,
    };

    ListPage PageCat, PageItem, CatSelect;


    // En cas d'erreur interne (produite uniquement en cas de reload
    // durant une transaction d'un joueur), reinitialisation de l'interface.
    void AffichErreur(Player * const pPlayer, Creature * const pCreature)
    {
        pPlayer->SEND_GOSSIP_MENU(NPC_TEXT_NOTHING, pCreature->GetObjectGuid());
    }

    // Fonction permettant de faire un lancer de des en fonction d'une probabilite.
    bool GagneJet(const uint8 &SuccesProbability)
    {
        return urand(1, 100) <= SuccesProbability;
    }

    // Fonction d'affichage des categories
    void AffichCat(Player * const pPlayer, Creature * const pCreature)
    {
        const Vendor * pVendor = GetVendor(pCreature->GetEntry());
        if (!pVendor || pVendor->m_VCategories.empty())
        {
            AffichErreur(pPlayer, pCreature);
            return;
        }

        Vendor::VCategorie_t VCat = pVendor->m_VCategories;
        Vendor::VCategorie_t::size_type i = PageCat[pPlayer] * NB_ITEM_PAGE;

        // Affichage Page Precedente.
        if (PageCat[pPlayer] > 0)
            pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_TALK, PREV_PAGE, GOSSIP_PREV_PAGEC, 0);

        for ( ; i < VCat.size() && i < (NB_ITEM_PAGE * (PageCat[pPlayer] + 1)); ++i)
        {
            const Categorie * pCat = GetCategorie(VCat[i]);
            if (!pCat)
            {
                AffichErreur(pPlayer, pCreature);
                return;
            }

            pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_TALK, pCat->GetName().c_str(), GOSSIP_SHOW_ITEMS, i);
        }

        // Affichage Page Suivante.
        if (i < VCat.size())
            pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_TALK, NEXT_PAGE, GOSSIP_NEXT_PAGEC, 0);

        pPlayer->SEND_GOSSIP_MENU(NPC_TEXT_INVITEC, pCreature->GetObjectGuid());
    }

    // Fonction d'affichage des items d'une categorie
    void AffichItem(Player * const pPlayer, Creature * const pCreature)
    {
        const Vendor * pVendor = GetVendor(pCreature->GetEntry());
        if (!pVendor || pVendor->m_VCategories.empty())
        {
            AffichErreur(pPlayer, pCreature);
            return;
        }

        Vendor::VCategorie_t VCat = pVendor->m_VCategories;
        Categorie::VIRecompense_t::size_type i = PageItem[pPlayer] * NB_ITEM_PAGE;

        const Categorie * pCat = GetCategorie(VCat[CatSelect[pPlayer]]);
        if (!pCat)
        {
            AffichErreur(pPlayer, pCreature);
            return;
        }
    
        // Affichage Page Precedente.
        if (PageItem[pPlayer] > 0)
            pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_TALK, PREV_PAGE, GOSSIP_PREV_PAGEI, 0);

        for ( ; i < pCat->size() && i < (NB_ITEM_PAGE * (PageItem[pPlayer] + 1)); ++i)
        {
            const ItemRecompense * pRec = pCat->GetItem(i);
            if (!pRec)
            {
                AffichErreur(pPlayer, pCreature);
                return;
            }

            const ItemSD2P * pItem = GetItemSD2P(pRec->m_Entry);
            if (!pItem)
            {
                AffichErreur(pPlayer, pCreature);
                return;
            }

            pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_2, pItem->m_Name.c_str(), GOSSIP_CONFIRM, i);
        }

        // Affichage Page Suivante.
        if (i < pCat->size())
            pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_TALK, NEXT_PAGE, GOSSIP_NEXT_PAGEI, 0);

        // Affichage lien vers menu Principal.
        if (VCat.size() > 1)
            pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_TALK, MAIN_MENU, GOSSIP_MAIN_MENU, 0);

        pPlayer->SEND_GOSSIP_MENU(NPC_TEXT_INVITER, pCreature->GetObjectGuid());
    }

https://github.com/scriptdev2/scriptdev2...odebox.cpp
Si je vous demande c'est que je n'y suis pas arriver. J'ai déjà éssayer
Juste pour tester remplace
pPlayer->SEND_GOSSIP_MENU(
par :
pPlayer->PlayerTalkClass->SendGossipMenu(

Pour du text seul met DoScriptText("Texte", pCreature);

Enfin si j'ai bien compris
Non benoit la macro SEND_GOSSIP_MENU est remplacée directement par l'autre fonction à la compilation.

Pour ton problème il manque des ClearMenu quand tu va dans un sous menu !
Tu dois rajouter pPlayer->PlayerTalkClass->ClearMenu() quand tu va dans un sous menu, vérifie juste le nom de la méthode.
je l'ai fait mais sa me met la fonction ne prends pas 3 argument et que je refait la fonction ba tous bug.
(30-07-2011 13:29)Arcanios a écrit :  Non benoit la macro SEND_GOSSIP_MENU est remplacée directement par l'autre fonction à la compilation.

Pour ton problème il manque des ClearMenu quand tu va dans un sous menu !
Tu dois rajouter pPlayer->PlayerTalkClass->ClearMenu() quand tu va dans un sous menu, vérifie juste le nom de la méthode.

Merci le pire c'est que j'ai cherchais gossip + clear dans google Hihi

edit : j'ai mis pPlayer->PlayerTalkClass->ClearMenus(); avant et après chaque ajout de gossip et c'est sans résultats
edit2 : Ca fonctionne je le suis trompé mais un MonsterWhisper fonctionne comment ?
edit3: résolu

PS : Darkblue est dans mon équipe
ok Xd

Retourner en haut Accueil