Пакет AttackRequest

  • Автор темы Автор темы nesss
  • Дата начала Дата начала

nesss

Единомышленник
Участник
Сообщения
171
Розыгрыши
0
Решения
3
Репутация
-2
Реакции
15
Баллы
130
Хроники
  1. Interlude
Исходники
Присутствуют
Сборка
Собственная
Всем привет, подскажите по пакету. Как сервер понимает, когда с зажатым Ctrl игрок атакует или без?
 
Только написал тему, и сам разобрался, удалите плиз тему :)))
 
  • Мне нравится
Реакции: raz
Только написал тему, и сам разобрался, удалите плиз тему :)))
Так не работает, если ты выяснил, то напиши как, что, уже мануал делай, чтоб другие загуглить могли или удовлетворить своё любопытство.

P.S. Но если ты ты анализировал пакеты через пакетхак, у тебя такого вопроса бы не было.
 
Ну в том то и дело, что я не анализировал, а руководствовался уже другими сборками, так вот там пакет написан не правильно, практически во всех сборках, там идет так:
Java:
public final class AttackRequest extends L2GameClientPacket
{
    private int _objectId;
    private boolean _isShiftAction;
    
    @Override
    protected void readImpl()
    {
        _objectId = readD();
        readD(); // originX
        readD(); // originY
        readD(); // originZ
        _isShiftAction = readC() != 0;
    }
    
    @Override
    protected void runImpl()
    {
        final Player player = getClient().getPlayer();
        if (player == null)
            return;
        
        if (player.isOutOfControl())
        {
            player.sendPacket(ActionFailed.STATIC_PACKET);
            return;
        }
        
        if (player.isInObserverMode())
        {
            player.sendPacket(SystemMessageId.OBSERVERS_CANNOT_PARTICIPATE);
            player.sendPacket(ActionFailed.STATIC_PACKET);
            return;
        }
        
        // avoid using expensive operations if not needed
        final WorldObject target = (player.getTargetId() == _objectId) ? player.getTarget() : World.getInstance().getObject(_objectId);
        
        if (target == null)
        {
            player.sendPacket(ActionFailed.STATIC_PACKET);
            return;
        }
        
        // (player.getTarget() == target) -> This happens when you control + click a target without having had it selected beforehand. Behaves as the Action packet and will NOT trigger an attack.
        target.onAction(player, (player.getTarget() == target), _isShiftAction);
    }
}

Но по сути private boolean _isShiftAction; в данном пакете будет false, так как данный пакет отправляется от клиента только когда уже зажат Ctrl, без зажатого Ctrl даже если ты жмешь на объект и жмешь кнопку атаковать в действиях, получаешь пакет действия, тот который получает сервер при инициализации действия клиентом (а именно клик по объекту), первый клик берет в таргет, второй следует за таргетом.
 
Ну в том то и дело, что я не анализировал, а руководствовался уже другими сборками, так вот там пакет написан не правильно, практически во всех сборках, там идет так:
Java:
public final class AttackRequest extends L2GameClientPacket
{
    private int _objectId;
    private boolean _isShiftAction;
   
    @Override
    protected void readImpl()
    {
        _objectId = readD();
        readD(); // originX
        readD(); // originY
        readD(); // originZ
        _isShiftAction = readC() != 0;
    }
   
    @Override
    protected void runImpl()
    {
        final Player player = getClient().getPlayer();
        if (player == null)
            return;
       
        if (player.isOutOfControl())
        {
            player.sendPacket(ActionFailed.STATIC_PACKET);
            return;
        }
       
        if (player.isInObserverMode())
        {
            player.sendPacket(SystemMessageId.OBSERVERS_CANNOT_PARTICIPATE);
            player.sendPacket(ActionFailed.STATIC_PACKET);
            return;
        }
       
        // avoid using expensive operations if not needed
        final WorldObject target = (player.getTargetId() == _objectId) ? player.getTarget() : World.getInstance().getObject(_objectId);
       
        if (target == null)
        {
            player.sendPacket(ActionFailed.STATIC_PACKET);
            return;
        }
       
        // (player.getTarget() == target) -> This happens when you control + click a target without having had it selected beforehand. Behaves as the Action packet and will NOT trigger an attack.
        target.onAction(player, (player.getTarget() == target), _isShiftAction);
    }
}

Но по сути private boolean _isShiftAction; в данном пакете будет false, так как данный пакет отправляется от клиента только когда уже зажат Ctrl, без зажатого Ctrl даже если ты жмешь на объект и жмешь кнопку атаковать в действиях, получаешь пакет действия, тот который получает сервер при инициализации действия клиентом (а именно клик по объекту), первый клик берет в таргет, второй следует за таргетом.
там есть еще прикол с shift - который как раз аналог "standattack" в макросах, но только для обычных действий.
 
  • Мне нравится
Реакции: raz
Назад
Сверху