Приветствуем вас на форуме проекта WoW Circle. Если вы читаете это, значит не зарегистрировались у нас. Для того, чтобы получить доступ к расширенным возможностям нашего форума нажмите сюда и пройди регистрацию, которая не займет у вас много времени. После регистрации будут доступны новые, более расширенные, возможности.
Призыв горгульи - Страница 2

Упомянутые в теме пользователи:

Страница 2 из 2 ПерваяПервая 12
Показано с 13 по 14 из 14
  1. #13
    Новичок
    Регистрация
    04.09.2014
    Адрес
    Россия
    Сообщений
    17
    Поблагодарил(а)
    3
    Получено благодарностей: 2 (сообщений: 2).
    Репутация: 2
    И так, собственно написал скрипт еще полгода назад, который исправляет эту проблему, а также теперь будет атаковать цель пета (это дает возможность дк, контролировать свою гаргу через пета, используя /petattack)
    Если сказать кратко, то реализовал Switch таргет у Горгульи.

    Код:
    class npc_ebon_gargoyle : public CreatureScript
    {
    public:
        npc_ebon_gargoyle() : CreatureScript("npc_ebon_gargoyle") { }
    
        struct npc_ebon_gargoyleAI : CasterAI
        {
            npc_ebon_gargoyleAI(Creature* creature) : CasterAI(creature) {}
    
            uint32 despawnTimer;
            uint32 switchTargetTimer;
    
            void InitializeAI()
            {
                CasterAI::InitializeAI();
                Unit * owner = me->GetOwner();
                if (!owner)
                    return;
                // Not needed to be despawned now
                despawnTimer = 0;
                switchTargetTimer = 1000;
                // Find victim of Summon Gargoyle spell
                std::list<Unit*> targets;
                Trinity::AnyUnfriendlyUnitInObjectRangeCheck u_check(me, me, 30);
                Trinity::UnitListSearcher<Trinity::AnyUnfriendlyUnitInObjectRangeCheck> searcher(me, targets, u_check);
                me->VisitNearbyObject(30, searcher);
                for (std::list<Unit*>::const_iterator iter = targets.begin(); iter != targets.end(); ++iter)
                    if ((*iter)->GetAura(49206, owner->GetGUID()))
                    {
                        me->Attack((*iter), false);
                        break;
                    }
            }
    
            void JustDied(Unit* /*killer*/)
            {
                // Stop Feeding Gargoyle when it dies
                if (Unit* owner = me->GetOwner())
                    owner->RemoveAurasDueToSpell(50514);
            }
    
            // Fly away when dismissed
            void SpellHit(Unit* source, SpellInfo const* spell)
            {
                if (spell->Id != 50515 || !me->isAlive())
                    return;
    
                Unit* owner = me->GetOwner();
    
                if (!owner || owner != source)
                    return;
    
                // Stop Fighting
                me->ApplyModFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE, true);
                // Sanctuary
                me->CastSpell(me, 54661, true);
                me->SetReactState(REACT_PASSIVE);
    
                //! HACK: Creature's can't have MOVEMENTFLAG_FLYING
                // Fly Away
                me->AddUnitMovementFlag(MOVEMENTFLAG_CAN_FLY|MOVEMENTFLAG_ASCENDING|MOVEMENTFLAG_FLYING);
                me->SetSpeed(MOVE_FLIGHT, 0.75f, true);
                me->SetSpeed(MOVE_RUN, 0.75f, true);
                float x = me->GetPositionX() + 20 * cos(me->GetOrientation());
                float y = me->GetPositionY() + 20 * sin(me->GetOrientation());
                float z = me->GetPositionZ() + 40;
                me->GetMotionMaster()->Clear(false);
                me->GetMotionMaster()->MovePoint(0, x, y, z);
    
                // Despawn as soon as possible
                despawnTimer = 4 * IN_MILLISECONDS;
            }
    
            void UpdateAI(const uint32 diff)
            {
                if (despawnTimer > 0)
                {
                    if (despawnTimer > diff)
                        despawnTimer -= diff;
                    else
                        me->DespawnOrUnsummon();
                    return;
                }
                
              if (switchTargetTimer <= diff)
              {
                switchTargetTimer = 1000;
                Unit * owner = me->GetOwner();
                Unit * target = me->getVictim();
                if (!owner)
                    return;
                
                Player * player = owner->ToPlayer();
                if (!player)
                    return;
                    
                uint64 GhoulGUID = NULL;
                Unit * Ghoul=NULL;
                for (Unit::ControlList::const_iterator itr = player->m_Controlled.begin(); itr != player->m_Controlled.end(); ++itr) //Find Ghoul
                     if ((*itr)->GetEntry() == 26125)
                     {
                            GhoulGUID = (*itr)->GetGUID();
                            Ghoul=(*itr);
                            break;
                     }
    
                if (GhoulGUID && Ghoul)
                {
                  if (target)
                  {
                     Unit * taget_ghoul = Ghoul->getVictim();
                     if (taget_ghoul && taget_ghoul != target)
                         me->Attack(taget_ghoul, false);
                  }
                }
                
                if (!target)
                {
                  std::list<Unit*> targets;
                  Trinity::AnyUnfriendlyUnitInObjectRangeCheck u_check(me, me, 30);
                  Trinity::UnitListSearcher<Trinity::AnyUnfriendlyUnitInObjectRangeCheck> searcher(me, targets, u_check);
                  me->VisitNearbyObject(30, searcher);
                  for (std::list<Unit*>::const_iterator iter = targets.begin(); iter != targets.end(); ++iter)
                    if ((*iter)->GetAura(49206, owner->GetGUID()))
                    {
                        me->Attack((*iter), false);
                        break;
                    }
                }
                
              } else switchTargetTimer -= diff;
              
              CasterAI::UpdateAI(diff);
                
            }
        };
    
        CreatureAI* GetAI(Creature* creature) const
        {
            return new npc_ebon_gargoyleAI(creature);
        }
    };
    Последний раз редактировалось riders92; 04.09.2014 в 16:18.

  2. #14
    Ветеран форума Аватар для Leyota
    Регистрация
    07.01.2012
    Сообщений
    1,491
    Поблагодарил(а)
    198
    Получено благодарностей: 1,303 (сообщений: 664).
    Репутация: 1615
    Исправлено.
    Описание багов или эксплоитов, впоследствии использования которых, игрок получает серьезное преимущество или доступ к сложно доступному контенту, награждается 250 бонусами. О таких багах писать рекомендуется исключительно в личном сообщении на форуме или в skype.

  3. 1 пользователь сказал cпасибо Leyota за это полезное сообщение:

    MrCroW (21.09.2014)

Страница 2 из 2 ПерваяПервая 12

Похожие темы

  1. [Призыв горгульи]
    от sweetsuffer в разделе Корзина
    Ответов: 0
    Последнее сообщение: 18.05.2013, 19:20
  2. Ответов: 3
    Последнее сообщение: 01.10.2012, 22:47
  3. Призыв горгульи
    от Rei в разделе Корзина
    Ответов: 0
    Последнее сообщение: 08.09.2012, 21:52

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •