Я пока, что ни у кого не видел таких вещей, поэтому пожалуй выложу и расскажу (во всяком случае более или менее полной по соответствию с клиентской стороной).
И так. В клиенте существует такая вещь, как тип окружения, в котором находится персонаж. Он влияет на внутр. переключение скорости павн-объекта в игре.
Когда-то давным-давно, переключать скорость можно было (а может я и ошибаюсь, т.к. не исследовал этот момент) через пакет ChangeMoveType, но в Interlude, это не работает. Если у кого-то получится на других версиях, то буду рад об этом услышать Так вот, из-за того, что оно не работает, l2j решили вообще не писать это значение в пакет, что в корне не верно.
В большинстве интерлюдов мы имеем жесткий оверхед трафика (настолько жесткий, что ниже можно найти графики), а так же глюк с изменение скорости во время движения: если актер двигается и у него меняется скорость (приходит пакет UserInfo с другими скоростями), то он останавливается; к сожалению, это фича клиента. Этого можно избежать, если скорости не будут изменяться, а мы просто изменим тип окружения, которому соответствует уже заранее просчитанная и отправленная скорость.
Вырезка из UserInfo
В результате мы получаем безглючное движение, хотя трафика оно все равно нямкает довольно много.
К моему большому сожалению, при падении актеров в клиенте, он сам не переключается на скорость fall, поэтому у меня очень много вопросов: "а нафига оно нужно?" - что довольно сильно усложняет просчет падений (при том, что падаем мы не вертикально, происходит так же движение по горизонтали, где-то в районе 10% от общей скорости падения). На PTS-сервере аналогичной версии, скорость падения всегда шлется 0, что опять же довольно интересно и как я подозреваю, тут скорее всего ситуация аналогичная с ChangeMoveType, корейцы такие корейцы.
График по отправляемым пакетам (при том, что была выполнена огромная куча оптимизаций по нему, на ванильной лыже/люцере1/люцере2 происходит полный пипец) под онлайном с 1200 до 400:
И так. В клиенте существует такая вещь, как тип окружения, в котором находится персонаж. Он влияет на внутр. переключение скорости павн-объекта в игре.
Код:
/**
* Unreal Engine 2.5 Lineage 2 Interlude deasm
*
* @author PointerRage, deasm izen
*/
public enum EEnvType {
ET_NONE(-1),
/** на земле */
ET_GROUND(0x00),
/** под водой */
ET_UNDERWATER(0x01),
/** воздух */
ET_AIR(0x02),
/** маунт */
ET_HOVER(0x03);
private final int type;
EEnvType(int type) {
this.type = type;
}
public int getType() {
return type;
}
}
Когда-то давным-давно, переключать скорость можно было (а может я и ошибаюсь, т.к. не исследовал этот момент) через пакет ChangeMoveType, но в Interlude, это не работает. Если у кого-то получится на других версиях, то буду рад об этом услышать Так вот, из-за того, что оно не работает, l2j решили вообще не писать это значение в пакет, что в корне не верно.
Код:
public class ChangeMoveType extends L2GameServerPacket implements BroadcastPacket {
private static final String _S__28_CHANGEMOVETYPE = "[ S ] 28 ChangeMoveType [ddd]";
public static final int WALK = 0;
public static final int RUN = 1;
private final int oid;
private final int moveType;
private final EEnvType env;
public ChangeMoveType(L2Character character) {
oid = character.getObjectId();
moveType = character.isRunning() ? RUN : WALK;
env = character.getEnvironment();
}
@Override
protected final void write() {
writeC(0x2e);
writeD(oid);
writeD(moveType);
writeD(env.getType()); //ни**я не меняет скорость движения. корейцы такие корейцы
}
@Override
public String getType() {
return _S__28_CHANGEMOVETYPE;
}
}
В большинстве интерлюдов мы имеем жесткий оверхед трафика (настолько жесткий, что ниже можно найти графики), а так же глюк с изменение скорости во время движения: если актер двигается и у него меняется скорость (приходит пакет UserInfo с другими скоростями), то он останавливается; к сожалению, это фича клиента. Этого можно избежать, если скорости не будут изменяться, а мы просто изменим тип окружения, которому соответствует уже заранее просчитанная и отправленная скорость.
Вырезка из UserInfo
Код:
...
int runSpd = (int) Math.round(_activeChar.getRunSpeed() / _activeChar.getStat().getMovementSpeedMultiplier());
int walkSpd = (int) Math.round(_activeChar.getStat().getWalkSpeed() / _activeChar.getStat().getMovementSpeedMultiplier());
writeD(runSpd);
writeD(walkSpd);
int swimRunSpd = (int) Math.round((_activeChar.getRunSpeed() / 2) / _activeChar.getStat().getMovementSpeedMultiplier());
int swimWalkSpd = (int) Math.round((_activeChar.getStat().getWalkSpeed() / 2) / _activeChar.getStat().getMovementSpeedMultiplier());
writeD(swimRunSpd); //swim
writeD(swimWalkSpd);
writeD(0x00); //fall run
writeD(0x00); //fall walk
writeD(runSpd); //fly
writeD(walkSpd);
...
writeD(_activeChar.getAbnormalEffect());
writeC(_activeChar.getEnvironment().getType());
...
В результате мы получаем безглючное движение, хотя трафика оно все равно нямкает довольно много.
К моему большому сожалению, при падении актеров в клиенте, он сам не переключается на скорость fall, поэтому у меня очень много вопросов: "а нафига оно нужно?" - что довольно сильно усложняет просчет падений (при том, что падаем мы не вертикально, происходит так же движение по горизонтали, где-то в районе 10% от общей скорости падения). На PTS-сервере аналогичной версии, скорость падения всегда шлется 0, что опять же довольно интересно и как я подозреваю, тут скорее всего ситуация аналогичная с ChangeMoveType, корейцы такие корейцы.
График по отправляемым пакетам (при том, что была выполнена огромная куча оптимизаций по нему, на ванильной лыже/люцере1/люцере2 происходит полный пипец) под онлайном с 1200 до 400:
Вложения
Последнее редактирование модератором: