UoKit.com Форумы > Ultima Online : Dev > RunUO Server > Вопросы по RunUO
Страницы: 1, 2
Джелу
Доброго времени суток, возник один вопрос, возможно подскажите. Стоит задача сделать сбивание каста фиелдов (стен и фф) как в сфере. Особенность такого сбивания следующая:

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

То что получает Ранка от клиента (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
Вверх
Aimed
Хочешь сказать что есть возможность узнать кастует клиент по ласт таргету или просто кидает таргет?
Если на 51 сфере дабл кликнуть по иконке, а потом нажать на ласттаргет макрос, каст собъётся ударом?
Вверх
Juzzver
Цитата
- Если игрок кастует с таргета, с книги или иконки, спел сбивается любым физическим воздействием
- Если игрок кастует по ласт таргету, спел не сбивается.

Можно попробовать завести новое свойство для Mobile, некий bool CanDisturb и определять в момент каста, с таргета он пошел или с книги, изменяя при этом CanDisturb на true/false.
В методе класса Spell остается определить, можно ли сбить игроку каст или нет.
public virtual void OnCasterHurt()
Вверх
Джелу
Цитата(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 и последние что открыли на проекте, но я пока не нашел этот момент...
Вверх
Джелу
Код
 
    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
Вверх
Aimed
Ответь на мой второй вопрос, плиз.
Да и у всех пинг разный, с таймером не вариант.
Вверх
Джелу
я на него не мог ответить так как не проверял именно этот момент, сейчас провел разные дополнительные тесты и выяснил следующее:

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

В общем, приходим к выводу что есть некая временная переменная, в которую пишется последняя цель, эта переменная обнуляется при нажатие вара, эта переменная пишется при любом таргете. Тоесть серверный ласттаргет
Вверх
Aimed
Это можно в ранке через комбатанта(Mobile.Combatant) сделать.
Если сменился комбатант, 1й каст по нему сбивается, следующие уже нет.
Довольно просто решается, по моему.
Вверх
Джелу
Combatant не совсем то, он ставиться при любой агрессии, я сделал временную переменную LastTarget и ставлю ее при установки таргета. В итоге у меня получилось примерно тоже самое что и в сфере.

Спасибо за помощь!
Вверх
Aimed
Цитата(Джелу @ 11.10.2015, 11:16)

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

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


Верно, я забыл насчет комбатанта. Не работаю с таргетами у себя...
Вверх
Invision Power Board © 2001-2024 Invision Power Services, Inc.
Version for Pocket PC © 2006-2024, IPBest Studio.