Ru-MaNGOS

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

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

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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 07.12.2010, 00:05   #1
PSZ
Ученый
 
Регистрация: 07.03.2010
Сообщений: 138
Сказал(а) спасибо: 200
Поблагодарили 143 раз(а) в 49 сообщениях
PSZ Обладатель прекрасной аурыPSZ Обладатель прекрасной ауры
По умолчанию [patch] Target pair (22, 7)

Спеллов с таргет-парой (22, 7) около 1000. Причем если TargetB=7, то TargetA - только 22. Других вариантов в Spell.dbc для 3.3.5a не существует. Очевидно, что если используется такая пара - то целью должен быть только какой-то специфический моб (или мобы), а не все вокруг. (Пример - Берсерк у Сартариона - 61632 - должен накладываться только на драконов-аддов). Делаем, чтобы список целей для этой пары брался из spell_script_target.
Код:
diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp
index ba62af4..1ede0a5 100644
--- a/src/game/Spell.cpp
+++ b/src/game/Spell.cpp
@@ -1992,8 +1992,38 @@ void Spell::SetTargetMap(SpellEffectIndex effIndex, uint32 targetMode, UnitList&
             // Select friendly targets for positive effect
             if (IsPositiveEffect(m_spellInfo->Id, effIndex))
                 targetB = SPELL_TARGETS_FRIENDLY;
+            if (m_spellInfo->EffectImplicitTargetA[effIndex] == TARGET_CASTER_COORDINATES)
+            {
+                FillAreaTargets(targetUnitMap,m_caster->GetPositionX(), m_caster->GetPositionY(),radius, PUSH_DEST_CENTER, SPELL_TARGETS_ALL);
+
+                if (targetUnitMap.empty())
+                    break;
 
-            FillAreaTargets(targetUnitMap, m_caster->GetPositionX(), m_caster->GetPositionY(), radius, PUSH_DEST_CENTER, targetB);
+                SpellScriptTargetBounds bounds = sSpellMgr.GetSpellScriptTargetBounds(m_spellInfo->Id);
+                if (bounds.first != bounds.second)
+                {
+                    for (UnitList::const_iterator itr = targetUnitMap.begin(),next; itr != targetUnitMap.end(); itr = next)
+                    {
+                        bool found = false;
+                        if (!(*itr)) 
+                            continue;
+
+                        next = itr;
+                        ++next;
+
+                        for (SpellScriptTarget::const_iterator i_spellST = bounds.first; i_spellST != bounds.second; ++i_spellST)
+                        {
+                            if (i_spellST->second.targetEntry == (*itr)->GetEntry())
+                                found = true;
+                        }
+
+                        if (!found)
+                            targetUnitMap.remove(*itr);
+                    }
+                }
+            }
+            else
+                FillAreaTargets(targetUnitMap, m_caster->GetPositionX(), m_caster->GetPositionY(), radius, PUSH_DEST_CENTER, targetB);
 
             // exclude caster
             targetUnitMap.remove(m_caster);
@@ -4908,13 +4938,14 @@ SpellCastResult Spell::CheckCast(bool strict)
                (m_spellInfo->EffectImplicitTargetB[j] == TARGET_SCRIPT && m_spellInfo->EffectImplicitTargetA[j] != TARGET_SELF) ||
                m_spellInfo->EffectImplicitTargetA[j] == TARGET_SCRIPT_COORDINATES ||
                m_spellInfo->EffectImplicitTargetB[j] == TARGET_SCRIPT_COORDINATES ||
-               m_spellInfo->EffectImplicitTargetA[j] == TARGET_FOCUS_OR_SCRIPTED_GAMEOBJECT)
+               m_spellInfo->EffectImplicitTargetA[j] == TARGET_FOCUS_OR_SCRIPTED_GAMEOBJECT ||
+               m_spellInfo->EffectImplicitTargetB[j] == TARGET_AREAEFFECT_INSTANT)
             {
 
                 SpellScriptTargetBounds bounds = sSpellMgr.GetSpellScriptTargetBounds(m_spellInfo->Id);
 
                 if (bounds.first == bounds.second)
-                    sLog.outErrorDb("Spell (ID: %u) has effect EffectImplicitTargetA/EffectImplicitTargetB = TARGET_SCRIPT or TARGET_SCRIPT_COORDINATES, but does not have record in `spell_script_target`", m_spellInfo->Id);
+                    sLog.outErrorDb("Spell (ID: %u) has effect EffectImplicitTargetA/EffectImplicitTargetB = TARGET_SCRIPT or TARGET_SCRIPT_COORDINATES or EffectImplicitTargetB = TARGET_AREAEFFECT_INSTANT, but does not have record in `spell_script_target`", m_spellInfo->Id);
 
                 SpellRangeEntry const* srange = sSpellRangeStore.LookupEntry(m_spellInfo->rangeIndex);
                 float range = GetSpellMaxRange(srange);
@@ -6746,7 +6777,8 @@ bool Spell::CheckTarget( Unit* target, SpellEffectIndex eff )
             m_spellInfo->EffectImplicitTargetA[eff] != TARGET_SCRIPT &&
             m_spellInfo->EffectImplicitTargetB[eff] != TARGET_SCRIPT &&
             m_spellInfo->EffectImplicitTargetA[eff] != TARGET_AREAEFFECT_CUSTOM &&
-            m_spellInfo->EffectImplicitTargetB[eff] != TARGET_AREAEFFECT_CUSTOM )
+            m_spellInfo->EffectImplicitTargetB[eff] != TARGET_AREAEFFECT_CUSTOM &&
+            m_spellInfo->EffectImplicitTargetB[eff] != TARGET_AREAEFFECT_INSTANT)
             return false;
     }
 
diff --git a/src/game/SpellMgr.cpp b/src/game/SpellMgr.cpp
index b7b734b..12c2d79 100644
--- a/src/game/SpellMgr.cpp
+++ b/src/game/SpellMgr.cpp
@@ -3110,7 +3110,8 @@ void SpellMgr::LoadSpellScriptTarget()
                 spellProto->EffectImplicitTargetA[i] == TARGET_FOCUS_OR_SCRIPTED_GAMEOBJECT ||
                 spellProto->EffectImplicitTargetB[i] == TARGET_FOCUS_OR_SCRIPTED_GAMEOBJECT ||
                 spellProto->EffectImplicitTargetA[i] == TARGET_AREAEFFECT_CUSTOM ||
-                spellProto->EffectImplicitTargetB[i] == TARGET_AREAEFFECT_CUSTOM)
+                spellProto->EffectImplicitTargetB[i] == TARGET_AREAEFFECT_CUSTOM ||
+                spellProto->EffectImplicitTargetB[i] == TARGET_AREAEFFECT_INSTANT)
             {
                 targetfound = true;
                 break;
@@ -3118,7 +3119,7 @@ void SpellMgr::LoadSpellScriptTarget()
         }
         if (!targetfound)
         {
-            sLog.outErrorDb("Table `spell_script_target`: spellId %u listed for TargetEntry %u does not have any implicit target TARGET_SCRIPT(38) or TARGET_SCRIPT_COORDINATES (46) or TARGET_FOCUS_OR_SCRIPTED_GAMEOBJECT (40).", spellId, targetEntry);
+            sLog.outErrorDb("Table `spell_script_target`: spellId %u listed for TargetEntry %u does not have any implicit target TARGET_SCRIPT(38) or TARGET_SCRIPT_COORDINATES (46) or TARGET_FOCUS_OR_SCRIPTED_GAMEOBJECT (40) or targetB TARGET_AREAEFFECT_INSTANT (7).", spellId, targetEntry);
             continue;
         }
PSZ вне форума   Ответить с цитированием
2 пользователя(ей) сказали cпасибо:
Vinolentus (08.12.2010), Vladimir (09.12.2010)
Старый 07.12.2010, 18:29   #2
zergtmn
MaNGOS Dev
 
Аватар для zergtmn
 
Регистрация: 07.03.2010
Сообщений: 314
Сказал(а) спасибо: 30
Поблагодарили 153 раз(а) в 83 сообщениях
zergtmn Обладатель прекрасной аурыzergtmn Обладатель прекрасной ауры
По умолчанию

