Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в эту темуОткрыть новую тему
> Сбивание каста стен как в сфере 51
Джелу
сообщение 6.10.2015, 23:04
Сообщение #1


***

Novice
Сообщений: 63
Регистрация: 13.7.2008
Группа: Пользователи
Наличность: 0
Пользователь №: 10.912
Возраст: 50



Доброго времени суток, возник один вопрос, возможно подскажите. Стоит задача сделать сбивание каста фиелдов (стен и фф) как в сфере. Особенность такого сбивания следующая:

- Если игрок кастует с таргета, с книги или иконки, спел сбивается любым физическим воздействием
- Если игрок кастует по ласт таргету, спел не сбивается.

То что получает Ранка от клиента (PacketHandlers):
- 0x27: // Cast spell from book
- 0x56: // Cast spell from macro

0x27 приходит когда кастуешь с самой книги, 0x56 с иконки или ласт таргета, разница в них лишь в том что в 1вом мы посылаем еще серийник спеллбуки, во втором нет.

В исходниках сферы пока не могу найти где и как это реализовано.

Возможно вы подскажите какой пакет посылается от клиета серверу ( тут не нашел http://docs.polserver.com/packets/) , и как различить ласттаргет от таргета.

Сделал логгинг пакетов:

С книги:
Код

- 5600 --- 18 client Perform Action
0000: 12 00 12 27 32 34 20 31 30 37 33 39 38 32 32 32 : ...'24 107398222
0010: 31 00 -- -- -- -- -- -- -- -- -- -- -- -- -- -- : 1.
- 0016 --- 58 server Server Talk
0000: 1c 00 3a ff ff ff ff ff ff 00 03 b2 00 03 53 79 : ..:...........Sy
0010: 73 74 65 6d 00 00 00 00 00 00 00 00 00 00 00 00 : stem............
0020: 00 00 00 00 00 00 00 00 00 00 00 00 53 65 6c 65 : ............Sele
0030: 63 74 20 74 61 72 67 65 74 00 -- -- -- -- -- -- : ct target.
- 0000 --- 19 server Target Data
0000: 6c 01 00 00 00 0d 00 00 00 00 00 00 00 00 00 00 : l...............
0010: 00 00 00 -- -- -- -- -- -- -- -- -- -- -- -- -- : ...
- 1123 --- 19 client Target Data
0000: 6c 00 00 00 00 0d 00 00 00 06 b2 0e 48 09 d4 00 : l...........H...
0010: 00 00 dc -- -- -- -- -- -- -- -- -- -- -- -- -- : ...
- 0000 --- 14 server Character Animation
0000: 6e 00 00 00 1c 00 11 00 01 00 01 00 00 01 -- -- : n.............
- 0000 --- 58 server Server Talk
0000: 1c 00 3a 00 00 00 1c 01 90 00 03 b2 00 03 54 65 : ..:...........Te
0010: 73 74 65 72 00 00 00 00 00 00 00 00 00 00 00 00 : ster............
0020: 00 00 00 00 00 00 00 00 00 00 00 00 49 6e 20 53 : ............In S
0030: 61 6e 63 74 20 59 6c 65 6d 00 -- -- -- -- -- -- : anct Ylem.



По таргету:

Код

- 1279 --- 7 client Perform Action
0000: 12 00 07 56 32 34 00 -- -- -- -- -- -- -- -- -- : ...V24.
- 0000 --- 58 server Server Talk
0000: 1c 00 3a ff ff ff ff ff ff 00 03 b2 00 03 53 79 : ..:...........Sy
0010: 73 74 65 6d 00 00 00 00 00 00 00 00 00 00 00 00 : stem............
0020: 00 00 00 00 00 00 00 00 00 00 00 00 53 65 6c 65 : ............Sele
0030: 63 74 20 74 61 72 67 65 74 00 -- -- -- -- -- -- : ct target.
- 0000 --- 19 server Target Data
0000: 6c 01 00 00 00 0a 00 00 00 00 00 00 00 00 00 00 : l...............
0010: 00 00 00 -- -- -- -- -- -- -- -- -- -- -- -- -- : ...
- 1264 --- 19 client Target Data
0000: 6c 00 00 00 00 0a 00 00 00 06 b2 0e 48 09 d4 00 : l...........H...
0010: 00 00 dc -- -- -- -- -- -- -- -- -- -- -- -- -- : ...
- 0000 --- 14 server Character Animation
0000: 6e 00 00 00 1c 00 11 00 01 00 01 00 00 01 -- -- : n.............
- 0000 --- 58 server Server Talk
0000: 1c 00 3a 00 00 00 1c 01 90 00 03 b2 00 03 54 65 : ..:...........Te
0010: 73 74 65 72 00 00 00 00 00 00 00 00 00 00 00 00 : ster............
0020: 00 00 00 00 00 00 00 00 00 00 00 00 49 6e 20 53 : ............In S
0030: 61 6e 63 74 20 59 6c 65 6d 00 -- -- -- -- -- -- : anct Ylem.


По ласттаргету:

Код
- 2949 --- 7 client Perform Action
0000: 12 00 07 56 32 34 00 -- -- -- -- -- -- -- -- -- : ...V24.
- 0015 --- 58 server Server Talk
0000: 1c 00 3a ff ff ff ff ff ff 00 03 b2 00 03 53 79 : ..:...........Sy
0010: 73 74 65 6d 00 00 00 00 00 00 00 00 00 00 00 00 : stem............
0020: 00 00 00 00 00 00 00 00 00 00 00 00 53 65 6c 65 : ............Sele
0030: 63 74 20 74 61 72 67 65 74 00 -- -- -- -- -- -- : ct target.
- 0000 --- 19 server Target Data
0000: 6c 01 00 00 00 0b 00 00 00 00 00 00 00 00 00 00 : l...............
0010: 00 00 00 -- -- -- -- -- -- -- -- -- -- -- -- -- : ...
- 0094 --- 19 client Target Data
0000: 6c 00 00 00 00 0b 00 00 00 06 b2 00 00 00 00 00 : l...............
0010: 00 00 00 -- -- -- -- -- -- -- -- -- -- -- -- -- : ...
- 0000 --- 14 server Character Animation
0000: 6e 00 00 00 1c 00 11 00 01 00 01 00 00 01 -- -- : n.............
- 0000 --- 58 server Server Talk
0000: 1c 00 3a 00 00 00 1c 01 90 00 03 b2 00 03 54 65 : ..:...........Te
0010: 73 74 65 72 00 00 00 00 00 00 00 00 00 00 00 00 : ster............
0020: 00 00 00 00 00 00 00 00 00 00 00 00 49 6e 20 53 : ............In S
0030: 61 6e 63 74 20 59 6c 65 6d 00 -- -- -- -- -- -- : anct Ylem.



Спасибо.

UPD: посмотрел внимательно лог, шлется от клиента 0x12 пакет
http://docs.polserver.com/packets/index.php?Packet=0x12
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Aimed
сообщение 7.10.2015, 0:20
Сообщение #2


*********

Grandmaster
Сообщений: 2.250
Регистрация: 29.12.2012
Группа: Пользователи
Наличность: 8845
Пользователь №: 15.607



Хочешь сказать что есть возможность узнать кастует клиент по ласт таргету или просто кидает таргет?
Если на 51 сфере дабл кликнуть по иконке, а потом нажать на ласттаргет макрос, каст собъётся ударом?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Juzzver
сообщение 7.10.2015, 2:57
Сообщение #3


**********

Модератор RunUO
Сообщений: 3.425
Регистрация: 1.11.2008
Группа: Супермодераторы
Наличность: 22564
Из: Северная Корея
Пользователь №: 11.273



Цитата
- Если игрок кастует с таргета, с книги или иконки, спел сбивается любым физическим воздействием
- Если игрок кастует по ласт таргету, спел не сбивается.

Можно попробовать завести новое свойство для Mobile, некий bool CanDisturb и определять в момент каста, с таргета он пошел или с книги, изменяя при этом CanDisturb на true/false.
В методе класса Spell остается определить, можно ли сбить игроку каст или нет.
public virtual void OnCasterHurt()


--------------------
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Джелу
сообщение 7.10.2015, 10:12
Сообщение #4


***

Novice
Сообщений: 63
Регистрация: 13.7.2008
Группа: Пользователи
Наличность: 0
Пользователь №: 10.912
Возраст: 50



Цитата(Juzzver @ 7.10.2015, 3:57) *

Можно попробовать завести новое свойство для Mobile, некий bool CanDisturb и определять в момент каста, с таргета он пошел или с книги, изменяя при этом CanDisturb на true/false.
В методе класса Spell остается определить, можно ли сбить игроку каст или нет.
public virtual void OnCasterHurt()


Спасибо!, кажется ты натолкнул меня на одну идею. По поводу переменной сразу скажу что не получиться, таргет передает данные всегда одинаковые, вне зависимости от того кинул ты таргет мышкой или макросом ( имеется ввиду пакет 0x6c), НО вот время разное, если подумать когда мы нажимаем макрос, вызывается таргет и кидается почти сразу по запомненому серийнику, а когда игроки кидает с руки, проходит определенное время.

Я думаю надо взять за основу 100-120мс, и делать проверку именно на этом. Добавить переменную в сам спел, во время таргета считаем время пройденное между вызовом и выбором, и ставим true если соответсвует условию, а в функции которая проверяет сбивание магии учитывать уже что это фиелд и перемную CanDisturb

Цитата
Хочешь сказать что есть возможность узнать кастует клиент по ласт таргету или просто кидает таргет?
Если на 51 сфере дабл кликнуть по иконке, а потом нажать на ласттаргет макрос, каст собъётся ударом?

да в сфере как то это реализовано, но найти я не смог, у меня есть неполные 52 сферы исходники, 55 и последние что открыли на проекте, но я пока не нашел этот момент...
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Джелу
сообщение 7.10.2015, 10:40
Сообщение #5


***

Novice
Сообщений: 63
Регистрация: 13.7.2008
Группа: Пользователи
Наличность: 0
Пользователь №: 10.912
Возраст: 50



Код
 
    public class SpellTarget : Target
    {
        protected Spell m_Spell;
        protected Mobile m_Caster;

        [b]protected DateTime StartTime;[/b]

        public SpellTarget( Spell spell ) : base( spell.Info.Range, spell.Info.AllowGround, spell.Info.TFlags )
        {
            m_Spell = spell;
            m_Caster = spell.Caster;
            m_Spell.OnSelectTarget();

            if ( m_Spell is Server.Spells.Third.TeleportSpell )
                CheckLOS = false;

            [b]StartTime = DateTime.Now;[/b]
        }

        protected override void OnTarget(Mobile from, object o)
        {
            if ( m_Spell.CheckTarget( from, o ) )
            {
                m_Spell.SpellTargetObject = o;

                if (o is Mobile)
                    m_Spell.SpellTargetPoint = ((Mobile)o).Location;
                else if (o is Item)
                    m_Spell.SpellTargetPoint = ((Item)o).GetWorldLocation();
                else if (o is IPoint3D)
                    m_Spell.SpellTargetPoint = (IPoint3D)o;
                else
                    m_Spell.SpellTargetPoint = from.Location;

                
                [b]TimeSpan total = DateTime.Now - StartTime;

                Console.WriteLine("{0}", total.TotalMilliseconds);[/b]

                m_Spell.CastSpell();
            }
        }


с руки на локальном сервере получается 450-800, с макроса всегда 94
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Aimed
сообщение 7.10.2015, 19:06
Сообщение #6


*********

Grandmaster
Сообщений: 2.250
Регистрация: 29.12.2012
Группа: Пользователи
Наличность: 8845
Пользователь №: 15.607



Ответь на мой второй вопрос, плиз.
Да и у всех пинг разный, с таймером не вариант.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Джелу
сообщение 7.10.2015, 20:16
Сообщение #7


***

Novice
Сообщений: 63
Регистрация: 13.7.2008
Группа: Пользователи
Наличность: 0
Пользователь №: 10.912
Возраст: 50



я на него не мог ответить так как не проверял именно этот момент, сейчас провел разные дополнительные тесты и выяснил следующее:

- Каст на землю сбивается всегда, даже если это макрос.
- 1 каст на НПС, даже если он идет по ласт таргету сбивается
- все остальные касты, даже с книги, иконки уже не сбиваются
- если нажать таб, или сменить цель, 1 каст можно сбить.

В общем, приходим к выводу что есть некая временная переменная, в которую пишется последняя цель, эта переменная обнуляется при нажатие вара, эта переменная пишется при любом таргете. Тоесть серверный ласттаргет
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Aimed
сообщение 10.10.2015, 0:52
Сообщение #8


*********

Grandmaster
Сообщений: 2.250
Регистрация: 29.12.2012
Группа: Пользователи
Наличность: 8845
Пользователь №: 15.607



Это можно в ранке через комбатанта(Mobile.Combatant) сделать.
Если сменился комбатант, 1й каст по нему сбивается, следующие уже нет.
Довольно просто решается, по моему.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Джелу
сообщение 11.10.2015, 12:16
Сообщение #9


***

Novice
Сообщений: 63
Регистрация: 13.7.2008
Группа: Пользователи
Наличность: 0
Пользователь №: 10.912
Возраст: 50



Combatant не совсем то, он ставиться при любой агрессии, я сделал временную переменную LastTarget и ставлю ее при установки таргета. В итоге у меня получилось примерно тоже самое что и в сфере.

Спасибо за помощь!
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Aimed
сообщение 11.10.2015, 13:58
Сообщение #10


*********

Grandmaster
Сообщений: 2.250
Регистрация: 29.12.2012
Группа: Пользователи
Наличность: 8845
Пользователь №: 15.607



Цитата(Джелу @ 11.10.2015, 11:16) *

Combatant не совсем то, он ставиться при любой агрессии, я сделал временную переменную LastTarget и ставлю ее при установки таргета. В итоге у меня получилось примерно тоже самое что и в сфере.

Спасибо за помощь!


Верно, я забыл насчет комбатанта. Не работаю с таргетами у себя...
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Juzzver
сообщение 11.10.2015, 14:56
Сообщение #11


**********

Модератор RunUO
Сообщений: 3.425
Регистрация: 1.11.2008
Группа: Супермодераторы
Наличность: 22564
Из: Северная Корея
Пользователь №: 11.273



Цитата
эта переменная обнуляется при нажатие вара

у мобайлов или плеермобайлов есть булевское свойство Warmode, срабатывает при нажатии кнопки "WAR".

Вообще все выше перечисленные факторы сбивания таргетов больше выглядит как баг, чем как что-то логическое). Слабо верится, что кто-то создавал логику для того, пойдет ли каст на землю с включенным или отключенным вармодом и т.п. варианты (IMG:style_emoticons/default/smile.gif)

Сообщение отредактировал Juzzver - 11.10.2015, 14:56


--------------------
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Aimed
сообщение 11.10.2015, 15:22
Сообщение #12


*********

Grandmaster
Сообщений: 2.250
Регистрация: 29.12.2012
Группа: Пользователи
Наличность: 8845
Пользователь №: 15.607



Цитата(Juzzver @ 11.10.2015, 13:56) *

у мобайлов или плеермобайлов есть булевское свойство Warmode, срабатывает при нажатии кнопки "WAR".

Вообще все выше перечисленные факторы сбивания таргетов больше выглядит как баг, чем как что-то логическое). Слабо верится, что кто-то создавал логику для того, пойдет ли каст на землю с включенным или отключенным вармодом и т.п. варианты (IMG:style_emoticons/default/smile.gif)


Ты будешь сильно удивлен, когда узнаешь сколько всяких багов/косяков Сферы стали крутыми фишками и неотъемлемой частью геймплея....
Качественно переписать старый сервер сферы, с кучей скриптов, на ранку - адский труд.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 29.3.2024, 9:11
Designed by Nickostyle