Ru-MaNGOS

Ru-MaNGOS (http://mangos.ytdb.ru/index.php)
-   Патчи на рассмотрении (http://mangos.ytdb.ru/forumdisplay.php?f=49)
-   -   [patch/dev][spell=1462]Знание зверя (http://mangos.ytdb.ru/showthread.php?t=3653)

virusav 05.02.2011 00:14

[patch/dev][spell=1462]Знание зверя
 
Вложений: 1
Спелл http://ru.wowhead.com/spell=1462 должен отображать подробности об нпц или игроке в формах животных только для кастера.

Патч:
Код:

diff --git a/src/game/Object.cpp b/src/game/Object.cpp
index 2dfa981..728555e 100644
--- a/src/game/Object.cpp
+++ b/src/game/Object.cpp
@@ -637,17 +637,45 @@ void Object::BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask *
                    *data << (m_uint32Values[index] & ~UNIT_FLAG_NOT_SELECTABLE);
                }
                // hide lootable animation for unallowed players
-                else if (index == UNIT_DYNAMIC_FLAGS && GetTypeId() == TYPEID_UNIT)
+                else if (index == UNIT_DYNAMIC_FLAGS)
                {
-                    if (!target->isAllowedToLoot((Creature*)this))
-                        *data << (m_uint32Values[index] & ~(UNIT_DYNFLAG_LOOTABLE | UNIT_DYNFLAG_TAPPED_BY_PLAYER));
-                    else
+                    uint32 appendValue = m_uint32Values[index];
+
+                    // checking SPELL_AURA_EMPATHY and caster
+                    if (((Unit*)this)->isAlive())
                    {
-                        // flag only for original loot recipent
-                        if (target->GetObjectGuid() == ((Creature*)this)->GetLootRecipientGuid())
-                            *data << m_uint32Values[index];
+                        bool bIsEmpathy = false;
+                        bool bIsCaster = false;
+                        Unit::AuraList const& mAuraEmpathy = ((Unit*)this)->GetAurasByType(SPELL_AURA_EMPATHY);
+                        for(Unit::AuraList::const_iterator i = mAuraEmpathy.begin(); i != mAuraEmpathy.end(); ++i)
+                        {
+                            bIsEmpathy = true;
+                            if ((*i)->GetCasterGuid() == target->GetObjectGuid())
+                            {
+                                bIsCaster = true;
+                                break;
+                            }
+                        }
+                        if (bIsEmpathy && !bIsCaster)
+                            appendValue &= ~UNIT_DYNFLAG_SPECIALINFO;
+                    }
+
+                    if (GetTypeId() == TYPEID_UNIT)
+                    {
+                        if (!target->isAllowedToLoot((Creature*)this))
+                            *data << (appendValue & ~(UNIT_DYNFLAG_LOOTABLE | UNIT_DYNFLAG_TAPPED_BY_PLAYER));
                        else
-                            *data << (m_uint32Values[index] & ~(UNIT_DYNFLAG_TAPPED | UNIT_DYNFLAG_TAPPED_BY_PLAYER));
+                        {
+                            // flag only for original loot recipent
+                            if (target->GetObjectGuid() == ((Creature*)this)->GetLootRecipientGuid())
+                                *data << appendValue;
+                            else
+                                *data << (appendValue & ~(UNIT_DYNFLAG_TAPPED | UNIT_DYNFLAG_TAPPED_BY_PLAYER));
+                        }
+                    }
+                    else
+                    {
+                        *data << appendValue;
                    }
                }
                else
diff --git a/src/game/SpellAuras.cpp b/src/game/SpellAuras.cpp
index bcedb01..dc89c6c 100644
--- a/src/game/SpellAuras.cpp
+++ b/src/game/SpellAuras.cpp
@@ -3066,6 +3066,14 @@ void Aura::HandleAuraModShapeshift(bool apply, bool Real)
 
    Unit *target = GetTarget();
 
+    // remove SPELL_AURA_EMPATHY
+    Unit::AuraList const& mAuraEmpathy = target->GetAurasByType(SPELL_AURA_EMPATHY);
+    for(Unit::AuraList::const_iterator i = mAuraEmpathy.begin(); i != mAuraEmpathy.end(); ++i)
+    {
+        target->RemoveAurasByCasterSpell((*i)->GetId(), (*i)->GetCasterGUID());
+        i = mAuraEmpathy.begin();
+    }
+
    SpellShapeshiftFormEntry const* ssEntry = sSpellShapeshiftFormStore.LookupEntry(form);
    if (!ssEntry)
    {
@@ -6475,12 +6483,10 @@ void Aura::HandleShapeshiftBoosts(bool apply)
 
 void Aura::HandleAuraEmpathy(bool apply, bool /*Real*/)
 {
-    if(GetTarget()->GetTypeId() != TYPEID_UNIT)
+    if (GetTarget()->GetTypeId() != TYPEID_UNIT && GetTarget()->GetTypeId() != TYPEID_PLAYER)
        return;
 
-    CreatureInfo const * ci = ObjectMgr::GetCreatureTemplate(GetTarget()->GetEntry());
-    if(ci && ci->type == CREATURE_TYPE_BEAST)
-        GetTarget()->ApplyModUInt32Value(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_SPECIALINFO, apply);
+    GetTarget()->ApplyModUInt32Value(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_SPECIALINFO, apply);
 }
 
 void Aura::HandleAuraUntrackable(bool apply, bool /*Real*/)

Код:

Creature Type Mask = 0x00000001 (BEAST)
Skill (Id 50) "Beast Mastery"


virusav 05.02.2011 10:27

Поправил патч, теперь спелл работает правильно на нпц и игроков, прикрепил патч к посту.

Вопросы:
1. Почему при наведении на игрока в формах кошки, медведя и т.д. урон и броня показывают 0, а сопротивления вообще не отображаются? Где находится обработка этого момента?
2. Каким образом можно определить формы нпц/игрока, на которые можно кастовать спелл, чтобы при смене формы снимать его, если это необходимо?

ZirO 06.02.2011 22:00

Цитата:

Сообщение от virusav (Сообщение 19032)
Вопросы:
2. Каким образом можно определить формы нпц/игрока, на которые можно кастовать спелл, чтобы при смене формы снимать его, если это необходимо?

Вот насчёт этого пункта. Последней его части. При смене формы друидом, например с Кошка на Медведь баф слетает. Тоесть любая смена формы у друида приводит к слёту бафа, не важно в какую он потом сразу прыгнет.. Медведь, ВОрон и тд..

RomanRom2 06.02.2011 23:30

Цитата:

Сообщение от virusav (Сообщение 19032)
2. Каким образом можно определить формы нпц/игрока, на которые можно кастовать спелл, чтобы при смене формы снимать его, если это необходимо?

очевидно, что по байту shapeshiftForm, это поле UNIT_FIELD_BYTES_1. но вообще где то в структуре юнита должны быть соответствующие свойства.

Цитата:

Сообщение от ZirO (Сообщение 19055)
Вот насчёт этого пункта. Последней его части. При смене формы друидом, например с Кошка на Медведь баф слетает. Тоесть любая смена формы у друида приводит к слёту бафа, не важно в какую он потом сразу прыгнет.. Медведь, ВОрон и тд..

а можно уточнить, какой баф слетает? все бафы слетают (не может быть)? наверное по флагам как то определяется, какие именно...

ZirO 07.02.2011 00:45

Цитата:

Сообщение от RomanRom2 (Сообщение 19062)
а можно уточнить, какой баф слетает? все бафы слетают (не может быть)? наверное по флагам как то определяется, какие именно...

Нет. Тут разговор только об обном бафе, который вешается при касте на игрока/НПЦ спелла Знание зверя. Хотя это работает так же и на замедляющие спеллы, когда в того же Друида в форме кота вешаешь замедление, то при переходе например в форму медведя, это замедление спадает. Этим часто на БГ игроки пользуются. Сам проверял, у меня друль есть, правда низкого уровня, но 2 формы есть Кот/Медведь.

virusav 09.02.2011 21:55

Обновил патч и вложение в первом посте: добавлено удаление аур SPELL_AURA_EMPATHY при смене форм.

На текущий момент остается проблема с отображением характеристик только об игроке:
1. Урон.
2. Броня.
3. Сопротивления.

Что за это отвечает?

virusav 30.07.2011 10:24

Возвращаемся к данной теме.
Каким образом можно получить информацию о сопротивлениях нпц/игрока (в UNIT_DYNFLAG_SPECIALINFO этого нет)?


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

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