|
Отвергнутые патчи Патчи, отвергнутые от приёма в GIT |
|
Опции темы | Поиск в этой теме | Опции просмотра |
07.12.2010, 00:05 | #1 |
Ученый
Регистрация: 07.03.2010
Сообщений: 138
Сказал(а) спасибо: 200
Поблагодарили 143 раз(а) в 49 сообщениях
|
[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; } |
2 пользователя(ей) сказали cпасибо: | Vinolentus (08.12.2010), Vladimir (09.12.2010) |
07.12.2010, 18:29 | #2 |
MaNGOS Dev
Регистрация: 07.03.2010
Сообщений: 314
Сказал(а) спасибо: 30
Поблагодарили 153 раз(а) в 83 сообщениях
|
А проверка isAlive()?
А каст на non-selectable? (http://www.wowhead.com/spell=62488) |
07.12.2010, 18:37 | #3 |
Ученый
Регистрация: 07.03.2010
Сообщений: 138
Сказал(а) спасибо: 200
Поблагодарили 143 раз(а) в 49 сообщениях
|
Эти спеллы могут кастоваться только на живых мобов? Получается, можно не обрабатывать тип цели (жив, мертв) в spell_script_target?
|
07.12.2010, 19:02 | #4 |
MaNGOS Dev
Регистрация: 07.03.2010
Сообщений: 314
Сказал(а) спасибо: 30
Поблагодарили 153 раз(а) в 83 сообщениях
|
Ну задействовать колонку type.
|
07.12.2010, 19:53 | #5 |
Ученый
Регистрация: 07.03.2010
Сообщений: 138
Сказал(а) спасибо: 200
Поблагодарили 143 раз(а) в 49 сообщениях
|
Нет, я имею в виду, что если такие спеллы могут кастоваться только на живые цели, то колонку type можно вообще не обрабатывать (как это делается в TARGET_SCRIPT), а просто поставить проверку isAlive().
|
07.12.2010, 20:07 | #6 |
MaNGOS Dev
Регистрация: 07.03.2010
Сообщений: 314
Сказал(а) спасибо: 30
Поблагодарили 153 раз(а) в 83 сообщениях
|
И на мертвых могут. Сразу вспоминается http://ru.wowhead.com/spell=43723
|
07.12.2010, 21:10 | #7 |
Ученый
Регистрация: 07.03.2010
Сообщений: 138
Сказал(а) спасибо: 200
Поблагодарили 143 раз(а) в 49 сообщениях
|
Тогда не понял, где нужна проверка isAlive? Типы целей берутся из spell_script_target и обрабатываются в CheckCast (после коммента // Database based targets from spell_target_script).
|
08.12.2010, 18:05 | #8 |
Ученый
Регистрация: 07.03.2010
Сообщений: 138
Сказал(а) спасибо: 200
Поблагодарили 143 раз(а) в 49 сообщениях
|
Тема закрыта.
https://github.com/mangos/mangos/com...8ecbdb96e4e532 Правда, я делал, что если записи в таблице нету - спелл не кастанется. NoFantasy решил по-другому. |
09.12.2010, 01:13 | #9 |
MaNGOS Dev
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 438 раз(а) в 181 сообщениях
|
В любом случае спасибо за патч
__________________
Так как устал объяснять знайте ICQ не пользуюсь |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
[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 |