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

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

Показано с 1 по 5 из 5
  1. #1
    Старожил Аватар для Ginn
    Регистрация
    12.05.2013
    Сообщений
    181
    Поблагодарил(а)
    100
    Получено благодарностей: 17 (сообщений: 9).
    Репутация: 17

    Lightbulb Нечистотон.

    1. Нечистотон.
    2. Что не работает? Как будто что-то новое - ничего не работает.
    2.1 ЯД
    2.2 яд
    2.3 отрава
    2.4 И самое интересное что делает босса уникальным 3 спелла - 1 2 3
    3. Как должно работать?
    3.1 Статичный плевок яда, много где используется (я взял ид спелла именно нечистотона). 413 - 588 ед. урона от сил природы раз в 2 сек.
    3.2 Окатывает ядом все цели, находящиеся перед заклинателем, и наносит им 1050 - 1351 ед. урона от сил природы. Из тултипа понятно что танк отворачивает босса от рейда, и плюет этот спелл только в него.
    3.3 Наносит 1313 - 1688 ед. урона раз в 2 сек. Замедляет движения на 40% на 9 секунд. Порывшись в дб я увидел что кидается сначало это 2 в рандомного игрока, в том числе и в танка, и после этого собственно говоря появляется само облачко отрава.
    3.4 Итак по порядку. Доведя босса до 1 хп, циферки продолжают идти однако босс не умирает.(Типичный пример - принцы из ЦЛК с 1 хп). Для того чтобы убить босса сплоченному рейду нужен фрост дамаг. Нужно нанести определенное количество ударов не важно насколько сильных.
    1 - 15 ударов фрост школы. В чате через эмоции должно прописаться, что Нечистотон замедляется.
    2 - еще 15 ударов фрост школы. В чате через эмоции должно прописаться, что Нечистотон замедляется сильнее.
    3 - последние 20 ударов фрост школыд. В чате через эмоции должно прописаться, что Нечистотон заморожен.
    После того как Нечистотона проклятого заморозили необходимо нанести 50 ударов физической школы (привет бичам дк), чтобы разбить босса и соответственно угробить, но только если у него 1 хп.
    4.07.02.2016 1:23 logon.wowcircle.com x10
    5. Никогда не работал как было задумано праотцами.
    6. Приоритет 5/10. Опциональный, не обязательный босс для прохода к К'туну, хотя и обязательных нету на нашем сервере все двери могут открыть простые смертные.
    7. В скринах нет смысла, в баг-репорте по Оуро я уже доказал, что такое значит ничего не работает. Если нужно - предоставлю.
    В виду того, что босс абсолютно не рабочий добавлю скрипт(может хоть как-то поможет).
    Код:
    /*
     * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
     *
     * This program is free software; you can redistribute it and/or modify it
     * under the terms of the GNU General Public License as published by the
     * Free Software Foundation; either version 2 of the License, or (at your
     * option) any later version.
     *
     * This program is distributed in the hope that it will be useful, but WITHOUT
     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
     * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
     * more details.
     *
     * You should have received a copy of the GNU General Public License along
     * with this program. If not, see <http://www.gnu.org/licenses/>.
     */
    
    #include "ScriptMgr.h"
    #include "ScriptedCreature.h"
    #include "SpellInfo.h"
    #include "temple_of_ahnqiraj.h"
    
    enum Spells
    {
        SPELL_POISON_SHOCK          = 25993,
        SPELL_POISONBOLT_VOLLEY     = 25991,
        SPELL_TOXIN                 = 26575,
        SPELL_VISCIDUS_SLOWED       = 26034,
        SPELL_VISCIDUS_SLOWED_MORE  = 26036,
        SPELL_VISCIDUS_FREEZE       = 25937,
        SPELL_REJOIN_VISCIDUS       = 25896,
        SPELL_VISCIDUS_EXPLODE      = 25938,
        SPELL_VISCIDUS_SUICIDE      = 26003,
        SPELL_VISCIDUS_SHRINKS      = 25893,                   // Removed from client, in world.spell_dbc
    
        SPELL_MEMBRANE_VISCIDUS     = 25994,                   // damage reduction spell - removed from DBC
        SPELL_VISCIDUS_WEAKNESS     = 25926,                   // aura which procs at damage - should trigger the slow spells - removed from DBC
        SPELL_VISCIDUS_GROWS        = 25897,                   // removed from DBC
        SPELL_SUMMON_GLOBS          = 25885,                   // summons npc 15667 using spells from 25865 to 25884; All spells have target coords - removed from DBC
        SPELL_VISCIDUS_TELEPORT     = 25904,                   // removed from DBC
    };
    
    enum Events
    {
        EVENT_POISONBOLT_VOLLEY     = 1,
        EVENT_POISON_SHOCK          = 2,
        EVENT_RESET_PHASE           = 3
    };
    
    enum Phases
    {
        PHASE_FROST                 = 1,
        PHASE_MELEE                 = 2,
        PHASE_GLOB                  = 3
    };
    
    enum Emotes
    {
        EMOTE_SLOW                  = 0,
        EMOTE_FREEZE                = 1,
        EMOTE_FROZEN                = 2,
    
        EMOTE_CRACK                 = 3,
        EMOTE_SHATTER               = 4,
        EMOTE_EXPLODE               = 5
    };
    
    enum HitCounter
    {
        HITCOUNTER_SLOW             = 100,
        HITCOUNTER_SLOW_MORE        = 150,
        HITCOUNTER_FREEZE           = 200,
    
        HITCOUNTER_CRACK            = 50,
        HITCOUNTER_SHATTER          = 100,
        HITCOUNTER_EXPLODE          = 150,
    };
    
    enum MovePoints
    {
        ROOM_CENTER                 = 1
    };
    
    Position const ViscidusCoord = { -7992.36f, 908.19f, -52.62f, 1.68f }; /// @todo Visci isn't in room middle
    float const RoomRadius = 40.0f; /// @todo Not sure if its correct
    
    class boss_viscidus : public CreatureScript
    {
        public:
            boss_viscidus() : CreatureScript("boss_viscidus") { }
    
            struct boss_viscidusAI : public BossAI
            {
                boss_viscidusAI(Creature* creature) : BossAI(creature, DATA_VISCIDUS)
                {
                    Initialize();
                }
    
                void Initialize()
                {
                    _hitcounter = 0;
                    _phase = PHASE_FROST;
                }
    
                void Reset() override
                {
                    _Reset();
                    Initialize();
                }
    
                void DamageTaken(Unit* attacker, uint32& /*damage*/) override
                {
                    if (_phase != PHASE_MELEE)
                        return;
    
                    ++_hitcounter;
    
                    if (attacker->HasUnitState(UNIT_STATE_MELEE_ATTACKING) && _hitcounter >= HITCOUNTER_EXPLODE)
                    {
                        Talk(EMOTE_EXPLODE);
                        events.Reset();
                        _phase = PHASE_GLOB;
                        DoCast(me, SPELL_VISCIDUS_EXPLODE);
                        me->SetVisible(false);
                        me->RemoveAura(SPELL_TOXIN);
                        me->RemoveAura(SPELL_VISCIDUS_FREEZE);
    
                        uint8 NumGlobes = me->GetHealthPct() / 5.0f;
                        for (uint8 i = 0; i < NumGlobes; ++i)
                        {
                            float Angle = i * 2 * float(M_PI) / NumGlobes;
                            float X = ViscidusCoord.GetPositionX() + std::cos(Angle) * RoomRadius;
                            float Y = ViscidusCoord.GetPositionY() + std::sin(Angle) * RoomRadius;
                            float Z = -35.0f;
    
                            if (TempSummon* Glob = me->SummonCreature(NPC_GLOB_OF_VISCIDUS, X, Y, Z))
                            {
                                Glob->UpdateAllowedPositionZ(X, Y, Z);
                                Glob->NearTeleportTo(X, Y, Z, 0.0f);
                                Glob->GetMotionMaster()->MovePoint(ROOM_CENTER, ViscidusCoord);
                            }
                        }
                    }
                    else if (_hitcounter == HITCOUNTER_SHATTER)
                        Talk(EMOTE_SHATTER);
                    else if (_hitcounter == HITCOUNTER_CRACK)
                        Talk(EMOTE_CRACK);
                }
    
                void SpellHit(Unit* /*caster*/, SpellInfo const* spell) override
                {
                    if ((spell->GetSchoolMask() & SPELL_SCHOOL_MASK_FROST) && _phase == PHASE_FROST && me->GetHealthPct() > 5.0f)
                    {
                        ++_hitcounter;
    
                        if (_hitcounter >= HITCOUNTER_FREEZE)
                        {
                            _hitcounter = 0;
                            Talk(EMOTE_FROZEN);
                            _phase = PHASE_MELEE;
                            DoCast(me, SPELL_VISCIDUS_FREEZE);
                            me->RemoveAura(SPELL_VISCIDUS_SLOWED_MORE);
                            events.ScheduleEvent(EVENT_RESET_PHASE, 15000);
                        }
                        else if (_hitcounter >= HITCOUNTER_SLOW_MORE)
                        {
                            Talk(EMOTE_FREEZE);
                            me->RemoveAura(SPELL_VISCIDUS_SLOWED);
                            DoCast(me, SPELL_VISCIDUS_SLOWED_MORE);
                        }
                        else if (_hitcounter >= HITCOUNTER_SLOW)
                        {
                            Talk(EMOTE_SLOW);
                            DoCast(me, SPELL_VISCIDUS_SLOWED);
                        }
                    }
                }
    
                void EnterCombat(Unit* /*who*/) override
                {
                    _EnterCombat();
                    events.Reset();
                    InitSpells();
                }
    
                void InitSpells()
                {
                    DoCast(me, SPELL_TOXIN);
                    events.ScheduleEvent(EVENT_POISONBOLT_VOLLEY, urand(10000, 15000));
                    events.ScheduleEvent(EVENT_POISON_SHOCK, urand(7000, 12000));
                }
    
                void EnterEvadeMode(EvadeReason why) override
                {
                    summons.DespawnAll();
                    ScriptedAI::EnterEvadeMode(why);
                }
    
                void JustDied(Unit* /*killer*/) override
                {
                    DoCast(me, SPELL_VISCIDUS_SUICIDE);
                    summons.DespawnAll();
                }
    
                void UpdateAI(uint32 diff) override
                {
                    if (!UpdateVictim())
                        return;
    
                    if (_phase == PHASE_GLOB && summons.empty())
                    {
                        DoResetThreat();
                        me->NearTeleportTo(ViscidusCoord.GetPositionX(),
                            ViscidusCoord.GetPositionY(),
                            ViscidusCoord.GetPositionZ(),
                            ViscidusCoord.GetOrientation());
    
                        _hitcounter = 0;
                        _phase = PHASE_FROST;
                        InitSpells();
                        me->SetVisible(true);
                    }
    
                    events.Update(diff);
    
                    while (uint32 eventId = events.ExecuteEvent())
                    {
                        switch (eventId)
                        {
                            case EVENT_POISONBOLT_VOLLEY:
                                DoCast(me, SPELL_POISONBOLT_VOLLEY);
                                events.ScheduleEvent(EVENT_POISONBOLT_VOLLEY, urand(10000, 15000));
                                break;
                            case EVENT_POISON_SHOCK:
                                DoCast(me, SPELL_POISON_SHOCK);
                                events.ScheduleEvent(EVENT_POISON_SHOCK, urand(7000, 12000));
                                break;
                            case EVENT_RESET_PHASE:
                                _hitcounter = 0;
                                _phase = PHASE_FROST;
                                break;
                            default:
                                break;
                        }
                    }
    
                    if (_phase != PHASE_GLOB)
                        DoMeleeAttackIfReady();
                }
    
            private:
                uint8 _hitcounter;
                Phases _phase;
            };
    
            CreatureAI* GetAI(Creature* creature) const override
            {
                return new boss_viscidusAI(creature);
            }
    };
    
    class npc_glob_of_viscidus : public CreatureScript
    {
        public:
            npc_glob_of_viscidus() : CreatureScript("boss_glob_of_viscidus") { }
    
            struct npc_glob_of_viscidusAI : public ScriptedAI
            {
                npc_glob_of_viscidusAI(Creature* creature) : ScriptedAI(creature) { }
    
                void JustDied(Unit* /*killer*/) override
                {
                    InstanceScript* Instance = me->GetInstanceScript();
    
                    if (Creature* Viscidus = me->GetMap()->GetCreature(Instance->GetGuidData(DATA_VISCIDUS)))
                    {
                        if (BossAI* ViscidusAI = dynamic_cast<BossAI*>(Viscidus->GetAI()))
                            ViscidusAI->SummonedCreatureDespawn(me);
    
                        if (Viscidus->IsAlive() && Viscidus->GetHealthPct() < 5.0f)
                        {
                            Viscidus->SetVisible(true);
                            if (Viscidus->GetVictim())
                                Viscidus->EnsureVictim()->Kill(Viscidus);
                        }
                        else
                        {
                            Viscidus->SetHealth(Viscidus->GetHealth() - Viscidus->GetMaxHealth() / 20);
                            Viscidus->CastSpell(Viscidus, SPELL_VISCIDUS_SHRINKS);
                        }
                    }
                }
    
                void MovementInform(uint32 /*type*/, uint32 id) override
                {
                    if (id == ROOM_CENTER)
                    {
                        DoCast(me, SPELL_REJOIN_VISCIDUS);
                        if (TempSummon* summon = me->ToTempSummon())
                            summon->UnSummon();
                    }
                }
            };
    
            CreatureAI* GetAI(Creature* creature) const override
            {
                return GetInstanceAI<npc_glob_of_viscidusAI>(creature);
            }
    };
    
    void AddSC_boss_viscidus()
    {
        new boss_viscidus();
        new npc_glob_of_viscidus();
    }
    З. Ы. Второй и, слава Богу, последний манекен с халявной голдой и "эпиками". Надо чинить.
    Последний раз редактировалось Ginn; 09.02.2016 в 08:14.

  2. 2 пользователей сказали cпасибо Ginn за это полезное сообщение:

    greensun (15.02.2016),Jester (15.06.2016)

  3. #2
    Старожил Аватар для Ginn
    Регистрация
    12.05.2013
    Сообщений
    181
    Поблагодарил(а)
    100
    Получено благодарностей: 17 (сообщений: 9).
    Репутация: 17
    ап............

  4. #3
    Старожил Аватар для Ginn
    Регистрация
    12.05.2013
    Сообщений
    181
    Поблагодарил(а)
    100
    Получено благодарностей: 17 (сообщений: 9).
    Репутация: 17
    ап

  5. #4
    Chaotic Good Аватар для Jester
    Регистрация
    31.01.2012
    Адрес
    Dark Side
    Сообщений
    4,145
    Поблагодарил(а)
    541
    Получено благодарностей: 865 (сообщений: 436).
    Репутация: 867
    Цитата Сообщение от Ginn Посмотреть сообщение
    Никогда не работал как было задумано праотцами.
    И никогда не будет

  6. #5
    Разработчик
    Регистрация
    12.10.2015
    Сообщений
    6,031
    Поблагодарил(а)
    3,866
    Получено благодарностей: 3,147 (сообщений: 1,854).
    Репутация: 32773
    Исправлено.

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

    Ginn (20.06.2016)

Похожие темы

  1. Заявка на разблокировку (блок по причине незнаю как он это сделал он читер)) )
    от AkaZmei в разделе Обжалование наказаний форумных аккаунтов
    Ответов: 1
    Последнее сообщение: 06.05.2015, 21:57
  2. Лон'горон, лук Горемычного кв нету
    от ETIS в разделе Корзина
    Ответов: 3
    Последнее сообщение: 18.04.2014, 12:55
  3. Ответов: 1
    Последнее сообщение: 01.11.2013, 21:26
  4. Ответов: 14
    Последнее сообщение: 24.09.2012, 09:27

Ваши права

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