|
Патчи Если кто-то хочет выложить не свой готовый патч - не забудьте указать автора и источник.
Если кто-то хочет задать вопрос по патчу - велкам. |
|
Опции темы | Поиск в этой теме | Опции просмотра |
12.05.2010, 14:46 | #1 |
Ученый
Регистрация: 15.03.2010
Сообщений: 261
Сказал(а) спасибо: 84
Поблагодарили 257 раз(а) в 96 сообщениях
|
[patch/dev] Невидимость vs магия
Достаточно давно роги (они же Разбойники) (и друиды тоже) стали жаловаться, что при уходе, например в "ванишу" (оно же Исчезновение), в них всё равно прилетает спел, если он наносит урон моментально. В итоге с помощью Чародейской вспышки или Чародейских стрел (особенно любимый магами спел для того чтобы мучать разбойников.
В данный момент стот ревизия 9880 и проблема всё ещё есть. По-моему вот этот участок кода в spell.cpp должен отвечать за это дело Код:
// update pointers base at GUIDs to prevent access to non-existed already object UpdatePointers(); // cancel at lost main target unit if(!m_targets.getUnitTarget() && m_targets.getUnitTargetGUID() && m_targets.getUnitTargetGUID() != m_caster->GetGUID()) { cancel(); m_caster->DecreaseCastCounter(); SetExecutedCurrently(false); return; } У кого-то есть другие идеи по реализации? Пишите, пока я не начал реализацию того, что задумал Ещё есть вариант поработать с этой функцией Код:
void SpellCastTargets::Update(Unit* caster) { m_GOTarget = !m_GOTargetGUID.IsEmpty() ? caster->GetMap()->GetGameObject(m_GOTargetGUID) : NULL; m_unitTarget = !m_unitTargetGUID.IsEmpty() ? ( m_unitTargetGUID == caster->GetObjectGuid() ? caster : ObjectAccessor::GetUnit(*caster, m_unitTargetGUID) ) : NULL; m_itemTarget = NULL; if(caster->GetTypeId() == TYPEID_PLAYER) { if(m_targetMask & TARGET_FLAG_ITEM) m_itemTarget = ((Player*)caster)->GetItemByGuid(m_itemTargetGUID); else if(m_targetMask & TARGET_FLAG_TRADE_ITEM) { Player* pTrader = ((Player*)caster)->GetTrader(); if(pTrader && m_itemTargetGUID.GetRawValue() < TRADE_SLOT_COUNT) m_itemTarget = pTrader->GetItemByPos(pTrader->GetItemPosByTradeSlot(uint32(m_itemTargetGUID.GetRawValue()))); } if(m_itemTarget) m_itemTargetEntry = m_itemTarget->GetEntry(); } } Код:
diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index fd69f8d..cba440c 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -188,6 +188,10 @@ void SpellCastTargets::Update(Unit* caster) ( m_unitTargetGUID == caster->GetObjectGuid() ? caster : ObjectAccessor::GetUnit(*caster, m_unitTargetGUID) ) : NULL; + if (m_unitTarget && m_unitTargetGUID != caster->GetObjectGuid() && + !m_unitTarget->isVisibleForOrDetect(caster, caster, false)) + m_unitTarget = NULL; + m_itemTarget = NULL; if(caster->GetTypeId() == TYPEID_PLAYER) { Код:
// for delayed spells ignore not visible explicit target if (m_spellInfo->speed > 0.0f && unit == m_targets.getUnitTarget() && !unit->isVisibleForOrDetect(m_caster, m_caster, false)) { realCaster->SendSpellMiss(unit, m_spellInfo->Id, SPELL_MISS_EVADE); ResetEffectDamageAndHeal(); return; } Поставлю на игровой сервер, посмотрим что ещё найдут :P Последний раз редактировалось Insider42; 12.05.2010 в 16:44. |
12.05.2010, 18:06 | #2 |
MaNGOS Dev
Регистрация: 09.03.2010
Сообщений: 33
Сказал(а) спасибо: 27
Поблагодарили 26 раз(а) в 11 сообщениях
|
SpellCastTargets::Update - может зря туда? Update в нескольких местах используется..
if(!m_targets.getUnitTarget() && m_targets.getUnitTargetGUID() && m_targets.getUnitTargetGUID() != m_caster->GetGUID()) может туда уже добавить как еще одно условие ? а не просто обнулять unitTarget? |
12.05.2010, 18:56 | #3 | ||
Ученый
Регистрация: 15.03.2010
Сообщений: 261
Сказал(а) спасибо: 84
Поблагодарили 257 раз(а) в 96 сообщениях
|
Цитата:
Цитата:
Нам же нужно прервать заклинание именно в тот момент когда цель стала недоступна Последний раз редактировалось Insider42; 12.05.2010 в 19:03. |
||
13.05.2010, 04:25 | #4 |
Гость
Сообщений: n/a
|
логично то логично, но этот баг есть и на офе. близы пытались его фиксить во времена траев ик-ивк, но безуспешно
|
13.05.2010, 20:31 | #5 |
WowCore Dev
Регистрация: 11.03.2010
Сообщений: 112
Сказал(а) спасибо: 10
Поблагодарили 51 раз(а) в 25 сообщениях
|
|
15.05.2010, 22:59 | #6 |
Ученый
Регистрация: 15.03.2010
Сообщений: 261
Сказал(а) спасибо: 84
Поблагодарили 257 раз(а) в 96 сообщениях
|
С патчем в первом посте проблема:
Ловушки охотников при попадании в них невидимых разбойников - прерываются, в прямом смысле слова. Загвоздка в том, что m_spellinfo нельзя (или я незнаю как) вызвать из функции, которую меняет патч, так возможно бы сделал исключение... Новая версия патча в более корректном месте Код:
diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index 16fd1f4..8a59d86 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -3109,6 +3105,9 @@ void Spell::update(uint32 difftime) { if(m_timer) { + if (m_targets.getUnitTarget() && !m_targets.getUnitTarget()->isVisibleForOrDetect(m_caster, m_caster, false)) + cancel(); + if(difftime >= m_timer) m_timer = 0; else Пожалуй, это окончательная версия Последний раз редактировалось Insider42; 16.05.2010 в 13:43. |
Пользователь сказал cпасибо: |
15.06.2010, 09:16 | #7 |
Ученый
Регистрация: 15.03.2010
Сообщений: 261
Сказал(а) спасибо: 84
Поблагодарили 257 раз(а) в 96 сообщениях
|
Нашёл баг в предыдущей версии патча, из-за которого некоторые невидимые НПС, такие как Хранители душ на БГ, иногда не воскрешали игроков
Новая версия патча не должна иметь данной проблемы, там всего лишь нехватало проверки на IsAlive, ведь мертвый по определению невидим. Код:
diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index 16fd1f4..8a59d86 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -3109,6 +3105,9 @@ void Spell::update(uint32 difftime) { if(m_timer) { + if (m_targets.getUnitTarget() && m_targets.getUnitTarget()->isAlive() && !m_targets.getUnitTarget()->isVisibleForOrDetect(m_caster, m_caster, false)) + cancel(); + if(difftime >= m_timer) m_timer = 0; else Последний раз редактировалось Insider42; 15.06.2010 в 10:46. |
2 пользователя(ей) сказали cпасибо: | KiriX (15.06.2010) |