Ru-MaNGOS

Ru-MaNGOS (http://mangos.ytdb.ru/index.php)
-   Принятые патчи (http://mangos.ytdb.ru/forumdisplay.php?f=5)
-   -   [10910] [fix] Spell::EffectQuestComplete (http://mangos.ytdb.ru/showthread.php?t=2144)

KiriX 16.08.2010 17:33

[10910] [fix] Spell::EffectQuestComplete
 
Сейчас разбирался с квестом и наткнулся на один спелл:
http://ru.wowhead.com/spell=31336
По логике спелла и данным с ВХ - данный спелл должен быть скастован НПС. Попробовал реализовать через EvemtAI, однако квест не засчитался. Механика квеста и самого спелла не позволяет сделать грамотно так, чтобы этот спелл кастовался игроком (квест может выполняться группой игроков (и должен), таргетов у НПС может быть несколько и не обязательно это будет игрок). Решил покопаться и понял.
Спелла 31336 имеет второй эффект - квест комплит и целью его должны стать цели: TARGET_ALL_ENEMY_IN_AREA. Почему же не происходит комплит?
Стал копать обработки и наткнулся на то, что для мангоса спеллы с комплитом кастует или только игрок или они не обрабатываются вообще, что неверно, учитывая указание цели в самом спелле.
Доработал обработчик следующим образом - тогда получается всё верно и есть страховка от ошибки если цель - не игрок:
PHP код:

diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp
index 096dae3
..70ea439 100644
--- a/src/game/SpellEffects.cpp
+++ b/src/game/SpellEffects.cpp
@@ -7182,10 +7182,10 @@ void Spell::EffectReputation(SpellEffectIndex eff_idx)
 
 
void Spell::EffectQuestComplete(SpellEffectIndex eff_idx)
 {
-    if(
m_caster->GetTypeId() != TYPEID_PLAYER)
+    if(
unitTarget->GetTypeId() != TYPEID_PLAYER)
         return;
 
-    
Player *_player = (Player*)m_caster;
+    
Player *_player = (Player*)unitTarget;
 
     
uint32 quest_id m_spellInfo->EffectMiscValue***91;eff_idx***93;;
     
_player->AreaExploredOrEventHappens(quest_id); 


Vinolentus 16.08.2010 18:38

Здорово. ;)
А случаев, когда кастер - игрок, чей квест должен завершиться, но цель - не игрок, быть не может?

KiriX 16.08.2010 19:02

Цитата:

Сообщение от Vinolentus (Сообщение 12697)
Здорово. ;)
А случаев, когда кастер - игрок, чей квест должен завершиться, но цель - не игрок, быть не может?

Не могу себе такого представить - это раз.
Два: неоднократно видел спеллы, завершающие квест, которые должны кастоваться НПС, но базе и скриптам приходится выёживаться вызывая каст спелла именно игроком именно из-за текущей реализации.
Три: цель не игроком быть не может, т.к. не игрок не может иметь квеста.

Vinolentus 16.08.2010 19:53

Ну почему же. Такое бы даже корректно работало раньше. Впрочем, подобных заклинаний нет, и, видимо, так быть не должно. ;)

virusav 16.08.2010 22:06

Было бы неплохо узнать, как поведет себя ядро с данным патчем в случае таких целей с данным эффектом:
http://ru.wowhead.com/spell=19719 - TARGET_SELF
http://ru.wowhead.com/spell=23658 - TARGET_SINGLE_FRIEND
http://ru.wowhead.com/spell=24875 - TARGET_DUELVSPLAYER
http://ru.wowhead.com/spell=25201 - TARGET_CASTER_COORDINATES, TARGET_AREAEFFECT_INSTANT
http://ru.wowhead.com/spell=30790 - TARGET_CASTER_COORDINATES, TARGET_ALL_ENEMY_IN_AREA
http://ru.wowhead.com/spell=31377 - TARGET_CASTER_COORDINATES, TARGET_ALL_FRIENDLY_UNITS_AROUND_CASTER
http://ru.wowhead.com/spell=44124 - TARGET_MASTER, TARGET_AREAEFFECT_PARTY

Для квеста на поимку Матиса есть спеллы:
http://ru.wowhead.com/spell=31336
http://ru.wowhead.com/spell=31337
http://ru.wowhead.com/spell=31339
http://ru.wowhead.com/spell=31377

Может, просто не тот спелл кастуется?
Нужен снифф.:)

KiriX 16.08.2010 22:14

