Пакет Grand Crusade

Володя

Fantix Attack
VIP
Старожил I степени
Участник Новогоднего Фонда 2023
Победитель в номинации 2023
Победитель в номинации 2022
Сообщения
293
Розыгрыши
0
Решения
2
Репутация
20
Реакции
136
Баллы
1 465
Хроники
  1. Chaotic Throne: High Five
  2. Grand Cursade
Исходники
Присутствуют
Сборка
L2j
110 протокол
не меняется скорость передвижение мобов в клиенте

Эта фигня влияет только при спавне
if(containsMask(NpcInfoType.SPEED_MULTIPLIER))
{
writeCutF(_atkSpdMul);
writeCutF(_runSpdMul);
}
если объект уже в клиенте, скорость не меняется
Шо делать?
Натыкался на упоминания этого пакета - ExNpcInfoSpeed, мб кто структуру знает?
 
Решение
Java:
package l2p.gameserver.network.s2c;

import l2p.gameserver.enums.NpcInfoSpeed;
import l2p.gameserver.model.Creature;
import l2p.gameserver.network.components.Opcode;

public class ExNpcInfoSpeed extends AbstractMaskPacket<NpcInfoSpeed>
{
    private int _objectId;
    private float _moveSpeedMul, _attackSpeedMul;
    private final byte[] _flags = new byte[1];

    public ExNpcInfoSpeed(Creature cha, NpcInfoSpeed... flags)
    {
        _objectId = cha.getObjectId();
        _moveSpeedMul = (float) cha.getMoveSpeedMultiplier();
        _attackSpeedMul = (float) cha.getAttackSpeedMultiplier();

        if (flags != null && flags.length > 0)
            addComponentType(flags);
        else...
Она там вроде с клиента подтягивается, если не путаю.
 
С клиента дефолтная, она умножается на мультипликатор. Но его обновления клиент упорно игнорирует.
ExNpcInfoSpeed 100% влияет на скорость атаки\бега, но что конкретно слать после обжид я чот не могу подобрать
 
Java:
package l2p.gameserver.network.s2c;

import l2p.gameserver.enums.NpcInfoSpeed;
import l2p.gameserver.model.Creature;
import l2p.gameserver.network.components.Opcode;

public class ExNpcInfoSpeed extends AbstractMaskPacket<NpcInfoSpeed>
{
    private int _objectId;
    private float _moveSpeedMul, _attackSpeedMul;
    private final byte[] _flags = new byte[1];

    public ExNpcInfoSpeed(Creature cha, NpcInfoSpeed... flags)
    {
        _objectId = cha.getObjectId();
        _moveSpeedMul = (float) cha.getMoveSpeedMultiplier();
        _attackSpeedMul = (float) cha.getAttackSpeedMultiplier();

        if (flags != null && flags.length > 0)
            addComponentType(flags);
        else
            addComponentType(NpcInfoSpeed.values());
    }

    @Override
    protected byte[] getMasks()
    {
        return _flags;
    }

    @Override
    protected void onNewMaskAdded(NpcInfoSpeed component)
    {}

    @Override
    protected void writeImpl()
    {
        writeEx(Opcode.ExNpcInfoSpeed);
        writeD(_objectId);
        writeH(NpcInfoSpeed.values().length);
        writeB(_flags);

        if (containsMask(NpcInfoSpeed.MOVE_SPEED_MUL))
            writeN(_moveSpeedMul);

        if (containsMask(NpcInfoSpeed.ATTACK_SPEED_MUL))
            writeN(_attackSpeedMul);

        if (containsMask(NpcInfoSpeed.UNK_3)) // casting speed?
            writeH(0);

        if (containsMask(NpcInfoSpeed.UNK_4)) // attack speed?
            writeH(0);
    }
}

package l2p.gameserver.enums;

import l2p.gameserver.model.IUpdateTypeComponent;

public enum NpcInfoSpeed implements IUpdateTypeComponent
{
    MOVE_SPEED_MUL,
    ATTACK_SPEED_MUL,
    UNK_3,
    UNK_4;

    @Override
    public int getMask()
    {
        return ordinal();
    }
}
З.Ы. Корейцы вобще странные - на кой надо было делать такой маленький по размерам пакет динамическим?
 
Последнее редактирование:
Решение
Java:
package l2p.gameserver.network.s2c;

import l2p.gameserver.enums.NpcInfoSpeed;
import l2p.gameserver.model.Creature;
import l2p.gameserver.network.components.Opcode;

public class ExNpcInfoSpeed extends AbstractMaskPacket<NpcInfoSpeed>
{
    private int _objectId;
    private float _moveSpeedMul, _attackSpeedMul;
    private final byte[] _flags = new byte[1];

    public ExNpcInfoSpeed(Creature cha, NpcInfoSpeed... flags)
    {
        _objectId = cha.getObjectId();
        _moveSpeedMul = (float) cha.getMoveSpeedMultiplier();
        _attackSpeedMul = (float) cha.getAttackSpeedMultiplier();

        if (flags != null && flags.length > 0)
            addComponentType(flags);
        else
            addComponentType(NpcInfoSpeed.values());
    }

    @Override
    protected byte[] getMasks()
    {
        return _flags;
    }

    @Override
    protected void onNewMaskAdded(NpcInfoSpeed component)
    {}

    @Override
    protected void writeImpl()
    {
        writeEx(Opcode.ExNpcInfoSpeed);
        writeD(_objectId);
        writeH(NpcInfoSpeed.values().length);
        writeB(_flags);

        if (containsMask(NpcInfoSpeed.MOVE_SPEED_MUL))
            writeN(_moveSpeedMul);

        if (containsMask(NpcInfoSpeed.ATTACK_SPEED_MUL))
            writeN(_attackSpeedMul);

        if (containsMask(NpcInfoSpeed.UNK_3)) // casting speed?
            writeH(0);

        if (containsMask(NpcInfoSpeed.UNK_4)) // attack speed?
            writeH(0);
    }
}

package l2p.gameserver.enums;

import l2p.gameserver.model.IUpdateTypeComponent;

public enum NpcInfoSpeed implements IUpdateTypeComponent
{
    MOVE_SPEED_MUL,
    ATTACK_SPEED_MUL,
    UNK_3,
    UNK_4;

    @Override
    public int getMask()
    {
        return ordinal();
    }
}
З.Ы. Корейцы вобще странные - на кой надо было делать такой маленький по размерам пакет динамическим?
Большое спасибо, но ток что увидел пост, уже успели разобраться)
 
Java:
package l2p.gameserver.network.s2c;

import l2p.gameserver.enums.NpcInfoSpeed;
import l2p.gameserver.model.Creature;
import l2p.gameserver.network.components.Opcode;

public class ExNpcInfoSpeed extends AbstractMaskPacket<NpcInfoSpeed>
{
    private int _objectId;
    private float _moveSpeedMul, _attackSpeedMul;
    private final byte[] _flags = new byte[1];

