zcxv

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

Похожие темы