А проверка isAlive()?
А каст на non-selectable? (http://www.wowhead.com/spell=62488)
zergtmn вне форума   Ответить с цитированием
Старый 07.12.2010, 18:37   #3
PSZ
Ученый
 
Регистрация: 07.03.2010
Сообщений: 138
Сказал(а) спасибо: 200
Поблагодарили 143 раз(а) в 49 сообщениях
PSZ Обладатель прекрасной аурыPSZ Обладатель прекрасной ауры
По умолчанию

Эти спеллы могут кастоваться только на живых мобов? Получается, можно не обрабатывать тип цели (жив, мертв) в spell_script_target?
PSZ вне форума   Ответить с цитированием
Старый 07.12.2010, 19:02   #4
zergtmn
MaNGOS Dev
 
Аватар для zergtmn
 
Регистрация: 07.03.2010
Сообщений: 314
Сказал(а) спасибо: 30
Поблагодарили 153 раз(а) в 83 сообщениях
zergtmn Обладатель прекрасной аурыzergtmn Обладатель прекрасной ауры
По умолчанию

Ну задействовать колонку type.
zergtmn вне форума   Ответить с цитированием
Старый 07.12.2010, 19:53   #5
PSZ
Ученый
 
Регистрация: 07.03.2010
Сообщений: 138
Сказал(а) спасибо: 200
Поблагодарили 143 раз(а) в 49 сообщениях
PSZ Обладатель прекрасной аурыPSZ Обладатель прекрасной ауры
По умолчанию

Нет, я имею в виду, что если такие спеллы могут кастоваться только на живые цели, то колонку type можно вообще не обрабатывать (как это делается в TARGET_SCRIPT), а просто поставить проверку isAlive().
PSZ вне форума   Ответить с цитированием
Старый 07.12.2010, 20:07   #6
zergtmn
MaNGOS Dev
 
Аватар для zergtmn
 
Регистрация: 07.03.2010
Сообщений: 314
Сказал(а) спасибо: 30
Поблагодарили 153 раз(а) в 83 сообщениях
zergtmn Обладатель прекрасной аурыzergtmn Обладатель прекрасной ауры
По умолчанию

И на мертвых могут. Сразу вспоминается http://ru.wowhead.com/spell=43723
zergtmn вне форума   Ответить с цитированием
Старый 07.12.2010, 21:10   #7
PSZ
Ученый
 
Регистрация: 07.03.2010
Сообщений: 138
Сказал(а) спасибо: 200
Поблагодарили 143 раз(а) в 49 сообщениях
PSZ Обладатель прекрасной аурыPSZ Обладатель прекрасной ауры
По умолчанию

Тогда не понял, где нужна проверка isAlive? Типы целей берутся из spell_script_target и обрабатываются в CheckCast (после коммента // Database based targets from spell_target_script).
PSZ вне форума   Ответить с цитированием
Старый 08.12.2010, 18:05   #8
PSZ
Ученый
 
Регистрация: 07.03.2010
Сообщений: 138
Сказал(а) спасибо: 200
Поблагодарили 143 раз(а) в 49 сообщениях
PSZ Обладатель прекрасной аурыPSZ Обладатель прекрасной ауры
По умолчанию

Тема закрыта.
https://github.com/mangos/mangos/com...8ecbdb96e4e532
Правда, я делал, что если записи в таблице нету - спелл не кастанется. NoFantasy решил по-другому.
PSZ вне форума   Ответить с цитированием
Старый 09.12.2010, 01:13   #9
Vladimir
MaNGOS Dev
 
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 438 раз(а) в 181 сообщениях
Vladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небес
По умолчанию

В любом случае спасибо за патч
__________________
Так как устал объяснять знайте ICQ не пользуюсь
Vladimir вне форума   Ответить с цитированием
Ответ


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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[10730] Check if Pet's target is a valid target (isTargetableForAttack) newsbot CMaNGOS Commits 0 17.11.2010 19:31
Invalid Target legend Флудильня 8 07.08.2010 23:23
[9949] Add target for TARGET_DUELVSPLAYER_COORDINATES only if not provided by another way. newsbot CMaNGOS Commits 0 22.05.2010 09:20
[9833] Allow TARGET_AREAEFFECT_CUSTOM to target invisible/not targetable npc if script target for th newsbot CMaNGOS Commits 4 04.05.2010 19:54
[9533] Use selected target for target mode 38/46 when provided. newsbot CMaNGOS Commits 0 06.03.2010 17:40


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


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