• Страница 1 из 1
  • 1
Архив - только для чтения
Модератор форума: andycrowz  
Gossip menu
animu
The Abysswalker
Всем привет. Может ли кто-нибудь немножко пролить свет на gossip menu?
Совсем недавно решил написать кастомного нпц, но столкнулся с такой проблемой: Хочу сделать, что бы он двигался по вейпоинтам после того, как игрок "поговорит с ним" ( заюзает госсип меню ).
Движение я написал, а вот как прикрепить туда госсип - пока не знаю.
Может кто помочь с данным вопросом?

Если нужно, вот код, который уже есть:

Сообщение # 1 отредактировано animu - Среда, 28.05.2014, 18:05
staford11
^s†af0rd f0rever^
animu, попробуй такой вариант (скорее всего я где-нибудь напутал с синтаксисом):
Код
class npc_move : public CreatureScript    
{    
public:    
      npc_move() : CreatureScript("npc_move") {}    

      struct npc_moveAI : public ScriptedAI    
      {    
       npc_moveAI(Creature * c) : ScriptedAI(c) {}    

       int moveCount;
       bool moveOnGossip;
       void Reset()    
       {    
        moveCount = 0;    
        moveOnGossip = false;
        me->SetSpeed(MOVE_RUN, 1.0f, true);    
       }    

       void MovementInform(uint32 type, uint32 id)    
       {    
        if (type != POINT_MOTION_TYPE)    
         return;    
        moveCount++;    
       }    

       bool OnGossipHello(Player *pPlayer)
       {
           pPlayer->ADD_GOSSIP_ITEM(0, "[PH] Start Moving", GOSSIP_SENDER_MAIN, START_MOVING);
           return true;
       }

       bool OnGossipSelect(Player *pPlayer, uint32 sender, uint32 action)
       {
           if (sender != GOSSIP_SENDER_MAIN) return true;
           if (!pPlayer->getAttackers().empty()) return true;

       switch(action)
       {
       case START_MOVING:
           moveOnGossip = true;
           break;      
           }
           return true;
       }

       void UpdateAI(uint32 const diff)    
       {    
        if (moveOnGossip)
        {
        switch (moveCount)    
        {    
        case 0:    
         me->GetMotionMaster()->MovePoint(....................);    
         me->MonsterYell("Text", LANG_IUNIVERSAL, me->GetGUID());    
         break;    
        case 1:    
         me->GetMotionMaster()->MovePoint(....................);    
         break;    
        case 2:    
         me->GetMotionMaster()->MovePoint(....................);    
         break;    
        case 4:    
         me->GetMotionMaster()->MovePoint(....................);    
         me->MonsterYell("Text2", LANG_IUNIVERSAL, me->GetGUID());    
         break;           
        }    
        }
       }    
      };    
      CreatureAI * GetAI(Creature * pCreature) const    
      {    
       return new npc_moveAI(pCreature)    
      }    
};    
Победоносная @ Галакронд
Мои сборки под 3.3.5а 12340

Исправительные работы: в наличии.
Сообщение # 2 отредактировано staford11 - Четверг, 29.05.2014, 07:41
_dm666
<3 Death Metal
Посмотри реализацию тириона в цлк.
Сообщение # 3 написано 30.05.2014 в 14:06
doomkas
Центурион
staford11

В структуре вроде бы не работает госсип, если только юзать sGossipHello (вроде бы так)

Код
#define ACTION_START_MOVING 1

class npc_move : public CreatureScript   
{   
public:   
     npc_move() : CreatureScript("npc_move") {}   

     bool moveOnGossip = false;
       
