Ru-MaNGOS

Ru-MaNGOS (http://mangos.ytdb.ru/index.php)
-   Патчи (http://mangos.ytdb.ru/forumdisplay.php?f=6)
-   -   [patch/dev] Earth Shield dispel (рассеивание Щита земли) (http://mangos.ytdb.ru/showthread.php?t=2914)

Insider42 14.11.2010 12:51

[patch/dev] Earth Shield dispel (рассеивание Щита земли)
 
Суть проблемы: не реализовано исправление патча 3.2.0a
Цитата:

- Щит земли: эффекты рассеивания теперь снимают заряды «Щита земли», а не саму ауру.
автор: я

исправляем сие недоразумение
Код:

diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp
index eade9ba..bdbb27d 100644
--- a/src/game/SpellEffects.cpp
+++ b/src/game/SpellEffects.cpp
@@ -4375,7 +4375,10 @@ void Spell::EffectDispel(SpellEffectIndex eff_idx)
                if (unitTarget->HasAura(50536))
                    continue;
 
-            dispel_list.push_back(std::pair<SpellAuraHolder* ,uint32>(holder, holder->GetStackAmount()));
+            if (holder->GetAuraCharges() > 1)
+                dispel_list.push_back(std::pair<SpellAuraHolder* ,uint32>(holder, holder->GetAuraCharges()));
+            else
+                dispel_list.push_back(std::pair<SpellAuraHolder* ,uint32>(holder, holder->GetStackAmount()));
        }
    }
    // Ok if exist some buffs for dispel try dispel it
diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp
index 1a6853f..7459723 100644
--- a/src/game/Unit.cpp
+++ b/src/game/Unit.cpp
@@ -4600,10 +4600,24 @@ void Unit::RemoveAuraHolderFromStack(uint32 spellId, int32 stackAmount, uint64 c
    {
        if (!casterGUID || iter->second->GetCasterGUID() == casterGUID)
        {
-            if (iter->second->ModStackAmount(-stackAmount))
+            if (iter->second->GetAuraCharges() > 1)
            {
-                RemoveSpellAuraHolder(iter->second, mode);
-                break;
+                while (stackAmount--)
+                {
+                    if (iter->second->DropAuraCharge())
+                    {
+                        RemoveSpellAuraHolder(iter->second, mode);
+                        break;
+                    }
+                }
+            }
+            else
+            {
+                if (iter->second->ModStackAmount(-stackAmount))
+                {
+                    RemoveSpellAuraHolder(iter->second, mode);
+                    break;
+                }
            }
        }
    }

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

LordJZ 14.11.2010 12:57

Диспел не со всех спеллов снимает один стак. С некоторых - все стаки сразу.

Добавлено: возможно зависит от того вредный или полезный спелл.

Insider42 14.11.2010 13:02

Вы заряды и стаки то не путайте.
А близы сделали хитрее. У них теперь все зарядовые позитивные спеллы (Внутренний огонь у пристов и т.д.) не могут быть сдиспелены, как раз таки кроме Щита земли. Видимо так они и обошли данный вопрос. А негативных зарядовых я вроде пока не видел, они в основной на стаках, нежели на зарядах основаны (Смертельный яд и т.д.)

Insider42 17.11.2010 21:12

кхм... упал вот с таким дампом
Код:

#0  Unit::RemoveAuraHolderFromStack (this=0xc693968, spellId=33151, stackAmount=0,
    casterGUID=0, mode=AURA_REMOVE_BY_DEFAULT) at ../../../src/game/Unit.cpp:4605
4605                if (iter->second->GetAuraCharges() > 0)
(gdb) bt full
#0  Unit::RemoveAuraHolderFromStack (this=0xc693968, spellId=33151, stackAmount=0,
    casterGUID=0, mode=AURA_REMOVE_BY_DEFAULT) at ../../../src/game/Unit.cpp:4605
No locals.
#1  0x084abf35 in Unit::ProcDamageAndSpellFor (this=0xc693968, isVictim=false,
    pTarget=0xc693968, procFlag=16384, procExtra=2, attType=BASE_ATTACK,
    procSpell=0xafcf8dc8, damage=3612) at ../../../src/game/Unit.cpp:10105
        removedSpells = {<std::_List_base<unsigned int,std::allocator<unsigned int> >> = {
    _M_impl = {<std::allocator<std::_List_node<unsigned int> >> = {<__gnu_cxx::new_allocator<std::_List_node<unsigned int> >> = {<No data fields>}, <No data fields>}, _M_node = {
        _M_next = 0x7a6be1c0, _M_prev = 0x7a6be1c0}}}, <No data fields>}
        procTriggered = {<std::_List_base<ProcTriggeredData,std::allocator<ProcTriggeredData> >> = {
    _M_impl = {<std::allocator<std::_List_node<ProcTriggeredData> >> = {<__gnu_cxx::new_allocator<std::_List_node<ProcTriggeredData> >> = {<No data fields>}, <No data fields>},
      _M_node = {_M_next = 0x7b4994f0, _M_prev = 0x75f34f20}}}, <No data fields>}
#2  0x084ac410 in Unit::ProcDamageAndSpell (this=0xc693968, pVictim=0xc693968,
    procAttacker=16384, procVictim=32768, procExtra=2, amount=3612, attType=BASE_ATTACK,
    procSpell=0xafcf8dc8) at ../../../src/game/Unit.cpp:5272
No locals.
#3  0x0842d3ba in Spell::DoAllEffectOnTarget (this=0x7b1ffd18, target=0x74b1c388)
    at ../../../src/game/Spell.cpp:1021
        addhealth = 3612
        absorb = 0

пока нет идей почему :/
или есть... у спелла charges - 1, быть может стоит искать спеллы у которых зарядов не > 0, а больше 1

Поправил 1 пост в связи с этим

Energy 17.11.2010 21:22

По крайней мере спеллстилится (а значит 99% что и диспеллится) щит земли целиком, все чарджи (заряды) сразу. Стакающихся диспелящихся БАФФОВ я не встречал, так же как и дебаффов с зарядами. Диспелл дебаффов всегда снимает 1 стак.

Insider42 17.11.2010 21:31

Цитата:

Сообщение от Energy (Сообщение 16330)
По крайней мере спеллстилится (а значит 99% что и диспеллится) щит земли целиком, все чарджи (заряды) сразу. Стакающихся диспелящихся БАФФОВ я не встречал, так же как и дебаффов с зарядами. Диспелл дебаффов всегда снимает 1 стак.

Как по-моему он должен работать (собственно с патчем и работает)
Спеллстил - ворует баф в целом
Диспел - рассеивает № зарядов (сколько бы снял эффектов)

Судя по всему зарядовых негативных реально не существует... это хорошо... хорошо что патч переделывать не придётся :)

Energy 18.11.2010 02:53

Кроме Earh Shield еще есть друидский хот. А вот он как раз стакающийся.. И насколько я знаю он диспеллится. И спеллстилится.
Завтра могу проверить и то и другое.

Insider42 18.11.2010 09:17

Цитата:

Сообщение от Energy (Сообщение 16338)
Кроме Earh Shield еще есть друидский хот. А вот он как раз стакающийся..

ок, тогда перечитайте пост №3 =))) точнее первое в нем предложение. Т.е. к данному патчу это вообще отношения не имеет

Energy 18.11.2010 17:09

Я заряды и стаки не путаю :)
Будем считать что пурж == диспелл.
Пурж снимает с вражеской цели 2 положительных эффекта.
Тестились друидский хот со _стаками_ (жизнецвет) и шаманский Щит земли (с чарджами)

Так вот пурж снимает 2 стака жизнецвета. В случае с щитом земли снимаются 2 заряда. То есть в данном случае заряды == стаки в плане диспелла. Странно, я почему-то считал что баффы с чарджами диспеллятся как один эффект.


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

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