|
Опкоды, Формулы, Клиент Разбор и изучение взаимодействия клиента с сервером |
|
Опции темы | Поиск в этой теме | Опции просмотра |
18.06.2011, 16:48 | #1 |
Ученый
Регистрация: 19.12.2010
Сообщений: 221
Сказал(а) спасибо: 64
Поблагодарили 12 раз(а) в 9 сообщениях
Записей в дневнике: 2
|
Каст заклинания на ходу
В клизме добавили возможность кастовать некоторые заклинания на ходу. Наблюдая за клиентом я думаю, что нужно отправить какой-то флаг клиенту в SMSG_CAST_GO чтобы каст у него не прерывался при движении. Кто-нибудь в курсе что это за флаг?
|
18.06.2011, 17:05 | #2 |
Ученый
Регистрация: 09.03.2010
Адрес: Кыргызстан
Сообщений: 266
Сказал(а) спасибо: 41
Поблагодарили 115 раз(а) в 34 сообщениях
|
Да уж открытие они и на вотлк есть. Lord Marrowgar. У него огонь движется по прямой и там идет каст с 0.2с каст таймером. все кастуется при движении. Причем я много встречал спеллов которые кастуются на ходу.
|
18.06.2011, 17:12 | #3 |
MaNGOS Dev
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 438 раз(а) в 181 сообщениях
|
Можно подумать раньше таких спелов не было...
__________________
Так как устал объяснять знайте ICQ не пользуюсь |
18.06.2011, 17:17 | #4 |
Ученый
Регистрация: 13.03.2010
Сообщений: 110
Сказал(а) спасибо: 55
Поблагодарили 23 раз(а) в 14 сообщениях
|
Некоторые гоблинкие мины всегда можно было кастовать на ходу.
|
18.06.2011, 20:18 | #5 |
MaNGOS Dev
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 438 раз(а) в 181 сообщениях
|
Да у паладина половина спелов таких
__________________
Так как устал объяснять знайте ICQ не пользуюсь |
18.06.2011, 20:39 | #6 |
Новичок
Регистрация: 30.04.2010
Сообщений: 12
Сказал(а) спасибо: 5
Поблагодарили 0 раз(а) в 0 сообщениях
|
К примеру?
|
18.06.2011, 21:10 | #7 | |||
Ученый
Регистрация: 19.12.2010
Сообщений: 221
Сказал(а) спасибо: 64
Поблагодарили 12 раз(а) в 9 сообщениях
Записей в дневнике: 2
|
Цитата:
Цитата:
Цитата:
Пример: http://ru.wowhead.com/spell=56641. http://ru.wowhead.com/spell=2948 + http://ru.wowhead.com/spell=86914 Последний раз редактировалось HuntsMan; 18.06.2011 в 21:14. |
|||
18.06.2011, 21:18 | #8 |
Ученый
Регистрация: 10.03.2010
Адрес: Бобруйск
Сообщений: 284
Сказал(а) спасибо: 213
Поблагодарили 98 раз(а) в 84 сообщениях
|
К примеру вот, квесты бк:
http://www.wowhead.com/quest=11008 http://www.wowhead.com/quest=11023 Каст идет при движении. |
Пользователь сказал cпасибо: | HuntsMan (18.06.2011) |
18.06.2011, 21:51 | #9 |
Ученый
Регистрация: 19.12.2010
Сообщений: 221
Сказал(а) спасибо: 64
Поблагодарили 12 раз(а) в 9 сообщениях
Записей в дневнике: 2
|
Как я понял, на ограничения по движению влияет Interrupt Flags (у спеллов предоставленных Den он равен 0, и поэтому клиент нормально кастует). Но например у того же 56641 Interrupt Flags: 0x0000000F. Поэтому клиент будет слать и шлет CMSG_CANCEL_CAST при движении. Я думаю, что нужно какой-то флаг указывать в SMSG_SPELL_GO (меняющий Interrupt Flags у клиента чтоли) чтобы все ок было, но вот вопрос какой?
Есть конечно вариант захакать Spell.dbc у клиента, или забивать на CMSG_CANCEL_CAST при определенных условиях, но сами понимаете что это не тру |
19.06.2011, 01:35 | #10 |
Супер-модератор
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
|
Возможно это просто modifier? SMSG_SET_FLAT_SPELL_MODIFIER.
|
19.06.2011, 02:02 | #11 |
Ученый
Регистрация: 19.12.2010
Сообщений: 221
Сказал(а) спасибо: 64
Поблагодарили 12 раз(а) в 9 сообщениях
Записей в дневнике: 2
|
Может быть. Просто смущает следующее:
Код:
Caster: (High: Zero (0x000), Counter: 175,292,137) Target: (High: Zero (0x000), Counter: 175,292,137) Pending Cast: 22 Spell Id: Автоматическая стрельба (75) Cast Flags: 0x00040100 262400 TicksCount: 975712495 GO Hit Target 0: (High: Unit (0xF13), Entry: 47659, Counter: 391,911) TargetFlags: 0x00000002 TARGET_FLAG_UNIT ObjectTarget: 247 -- Read 42 bytes, have 49 Если я правильно понял, SMSG_SET_FLAT_SPELL_MODIFIER позволяет менять только BasePoints, или ещё что-то? Последний раз редактировалось HuntsMan; 19.06.2011 в 02:05. |
19.06.2011, 04:55 | #12 |
Новичок
Регистрация: 04.03.2011
Сообщений: 29
Сказал(а) спасибо: 12
Поблагодарили 9 раз(а) в 7 сообщениях
|
Если вопрос про ауру 330, использующуюся например в Spiritwalker's Grace, то я делал так.
|
19.06.2011, 05:13 | #13 | |
Супер-модератор
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
|
Цитата:
|
|
Пользователь сказал cпасибо: | HuntsMan (19.06.2011) |
19.06.2011, 05:54 | #14 |
Новичок
Регистрация: 04.03.2011
Сообщений: 29
Сказал(а) спасибо: 12
Поблагодарили 9 раз(а) в 7 сообщениях
|
|
19.06.2011, 08:03 | #15 |
Супер-модератор
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
|
|
19.06.2011, 09:50 | #16 | |
Модератор
|
Вобщем-то да
Цитата:
void __cdecl Spell_C_CancelCastingSpellByMovement(C_Player * player) Код:
if ( v7 >= v8 && v7 <= *(&g_spellInterruptsDB + 2) && (v9 = *(_DWORD *)(*(&g_spellInterruptsDB + 6) + 4 * (v7 - v8))) != 0 && *(_BYTE *)(v9 + 20) & 1 && !(unsigned __int8)CGUnit_C__HasAuraMatchingSpellClass(a1, 330, v6) ) { Spell_C_CancelSpell(v10, 0, 1, 42); v1 = s_pendingCasts; LABEL_4: ++v2; v11 += 90; if ( v2 >= v1 ) return; } else { LABEL_28: v1 = s_pendingCasts; ++v2; v11 += 90; if ( v2 >= s_pendingCasts ) return; } |
|
19.06.2011, 10:06 | #17 |
Ученый
Регистрация: 19.12.2010
Сообщений: 221
Сказал(а) спасибо: 64
Поблагодарили 12 раз(а) в 9 сообщениях
Записей в дневнике: 2
|
Хм, тогда осталось выловить ауру, которая накладывается на персов для нужных заклинаний. Всем спасибо за помощь в изысканиях
Хм, странно, при наличии ауры на плеере (http://ru.wowhead.com/spell=86914 к примеру) клиент все равно шлет CMSG_CANCEL_CAST. Т.е. даже если дело было б в реализации на сервере, клиент поидее все равно не должен был его слать. Что за... Add: А не, для Верного выстрела работает нормально, вот почему для таланта не хочет( Последний раз редактировалось HuntsMan; 19.06.2011 в 11:29. |
15.10.2011, 20:44 | #18 |
Пользователь
Регистрация: 26.08.2011
Сообщений: 35
Сказал(а) спасибо: 6
Поблагодарили 5 раз(а) в 4 сообщениях
|
Не кто не решил проблему с http://ru.wowhead.com/spell=86914 ?
У этой ауры в отлии от других есть значение misc Код:
Effect 0: Id 6 (SPELL_EFFECT_APPLY_AURA) BasePoints = 5 Targets (1, 0) (TARGET_SELF, NO_TARGET) Aura Id 330 (SPELL_AURA_ALLOW_CAST_WHILE_MOVING), value = 6, misc = 12 (12), miscB = 0, periodic = 0 SpellClassMask = 00000000 00000000 00000010 Если просто игнорировать опкод отмены каста, то в клиенте визуально пропадает каст, а через время урон наносится жертве. А может кто нибудь выложить код функции Код:
CGUnit_C__HasAuraMatchingSpellClass Последний раз редактировалось NeatElves; 16.10.2011 в 15:28. |
16.10.2011, 09:30 | #19 |
Модератор
|
Выложить можно, но понять его будет сложно, ибо там нет структур и названных переменных
Обычно это проверятся в отладчике напрямую, смотрится где и как идут переходы на выход из функции Код вот : База TOM_RUS, 4.2.2.14545 Код:
char __thiscall CGUnit_C::HasAuraMatchingSpellClass(void *this, signed int auraEffect, int a3) { void *v3; // esi@1 unsigned int v4; // ebx@2 int v5; // edi@3 unsigned int v6; // eax@4 int v7; // ebx@8 int v8; // eax@11 int v9; // edi@13 int v10; // esi@14 int v11; // eax@15 void *v13; // [sp+Ch] [bp-14h]@1 int v14; // [sp+10h] [bp-10h]@14 int v15; // [sp+14h] [bp-Ch]@3 unsigned int v16; // [sp+18h] [bp-8h]@2 unsigned int v17; // [sp+1Ch] [bp-4h]@14 v3 = this; v13 = this; if ( !((unsigned __int8)(1 << auraEffect % 8) & *((_BYTE *)this + auraEffect / 8 + 4064)) || (v4 = 0, v16 = 0, !CGUnit_C::GetAuraCount(this)) ) return 0; v5 = 0; v15 = 0; while ( 1 ) { v6 = *((_DWORD *)v3 + 932); if ( v6 == -1 ) v6 = *((_DWORD *)v3 + 773); if ( v4 >= v6 ) { v7 = 0; } else { if ( *((_DWORD *)v3 + 932) == -1 ) v7 = v5 + *((_DWORD *)v3 + 774); else v7 = (int)((char *)v3 + v5 + 3088); } v8 = *(_DWORD *)(v7 + 8); if ( v8 < g_SpellDB.minIndex || v8 > g_SpellDB.maxIndex || (v9 = *((_DWORD *)g_SpellDB.Rows + v8 - g_SpellDB.minIndex)) == 0 ) goto LABEL_21; v10 = 0; v14 = SpellGetEffects(*(_DWORD *)v9, &v17); if ( v17 ) break; LABEL_20: v3 = v13; LABEL_21: v5 = v15 + 40; ++v16; v4 = v16; v15 += 40; if ( v16 >= CGUnit_C::GetAuraCount(v3) ) return 0; } while ( 1 ) { v11 = *(_DWORD *)(v14 + 8) + 4 * v10; if ( *(_DWORD *)v11 ) { if ( *(_DWORD *)(*(_DWORD *)v11 + 12) == auraEffect && *(_WORD *)(v7 + 12) & (1 << v10) && SpellMatchesAuraSpellClass(a3, v9, v10) ) return 1; } ++v10; if ( v10 >= v17 ) goto LABEL_20; } } |
Пользователь сказал cпасибо: | Easy (16.10.2011) |
16.10.2011, 13:02 | #20 |
Пользователь
Регистрация: 26.08.2011
Сообщений: 35
Сказал(а) спасибо: 6
Поблагодарили 5 раз(а) в 4 сообщениях
|
мдя... наверное проще всего было бы, если бы кто нибудь смог снифнуть момент вкачивания таланта поджигатель, по любому что то отправляется клиенту, так как с талом этим на ходу клиент не позволяет даже начать каст, серверу не чего не шлётся при кликанье по кнопке. Но на сколько я слышал в данный момент нет возможности снифать офф
|
16.10.2011, 13:17 | #21 |
Умный
Регистрация: 17.06.2010
Сообщений: 397
Сказал(а) спасибо: 58
Поблагодарили 55 раз(а) в 38 сообщениях
|
Нет, я сниффал. Там ничего не шлется как и при касте спелла 75
|
16.10.2011, 13:25 | #22 |
Пользователь
Регистрация: 26.08.2011
Сообщений: 35
Сказал(а) спасибо: 6
Поблагодарили 5 раз(а) в 4 сообщениях
|
хм... ну не может же просто так не работать.
100% клиент блокирует, значит что то должно влиять. Мб аура несколько раз шлётся, мб бп меняются, мб в пакете ауры дополнительная инфа о которой мы не знаем прикреплена. |
16.10.2011, 13:57 | #23 |
Модератор
|
а другие талы под 330 аурой работают? как выглядит отмена каста? вы бежите, начинаете кастовать, прилетает CMSG_CANCEL_CAST, и все?
Есть 2 вида проверок, одна - срабатывающая при любом изменении движения, т.е хоть на миллиметр сдвинулись, чек идет, вторая проверка при касте Так вот при первой CMSG_CANCEL_CAST шлется, при 2 пока не обнаружил, там если ауры нету, идут SpellFailed 34, SpellFailed 53 Отладка бы помогла - расставить бряки на Spell_C_CancelSpell и посмотреть call stack, откуда ноги растут |
16.10.2011, 14:16 | #24 | |
Пользователь
Регистрация: 26.08.2011
Сообщений: 35
Сказал(а) спасибо: 6
Поблагодарили 5 раз(а) в 4 сообщениях
|
Вообщем всё что выяснил пока.
Есть аура 330 у ханта и шамы В сервере просто проверка на 330 ауру, и если она есть, то кастовать можно. Собственно ссылка на функцию есть выше, на скайфаер. А есть тал мага (возможно и лока тоже, пока не проверял) Так вот, вкачиваем тал мага и на сервере видит что аура у него 330 и не блочит. Дальше два варианта, которые говорят о том что клиент блочит: 1) Начинаем кастовать, и потом бежать, приходит опкод CMSG_CANCEL_CAST Если мы его просто игнорируем, то на сервере каст продолжается, и урон будет нанесён, но визуально в клиенте всё равно обрыв каста. 2) Начинаем бежать, а потом пытаемся начать кастовать - не чего не происходит, в клиенте сообщение "вы не можете этого делать на ходу" а на сервер опкод старта каста даже не приходит. То что сервер не блочит, легко проверить ещё так: Начинаем бежать и пишем .cast 2948, и чар начнёт кастовать, так как сервер пошлёт команду старта каста. Но стоит остановится и опять попытаться побежать, как каст прервётся опкодом отмены каста. Добавлено через 2 минуты Цитата:
Но основная проблема в том, что я не когда этого не делал И я даже не смог через IDA запустить клиент, ошибки сыпятся и не чего не выходит Ну что ещё видно, это то что у ханта и шамы бп = 0 для аур 330, а у мага и лока бп != 0 Последний раз редактировалось NeatElves; 16.10.2011 в 15:27. |
|
16.10.2011, 14:37 | #25 |
Модератор
|
если глянуть на код проверки самой функции, там есть условие при котором возвращается 1
Код:
if ( *(_DWORD *)(*(_DWORD *)v11 + 12) == auraEffect && *(_WORD *)(v7 + 12) & (1 << v10) && SpellMatchesAuraSpellClass(a3, v9, v10) ) return 1; Поправка - не misc, а value = basepoints, он же бп ПС : мб бредово звучит, я посмотрел что за дбц, мб 6 - это spellfamily, попробуйте дать тал и спелл тому классу, у кого спеллфэмили 6, в кате хз кто, в личе был прист Последний раз редактировалось MaS0n; 16.10.2011 в 14:51. Причина: Упс |
16.10.2011, 14:53 | #26 | |
Пользователь
Регистрация: 26.08.2011
Сообщений: 35
Сказал(а) спасибо: 6
Поблагодарили 5 раз(а) в 4 сообщениях
|
да, есть запись в дбц для этого спела
Цитата:
Код:
// SpellClassOptions.dbc struct SpellClassOptionsEntry { uint32 Id; // 0 m_ID //uint32 modalNextSpell; // 1 m_modalNextSpell not used flag96 SpellFamilyFlags; // 2-4 uint32 SpellFamilyName; // 5 m_spellClassSet //DBCString Description; // 6 4.0.0 }; Family SPELLFAMILY_MAGE, flag 0x00000000 00000000 00000000 для ожога это Family SPELLFAMILY_MAGE, flag 0x00000000 00000000 00000010 ну и условие для ауры SpellClassMask = 00000000 00000000 00000010 То есть тут вроде бы всё в порядке. Кто может проверить отладкой? Или кинуть ссылочку на мануал как вов отладить под вин 7 х64 У приста тоже отмена каста идёт от клиента. Кстати. Если нажать правую кнопку мышки, и во время каста влево или вправо, то под талом маг побежит и каст не собьётся, то есть это как раз говорит о том что сервер не блочит. А клиент в таком случае не шлёт опкод. но если бежать так а потом попытаться кастануть то всё равно не разрешит клиент. Последний раз редактировалось NeatElves; 16.10.2011 в 15:27. |
|
16.10.2011, 15:09 | #27 |
Модератор
|
в ПМ загляни, чтоб не флудить тут)
|
19.10.2011, 21:58 | #29 |
Модератор
|
да легко
Суть опущу, желающие могут взять и подебажить клиент В функции идет проверка двух значений, одного, который считается из номера эффекта ауры и второго, значения по адресу в какой-то структуре, возможно это клиентская структура Aura. Соотвественно начат был поиск где же устанавливается значение в этот адрес. Второе значение выставляется/изменяется только в одном месте - в функции, названной близами AuraEffectUpdateMask - внутри клиентской функции OnAuraUpdate, родителем которой является пакет хандлер SMSG_AURA_UPDATE. Там пишется значение в этот адрес, причем расчет аналогичен - по номеру эффекта ауры Шама и хант, имеют активные эффекты, для них шлется пакет SMSG_AURA_UPDATE, а маг - не имеет, это талант, и пакет для него не шлется По сути этот пакет для ауры/таланта мага служит активатором, который переводит состояние откл. в состояние вкл. |
Пользователь сказал cпасибо: | HuntsMan (20.10.2011) |
21.10.2011, 07:17 | #30 | |
Почетный флудер
Старожил
Регистрация: 08.03.2010
Адрес: Мурманск, Россия
Сообщений: 788
Сказал(а) спасибо: 55
Поблагодарили 333 раз(а) в 151 сообщениях
Записей в дневнике: 1
|
Цитата:
кул как меня, помнится, за подобное предположение на гетмангосе обо...ли... |
|
21.10.2011, 13:58 | #33 |
Ученый
Регистрация: 13.03.2010
Сообщений: 110
Сказал(а) спасибо: 55
Поблагодарили 23 раз(а) в 14 сообщениях
|
|
22.10.2011, 00:02 | #34 | |
MaNGOS Dev
Регистрация: 09.03.2010
Сообщений: 33
Сказал(а) спасибо: 27
Поблагодарили 26 раз(а) в 11 сообщениях
|
Цитата:
|
|
22.10.2011, 13:52 | #35 |
Почетный флудер
Старожил
Регистрация: 08.03.2010
Адрес: Мурманск, Россия
Сообщений: 788
Сказал(а) спасибо: 55
Поблагодарили 333 раз(а) в 151 сообщениях
Записей в дневнике: 1
|
разговор как раз и был после этого добавления (впрочем, точно установить не выйдет, большая часть моих писем на гетмангосе вычищена). я предполагал тогда что ауры надо обновлять и без наличия/требования наличия слота.
|
Пользователь сказал cпасибо: | Mayss (26.10.2011) |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Каст триггерных спеллов | virusav | Баг-репорты | 1 | 08.12.2010 16:54 |
[10696] Каст спеллов с EffectImplicitTarget на нпц | virusav | Принятые патчи | 2 | 08.11.2010 02:09 |
Каст спеллов объектами | virusav | Запросы | 9 | 30.05.2010 10:01 |
Каст спелла объектом на нпц | virusav | Новичкам | 9 | 13.03.2010 14:19 |