/**
  * Sends a login failure.
  *
  * @param message The message to send to the client.
  */
 public void sendLoginFailure(String message) {
   PacketBuilder bldr =
       new PacketBuilder(PersistingPacketManager.getPacketManager().getOutgoingPacket(14));
   bldr.putString("reason", message);
   session.send(bldr.toPacket());
   session.close();
 }
 /**
  * Sends a teleport.
  *
  * @param position The new position.
  * @param rotation The new rotation.
  */
 public void sendTeleport(Position position, Rotation rotation) {
   session.getPlayer().teleportPosition = position.toBlockPos();
   PacketBuilder bldr =
       new PacketBuilder(PersistingPacketManager.getPacketManager().getOutgoingPacket(8));
   bldr.putByte("id", -1);
   bldr.putShort("x", position.getX());
   bldr.putShort("y", position.getY());
   bldr.putShort("z", position.getZ());
   bldr.putByte("rotation", rotation.getRotation());
   bldr.putByte("look", rotation.getLook());
   session.send(bldr.toPacket());
   session.getPlayer().teleporting = true;
 }
  /**
   * Sends the update entity packet.
   *
   * @param entity The entity being updated.
   */
  public void sendUpdateEntity(Entity entity) {
    final Position oldPosition = entity.getOldPosition();
    final Position position = entity.getPosition();

    final Rotation oldRotation = entity.getOldRotation();
    final Rotation rotation = entity.getRotation();

    final int deltaX = -oldPosition.getX() - position.getX();
    final int deltaY = -oldPosition.getY() - position.getY();
    final int deltaZ = -oldPosition.getZ() - position.getZ();

    final int deltaRotation = -oldRotation.getRotation() - rotation.getRotation();
    final int deltaLook = -oldRotation.getLook() - rotation.getLook();
    if (deltaX != 0 || deltaY != 0 || deltaZ != 0) {
      if (deltaX > Byte.MAX_VALUE
          || deltaX < Byte.MIN_VALUE
          || deltaY > Byte.MAX_VALUE
          || deltaY < Byte.MIN_VALUE
          || deltaZ > Byte.MAX_VALUE
          || deltaZ < Byte.MIN_VALUE
          || deltaRotation > Byte.MAX_VALUE
          || deltaRotation < Byte.MIN_VALUE
          || deltaLook > Byte.MAX_VALUE
          || deltaLook < Byte.MIN_VALUE) {
        // teleport
        PacketBuilder bldr =
            new PacketBuilder(PersistingPacketManager.getPacketManager().getOutgoingPacket(8));
        bldr.putByte("id", entity.getId());
        bldr.putShort("x", position.getX());
        bldr.putShort("y", position.getY());
        bldr.putShort("z", position.getZ());
        bldr.putByte("rotation", rotation.getRotation());
        bldr.putByte("look", rotation.getLook());
        session.send(bldr.toPacket());
      } else {
        // send move and rotate packet
        PacketBuilder bldr =
            new PacketBuilder(PersistingPacketManager.getPacketManager().getOutgoingPacket(9));
        bldr.putByte("id", entity.getId());
        bldr.putByte("delta_x", deltaX);
        bldr.putByte("delta_y", deltaY);
        bldr.putByte("delta_z", deltaZ);
        bldr.putByte("delta_rotation", deltaRotation);
        bldr.putByte("delta_look", deltaLook);
        session.send(bldr.toPacket());
      }
    }
  }
 /**
  * Sends a level block/chunk.
  *
  * @param len The length of the chunk.
  * @param chunk The chunk data.
  * @param percent The percentage.
  */
 public void sendLevelBlock(int len, byte[] chunk, int percent) {
   PacketBuilder bldr =
       new PacketBuilder(PersistingPacketManager.getPacketManager().getOutgoingPacket(3));
   bldr.putShort("chunk_length", len);
   bldr.putByteArray("chunk_data", chunk);
   bldr.putByte("percent", percent);
   session.send(bldr.toPacket());
 }
 /**
  * Sends a login response.
  *
  * @param protocolVersion The protocol version.
  * @param name The server name.
  * @param message The server message of the day.
  * @param op Operator flag.
  */
 public void sendLoginResponse(int protocolVersion, String name, String message, boolean op) {
   PacketBuilder bldr =
       new PacketBuilder(PersistingPacketManager.getPacketManager().getOutgoingPacket(0));
   bldr.putByte("protocol_version", protocolVersion);
   bldr.putString("server_name", name);
   bldr.putString("server_message", message);
   bldr.putByte("user_type", op ? 100 : 0);
   session.send(bldr.toPacket());
 }
 /**
  * Sends a block.
  *
  * @param x X coordinate.
  * @param y Y coordinate.
  * @param z Z coordinate.
  * @param type BlockDefinition type.
  */
 public void sendBlock(int x, int y, int z, byte type) {
   PacketBuilder bldr =
       new PacketBuilder(PersistingPacketManager.getPacketManager().getOutgoingPacket(6));
   bldr.putShort("x", x);
   bldr.putShort("y", y);
   bldr.putShort("z", z);
   bldr.putByte("type", type);
   session.send(bldr.toPacket());
 }
 public void sendSpawn(byte id, String name, int x, int y, int z, byte rotation, byte look) {
   PacketBuilder bldr =
       new PacketBuilder(PersistingPacketManager.getPacketManager().getOutgoingPacket(7));
   bldr.putByte("id", id);
   bldr.putString("name", name);
   bldr.putShort("x", x);
   bldr.putShort("y", y);
   bldr.putShort("z", z);
   bldr.putByte("rotation", rotation);
   bldr.putByte("look", look);
   session.send(bldr.toPacket());
 }
 /**
  * Sends the add entity packet.
  *
  * @param entity The entity being added.
  */
 public void sendAddEntity(Entity entity) {
   PacketBuilder bldr =
       new PacketBuilder(PersistingPacketManager.getPacketManager().getOutgoingPacket(7));
   bldr.putByte("id", entity.getId());
   bldr.putString("name", entity.getColoredName());
   bldr.putShort("x", entity.getPosition().getX());
   bldr.putShort("y", entity.getPosition().getY());
   bldr.putShort("z", entity.getPosition().getZ());
   bldr.putByte("rotation", entity.getRotation().getRotation());
   bldr.putByte("look", entity.getRotation().getLook());
   session.send(bldr.toPacket());
 }
 /**
  * Sends a chat message.
  *
  * @param id The source player id.
  * @param message The message.
  */
 public void sendChatMessage(int id, String message) {
   PacketBuilder bldr =
       new PacketBuilder(PersistingPacketManager.getPacketManager().getOutgoingPacket(13));
   String message2 = "";
   if (message.length() > 64) {
     message2 = message.substring(64);
     int idx = message.lastIndexOf("&");
     if (idx != -1) message2 = "&" + message.charAt(idx + 1) + message2;
     message = message.substring(0, 64);
   }
   bldr.putByte("id", id);
   bldr.putString("message", message);
   session.send(bldr.toPacket());
   if (!message2.equals("")) sendChatMessage(id, "> " + message2);
 }
 /**
  * Sends the remove entity packet.
  *
  * @param entity The entity being removed.
  */
 public void sendRemoveEntity(Entity entity) {
   PacketBuilder bldr =
       new PacketBuilder(PersistingPacketManager.getPacketManager().getOutgoingPacket(12));
   bldr.putByte("id", entity.getOldId());
   session.send(bldr.toPacket());
 }
 /** Sends the level init packet. */
 public void sendLevelInit() {
   session.setAuthenticated();
   PacketBuilder bldr =
       new PacketBuilder(PersistingPacketManager.getPacketManager().getOutgoingPacket(2));
   session.send(bldr.toPacket());
 }