Ru-MaNGOS

Вернуться   Ru-MaNGOS > Ядро > Патчи > Отвергнутые патчи

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

Отвергнутые патчи Патчи, отвергнутые от приёма в GIT

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 23.04.2010, 14:01   #1
Insider42
Ученый
 
Регистрация: 15.03.2010
Сообщений: 261
Сказал(а) спасибо: 84
Поблагодарили 257 раз(а) в 96 сообщениях
Insider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранита
По умолчанию [crash fix] Aura::PeriodicTick

Оригинальная тема тут http://getmangos.com/community/showthread.php?13636

Тут не проверяется есть ли цель в игре, по-моему более правильно ничего не делать с целью которая находится вне игры. По крайней мере ниразу не слышал от игроков с оффа чтобы что-то происходило с их персонажами когда они вышли из игры+их персонаж выгрузился из мира (как уже было обнаружено, на оффе персонаж ещё некоторое время стоит в игре после того как игрок уже вышел из игры. Возможно это происходит только если он был в бою).

Код:
diff --git a/src/game/SpellAuras.cpp b/src/game/SpellAuras.cpp
index 59b037f..d9af2ae 100644
--- a/src/game/SpellAuras.cpp
+++ b/src/game/SpellAuras.cpp
@@ -7284,13 +7284,32 @@ void Aura::PeriodicTick()
 {
     switch(m_modifier.m_auraname)
     {
+        // don't do anything to target that isn't in world or dead, possible death persistent effects
         case SPELL_AURA_PERIODIC_DAMAGE:
         case SPELL_AURA_PERIODIC_DAMAGE_PERCENT:
-        {
-            // don't damage target if not alive, possible death persistent effects
-            if (!m_target->isAlive())
+        case SPELL_AURA_PERIODIC_LEECH:
+        case SPELL_AURA_PERIODIC_HEALTH_FUNNEL:
+        case SPELL_AURA_PERIODIC_HEAL:
+        case SPELL_AURA_OBS_MOD_HEALTH:
+        case SPELL_AURA_PERIODIC_MANA_LEECH:
+        case SPELL_AURA_POWER_BURN_MANA:
+        case SPELL_AURA_PERIODIC_ENERGIZE:
+        case SPELL_AURA_OBS_MOD_MANA:
+        case SPELL_AURA_MOD_REGEN:
+        case SPELL_AURA_MOD_POWER_REGEN:
+            if (!m_target || !m_target->IsInWorld() || !m_target->isAlive())
                 return;
+            break;
+        default:
+            break;
+    }
 
+    switch(m_modifier.m_auraname)
+    {
+        case SPELL_AURA_PERIODIC_DAMAGE:
+        case SPELL_AURA_PERIODIC_DAMAGE_PERCENT:
+        {
             Unit *pCaster = GetCaster();
             if(!pCaster)
                 return;
@@ -7427,10 +7446,6 @@ void Aura::PeriodicTick()
         case SPELL_AURA_PERIODIC_LEECH:
         case SPELL_AURA_PERIODIC_HEALTH_FUNNEL:
         {
-            // don't damage target if not alive, possible death persistent effects
-            if (!m_target->isAlive())
-                return;
-
             Unit *pCaster = GetCaster();
             if(!pCaster)
                 return;
@@ -7516,10 +7531,6 @@ void Aura::PeriodicTick()
         case SPELL_AURA_PERIODIC_HEAL:
         case SPELL_AURA_OBS_MOD_HEALTH:
         {
-            // don't heal target if not alive, mostly death persistent effects from items
-            if (!m_target->isAlive())
-                return;
-
             Unit *pCaster = GetCaster();
             if(!pCaster)
                 return;
@@ -7618,10 +7629,6 @@ void Aura::PeriodicTick()
         }
         case SPELL_AURA_PERIODIC_MANA_LEECH:
         {
-            // don't damage target if not alive, possible death persistent effects
-            if (!m_target->isAlive())
-                return;
-
             if(m_modifier.m_miscvalue < 0 || m_modifier.m_miscvalue >= MAX_POWERS)
                 return;
 
@@ -7695,10 +7702,6 @@ void Aura::PeriodicTick()
         }
         case SPELL_AURA_PERIODIC_ENERGIZE:
         {
-            // don't energize target if not alive, possible death persistent effects
-            if (!m_target->isAlive())
-                return;
-
             // ignore non positive values (can be result apply spellmods to aura damage
             uint32 pdamage = m_modifier.m_amount > 0 ? m_modifier.m_amount : 0;
 
@@ -7724,10 +7727,6 @@ void Aura::PeriodicTick()
         }
         case SPELL_AURA_OBS_MOD_MANA:
         {
-            // don't energize target if not alive, possible death persistent effects
-            if (!m_target->isAlive())
-                return;
-
             // ignore non positive values (can be result apply spellmods to aura damage
             uint32 amount = m_modifier.m_amount > 0 ? m_modifier.m_amount : 0;
 
@@ -7750,10 +7749,6 @@ void Aura::PeriodicTick()
         }
         case SPELL_AURA_POWER_BURN_MANA:
         {
-            // don't mana burn target if not alive, possible death persistent effects
-            if (!m_target->isAlive())
-                return;
-
             Unit *pCaster = GetCaster();
             if(!pCaster)
                 return;
@@ -7800,10 +7795,6 @@ void Aura::PeriodicTick()
         }
         case SPELL_AURA_MOD_REGEN:
         {
-            // don't heal target if not alive, possible death persistent effects
-            if (!m_target->isAlive())
-                return;
-
             int32 gain = m_target->ModifyHealth(m_modifier.m_amount);
             if (Unit *caster = GetCaster())
                 m_target->getHostileRefManager().threatAssist(caster, float(gain) * 0.5f, GetSpellProto());
@@ -7811,10 +7802,6 @@ void Aura::PeriodicTick()
         }
         case SPELL_AURA_MOD_POWER_REGEN:
         {
-            // don't energize target if not alive, possible death persistent effects
-            if (!m_target->isAlive())
-                return;
-
             Powers pt = m_target->getPowerType();
             if(int32(pt) != m_modifier.m_miscvalue)
                 return;
Вынес в отдельный switch для обобщения условия

Последний раз редактировалось Insider42; 24.04.2010 в 20:54.
Insider42 вне форума   Ответить с цитированием
4 пользователя(ей) сказали cпасибо:
Feel the Power (23.04.2010), PSZ (23.04.2010)
Старый 23.04.2010, 16:55   #2
Insider42
Ученый
 
Регистрация: 15.03.2010
Сообщений: 261
Сказал(а) спасибо: 84
Поблагодарили 257 раз(а) в 96 сообщениях
Insider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранита
По умолчанию

добавил проверку "есть ли вообще" цель. Патч обновлен
Insider42 вне форума   Ответить с цитированием
Пользователь сказал cпасибо:
Старый 23.04.2010, 20:11   #3
Vladimir
MaNGOS Dev
 
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 438 раз(а) в 181 сообщениях
Vladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небес
По умолчанию

Цитата:
if (!m_target
Чистой воды хак: m_target не может быть NULL без бага - m_target - это наком наложена аура и аура удаляется раньше чем сам носитель, _всегда_

Цитата:
!m_target->IsInWorld()
Хак. Обновление ауры не вызывается для юнитов вне мира, так как обновление вызывается для карты включая играков.

Конечно это все в чистом мангосе.
__________________
Так как устал объяснять знайте ICQ не пользуюсь
Vladimir вне форума   Ответить с цитированием
Старый 23.04.2010, 20:33   #4
Insider42
Ученый
 
Регистрация: 15.03.2010
Сообщений: 261
Сказал(а) спасибо: 84
Поблагодарили 257 раз(а) в 96 сообщениях
Insider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранита
По умолчанию

Но ведь этот краш происходит и на чистом мангосе ... где-то явно бага закопалась

Как можно отследить?
Insider42 вне форума   Ответить с цитированием
Старый 23.04.2010, 23:11   #5
Vladimir
MaNGOS Dev
 
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 438 раз(а) в 181 сообщениях
Vladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небес
По умолчанию

ну как всегда - поймать в отладчике и отследить причину если получится...
__________________
Так как устал объяснять знайте ICQ не пользуюсь
Vladimir вне форума   Ответить с цитированием
Старый 24.04.2010, 14:02   #6
Mr.Grom
Пользователь
 
Аватар для Mr.Grom
 
Регистрация: 08.03.2010
Сообщений: 43
Сказал(а) спасибо: 1
Поблагодарили 1 раз в 1 сообщении
Mr.Grom На верном пути
По умолчанию

Может одна проверка на 11 аур меньше грузит ядро чем 11 проверок на 11 аур?
Так же можно попробовать и с проверками
Код:
             Unit *pCaster = GetCaster();
             if(!pCaster)
                 return;
В патче 1 строка повтор.
Код:
+        case SPELL_AURA_POWER_BURN_MANA:

Последний раз редактировалось Mr.Grom; 24.04.2010 в 14:30.
Mr.Grom вне форума   Ответить с цитированием
Старый 24.04.2010, 14:23   #7
Insider42
Ученый
 
Регистрация: 15.03.2010
Сообщений: 261
Сказал(а) спасибо: 84
Поблагодарили 257 раз(а) в 96 сообщениях
Insider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранита
По умолчанию

Цитата:
Сообщение от Mr.Grom Посмотреть сообщение
Может одна проверка на 11 аур меньше грузит ядро чем 11 проверок на 11 аур?
обрабатываться будет точно также, просто меньше хлама.
Insider42 вне форума   Ответить с цитированием
Старый 24.04.2010, 20:42   #8
Vladimir
MaNGOS Dev
 
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 438 раз(а) в 181 сообщениях
Vladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небес
По умолчанию

у вас 2 раза select - что не одно тоже что один - что медленнее (хотя этот и не сильная разница), но что более неприятно - можно забыть добавить проверку когда будет добавляться новый вариант в отсновной выбор.
__________________
Так как устал объяснять знайте ICQ не пользуюсь
Vladimir вне форума   Ответить с цитированием
Ответ


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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[10996] Move set max original aura stack cases to aura holder creating newsbot CMaNGOS Commits 0 10.01.2011 16:03
[10584] Prevent lost aura connection with item at Aura::ReapplyAffectedPassiveAuras newsbot CMaNGOS Commits 0 07.10.2010 02:19
[10400] Fixed crash in .aura command for spell without auras. newsbot CMaNGOS Commits 0 22.08.2010 16:00
Crash с инстами ice74 Баг-репорты 12 20.05.2010 12:11
[Crash?] удаление GO zergtmn Баг-репорты 0 29.04.2010 22:31


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


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