258 lines
9.3 KiB
Java
258 lines
9.3 KiB
Java
/*
|
|
* ProtocolLib - Bukkit server library that allows access to the Minecraft protocol.
|
|
* Copyright (C) 2012 Kristian S. Stangeland
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify it under the terms of the
|
|
* GNU General Public License as published by the Free Software Foundation; either version 2 of
|
|
* the License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
|
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
* See the GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along with this program;
|
|
* if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
|
* 02111-1307 USA
|
|
*/
|
|
|
|
package com.comphenix.protocol;
|
|
|
|
import java.util.Set;
|
|
|
|
import com.comphenix.protocol.injector.PacketFilterManager;
|
|
import com.comphenix.protocol.reflect.FieldAccessException;
|
|
import com.comphenix.protocol.reflect.IntEnum;
|
|
|
|
/**
|
|
* List of known packet IDs since 1.3.2.
|
|
*
|
|
* @author Kristian
|
|
*/
|
|
public final class Packets {
|
|
|
|
/**
|
|
* List of packets sent only by the server.
|
|
* @author Kristian
|
|
*/
|
|
public static final class Server extends IntEnum {
|
|
/**
|
|
* The singleton instance. Can also be retrieved from the parent class.
|
|
*/
|
|
private static Server INSTANCE = new Server();
|
|
|
|
public static final int KEEP_ALIVE = 0;
|
|
public static final int LOGIN = 1;
|
|
public static final int CHAT = 3;
|
|
public static final int UPDATE_TIME = 4;
|
|
public static final int ENTITY_EQUIPMENT = 5;
|
|
public static final int SPAWN_POSITION = 6;
|
|
public static final int UPDATE_HEALTH = 8;
|
|
public static final int RESPAWN = 9;
|
|
public static final int FLYING = 10;
|
|
public static final int PLAYER_POSITION = 11;
|
|
public static final int PLAYER_LOOK = 12;
|
|
public static final int PLAYER_LOOK_MOVE = 13;
|
|
public static final int ENTITY_LOCATION_ACTION = 17;
|
|
public static final int ARM_ANIMATION = 18;
|
|
public static final int NAMED_ENTITY_SPAWN = 20;
|
|
public static final int PICKUP_SPAWN = 21;
|
|
public static final int COLLECT = 22;
|
|
public static final int VEHICLE_SPAWN = 23;
|
|
public static final int MOB_SPAWN = 24;
|
|
public static final int ENTITY_PAINTING = 25;
|
|
public static final int ADD_EXP_ORB = 26;
|
|
public static final int ENTITY_VELOCITY = 28;
|
|
public static final int DESTROY_ENTITY = 29;
|
|
public static final int ENTITY = 30;
|
|
public static final int REL_ENTITY_MOVE = 31;
|
|
public static final int ENTITY_LOOK = 32;
|
|
public static final int REL_ENTITY_MOVE_LOOK = 33;
|
|
public static final int ENTITY_TELEPORT = 34;
|
|
public static final int ENTITY_HEAD_ROTATION = 35;
|
|
public static final int ENTITY_STATUS = 38;
|
|
public static final int ATTACH_ENTITY = 39;
|
|
public static final int ENTITY_METADATA = 40;
|
|
public static final int MOB_EFFECT = 41;
|
|
public static final int REMOVE_MOB_EFFECT = 42;
|
|
public static final int SET_EXPERIENCE = 43;
|
|
public static final int MAP_CHUNK = 51;
|
|
public static final int MULTI_BLOCK_CHANGE = 52;
|
|
public static final int BLOCK_CHANGE = 53;
|
|
public static final int PLAY_NOTE_BLOCK = 54;
|
|
public static final int BLOCK_BREAK_ANIMATION = 55;
|
|
public static final int MAP_CHUNK_BULK = 56;
|
|
public static final int EXPLOSION = 60;
|
|
public static final int WORLD_EVENT = 61;
|
|
public static final int NAMED_SOUND_EFFECT = 62;
|
|
public static final int BED = 70;
|
|
public static final int WEATHER = 71;
|
|
public static final int OPEN_WINDOW = 100;
|
|
public static final int CLOSE_WINDOW = 101;
|
|
public static final int SET_SLOT = 103;
|
|
public static final int WINDOW_ITEMS = 104;
|
|
public static final int CRAFT_PROGRESS_BAR = 105;
|
|
public static final int TRANSACTION = 106;
|
|
public static final int SET_CREATIVE_SLOT = 107;
|
|
public static final int UPDATE_SIGN = 130;
|
|
public static final int ITEM_DATA = 131;
|
|
public static final int TILE_ENTITY_DATA = 132;
|
|
public static final int STATISTIC = 200;
|
|
public static final int PLAYER_INFO = 201;
|
|
public static final int ABILITIES = 202;
|
|
public static final int TAB_COMPLETE = 203;
|
|
public static final int CUSTOM_PAYLOAD = 250;
|
|
public static final int KEY_RESPONSE = 252;
|
|
public static final int KEY_REQUEST = 253;
|
|
public static final int KICK_DISCONNECT = 255;
|
|
|
|
/**
|
|
* A registry that parses between names and packet IDs.
|
|
* @return The current server registry.
|
|
*/
|
|
public static Server getRegistry() {
|
|
return INSTANCE;
|
|
}
|
|
|
|
/**
|
|
* Determine if the given packet is a valid server packet in the current version of Minecraft.
|
|
* @param packetID - the packet to test.
|
|
* @return TRUE if this packet is supported, FALSE otherwise.
|
|
* @throws FieldAccessException If we're unable to retrieve the server packet data from Minecraft.
|
|
*/
|
|
public static boolean isSupported(int packetID) throws FieldAccessException {
|
|
return PacketFilterManager.getServerPackets().contains(packetID);
|
|
}
|
|
|
|
/**
|
|
* Retrieve every client packet the current version of Minecraft is aware of.
|
|
* @return Every supported server packet.
|
|
* @throws FieldAccessException If we're unable to retrieve the server packet data from Minecraft.
|
|
*/
|
|
public static Set<Integer> getSupported() throws FieldAccessException {
|
|
return PacketFilterManager.getServerPackets();
|
|
}
|
|
|
|
// We only allow a single instance of this class
|
|
private Server() {
|
|
super();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* List of packets sent by the client.
|
|
* @author Kristian
|
|
*/
|
|
public static class Client extends IntEnum {
|
|
/**
|
|
* The singleton instance. Can also be retrieved from the parent class.
|
|
*/
|
|
private static Client INSTANCE = new Client();
|
|
|
|
public static final int KEEP_ALIVE = 0;
|
|
public static final int LOGIN = 1;
|
|
public static final int HANDSHAKE = 2;
|
|
public static final int CHAT = 3;
|
|
public static final int USE_ENTITY = 7;
|
|
public static final int RESPAWN = 9;
|
|
public static final int FLYING = 10;
|
|
public static final int PLAYER_POSITION = 11;
|
|
public static final int PLAYER_LOOK = 12;
|
|
public static final int PLAYER_LOOK_MOVE = 13;
|
|
public static final int BLOCK_DIG = 14;
|
|
public static final int PLACE = 15;
|
|
public static final int BLOCK_ITEM_SWITCH = 16;
|
|
public static final int ARM_ANIMATION = 18;
|
|
public static final int ENTITY_ACTION = 19;
|
|
public static final int CLOSE_WINDOW = 101;
|
|
public static final int WINDOW_CLICK = 102;
|
|
public static final int TRANSACTION = 106;
|
|
public static final int SET_CREATIVE_SLOT = 107;
|
|
public static final int BUTTON_CLICK = 108;
|
|
public static final int UPDATE_SIGN = 130;
|
|
public static final int ABILITIES = 202;
|
|
public static final int TAB_COMPLETE = 203;
|
|
public static final int LOCALE_AND_VIEW_DISTANCE = 204;
|
|
public static final int CLIENT_COMMAND = 205;
|
|
public static final int CUSTOM_PAYLOAD = 250;
|
|
public static final int KEY_RESPONSE = 252;
|
|
public static final int GET_INFO = 254;
|
|
public static final int KICK_DISCONNECT = 255;
|
|
|
|
/**
|
|
* A registry that parses between names and packet IDs.
|
|
* @return The current client registry.
|
|
*/
|
|
public static Client getRegistry() {
|
|
return INSTANCE;
|
|
}
|
|
|
|
/**
|
|
* Determine if the given packet is a valid client packet in the current version of Minecraft.
|
|
* @param packetID - the packet to test.
|
|
* @return TRUE if this packet is supported, FALSE otherwise.
|
|
* @throws FieldAccessException If we're unable to retrieve the client packet data from Minecraft.
|
|
*/
|
|
public static boolean isSupported(int packetID) throws FieldAccessException {
|
|
return PacketFilterManager.getClientPackets().contains(packetID);
|
|
}
|
|
|
|
/**
|
|
* Retrieve every client packet the current version of Minecraft is aware of.
|
|
* @return Every supported client packet.
|
|
* @throws FieldAccessException If we're unable to retrieve the client packet data from Minecraft.
|
|
*/
|
|
public static Set<Integer> getSupported() throws FieldAccessException {
|
|
return PacketFilterManager.getClientPackets();
|
|
}
|
|
|
|
// Like above
|
|
private Client() {
|
|
super();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* A registry that parses between names and packet IDs.
|
|
* @return The current client registry.
|
|
*/
|
|
public static Server getServerRegistry() {
|
|
return Server.getRegistry();
|
|
}
|
|
|
|
/**
|
|
* A registry that parses between names and packet IDs.
|
|
* @return The current server registry.
|
|
*/
|
|
public static Client getClientRegistry() {
|
|
return Client.INSTANCE;
|
|
}
|
|
|
|
/**
|
|
* Find a packet by name. Must be capitalized and use underscores.
|
|
* @param name - name of packet to find.
|
|
* @return The packet ID found.
|
|
*/
|
|
public static int valueOf(String name) {
|
|
Integer serverAttempt = Server.INSTANCE.valueOf(name);
|
|
|
|
if (serverAttempt != null)
|
|
return serverAttempt;
|
|
else
|
|
return Client.INSTANCE.valueOf(name);
|
|
}
|
|
|
|
/**
|
|
* Retrieves the name of a packet.
|
|
* @param packetID - packet to retrieve name.
|
|
* @return The name, or NULL if unable to find such a packet.
|
|
*/
|
|
public static String getDeclaredName(int packetID) {
|
|
String serverAttempt = Server.INSTANCE.getDeclaredName(packetID);
|
|
|
|
if (serverAttempt != null)
|
|
return serverAttempt;
|
|
else
|
|
return Client.INSTANCE.getDeclaredName(packetID);
|
|
}
|
|
}
|