Ну в том то и дело, что я не анализировал, а руководствовался уже другими сборками, так вот там пакет написан не правильно, практически во всех сборках, там идет так:
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 даже если ты жмешь на объект и жмешь кнопку атаковать в действиях, получаешь пакет действия, тот который получает сервер при инициализации действия клиентом (а именно клик по объекту), первый клик берет в таргет, второй следует за таргетом.