     bool OnGossipHello(Player* player, Creature* creature)
     {
    player->ADD_GOSSIP_ITEM(0, "[PH] Start Moving", GOSSIP_SENDER_MAIN, ACTION_START_MOVING);   
    player->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE, creature->GetGUID());
    return true;
   }
     
   bool OnGossipSelect(Player *player, Creature *creature, uint32 sender, uint32 uiAction)
      {
          if (sender == GOSSIP_SENDER_MAIN)
          {
              player->PlayerTalkClass->ClearMenus();
              switch(uiAction)
              {
      case ACTION_START_MOVING:
       moveOnGossip = true;
                      player->CLOSE_GOSSIP_MENU();
       break;
                  default:
                      break;
              }
          }
          return true;
      }
       
     struct npc_moveAI : public ScriptedAI   
     {   
      npc_moveAI(Creature * c) : ScriptedAI(c) {}   

      int moveCount;   
      void Reset()   
      {   
       moveCount = 0;   
       me->SetSpeed(MOVE_RUN, 1.0f, true);   
      }

      void MovementInform(uint32 type, uint32 id)   
      {   
       if (type != POINT_MOTION_TYPE)   
        return;   
       moveCount++;   
      }   

      void UpdateAI(uint32 const diff)   
      {   
     
   if (moveOnGossip)
       switch (moveCount)   
       {   
       case 0:   
        me->GetMotionMaster()->MovePoint(....................);   
        me->MonsterYell("Text", LANG_IUNIVERSAL, me->GetGUID());   
        break;   
       case 1:   
        me->GetMotionMaster()->MovePoint(....................);   
        break;   
       case 2:   
        me->GetMotionMaster()->MovePoint(....................);   
        break;   
       case 4:   
        me->GetMotionMaster()->MovePoint(....................);   
        me->MonsterYell("Text2", LANG_IUNIVERSAL, me->GetGUID());   
        break;   
           
       }   
      }   
     };   
     CreatureAI * GetAI(Creature * pCreature) const   
     {   
      return new npc_moveAI(pCreature)   
     }   
};   

void AddSC_move()   
{   
     new npc_move;   
}


animu Так попробуй.

Добавлено (02.06.2014, 14:58)
---------------------------------------------
Если не получится, то так.

Код
#define ACTION_START_MOVING 1

class npc_move : public CreatureScript   
{   
public:   
     npc_move() : CreatureScript("npc_move") {}   
       
     bool OnGossipHello(Player* player, Creature* creature)
     {
    player->ADD_GOSSIP_ITEM(0, "[PH] Start Moving", GOSSIP_SENDER_MAIN, ACTION_START_MOVING);   
    player->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE, creature->GetGUID());
    return true;
   }
     
   bool OnGossipSelect(Player *player, Creature *creature, uint32 sender, uint32 uiAction)
      {
          if (sender == GOSSIP_SENDER_MAIN)
          {
              player->PlayerTalkClass->ClearMenus();
              switch(uiAction)
              {
      case ACTION_START_MOVING:
       creature->AI()->DoAction(ACTION_START_MOVING);
                      player->CLOSE_GOSSIP_MENU();
       break;
                  default:
                      break;
              }
          }
          return true;
      }
       
     struct npc_moveAI : public ScriptedAI   
     {   
      npc_moveAI(Creature * c) : ScriptedAI(c) {}   

   bool moveOnGossip;
      int moveCount;   
      void Reset()   
      {   
       moveCount = 0;   
    moveOnGossip = false;
       me->SetSpeed(MOVE_RUN, 1.0f, true);   
      }
     
   void DoAction(int32 actions)
   {
    switch (actions)
    {
     case ACTION_START_MOVING:
      moveOnGossip = true;
      break;
    }
   }

      void MovementInform(uint32 type, uint32 id)   
      {   
       if (type != POINT_MOTION_TYPE)   
        return;   
       moveCount++;   
      }   

      void UpdateAI(uint32 const diff)   
      {   
     
   if (moveOnGossip)
       switch (moveCount)   
       {   
       case 0:   
        me->GetMotionMaster()->MovePoint(....................);   
        me->MonsterYell("Text", LANG_IUNIVERSAL, me->GetGUID());   
        break;   
       case 1:   
        me->GetMotionMaster()->MovePoint(....................);   
        break;   
       case 2:   
        me->GetMotionMaster()->MovePoint(....................);   
        break;   
       case 4:   
        me->GetMotionMaster()->MovePoint(....................);   
        me->MonsterYell("Text2", LANG_IUNIVERSAL, me->GetGUID());   
        break;   
           
       }   
      }   
     };   
     CreatureAI * GetAI(Creature * pCreature) const   
     {   
      return new npc_moveAI(pCreature)   
     }   
};   

void AddSC_move()   
{   
     new npc_move;   
}
Сообщение # 4 отредактировано doomkas - Понедельник, 02.06.2014, 15:03
  • Страница 1 из 1
  • 1
Поиск: