Ru-MaNGOS

Ru-MaNGOS (http://mangos.ytdb.ru/index.php)
-   Отвергнутые патчи (http://mangos.ytdb.ru/forumdisplay.php?f=50)
-   -   [fix] Mirror Image (http://mangos.ytdb.ru/showthread.php?t=246)

MaxXx2021 12.03.2010 04:18

[fix] Mirror Image
 
Вложений: 1
Реализует работу Зеркальных Изображений у магов. Проверял на версии ядра 9225. также на версии клиента 3.3.2 Ревизию ядра не помню.

Патч переводили с тринити, но он не работал (вызывал трех призраков и все), дописал его я. Имеются недочеты:
1. В дуэли иллюзии не аттакуют игрока. - поправлено! (Спасибо Set)
2. Спелл агрит мобов вокруг. - поправлено! (огромное спасибо lucky)
3. Поправлено, Движение иллюзий за магом. (Спасибо Set)
4. Поправлено, после 30 секунд иллюзии исчезают (Спасибо Dimitrius)
5. Теперь копируется имя и гильдия. (Спасибо Set)

MaxXx2021 12.03.2010 04:21

Код:

enum
{
  SPELL_FROSTBOLT        = 59638,
  SPELL_FIREBALL          = 59637
};

/*######
## npc_mirror_image
######*/

struct MANGOS_DLL_DECL npc_mirror_imageAI : public ScriptedAI
{
    npc_mirror_imageAI(Creature* pCreature) : ScriptedAI(pCreature) {Reset();}

        uint32 m_uiFrostboltTimer;
        uint32 m_uiFireblastTimer;
        bool inCombat;
                uint32 LifeTime;

    void Reset()
        {
                                LifeTime = 30000;
                Unit *owner = m_creature->GetOwner();
                if (!owner)
                        return;

                if (owner && !m_creature->hasUnitState(UNIT_STAT_FOLLOW))
                {
                        m_creature->GetMotionMaster()->Clear(false);
                        m_creature->GetMotionMaster()->MoveFollow(owner, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE);
                }
                // Inherit Master's Threat List (not yet implemented)
                //owner->CastSpell((Unit*)NULL, 58838, true);
                // here mirror image casts on summoner spell (not present in client dbc) 49866
                // here should be auras (not present in client dbc): 35657, 35658, 35659, 35660 selfcasted by mirror images (stats related?)
                // Clone Me!
                m_uiFrostboltTimer = 0;
                m_uiFireblastTimer = 6100;
                inCombat = false;
        }

        void AttackStart(Unit* pWho)
        {
                if (!pWho)
                        return;

                if (m_creature->Attack(pWho, true))
                {
            m_creature->clearUnitState(UNIT_STAT_FOLLOW);
            // TMGs call CreatureRelocation which via MoveInLineOfSight can call this function
            // thus with the following clear the original TMG gets invalidated and crash, doh
            // hope it doesn't start to leak memory without this :-/
            //i_pet->Clear();
            m_creature->GetMotionMaster()->MoveChase(pWho);
            m_creature->getVictim()->AddThreat(m_creature);
            inCombat = true;
        }
        }

        void EnterEvadeMode()
        {
                if (m_creature->IsInEvadeMode() || !m_creature->isAlive())
                        return;

                inCombat = false;
                Unit *owner = m_creature->GetCharmerOrOwner();

                m_creature->AttackStop();
                m_creature->CombatStop(true);
                if (owner && !m_creature->hasUnitState(UNIT_STAT_FOLLOW))
                {
                        m_creature->GetMotionMaster()->Clear(false);
                        m_creature->GetMotionMaster()->MoveFollow(owner, PET_FOLLOW_DIST,PET_FOLLOW_ANGLE);
                }
        }

        void UpdateAI(const uint32 diff)
        {

                if (LifeTime < diff)
                {
                        m_creature->RemoveFromWorld();
                } else LifeTime -= diff;
               
                if (/*!m_creature->SelectHostileTarget() || */!m_creature->getVictim())
                {
                        Unit *owner = m_creature->GetCharmerOrOwner();
                        if (owner && owner->getVictim())
                                m_creature->AI()->AttackStart(owner->getVictim());
                }

                if (inCombat && !m_creature->getVictim())
                {
                        EnterEvadeMode();
                        return;
                }

                if (/*!m_creature->SelectHostileTarget() || */!m_creature->getVictim())
                        return;

                if (m_uiFrostboltTimer <= diff)
                {
                        DoCast(m_creature->getVictim(),59638);
                        m_uiFrostboltTimer = 3100;
                }else m_uiFrostboltTimer -= diff;

                if (m_uiFireblastTimer <= diff)
                {
                        DoCast(m_creature->getVictim(),59637,true);
                        m_uiFireblastTimer = 6000;
                }else m_uiFireblastTimer -= diff;

                DoMeleeAttackIfReady();
        }
};

CreatureAI* GetAI_npc_mirror_image(Creature* pCreature)
{
    return new npc_mirror_imageAI(pCreature);
}

Код:

    newscript = new Script;
    newscript->Name = "npc_mirror_image";
    newscript->GetAI = &GetAI_npc_mirror_image;
    newscript->RegisterSelf();

это в SpecialNPC - спасибо Set за предоставленый скрипт. Я чуток подогнал его под свой патч.

lucky 12.03.2010 07:39

Мобы агрятся из-за этого
Код:

+            if (spell->Id == 55342)
+            {
+                // Set name of summons to name of caster
+                m_target->CastSpell((Unit *)NULL, m_spellProto->EffectTriggerSpell[m_effIndex], true);
+                m_isPeriodic = false;
+            }

стоит закомментировать

Код:

+                m_target->CastSpell((Unit *)NULL, m_spellProto->EffectTriggerSpell[m_effIndex], true);
и все становится хорошо.

У меня также из-за этого было, что при вызове проекций всем мобам в округе присваивалось имя кастера :) у и агрились. Ну естественно после таких манипуляций проекциям имя присваиваться не будет

MaxXx2021 12.03.2010 07:50

Цитата:

Сообщение от lucky (Сообщение 1476)
Мобы агрятся из-за этого
Код:

+            if (spell->Id == 55342)
+            {
+                // Set name of summons to name of caster
+                m_target->CastSpell((Unit *)NULL, m_spellProto->EffectTriggerSpell[m_effIndex], true);
+                m_isPeriodic = false;
+            }

стоит закомментировать

Код:

+                m_target->CastSpell((Unit *)NULL, m_spellProto->EffectTriggerSpell[m_effIndex], true);
и все становится хорошо.

У меня также из-за этого было, что при вызове проекций всем мобам в округе присваивалось имя кастера :) у и агрились. Ну естественно после таких манипуляций проекциям имя присваиваться не будет

Спс у меня оружие у всех мобов появлялось которое у меня было, потом поправил. :) Имя тоже надо копировать иллюзиям? (+Гильдию?)

SeT 13.03.2010 08:10

Проблема в том, что у спелла ID - 58836 Initialize Images () - Target B (TARGET_7). Нужно реализовывать его еще, это что-то вроде массового SCRIPT_TARGET.

Hantet 14.03.2010 02:09

Создаваемые копии стоят на месте если поблизости нет врагов - это нормально? При появлении врагов работают как и должны (сверил с оффом). Попробую пока из pet.cpp (или player.cpp - точно пока не знаю, предположил) вытащить функцию следования за игроком, если решения пока нет (что маловероятно).

MaNGOS 9435 (не чистое)
SD2 R1581 (не чистое)
YTDB R535
ACID R303


Added:
Добавил в spell_effects.cpp:

После summon->SetUInt32Value(UNIT_FIELD_FLAGS_2, 2064);
Код:

summon->GetMotionMaster()->MoveFollow(m_caster,PET_FOLLOW_DIST,PET_FOLLOW_ANGLE);
Теперь копии стали ходить за игроком и всё вроде бы отлично, но! После первой же битвы копии встают на свои места по треугольной траектории вокруг места где стоял персонаж когда юзал спелл и больше не сдвигаются с места. Как и где задать чтобы копии бегали за персонажем и после битвы, не подскажите?
P.s. не ругайте пожалуйста за кракозяброкод, использовал функции из Pet.cpp и PetHandler.cpp

Бггг, я ненормальный. Всю ночь просидел перед ящиком, пробовал разные варианты. Псих :(

Dimitrius 14.03.2010 05:19

Еще один минус - созданные копии не исчезают по прохождении 30 сек, если они находятся в бою. Следовательно дождавшись кд допустим на арене можно будет призвать еще 3-4 копии. Я думаю это не верно, и поправил это в SD2:
(+ отмечены добавленные строки)
Код:

struct MANGOS_DLL_DECL npc_mirror_imageAI : public ScriptedAI
{
    npc_mirror_imageAI(Creature *pCreature) : ScriptedAI(pCreature)
  {
+          LifeTime = 30000;
      Reset();
  }

+uint32 LifeTime;
uint32 m_uiFrostBoltTimer;

    void Reset()
    {
      m_uiFrostBoltTimer = 1000;
    }

    void UpdateAI(const uint32 uiDiff)
    {
+                if (LifeTime < uiDiff)
+                {
+                        m_creature->RemoveFromWorld();
+                } else LifeTime -= uiDiff;

        if (!m_creature->SelectHostileTarget() || !m_creature->getVictim())
            return;

                    if (m_uiFrostBoltTimer < uiDiff)
                    {
                        if (DoCastSpellIfCan(m_creature->getVictim(), SPELL_FROSTBOLT) == CAST_OK)
                            m_uiFrostBoltTimer = urand(3600, 4000);
                    }else
                        m_uiFrostBoltTimer -= uiDiff;

    }
};


SeT 14.03.2010 06:59

Код:

/*######
## npc_mirror_image
######*/

struct MANGOS_DLL_DECL npc_mirror_imageAI : public ScriptedAI
{
    npc_mirror_imageAI(Creature* pCreature) : ScriptedAI(pCreature) {Reset();}

        uint32 m_uiFrostboltTimer;
        uint32 m_uiFireblastTimer;
        bool inCombat;

    void Reset()
        {
                Unit *owner = m_creature->GetOwner();
                if (!owner)
                        return;

                if (owner && !m_creature->hasUnitState(UNIT_STAT_FOLLOW))
                {
                        m_creature->GetMotionMaster()->Clear(false);
                        m_creature->GetMotionMaster()->MoveFollow(owner, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE);
                }
                // Inherit Master's Threat List (not yet implemented)
                //owner->CastSpell((Unit*)NULL, 58838, true);
                // here mirror image casts on summoner spell (not present in client dbc) 49866
                // here should be auras (not present in client dbc): 35657, 35658, 35659, 35660 selfcasted by mirror images (stats related?)
                // Clone Me!
                m_uiFrostboltTimer = 0;
                m_uiFireblastTimer = 6100;
                inCombat = false;
        }

        void AttackStart(Unit* pWho)
        {
                if (!pWho)
                        return;

                if (m_creature->Attack(pWho, true))
                {
            m_creature->clearUnitState(UNIT_STAT_FOLLOW);
            // TMGs call CreatureRelocation which via MoveInLineOfSight can call this function
            // thus with the following clear the original TMG gets invalidated and crash, doh
            // hope it doesn't start to leak memory without this :-/
            //i_pet->Clear();
            m_creature->GetMotionMaster()->MoveChase(pWho);
            m_creature->getVictim()->AddThreat(m_creature);
            inCombat = true;
        }
        }

        void EnterEvadeMode()
        {
                if (m_creature->IsInEvadeMode() || !m_creature->isAlive())
                        return;

                inCombat = false;
                Unit *owner = m_creature->GetCharmerOrOwner();

                m_creature->AttackStop();
                m_creature->CombatStop(true);
                if (owner && !m_creature->hasUnitState(UNIT_STAT_FOLLOW))
                {
                        m_creature->GetMotionMaster()->Clear(false);
                        m_creature->GetMotionMaster()->MoveFollow(owner, PET_FOLLOW_DIST,PET_FOLLOW_ANGLE);
                }
        }

        void UpdateAI(const uint32 diff)
        {
                if (!(m_creature->HasAura(45204)))
                {
                        Unit *owner = m_creature->GetCharmerOrOwner();
                        if (!owner)
                                return;
                        m_creature->CastSpell(m_creature, 45204, true, NULL, NULL, owner->GetGUID());
                }

                if (!(m_creature->HasAura(58836)))
                {
                        Unit *owner = m_creature->GetCharmerOrOwner();
                        if (!owner)
                                return;
                        m_creature->CastSpell(m_creature, 58836, true, NULL, NULL, owner->GetGUID());
                }
               
                if (/*!m_creature->SelectHostileTarget() || */!m_creature->getVictim())
                {
                        Unit *owner = m_creature->GetCharmerOrOwner();
                        if (owner && owner->getVictim())
                                m_creature->AI()->AttackStart(owner->getVictim());
                }

                if (inCombat && !m_creature->getVictim())
                {
                        EnterEvadeMode();
                        return;
                }

                if (/*!m_creature->SelectHostileTarget() || */!m_creature->getVictim())
                        return;

                if (m_uiFrostboltTimer <= diff)
                {
                        DoCast(m_creature->getVictim(),59638);
                        m_uiFrostboltTimer = 3100;
                }else m_uiFrostboltTimer -= diff;

                if (m_uiFireblastTimer <= diff)
                {
                        DoCast(m_creature->getVictim(),59637,true);
                        m_uiFireblastTimer = 6000;
                }else m_uiFireblastTimer -= diff;

                DoMeleeAttackIfReady();
        }
};

CreatureAI* GetAI_npc_mirror_image(Creature* pCreature)
{
    return new npc_mirror_imageAI(pCreature);
}

Моя версия.

MaxXx2021 15.03.2010 04:02

Set странно, когда я в скрипте на 3.3.0 делал через owner у меня писало indefener is not found.

LordJZ 15.03.2010 06:23

Цитата:

Сообщение от MaxXx2021 (Сообщение 2061)
Set странно, когда я в скрипте на 3.3.0 делал через owner у меня писало indefener is not found.

Код:

Unit *owner = m_creature->GetOwner();

MaxXx2021 15.03.2010 07:38

Цитата:

Сообщение от LordJZ (Сообщение 2069)
Код:

Unit *owner = m_creature->GetOwner();

именно GetOwner(); и не мог получить писало что GetOwner(); переменная не найдена смотрите unit.h. Полазил там но похожего не нашел!

LordJZ 15.03.2010 13:45

Код:

m_creature->GetOwner();
http://github.com/mangos/mangos/raw/...rc/game/Unit.h поиск по GetOwner() выдает строку:
Код:

        Unit* GetOwner() const;
Вы делаете что-то не так...

MaxXx2021 16.03.2010 03:47

Цитата:

Сообщение от LordJZ (Сообщение 2119)
Код:

m_creature->GetOwner();
http://github.com/mangos/mangos/raw/...rc/game/Unit.h поиск по GetOwner() выдает строку:
Код:

        Unit* GetOwner() const;
Вы делаете что-то не так...

У меня было написано так! Unit* Mirror = m_creature->GetOwner(); Писало ошибку что GetOwner() нету такого void!

Dimitrius 16.03.2010 13:32

А зазве у клонов столько же хелов сколько и у владельца?
Помойму нужно в Reset() добавить
Код:

m_creature->SetMaxHealth(4000);
И кстати исправь в updateAI где проверка таймера LifeTime - uiDiff на diff коли подогнал патч ))

