zcxv

Легендарный
Проверенный
Победитель в номинации 2015
Сообщения
562
Розыгрыши
0
Репутация
812
Реакции
1 360
Баллы
1 703
Я пока, что ни у кого не видел таких вещей, поэтому пожалуй выложу и расскажу (во всяком случае более или менее полной по соответствию с клиентской стороной).

И так. В клиенте существует такая вещь, как тип окружения, в котором находится персонаж. Он влияет на внутр. переключение скорости павн-объекта в игре.
Код:
/**
* 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:
 

Вложения

  • 0 байт · Просмотры: 0
  • pow_statistic_packet_send.png
    pow_statistic_packet_send.png
    834,6 КБ · Просмотры: 146
Последнее редактирование модератором:
Блин, тема случайно опубликовалась. Все еще в процессе редактирования-написания, если что :)
 
У меня дар речи пропал, без матов никак. Ахеренно.
PointerRage Если что подправить итд итп в ЛС пиши
 
Поинтер, расскажи как "гайд для колхозников", как запилить такую же стату по пакетам?
 
Поинтер, расскажи как "гайд для колхозников", как запилить такую же стату по пакетам?
Для начала собирать данные, которые нужны :) Я их собираю в базу данных с помощью DELAYED запроса; очень хорошо будет, если база будет nosql, т.е. другими словами не реляционная, т.к. у нас есть единственный ключ - время, и ничто ни к чему не относится; к сожалению nosql я не могу использовать по ряду некоторых технических и не очень причин (just as planned migration to postgre & procedures), но надеюсь, что в ближайшем будущем получится... :Escape:
Ну, а дальше все просто - визуализируем данную статистику в виде графиков, либо еще чего-либо, тут уж как удобнее будет. В этом плане, особенно удобно погенерить JS'овые графики с поддержкой масштабирования. Для "картиночных" графиков я использую xchart, JS - amcharts.
 

Похожие темы

Назад
Сверху Снизу