Ru-MaNGOS

Вернуться   Ru-MaNGOS > Ядро > Патчи > Патчи на рассмотрении

Важная информация

Патчи на рассмотрении Рассматриваемые к принятию патчи

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 13.05.2010, 09:52   #1
zergtmn
MaNGOS Dev
 
Аватар для zergtmn
 
Регистрация: 07.03.2010
Сообщений: 314
Сказал(а) спасибо: 30
Поблагодарили 153 раз(а) в 83 сообщениях
zergtmn Обладатель прекрасной аурыzergtmn Обладатель прекрасной ауры
По умолчанию [patch] Неверный порядок вызовов в Unit::AttackerStateUpdate

Рассмотрим пример:
Моб должен прикидываться мертвым при получении последнего удара. Для этого обычно используют следующий трюк:
Код:
void DamageTaken(Unit* pKiller, uint32 &damage)
{
    if (damage >= m_creature->GetHealth())
    {
        //prevent death
        damage = 0;
        m_bFakeDeath = true;

        m_creature->InterruptNonMeleeSpells(false);
        m_creature->SetHealth(0);
        m_creature->StopMoving();
        m_creature->ClearComboPointHolders();
        m_creature->RemoveAllAurasOnDeath();
        m_creature->ModifyAuraState(AURA_STATE_HEALTHLESS_20_PERCENT, false);
        m_creature->ModifyAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, false);
        m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
        m_creature->ClearAllReactives();
        m_creature->SetUInt64Value(UNIT_FIELD_TARGET,0);
        m_creature->GetMotionMaster()->Clear();
        m_creature->GetMotionMaster()->MoveIdle();
        m_creature->SetStandState(UNIT_STAND_STATE_DEAD);
        JustDied(pKiller);
    }
}
Несмотря на это, моб умирает, когда прок оружия (например, http://www.wowhead.com/spell=21084) наносит последний удар.

В Unit::AttackerStateUpdate увидел следующее:
Код:
     CalcDamageInfo damageInfo;
     CalculateMeleeDamage(pVictim, 0, &damageInfo, attType);
     // Send log damage message to client
1    DealDamageMods(pVictim,damageInfo.damage,&damageInfo.absorb);
     SendAttackStateUpdate(&damageInfo);
2    ProcDamageAndSpell(damageInfo.target, damageInfo.procAttacker, damageInfo.procVictim, damageInfo.procEx, damageInfo.damage, damageInfo.attackType);
3    DealMeleeDamage(&damageInfo,true);
1. В строке 1 вызывается DamageTaken для урона оружия, проходит проверка hp > damage, все нормально, absorb = 0.
2. В строке 2 прокает печать. Вызывается DamageTaken, выполняется проверка hp < damage, следовательно absorb = damage, моб прикидывается мертвым и выставляется hp = 0.
3. В строке 3 наносится урон оружия != 0, без абсорба, что добивает моба уже после того, как он прикинулся мертвым.

Надеюсь, понятно объяснил.
Как решение, предлагаю поменять местами строки 2 и 3. Возможно, это также предотвратит смерти в дуэлях.

Баг №2: для SPELL_AURA_PERIODIC_LEECH вообще не вызывается DealDamageMods.

Патч:
Код:
diff --git a/src/game/SpellAuras.cpp b/src/game/SpellAuras.cpp
index b4cdd90..d094379 100644
--- a/src/game/SpellAuras.cpp
+++ b/src/game/SpellAuras.cpp
@@ -7236,6 +7236,7 @@ void Aura::PeriodicTick()
             DETAIL_FILTER_LOG(LOG_FILTER_PERIODIC_AFFECTS, "PeriodicTick: %u (TypeId: %u) health leech of %u (TypeId: %u) for %u dmg inflicted by %u abs is %u",
                 GUID_LOPART(GetCasterGUID()), GuidHigh2TypeId(GUID_HIPART(GetCasterGUID())), m_target->GetGUIDLow(), m_target->GetTypeId(), pdamage, GetId(),absorb);
 
+            pCaster->DealDamageMods(m_target, pdamage, &absorb);
             pCaster->SendSpellNonMeleeDamageLog(m_target, GetId(), pdamage, GetSpellSchoolMask(GetSpellProto()), absorb, resist, false, 0, isCrit);
 
             float multiplier = GetSpellProto()->EffectMultipleValue[GetEffIndex()] > 0 ? GetSpellProto()->EffectMultipleValue[GetEffIndex()] : 1;
diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp
index 3b36892..a64c35c 100644
--- a/src/game/Unit.cpp
+++ b/src/game/Unit.cpp
@@ -2375,8 +2375,8 @@ void Unit::AttackerStateUpdate (Unit *pVictim, WeaponAttackType attType, bool ex
     // Send log damage message to client
     DealDamageMods(pVictim,damageInfo.damage,&damageInfo.absorb);
     SendAttackStateUpdate(&damageInfo);
-    ProcDamageAndSpell(damageInfo.target, damageInfo.procAttacker, damageInfo.procVictim, damageInfo.procEx, damageInfo.damage, damageInfo.attackType);
     DealMeleeDamage(&damageInfo,true);
+    ProcDamageAndSpell(damageInfo.target, damageInfo.procAttacker, damageInfo.procVictim, damageInfo.procEx, damageInfo.damage, damageInfo.attackType);
 
     if (GetTypeId() == TYPEID_PLAYER)
         DEBUG_LOG("AttackerStateUpdate: (Player) %u attacked %u (TypeId: %u) for %u dmg, absorbed %u, blocked %u, resisted %u.",
zergtmn вне форума   Ответить с цитированием
5 пользователя(ей) сказали cпасибо:
Den (06.01.2011), Insider42 (17.05.2010), Lightunit (18.05.2010), LordJZ (13.05.2010), Vladimir (19.05.2010)
Старый 17.05.2010, 21:23   #2
zergtmn
MaNGOS Dev
 
Аватар для zergtmn
 
Регистрация: 07.03.2010
Сообщений: 314
Сказал(а) спасибо: 30
Поблагодарили 153 раз(а) в 83 сообщениях
zergtmn Обладатель прекрасной аурыzergtmn Обладатель прекрасной ауры
По умолчанию

Цитата:
Возможно, это также предотвратит смерти в дуэлях.
Работает, смертей однозначно стало меньше.
zergtmn вне форума   Ответить с цитированием
3 пользователя(ей) сказали cпасибо:
Den (06.01.2011), Insider42 (17.05.2010), LordJZ (17.05.2010)
Старый 18.05.2010, 22:12   #3
Insider42
Ученый
 
Регистрация: 15.03.2010
Сообщений: 261
Сказал(а) спасибо: 84
Поблагодарили 257 раз(а) в 96 сообщениях
Insider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранита
По умолчанию

Фикс в SpellAuras.cpp бажит Похищение жизни у чернокнижника, проверял 80ком в а5-а6 обвесе на свинках в дуротаре, оно то лечит то отнимает хп монстру, в итоге убить его так и не вышло с помощью похищения жизни...
Причем это происходит как и с первым рангом заклинаний, как и с последним. Также урон и лечение имеет некий "разброс", будто бы полный рандом.

Последний раз редактировалось Insider42; 18.05.2010 в 22:56.
Insider42 вне форума   Ответить с цитированием
Старый 18.05.2010, 23:21   #4
zergtmn
MaNGOS Dev
 
Аватар для zergtmn
 
Регистрация: 07.03.2010
Сообщений: 314
Сказал(а) спасибо: 30
Поблагодарили 153 раз(а) в 83 сообщениях
zergtmn Обладатель прекрасной аурыzergtmn Обладатель прекрасной ауры
По умолчанию

У меня не хилит, а просто урон иногда не правильно отображается в логе.
Это из-за проверки выше:
Код:
if(m_target->GetHealth() < pdamage)
    pdamage = uint32(m_target->GetHealth());

Последний раз редактировалось zergtmn; 18.05.2010 в 23:31.
zergtmn вне форума   Ответить с цитированием
Старый 19.05.2010, 04:17   #5
Vladimir
MaNGOS Dev
 
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 438 раз(а) в 181 сообщениях
Vladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небес
По умолчанию

DealDamageMods добавлен в [9933]. Спасибо.

Проблема с переносом ProcDamageAndSpell после DealMeleeDamage в приведенно случая в том что мы _везде_ вызываем ProcDamageAndSpell пере применением урона.
Насколько я помню на этом завязана работа части spell-proc кода в обрабочиках spell events. Т.е если менять то менять для всех случаев и просмотреть код обрабочиков на предмет неожиданностей - особенно так где проваеряются health...
__________________
Так как устал объяснять знайте ICQ не пользуюсь
Vladimir вне форума   Ответить с цитированием
Ответ


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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[10900] Remove SPELL_AURA_MOD_POSSESS_PET auras in Unit::Uncharm() newsbot CMaNGOS Commits 0 21.12.2010 12:10
[10557] Add optionial arg to Unit::SetFacingTo which is passed to SendMessageToSet newsbot CMaNGOS Commits 0 29.09.2010 23:20
[10255] Fix aura remove in Unit:: _UpdateSpells newsbot CMaNGOS Commits 0 24.07.2010 13:00
[10212] Fix iterator update in Unit::RemoveNotOwnSingleTargetAuras newsbot CMaNGOS Commits 0 17.07.2010 21:40
[9926] Typos in Unit::DealDamageMods newsbot CMaNGOS Commits 0 18.05.2010 13:30


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


ru-mangos.ru - Русское сообщество MaNGOS
Главная цель проекта MaNGOS - обучающая, поэтому разрешается использовать исходный код и собранную программу только для образовательных целей.
Вы не можете использовать MaNGOS в коммерческих целях, а также не разрешается устанавливать публичные серверы на базе MaNGOS.
Любое копирование материалов, информации в любом виде без указания источника - форума Ru-MaNGOS будет считаться нарушением авторских прав и нарушением Уголовного Кодекса РФ, ст. 146 ст. 147.
Перевод vBulletin: zCarot