DiffuSer 16.03.2010 13:44

Я всегда думал, что у клонов и ХП должно быть столько же.

LordJZ 16.03.2010 14:24

Нет, у них около 2.6к, насколько я помню.

MaxXx2021 17.03.2010 04:03

Цитата:

Сообщение от LordJZ (Сообщение 2255)
Нет, у них около 2.6к, насколько я помню.

Oo столько же должно быть. Кстати как скопировать имя и гильдию?

LordJZ 17.03.2010 06:23

Цитата:

Сообщение от MaxXx2021 (Сообщение 2349)
Oo столько же должно быть. Кстати как скопировать имя и гильдию?

http://www.wowhead.com/?spell=69960 (к примеру)

MaxXx2021 17.03.2010 11:08

Цитата:

Сообщение от LordJZ (Сообщение 2359)

Вопрос на миллион $! Он работает? =)))

timmit 17.03.2010 13:01

Код:

Effect        Apply Aura: Mirror Name
Radius: 100 yards

Надо реализовать эту ауру :)
где-то я видел спелы - которые берут оружие и одежду миррор цели, как то их надо под эту ауру подогнать наверно

LordJZ 17.03.2010 14:30

Насколько я помню это клиентом реализуется.

VENOM 17.03.2010 18:49

когда игрок умирает воспроизводится клон игрока [Труп игрока]

Есть ли возможность использовать это В mirror image

LordJZ 17.03.2010 18:54

Цитата:

Сообщение от VENOM (Сообщение 2474)
когда игрок умирает воспроизводится клон игрока [Труп игрока]

Есть ли возможность использовать это В mirror image

Нет, у трупов совершенно иная реализация.

MaxXx2021 18.03.2010 03:46

Цитата:

Сообщение от LordJZ (Сообщение 2408)
Насколько я помню это клиентом реализуется.

SetName Не помогает. Как еще можно функциями сделать?

LordJZ 18.03.2010 14:16

Я имею ввиду ауру, на которую я давал ссылку.

MaS0n 18.03.2010 14:33

Не функции, пакеты CMSG_GET_MIRRORIMAGE_DATA, SMSG_MIRRORIMAGE_DATA

Они отсылаются с аурой и копируют имя, гильду, прическу, лицо, одежду и т.д

MaxXx2021 19.03.2010 03:40

Цитата:

Сообщение от MaS0n (Сообщение 2576)
Не функции, пакеты CMSG_GET_MIRRORIMAGE_DATA, SMSG_MIRRORIMAGE_DATA

Они отсылаются с аурой и копируют имя, гильду, прическу, лицо, одежду и т.д

Это я знаю, но изначально нет этой функции. Если на прическу и все остальное функции есть.

Код:

+        Player* pCreator = (Player *)m_caster;
+        data << (uint8)pCreator->getRace();                        // race
+        data << (uint8)pCreator->getGender();                      // gender
+        data << (uint8)pCreator->getClass();                        // class
+        data << (uint8)pCreator->GetByteValue(PLAYER_BYTES, 0);    // skin
+        data << (uint8)pCreator->GetByteValue(PLAYER_BYTES, 1);    // face
+        data << (uint8)pCreator->GetByteValue(PLAYER_BYTES, 2);    // hair
+        data << (uint8)pCreator->GetByteValue(PLAYER_BYTES, 3);    // haircolor
+        data << (uint8)pCreator->GetByteValue(PLAYER_BYTES_2, 0);  // facialhair
+
+        data << (uint32)0;                    // unknown

Вот теперь надо имя сюда вписать.

VENOM 21.03.2010 08:56

это уже работает? или что не хватает?

GriffonHeart 21.03.2010 19:06

Цитата:

Сообщение от MaxXx2021 (Сообщение 2622)
Вот теперь надо имя сюда вписать.

Ну может быть сюда?
Цитата:

Сообщение от MaxXx2021 (Сообщение 2622)
Код:

+        data << (uint32)0;                    // unknown


MaxXx2021 23.03.2010 03:47

Цитата:

Сообщение от GriffonHeart (Сообщение 2824)
Ну может быть сюда?

Да ток я вот и спрашиваю функцию!

GriffonHeart 23.03.2010 07:45

Цитата:

Сообщение от MaxXx2021 (Сообщение 2925)
Да ток я вот и спрашиваю функцию!

Код:

+        data << pCreator->GetName();                    // unknown
так не пойдёт?

MaxXx2021 23.03.2010 08:08

Цитата:

Сообщение от GriffonHeart (Сообщение 2933)
Код:

+        data << pCreator->GetName();                    // unknown
так не пойдёт?

Ок, спс приду домой проверю! Теперь еще вопрос на миллион $ как копировать гильдию? Что отвечает за это? Что является названием гильдии у героя? Это SubName? Или другое?

Fedia22 23.03.2010 08:13


Anti 24.03.2010 00:21


MaxXx2021 24.03.2010 03:49

Цитата:

Сообщение от Anti (Сообщение 2989)

Код:

+        data << pCreator->GetTitle();                    // unknown
так чтоли?

SeT 24.03.2010 05:28

Код:

+void WorldSession::HandleMirrrorImageDataRequest( WorldPacket & recv_data )
+{
+        sLog.outDebug("WORLD: CMSG_GET_MIRRORIMAGE_DATA");
+        uint64 guid;
+        recv_data >> guid;
+
+        // Get unit for which data is needed by client
+        Unit *unit = ObjectAccessor::GetObjectInWorld(guid, (Unit*)NULL);
+        if(!unit)
+                return;
+        // Get creator of the unit
+        Unit *creator = ObjectAccessor::GetObjectInWorld(unit->GetCreatorGUID(),(Unit*)NULL);
+        if (!creator)
+                return;
+        WorldPacket data(SMSG_MIRRORIMAGE_DATA, 68);
+        data << (uint64)guid;
+        data << (uint32)creator->GetDisplayId();
+        if (creator->GetTypeId() == TYPEID_PLAYER)
+        {
+                Player * pCreator = (Player *)creator;
+                data << (uint8)pCreator->getRace();
+                data << (uint8)pCreator->getGender();
+                data << (uint8)pCreator->getClass();
+                data << (uint8)pCreator->GetByteValue(PLAYER_BYTES, 0); // skin
+
+                data << (uint8)pCreator->GetByteValue(PLAYER_BYTES, 1); // face
+                data << (uint8)pCreator->GetByteValue(PLAYER_BYTES, 2); // hair
+                data << (uint8)pCreator->GetByteValue(PLAYER_BYTES, 3); // haircolor
+                data << (uint8)pCreator->GetByteValue(PLAYER_BYTES_2, 0); // facialhair
+
+                data << (uint32)pCreator->GetGuildId();  // unk
+                static const EquipmentSlots ItemSlots[] =
+                {
+                        EQUIPMENT_SLOT_HEAD,
+                        EQUIPMENT_SLOT_SHOULDERS,
+                        EQUIPMENT_SLOT_BODY,
+                        EQUIPMENT_SLOT_CHEST,
+                        EQUIPMENT_SLOT_WAIST,
+                        EQUIPMENT_SLOT_LEGS,
+                        EQUIPMENT_SLOT_FEET,
+                        EQUIPMENT_SLOT_WRISTS,
+                        EQUIPMENT_SLOT_HANDS,
+                        EQUIPMENT_SLOT_BACK,
+                        EQUIPMENT_SLOT_TABARD,
+                        EQUIPMENT_SLOT_END
+                };
+                // Display items in visible slots
+                for (EquipmentSlots const* itr = &ItemSlots[0]; *itr!=EQUIPMENT_SLOT_END; ++itr)
+                {
+                        if (*itr == EQUIPMENT_SLOT_HEAD && pCreator->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_HIDE_HELM))
+                                data << (uint32)0;
+                        else if (*itr == EQUIPMENT_SLOT_BACK && pCreator->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_HIDE_CLOAK))
+                                data << (uint32)0;
+                        else if (Item const *item = pCreator->GetItemByPos(INVENTORY_SLOT_BAG_0, *itr))
+                                data << (uint32)item->GetProto()->DisplayInfoID;
+                        else
+                                data << (uint32)0;
+                }
+        }
+        else
+        {
+                // Skip player data for creatures
+                data << (uint32)0;
+                data << (uint32)0;
+                data << (uint32)0;
+                data << (uint32)0;
+                data << (uint32)0;
+                data << (uint32)0;
+                data << (uint32)0;
+                data << (uint32)0;
+                data << (uint32)0;
+                data << (uint32)0;
+                data << (uint32)0;
+                data << (uint32)0;
+                data << (uint32)0;
+                data << (uint32)0;
+        }
+        SendPacket( &data );
 }


MaxXx2021 24.03.2010 05:44

Цитата:

Сообщение от SeT (Сообщение 2999)
Код:

+void WorldSession::HandleMirrrorImageDataRequest( WorldPacket & recv_data )
+{
+        sLog.outDebug("WORLD: CMSG_GET_MIRRORIMAGE_DATA");
+        uint64 guid;
+        recv_data >> guid;
+
+        // Get unit for which data is needed by client
+        Unit *unit = ObjectAccessor::GetObjectInWorld(guid, (Unit*)NULL);
+        if(!unit)
+                return;
+        // Get creator of the unit
+        Unit *creator = ObjectAccessor::GetObjectInWorld(unit->GetCreatorGUID(),(Unit*)NULL);
+        if (!creator)
+                return;
+        WorldPacket data(SMSG_MIRRORIMAGE_DATA, 68);
+        data << (uint64)guid;
+        data << (uint32)creator->GetDisplayId();
+        if (creator->GetTypeId() == TYPEID_PLAYER)
+        {
+                Player * pCreator = (Player *)creator;
+                data << (uint8)pCreator->getRace();
+                data << (uint8)pCreator->getGender();
+                data << (uint8)pCreator->getClass();
+                data << (uint8)pCreator->GetByteValue(PLAYER_BYTES, 0); // skin
+
+                data << (uint8)pCreator->GetByteValue(PLAYER_BYTES, 1); // face
+                data << (uint8)pCreator->GetByteValue(PLAYER_BYTES, 2); // hair
+                data << (uint8)pCreator->GetByteValue(PLAYER_BYTES, 3); // haircolor
+                data << (uint8)pCreator->GetByteValue(PLAYER_BYTES_2, 0); // facialhair
+
+                data << (uint32)pCreator->GetGuildId();  // unk
+                static const EquipmentSlots ItemSlots[] =
+                {
+                        EQUIPMENT_SLOT_HEAD,
+                        EQUIPMENT_SLOT_SHOULDERS,
+                        EQUIPMENT_SLOT_BODY,
+                        EQUIPMENT_SLOT_CHEST,
+                        EQUIPMENT_SLOT_WAIST,
+                        EQUIPMENT_SLOT_LEGS,
+                        EQUIPMENT_SLOT_FEET,
+                        EQUIPMENT_SLOT_WRISTS,
+                        EQUIPMENT_SLOT_HANDS,
+                        EQUIPMENT_SLOT_BACK,
+                        EQUIPMENT_SLOT_TABARD,
+                        EQUIPMENT_SLOT_END
+                };
+                // Display items in visible slots
+                for (EquipmentSlots const* itr = &ItemSlots[0]; *itr!=EQUIPMENT_SLOT_END; ++itr)
+                {
+                        if (*itr == EQUIPMENT_SLOT_HEAD && pCreator->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_HIDE_HELM))
+                                data << (uint32)0;
+                        else if (*itr == EQUIPMENT_SLOT_BACK && pCreator->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_HIDE_CLOAK))
+                                data << (uint32)0;
+                        else if (Item const *item = pCreator->GetItemByPos(INVENTORY_SLOT_BAG_0, *itr))
+                                data << (uint32)item->GetProto()->DisplayInfoID;
+                        else
+                                data << (uint32)0;
+                }
+        }
+        else
+        {
+                // Skip player data for creatures
+                data << (uint32)0;
+                data << (uint32)0;
+                data << (uint32)0;
+                data << (uint32)0;
+                data << (uint32)0;
+                data << (uint32)0;
+                data << (uint32)0;
+                data << (uint32)0;
+                data << (uint32)0;
+                data << (uint32)0;
+                data << (uint32)0;
+                data << (uint32)0;
+                data << (uint32)0;
+                data << (uint32)0;
+        }
+        SendPacket( &data );
 }


Звание так? GetTitle() или GetTitleId() ?

Nordway 24.03.2010 11:01

Вложений: 2
Сегодня собрал с Мангос 9611 (не чистые) и SD2 1647 (не чистый) старую версию, т.е. без пункта 5. Теперь копируется имя и гильдия. (Спасибо Set).

При появлении нпс реагриует только на вражеских мобов, а так же:
- не ходят за мной;
- не атакуют мою цель.

Видел, что об этих багах писали выше, но в первом посте они значатся как "поправленные".

Скрины прилагаются.

GriffonHeart 24.03.2010 16:49

Ошибка
Цитата:

2010-03-24 21:47:43 ERROR:Table `spell_script_target`: spellId 58836 listed for TargetEntry 31216 does not have any implicit target TARGET_SCRIPT(38) or TARGET_SCRIPT_COORDINATES (46) or TARGET_FOCUS_OR_SCRIPTED_GAMEOBJECT (40).

MaxXx2021 25.03.2010 03:53

Цитата:

Сообщение от Nordway (Сообщение 3014)
Сегодня собрал с Мангос 9611 (не чистые) и SD2 1647 (не чистый) старую версию, т.е. без пункта 5. Теперь копируется имя и гильдия. (Спасибо Set).

При появлении нпс реагриует только на вражеских мобов, а так же:
- не ходят за мной;
- не атакуют мою цель.

Видел, что об этих багах писали выше, но в первом посте они значатся как "поправленные".

Скрины прилагаются.

Второй пост поставили в SD2 ?


Текущее время: 22:32. Часовой пояс GMT +3.

ru-mangos.ru - Русское сообщество MaNGOS