|
Патчи на рассмотрении Рассматриваемые к принятию патчи |
|
Опции темы | Поиск в этой теме | Опции просмотра |
13.05.2010, 09:52 | #1 |
MaNGOS Dev
Регистрация: 07.03.2010
Сообщений: 314
Сказал(а) спасибо: 30
Поблагодарили 153 раз(а) в 83 сообщениях
|
[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); } } В 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); 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.", |
17.05.2010, 21:23 | #2 | |
MaNGOS Dev
Регистрация: 07.03.2010
Сообщений: 314
Сказал(а) спасибо: 30
Поблагодарили 153 раз(а) в 83 сообщениях
|
Цитата:
|
|
18.05.2010, 22:12 | #3 |
Ученый
Регистрация: 15.03.2010
Сообщений: 261
Сказал(а) спасибо: 84
Поблагодарили 257 раз(а) в 96 сообщениях
|
Фикс в SpellAuras.cpp бажит Похищение жизни у чернокнижника, проверял 80ком в а5-а6 обвесе на свинках в дуротаре, оно то лечит то отнимает хп монстру, в итоге убить его так и не вышло с помощью похищения жизни...
Причем это происходит как и с первым рангом заклинаний, как и с последним. Также урон и лечение имеет некий "разброс", будто бы полный рандом. Последний раз редактировалось Insider42; 18.05.2010 в 22:56. |
18.05.2010, 23:21 | #4 |
MaNGOS Dev
Регистрация: 07.03.2010
Сообщений: 314
Сказал(а) спасибо: 30
Поблагодарили 153 раз(а) в 83 сообщениях
|
У меня не хилит, а просто урон иногда не правильно отображается в логе.
Это из-за проверки выше: Код:
if(m_target->GetHealth() < pdamage) pdamage = uint32(m_target->GetHealth()); Последний раз редактировалось zergtmn; 18.05.2010 в 23:31. |
19.05.2010, 04:17 | #5 |
MaNGOS Dev
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 438 раз(а) в 181 сообщениях
|
DealDamageMods добавлен в [9933]. Спасибо.
Проблема с переносом ProcDamageAndSpell после DealMeleeDamage в приведенно случая в том что мы _везде_ вызываем ProcDamageAndSpell пере применением урона. Насколько я помню на этом завязана работа части spell-proc кода в обрабочиках spell events. Т.е если менять то менять для всех случаев и просмотреть код обрабочиков на предмет неожиданностей - особенно так где проваеряются health...
__________________
Так как устал объяснять знайте ICQ не пользуюсь |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
[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 |