Нахождение персонажа в воде

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

nesss

Единомышленник
Участник
Сообщения
144
Розыгрыши
0
Решения
3
Репутация
-2
Реакции
14
Баллы
130
Хроники
  1. Interlude
Исходники
Присутствуют
Сборка
Собственная
Всем привет, подскажите плиз по пакетам, вот есть пакет ChangeMoveType, который оповещает слушателей что персонаж изменил тип перемещения, вот сам пакет:

Java:
public final class ChangeMoveType extends WritePacket {

    private final int id, run, swim;

    /**
     * Конструктор.
     *
     * @param player Персонаж.
     */
    public ChangeMoveType(Player player) {

        this.id = player.getId();
        this.run = player.getEmployment().isRun() ? 0x01 : 0x00;
        this.swim = player.getEnvironment() == EnvironmentType.WATER ? 0x01 : 0x00;

    }

    @Override
    public void write() {

        writeByte(0x2e);
        writeInt(id);
        writeInt(run);
        writeInt(swim);

    }

}

Но при тестах нечего не происходит, скорость персонажа не изменяется на скорость плаванья у слушателей, то есть для слушателей персонаж передвигается в клиенте со скоростью как по суше так и под водой.
 
Решение
Все нашел, оказывается есть в CharInfo где указывается флаг перемещения в воде, только во всех сборках что я перелапатил в интернете, вместо данного флага указывалось - СКОЛЬКО РЕКОМЕНДАЦИЙ ЕСТЬ у персонажа, именно не сколько ему дали реков, а сколько он может дать, в общем вот кусок где он находится:
Java:
        cubes.forEach(this::writeShort);
        writeByte(partyMatchRoom);
        writeInt(abnormalEffects);
        writeByte(0x01);            // Флаг нахождения в воде.
        writeShort(recGained);
        writeInt(classId);
        writeInt(maxCp);
        writeInt(curCp);
Это не "флаг нахождения в воде"
Это буквально EnvType.
У тебя у персонажа есть два переключателя. EnvType и MoveType
Код:
enum EnvType : __int32
{...
как минимум должны быть размечены зоны в плеере смотрети таск типо startWaterTask
а обычно еще бывает конфиг в сборках включена ли вода
 
Оверпостинг
я сам пишу сборку ГЕО движок уже доделал, передвижение, поиск пути змеля, вода, воздух, все готово, сейчас начал тестить воду, а именно мультиплеер, и нашел такой баг, для окна с которого забегаешь в воду, плаваешь там и т.д. все отлично, вот когда заходишь одним окном в воду, там флаг меняется, что ты зашел в воду в UserInfo, а в CharInfo я такой флаг не нашел, там есть какие-то пустые 0ли вот думаю может кто знает, у кого как реализовано? Я на других серверах тестил данную проблему, там на такие мелочи не обращают внимание, так же как и на SpeedMultiplayer они 1 раз устанавливают при видимости объекта, присылают CharInfo и все, а если у чара меняется скорость передвижения, так же меняется и SpeedMultiplayer, соответственно и пакет нужно обновлять.

Все нашел, оказывается есть в CharInfo где указывается флаг перемещения в воде, только во всех сборках что я перелапатил в интернете, вместо данного флага указывалось - СКОЛЬКО РЕКОМЕНДАЦИЙ ЕСТЬ у персонажа, именно не сколько ему дали реков, а сколько он может дать, в общем вот кусок где он находится:
Java:
        cubes.forEach(this::writeShort);
        writeByte(partyMatchRoom);
        writeInt(abnormalEffects);
        writeByte(0x01);            // Флаг нахождения в воде.
        writeShort(recGained);
        writeInt(classId);
        writeInt(maxCp);
        writeInt(curCp);
 
Последнее редактирование модератором:
Все нашел, оказывается есть в CharInfo где указывается флаг перемещения в воде, только во всех сборках что я перелапатил в интернете, вместо данного флага указывалось - СКОЛЬКО РЕКОМЕНДАЦИЙ ЕСТЬ у персонажа, именно не сколько ему дали реков, а сколько он может дать, в общем вот кусок где он находится:
Java:
        cubes.forEach(this::writeShort);
        writeByte(partyMatchRoom);
        writeInt(abnormalEffects);
        writeByte(0x01);            // Флаг нахождения в воде.
        writeShort(recGained);
        writeInt(classId);
        writeInt(maxCp);
        writeInt(curCp);
Это не "флаг нахождения в воде"
Это буквально EnvType.
У тебя у персонажа есть два переключателя. EnvType и MoveType
Код:
enum EnvType : __int32
{
  ENV_GROUND = 0x0,
  ENV_UNDERWATER = 0x1,
  ENV_AIR = 0x2,
  ENV_HOVER = 0x3,
  ENV_MAX = 0x4,
};

enum MoveType : __int32
{
  MT_SLOW = 0x0,
  MT_FAST = 0x1,
  MT_END = 0x2,
};

Базовая скорость персонажа в конкретный момент времени берется из его шаблона по формуле:

Код:
double[EnvType * 2 + MoveType]

Например у людей-воинов это FFighter={80; 115; 50; 50; 0; 0; 0; 0}
Т.е По земле бегом скорость будет index = (0 * 2 + 1) = 1 и speed = FFighter[index] = 115
4 последних нуля, означают что данный экземпляр игрового объекта не умеет летать и парить в дефолтном виде(чаще всего у модельки павна в клиенте нет анимации под такой тип движения). Поэтому, если условно, чтобы начать летать, персонаж должен сесть на виверну, у которой внезапно такой тип мува есть: speed_on_ride={250;250;140;140;250;250}
Т.е когда персонаж сядет на виверну, у него скорость будет считаться от нее, а не от его собственного шаблона.

Ну и в пакете идет ordinal значения EnvType и MoveType
 
Решение
Ага спасибо, я понял.
 
Назад
Сверху