Saltar a contenido

Puntos de Ruta

El oyente de paquetes del punto de ruta externo es una función que permite al servidor enviar puntos de ruta al cliente. Esto es útil para los administradores de servidores que desean proporcionar puntos de ruta a los jugadores sin necesidad de un mod adicional.

Ejemplos

A continuación se muestra un ejemplo de cómo se ve el paquete json y qué información envía el servidor al cliente para que la procese e interprete.

Identificador de paquete

discriminator:0
channel:journeymap:waypoint

Búfer de Paquetes

waypoint StringUtf  value -> waypointjson.toString();
action StringUtf  value-> "create" or "delete"
announce Boolean -> value true or false  : Announce determines if the user is notified when a waypoint is created or deleted. 

Lector de paquetes (código del cliente de JourneyMap)

this.waypoint = buf.readUtf();
this.action = buf.readUtf();
this.announce = buf.readBoolean();

Ejemplo de creación de carga útil

{
  "id": "home_-10,70,32",
  "name": "home",
  "icon": "journeymap:ui/img/waypoint-icon.png",
  "enable": true,
  "type": "Normal",
  "origin": "external",
  "x": -10,
  "y": 70,
  "z": 32,
  "r": 85,
  "g": 255,
  "b": 255,
  "persistent": false,
  "dimensions": [
    "minecraft:overworld"
  ]
}
id -> <code>id = "name + "_" + x + "," + y + "," + z"</code> this format is required.<br>
name -> waypoint name<br>
icon -> <code>journeymap:ui/img/waypoint-icon.png</code> this is required<br>
enable -> required to be true<br>
type -> <code>Normal</code>  or <code>Death</code><br>
origin -> <code>external</code> or <code>external-force</code> external-force cannot be disabled/hidden on the client<br>
x -> x coord<br>
y -> y coord<br>
z -> z coord<br>
r -> red value<br>
g -> green value<br>
b -> blue value<br>
persistent -> <code>true</code> saves to disk, will load when the user restarts minecraft, or changes dimensions. <code>false</code> is not saved to disk, is removed from memory when the user exists minecraft<br>
dimensions -> list of dimensions<br>

Ejemplo de eliminación de carga útil

{
  "name": "test"
}

nombre -> nombre del punto de ruta es todo lo que se necesita para eliminar el punto de ruta. Implementación de ejemplo usando CraftBukkit

    public static void createWaypoint(Player player, String name, IntVector3 pos, WaypointType type, ChatColor color) {
        Color rgb = color.getColor();
        JsonObject obj = new JsonObject();
        obj.addProperty("id", name + '_' + pos.getX() + ',' + pos.getY() + ',' + pos.getZ());
        obj.addProperty("name", name);
        obj.addProperty("icon", "waypoint-normal.png");
        obj.addProperty("enable", true);
        obj.addProperty("type", type.type);
        obj.addProperty("origin", "external");
        obj.addProperty("x", pos.getX());
        obj.addProperty("y", pos.getY());
        obj.addProperty("z", pos.getZ());
        obj.addProperty("r", rgb.getRed());
        obj.addProperty("g", rgb.getGreen());
        obj.addProperty("b", rgb.getBlue());
        obj.addProperty("persistent", false);

        JsonArray dimensions = new JsonArray(1);
        dimensions.add("minecraft:" + player.getWorld().getName());
        obj.add("dimensions", dimensions);

        PacketDataSerializer out = new PacketDataSerializer(Unpooled.buffer());
        out.writeByte(0); // Extra Byte for Forge
        out.a(obj.toString()); // Payload
        out.a(CREATE); // Action
        out.writeBoolean(false); // Announce
        player.sendPacket(new PacketPlayOutCustomPayload(WAYPOINT_KEY, out));
    }

    public static void deleteWaypoint(Player player, String name) {
        JsonObject obj = new JsonObject();
        obj.addProperty("name", name);
        obj.addProperty("origin", "external");

        PacketDataSerializer out = new PacketDataSerializer(Unpooled.buffer());
        out.writeByte(0); // Extra Byte for Forge
        out.a(obj.toString()); // Payload
        out.a(DELETE); // Action
        out.writeBoolean(false); // Announce
        player.sendPacket(new PacketPlayOutCustomPayload(WAYPOINT_KEY, out));
    }

Si tiene el PacketDataSerializer (PacketBuffer) desofuscado, lo más probable es que use buffer.writeString(...) en lugar de buffer.a(...) Si desea utilizar un búfer/escribir manualmente diferente, los aspectos internos de ese método son algo como:

    public PacketDataSerializer writeString(String s, int byteLimit) {

        byte[] bytes = s.getBytes(StandardCharsets.UTF_8);
        if (bytes.length > byteLimit) {
            throw new EncoderException("String too big (was " + bytes.length + " bytes encoded, max " + byteLimit + ")");
        } else {

            this.writeVarInt(bytes.length);
            this.writeBytes(bytes);
            return this;
        }
    }