    public ExNpcInfoSpeed(Creature cha, NpcInfoSpeed... flags)
    {
        _objectId = cha.getObjectId();
        _moveSpeedMul = (float) cha.getMoveSpeedMultiplier();
        _attackSpeedMul = (float) cha.getAttackSpeedMultiplier();

        if (flags != null && flags.length > 0)
            addComponentType(flags);
        else
            addComponentType(NpcInfoSpeed.values());
    }

    @Override
    protected byte[] getMasks()
    {
        return _flags;
    }

    @Override
    protected void onNewMaskAdded(NpcInfoSpeed component)
    {}

    @Override
    protected void writeImpl()
    {
        writeEx(Opcode.ExNpcInfoSpeed);
        writeD(_objectId);
        writeH(NpcInfoSpeed.values().length);
        writeB(_flags);

        if (containsMask(NpcInfoSpeed.MOVE_SPEED_MUL))
            writeN(_moveSpeedMul);

        if (containsMask(NpcInfoSpeed.ATTACK_SPEED_MUL))
            writeN(_attackSpeedMul);

        if (containsMask(NpcInfoSpeed.UNK_3)) // casting speed?
            writeH(0);

        if (containsMask(NpcInfoSpeed.UNK_4)) // attack speed?
            writeH(0);
    }
}

package l2p.gameserver.enums;

import l2p.gameserver.model.IUpdateTypeComponent;

public enum NpcInfoSpeed implements IUpdateTypeComponent
{
    MOVE_SPEED_MUL,
    ATTACK_SPEED_MUL,
    UNK_3,
    UNK_4;

    @Override
    public int getMask()
    {
        return ordinal();
    }
}
З.Ы. Корейцы вобще странные - на кой надо было делать такой маленький по размерам пакет динамическим?
Пасиб! Наверное по той-же таинственной причине, по который надо было скорость в клиенте хранить)
 
Назад
Сверху Снизу