Цели для комплита квеста будут определяться точно также как и при касте любого другого спелла с подобными целями.
Да и в любом случае - целью спелла должны быть именно те цели, которые указаны в спелле в дбц. Что-то я не часто вижу, чтобы в спеллах подменялись цели, которые указаны у них в дбц, почему же для этого эффекта делается исключение?

Спеллы для поимки Матиса:
В текущем варианте работы ядра все эти спеллы должны быть обязательно скастованы от игрока, что даже скриптом SD2 реализовать не так просто будет + ни один из приведённых спеллов не имеет для эффекта комплита цели self, что было бы логично если бы спелл должен был быть скастован игроком.

virusav 16.08.2010 22:18

31339 - TARGET_DUELVSPLAYER
Может, госсип? Тут уже нужна точная инфа по данному квесту.

KiriX 16.08.2010 22:26

Цитата:

Сообщение от virusav (Сообщение 12709)
31339 - TARGET_DUELVSPLAYER
Может, госсип? Тут уже нужна точная инфа по данному квесту.

Это всё равно сути не меняет. Почему для данного эффекта игнорируется цель и сущестует лишь одна цель: если кастер игрок - цель - кастер. Если кастре не игрок - эффект просто не обрабатывается, хотя срабатывал бы совершенно нормально, без костылей в ЭвентАИ типа "каст этого спелла целью".

KiriX 20.08.2010 11:00

Что разработчики скажут по поводу данного фикса?

tmuc 22.08.2010 16:01

Цитата:

Сообщение от Vinolentus (Сообщение 12697)
Здорово. ;)
А случаев, когда кастер - игрок, чей квест должен завершиться, но цель - не игрок, быть не может?

Есть такой случай.... http://www.wowhead.com/quest=12842
Вот пример квеста, когда игрок должен скастовать (использовать спелл - http://www.wowhead.com/spell=53428), но не на NPC или GO.... а на итем.....
не знаю как в мангосе, а в тринити последней ревизии данный квест невыполним (без ремонта ядра).
Вот сейчас чистое ядро мангоса откомпилю, посмотрим как там.
__________________________________________________ ______________

На мангосе данный квест выполняется нормально...

Подскажите где копать в ядре? Где обработка таких квестов находится?

KiriX 22.08.2010 20:00

Цитата:

Сообщение от tmuc (Сообщение 12891)
Есть такой случай.... http://www.wowhead.com/quest=12842
Вот пример квеста, когда игрок должен скастовать (использовать спелл - http://www.wowhead.com/spell=53428), но не на NPC или GO.... а на итем.....
не знаю как в мангосе, а в тринити последней ревизии данный квест невыполним (без ремонта ядра).
Вот сейчас чистое ядро мангоса откомпилю, посмотрим как там.
__________________________________________________ ______________

На мангосе данный квест выполняется нормально...

Подскажите где копать в ядре? Где обработка таких квестов находится?

Тут совершенно другое дело. Не путайте тёплое с мягким ;) Патч давно внесён в ядро (и в мангос и в триньку) - кв прекрасно выполняется...

tmuc 22.08.2010 21:31

С офф репо триньки, после компила квест не выполняется... значит в офф не исправили данный косяк..

KiriX 22.08.2010 21:39

Цитата:

Сообщение от tmuc (Сообщение 12912)
С офф репо триньки, после компила квест не выполняется... значит в офф не исправили данный косяк..

Хм... Странно... Я точно знаю, что на триньке все кв ДК 100% проходимы - сам тестировал. Но в коде у них действительно нет того, что есть в мангосе.
SpellEffects.cpp:
PHP код:

                case 53343:                                 // Rune of Razorice
                
{
                    
// Runeforging Credit
                    
m_caster->CastSpell(m_caster54586true);
                    return;
                } 

54586 - этот спелл комплитит квест. Эффект комплита имеет цель - target_self. Вызов данного спелла идёт таким образом, что данный спелл кастует именно игрок. К данной теме ваш комментарий всё же не имеет никакого отношения =)
Кв этот и на тринити 100% работал, а значит был реализован скорее всего скриптом, советую вам копать в этом направлении.

tmuc 22.08.2010 21:52

Спс.... буду копать.... Что интересно.. включил логи - 3 и на мангосе и на тринити....
абсолютно идентичны все вызовы...((( и 53343 есть...

KiriX 22.08.2010 22:15


KiriX 21.12.2010 13:43

Тема висит давно без единого коммента. Ап!

zergtmn 23.12.2010 18:04

В 10910. Спасибо :)


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

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