mirror of
https://github.com/dmulloy2/ProtocolLib.git
synced 2024-11-30 14:43:27 +01:00
WIP: 1.19.4 update
This commit is contained in:
parent
bba534d694
commit
05fa147b48
2
pom.xml
2
pom.xml
@ -19,7 +19,7 @@
|
|||||||
<junit.version>5.9.0</junit.version>
|
<junit.version>5.9.0</junit.version>
|
||||||
<mockito.version>4.6.1</mockito.version>
|
<mockito.version>4.6.1</mockito.version>
|
||||||
<netty.version>4.1.77.Final</netty.version>
|
<netty.version>4.1.77.Final</netty.version>
|
||||||
<spigot.version>1.19.3-R0.1-SNAPSHOT</spigot.version>
|
<spigot.version>1.19.4-R0.1-SNAPSHOT</spigot.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
|
@ -102,113 +102,117 @@ public class PacketType implements Serializable, Cloneable, Comparable<PacketTyp
|
|||||||
public static class Server extends PacketTypeEnum {
|
public static class Server extends PacketTypeEnum {
|
||||||
private final static Sender SENDER = Sender.SERVER;
|
private final static Sender SENDER = Sender.SERVER;
|
||||||
|
|
||||||
public static final PacketType SPAWN_ENTITY = new PacketType(PROTOCOL, SENDER, 0x00, "SpawnEntity", "SPacketSpawnObject");
|
public static final PacketType DELIMITER = new PacketType(PROTOCOL, SENDER, 0x00, "Delimiter", "BundleDelimiterPacket");
|
||||||
public static final PacketType SPAWN_ENTITY_EXPERIENCE_ORB = new PacketType(PROTOCOL, SENDER, 0x01, "SpawnEntityExperienceOrb", "SPacketSpawnExperienceOrb");
|
public static final PacketType SPAWN_ENTITY = new PacketType(PROTOCOL, SENDER, 0x01, "SpawnEntity", "SPacketSpawnObject");
|
||||||
public static final PacketType NAMED_ENTITY_SPAWN = new PacketType(PROTOCOL, SENDER, 0x02, "NamedEntitySpawn", "SPacketSpawnPlayer");
|
public static final PacketType SPAWN_ENTITY_EXPERIENCE_ORB = new PacketType(PROTOCOL, SENDER, 0x02, "SpawnEntityExperienceOrb", "SPacketSpawnExperienceOrb");
|
||||||
public static final PacketType ANIMATION = new PacketType(PROTOCOL, SENDER, 0x03, "Animation", "SPacketAnimation");
|
public static final PacketType NAMED_ENTITY_SPAWN = new PacketType(PROTOCOL, SENDER, 0x03, "NamedEntitySpawn", "SPacketSpawnPlayer");
|
||||||
public static final PacketType STATISTIC = new PacketType(PROTOCOL, SENDER, 0x04, "Statistic", "SPacketStatistics");
|
public static final PacketType ANIMATION = new PacketType(PROTOCOL, SENDER, 0x04, "Animation", "SPacketAnimation");
|
||||||
public static final PacketType BLOCK_CHANGED_ACK = new PacketType(PROTOCOL, SENDER, 0x05, "BlockChangedAck");
|
public static final PacketType STATISTIC = new PacketType(PROTOCOL, SENDER, 0x05, "Statistic", "SPacketStatistics");
|
||||||
public static final PacketType BLOCK_BREAK_ANIMATION = new PacketType(PROTOCOL, SENDER, 0x06, "BlockBreakAnimation", "SPacketBlockBreakAnim");
|
public static final PacketType BLOCK_CHANGED_ACK = new PacketType(PROTOCOL, SENDER, 0x06, "BlockChangedAck");
|
||||||
public static final PacketType TILE_ENTITY_DATA = new PacketType(PROTOCOL, SENDER, 0x07, "TileEntityData", "SPacketUpdateTileEntity");
|
public static final PacketType BLOCK_BREAK_ANIMATION = new PacketType(PROTOCOL, SENDER, 0x07, "BlockBreakAnimation", "SPacketBlockBreakAnim");
|
||||||
public static final PacketType BLOCK_ACTION = new PacketType(PROTOCOL, SENDER, 0x08, "BlockAction", "SPacketBlockAction");
|
public static final PacketType TILE_ENTITY_DATA = new PacketType(PROTOCOL, SENDER, 0x08, "TileEntityData", "SPacketUpdateTileEntity");
|
||||||
public static final PacketType BLOCK_CHANGE = new PacketType(PROTOCOL, SENDER, 0x09, "BlockChange", "SPacketBlockChange");
|
public static final PacketType BLOCK_ACTION = new PacketType(PROTOCOL, SENDER, 0x09, "BlockAction", "SPacketBlockAction");
|
||||||
public static final PacketType BOSS = new PacketType(PROTOCOL, SENDER, 0x0A, "Boss", "SPacketUpdateBossInfo");
|
public static final PacketType BLOCK_CHANGE = new PacketType(PROTOCOL, SENDER, 0x0A, "BlockChange", "SPacketBlockChange");
|
||||||
public static final PacketType SERVER_DIFFICULTY = new PacketType(PROTOCOL, SENDER, 0x0B, "ServerDifficulty", "SPacketServerDifficulty");
|
public static final PacketType BOSS = new PacketType(PROTOCOL, SENDER, 0x0B, "Boss", "SPacketUpdateBossInfo");
|
||||||
public static final PacketType CLEAR_TITLES = new PacketType(PROTOCOL, SENDER, 0x0C, "ClearTitles");
|
public static final PacketType SERVER_DIFFICULTY = new PacketType(PROTOCOL, SENDER, 0x0C, "ServerDifficulty", "SPacketServerDifficulty");
|
||||||
public static final PacketType TAB_COMPLETE = new PacketType(PROTOCOL, SENDER, 0x0D, "TabComplete", "SPacketTabComplete");
|
public static final PacketType CHUNKS_BIOMES = new PacketType(PROTOCOL, SENDER, 0x0D, "ChunksBiomes", "ClientboundChunksBiomesPacket");
|
||||||
public static final PacketType COMMANDS = new PacketType(PROTOCOL, SENDER, 0x0E, "Commands");
|
public static final PacketType CLEAR_TITLES = new PacketType(PROTOCOL, SENDER, 0x0E, "ClearTitles");
|
||||||
public static final PacketType CLOSE_WINDOW = new PacketType(PROTOCOL, SENDER, 0x0F, "CloseWindow", "SPacketCloseWindow");
|
public static final PacketType TAB_COMPLETE = new PacketType(PROTOCOL, SENDER, 0x0F, "TabComplete", "SPacketTabComplete");
|
||||||
public static final PacketType WINDOW_ITEMS = new PacketType(PROTOCOL, SENDER, 0x10, "WindowItems", "SPacketWindowItems");
|
public static final PacketType COMMANDS = new PacketType(PROTOCOL, SENDER, 0x10, "Commands");
|
||||||
public static final PacketType WINDOW_DATA = new PacketType(PROTOCOL, SENDER, 0x11, "WindowData", "SPacketWindowProperty");
|
public static final PacketType CLOSE_WINDOW = new PacketType(PROTOCOL, SENDER, 0x11, "CloseWindow", "SPacketCloseWindow");
|
||||||
public static final PacketType SET_SLOT = new PacketType(PROTOCOL, SENDER, 0x12, "SetSlot", "SPacketSetSlot");
|
public static final PacketType WINDOW_ITEMS = new PacketType(PROTOCOL, SENDER, 0x12, "WindowItems", "SPacketWindowItems");
|
||||||
public static final PacketType SET_COOLDOWN = new PacketType(PROTOCOL, SENDER, 0x13, "SetCooldown", "SPacketCooldown");
|
public static final PacketType WINDOW_DATA = new PacketType(PROTOCOL, SENDER, 0x13, "WindowData", "SPacketWindowProperty");
|
||||||
public static final PacketType CUSTOM_CHAT_COMPLETIONS = new PacketType(PROTOCOL, SENDER, 0x14, "CustomChatCompletions");
|
public static final PacketType SET_SLOT = new PacketType(PROTOCOL, SENDER, 0x14, "SetSlot", "SPacketSetSlot");
|
||||||
public static final PacketType CUSTOM_PAYLOAD = new PacketType(PROTOCOL, SENDER, 0x15, "CustomPayload", "SPacketCustomPayload");
|
public static final PacketType SET_COOLDOWN = new PacketType(PROTOCOL, SENDER, 0x15, "SetCooldown", "SPacketCooldown");
|
||||||
public static final PacketType DELETE_CHAT_MESSAGE = new PacketType(PROTOCOL, SENDER, 0x16, "DeleteChat");
|
public static final PacketType CUSTOM_CHAT_COMPLETIONS = new PacketType(PROTOCOL, SENDER, 0x16, "CustomChatCompletions");
|
||||||
public static final PacketType KICK_DISCONNECT = new PacketType(PROTOCOL, SENDER, 0x17, "KickDisconnect", "SPacketDisconnect");
|
public static final PacketType CUSTOM_PAYLOAD = new PacketType(PROTOCOL, SENDER, 0x17, "CustomPayload", "SPacketCustomPayload");
|
||||||
public static final PacketType DISGUISED_CHAT = new PacketType(PROTOCOL, SENDER, 0x18, "DisguisedChat");
|
public static final PacketType DAMAGE_EVENT = new PacketType(PROTOCOL, SENDER, 0x18, "DamageEvent", "ClientboundDamageEventPacket");
|
||||||
public static final PacketType ENTITY_STATUS = new PacketType(PROTOCOL, SENDER, 0x19, "EntityStatus", "SPacketEntityStatus");
|
public static final PacketType DELETE_CHAT_MESSAGE = new PacketType(PROTOCOL, SENDER, 0x19, "DeleteChat");
|
||||||
public static final PacketType EXPLOSION = new PacketType(PROTOCOL, SENDER, 0x1A, "Explosion", "SPacketExplosion");
|
public static final PacketType KICK_DISCONNECT = new PacketType(PROTOCOL, SENDER, 0x1A, "KickDisconnect", "SPacketDisconnect");
|
||||||
public static final PacketType UNLOAD_CHUNK = new PacketType(PROTOCOL, SENDER, 0x1B, "UnloadChunk", "SPacketUnloadChunk");
|
public static final PacketType DISGUISED_CHAT = new PacketType(PROTOCOL, SENDER, 0x1B, "DisguisedChat");
|
||||||
public static final PacketType GAME_STATE_CHANGE = new PacketType(PROTOCOL, SENDER, 0x1C, "GameStateChange", "SPacketChangeGameState");
|
public static final PacketType ENTITY_STATUS = new PacketType(PROTOCOL, SENDER, 0x1C, "EntityStatus", "SPacketEntityStatus");
|
||||||
public static final PacketType OPEN_WINDOW_HORSE = new PacketType(PROTOCOL, SENDER, 0x1D, "OpenWindowHorse");
|
public static final PacketType EXPLOSION = new PacketType(PROTOCOL, SENDER, 0x1D, "Explosion", "SPacketExplosion");
|
||||||
public static final PacketType INITIALIZE_BORDER = new PacketType(PROTOCOL, SENDER, 0x1E, "InitializeBorder");
|
public static final PacketType UNLOAD_CHUNK = new PacketType(PROTOCOL, SENDER, 0x1E, "UnloadChunk", "SPacketUnloadChunk");
|
||||||
public static final PacketType KEEP_ALIVE = new PacketType(PROTOCOL, SENDER, 0x1F, "KeepAlive", "SPacketKeepAlive");
|
public static final PacketType GAME_STATE_CHANGE = new PacketType(PROTOCOL, SENDER, 0x1F, "GameStateChange", "SPacketChangeGameState");
|
||||||
public static final PacketType MAP_CHUNK = new PacketType(PROTOCOL, SENDER, 0x20, "LevelChunkWithLight", "MapChunk", "SPacketChunkData");
|
public static final PacketType OPEN_WINDOW_HORSE = new PacketType(PROTOCOL, SENDER, 0x20, "OpenWindowHorse");
|
||||||
public static final PacketType WORLD_EVENT = new PacketType(PROTOCOL, SENDER, 0x21, "WorldEvent", "SPacketEffect");
|
public static final PacketType HURT_ANIMATION = new PacketType(PROTOCOL, SENDER, 0x21, "HurtAnimation", "ClientboundHurtAnimationPacket");
|
||||||
public static final PacketType WORLD_PARTICLES = new PacketType(PROTOCOL, SENDER, 0x22, "WorldParticles", "SPacketParticles");
|
public static final PacketType INITIALIZE_BORDER = new PacketType(PROTOCOL, SENDER, 0x22, "InitializeBorder");
|
||||||
public static final PacketType LIGHT_UPDATE = new PacketType(PROTOCOL, SENDER, 0x23, "LightUpdate");
|
public static final PacketType KEEP_ALIVE = new PacketType(PROTOCOL, SENDER, 0x23, "KeepAlive", "SPacketKeepAlive");
|
||||||
public static final PacketType LOGIN = new PacketType(PROTOCOL, SENDER, 0x24, "Login", "SPacketJoinGame");
|
public static final PacketType MAP_CHUNK = new PacketType(PROTOCOL, SENDER, 0x24, "LevelChunkWithLight", "MapChunk", "SPacketChunkData");
|
||||||
public static final PacketType MAP = new PacketType(PROTOCOL, SENDER, 0x25, "Map", "SPacketMaps");
|
public static final PacketType WORLD_EVENT = new PacketType(PROTOCOL, SENDER, 0x25, "WorldEvent", "SPacketEffect");
|
||||||
public static final PacketType OPEN_WINDOW_MERCHANT = new PacketType(PROTOCOL, SENDER, 0x26, "OpenWindowMerchant");
|
public static final PacketType WORLD_PARTICLES = new PacketType(PROTOCOL, SENDER, 0x26, "WorldParticles", "SPacketParticles");
|
||||||
public static final PacketType REL_ENTITY_MOVE = new PacketType(PROTOCOL, SENDER, 0x27, "Entity$RelEntityMove", "Entity$PacketPlayOutRelEntityMove");
|
public static final PacketType LIGHT_UPDATE = new PacketType(PROTOCOL, SENDER, 0x27, "LightUpdate");
|
||||||
public static final PacketType REL_ENTITY_MOVE_LOOK = new PacketType(PROTOCOL, SENDER, 0x28, "Entity$RelEntityMoveLook", "Entity$PacketPlayOutRelEntityMoveLook");
|
public static final PacketType LOGIN = new PacketType(PROTOCOL, SENDER, 0x28, "Login", "SPacketJoinGame");
|
||||||
public static final PacketType ENTITY_LOOK = new PacketType(PROTOCOL, SENDER, 0x29, "Entity$EntityLook", "Entity$PacketPlayOutEntityLook");
|
public static final PacketType MAP = new PacketType(PROTOCOL, SENDER, 0x29, "Map", "SPacketMaps");
|
||||||
public static final PacketType VEHICLE_MOVE = new PacketType(PROTOCOL, SENDER, 0x2A, "VehicleMove", "SPacketMoveVehicle");
|
public static final PacketType OPEN_WINDOW_MERCHANT = new PacketType(PROTOCOL, SENDER, 0x2A, "OpenWindowMerchant");
|
||||||
public static final PacketType OPEN_BOOK = new PacketType(PROTOCOL, SENDER, 0x2B, "OpenBook");
|
public static final PacketType REL_ENTITY_MOVE = new PacketType(PROTOCOL, SENDER, 0x2B, "Entity$RelEntityMove", "Entity$PacketPlayOutRelEntityMove");
|
||||||
public static final PacketType OPEN_WINDOW = new PacketType(PROTOCOL, SENDER, 0x2C, "OpenWindow", "SPacketOpenWindow");
|
public static final PacketType REL_ENTITY_MOVE_LOOK = new PacketType(PROTOCOL, SENDER, 0x2C, "Entity$RelEntityMoveLook", "Entity$PacketPlayOutRelEntityMoveLook");
|
||||||
public static final PacketType OPEN_SIGN_EDITOR = new PacketType(PROTOCOL, SENDER, 0x2D, "OpenSignEditor", "SPacketSignEditorOpen");
|
public static final PacketType ENTITY_LOOK = new PacketType(PROTOCOL, SENDER, 0x2D, "Entity$EntityLook", "Entity$PacketPlayOutEntityLook");
|
||||||
public static final PacketType PING = new PacketType(PROTOCOL, SENDER, 0x2E, "Ping");
|
public static final PacketType VEHICLE_MOVE = new PacketType(PROTOCOL, SENDER, 0x2E, "VehicleMove", "SPacketMoveVehicle");
|
||||||
public static final PacketType AUTO_RECIPE = new PacketType(PROTOCOL, SENDER, 0x2F, "AutoRecipe", "SPacketPlaceGhostRecipe");
|
public static final PacketType OPEN_BOOK = new PacketType(PROTOCOL, SENDER, 0x2F, "OpenBook");
|
||||||
public static final PacketType ABILITIES = new PacketType(PROTOCOL, SENDER, 0x30, "Abilities", "SPacketPlayerAbilities");
|
public static final PacketType OPEN_WINDOW = new PacketType(PROTOCOL, SENDER, 0x30, "OpenWindow", "SPacketOpenWindow");
|
||||||
public static final PacketType CHAT = new PacketType(PROTOCOL, SENDER, 0x31, "PlayerChat", "Chat", "SPacketChat");
|
public static final PacketType OPEN_SIGN_EDITOR = new PacketType(PROTOCOL, SENDER, 0x31, "OpenSignEditor", "SPacketSignEditorOpen");
|
||||||
public static final PacketType PLAYER_COMBAT_END = new PacketType(PROTOCOL, SENDER, 0x32, "PlayerCombatEnd");
|
public static final PacketType PING = new PacketType(PROTOCOL, SENDER, 0x32, "Ping");
|
||||||
public static final PacketType PLAYER_COMBAT_ENTER = new PacketType(PROTOCOL, SENDER, 0x33, "PlayerCombatEnter");
|
public static final PacketType AUTO_RECIPE = new PacketType(PROTOCOL, SENDER, 0x33, "AutoRecipe", "SPacketPlaceGhostRecipe");
|
||||||
public static final PacketType PLAYER_COMBAT_KILL = new PacketType(PROTOCOL, SENDER, 0x34, "PlayerCombatKill");
|
public static final PacketType ABILITIES = new PacketType(PROTOCOL, SENDER, 0x34, "Abilities", "SPacketPlayerAbilities");
|
||||||
public static final PacketType PLAYER_INFO_REMOVE = new PacketType(PROTOCOL, SENDER, 0x35, "PlayerInfoRemove");
|
public static final PacketType CHAT = new PacketType(PROTOCOL, SENDER, 0x35, "PlayerChat", "Chat", "SPacketChat");
|
||||||
public static final PacketType PLAYER_INFO = new PacketType(PROTOCOL, SENDER, 0x36, "PlayerInfoUpdate", "PlayerInfo");
|
public static final PacketType PLAYER_COMBAT_END = new PacketType(PROTOCOL, SENDER, 0x36, "PlayerCombatEnd");
|
||||||
public static final PacketType LOOK_AT = new PacketType(PROTOCOL, SENDER, 0x37, "LookAt", "SPacketPlayerPosLook");
|
public static final PacketType PLAYER_COMBAT_ENTER = new PacketType(PROTOCOL, SENDER, 0x37, "PlayerCombatEnter");
|
||||||
public static final PacketType POSITION = new PacketType(PROTOCOL, SENDER, 0x38, "Position");
|
public static final PacketType PLAYER_COMBAT_KILL = new PacketType(PROTOCOL, SENDER, 0x38, "PlayerCombatKill");
|
||||||
public static final PacketType RECIPES = new PacketType(PROTOCOL, SENDER, 0x39, "Recipes", "SPacketRecipeBook");
|
public static final PacketType PLAYER_INFO_REMOVE = new PacketType(PROTOCOL, SENDER, 0x39, "PlayerInfoRemove");
|
||||||
public static final PacketType ENTITY_DESTROY = new PacketType(PROTOCOL, SENDER, 0x3A, "EntityDestroy", "SPacketDestroyEntities");
|
public static final PacketType PLAYER_INFO = new PacketType(PROTOCOL, SENDER, 0x3A, "PlayerInfoUpdate", "PlayerInfo");
|
||||||
public static final PacketType REMOVE_ENTITY_EFFECT = new PacketType(PROTOCOL, SENDER, 0x3B, "RemoveEntityEffect", "SPacketRemoveEntityEffect");
|
public static final PacketType LOOK_AT = new PacketType(PROTOCOL, SENDER, 0x3B, "LookAt", "SPacketPlayerPosLook");
|
||||||
public static final PacketType RESOURCE_PACK_SEND = new PacketType(PROTOCOL, SENDER, 0x3C, "ResourcePackSend", "SPacketResourcePackSend");
|
public static final PacketType POSITION = new PacketType(PROTOCOL, SENDER, 0x3C, "Position");
|
||||||
public static final PacketType RESPAWN = new PacketType(PROTOCOL, SENDER, 0x3D, "Respawn", "SPacketRespawn");
|
public static final PacketType RECIPES = new PacketType(PROTOCOL, SENDER, 0x3D, "Recipes", "SPacketRecipeBook");
|
||||||
public static final PacketType ENTITY_HEAD_ROTATION = new PacketType(PROTOCOL, SENDER, 0x3E, "EntityHeadRotation", "SPacketEntityHeadLook");
|
public static final PacketType ENTITY_DESTROY = new PacketType(PROTOCOL, SENDER, 0x3E, "EntityDestroy", "SPacketDestroyEntities");
|
||||||
public static final PacketType MULTI_BLOCK_CHANGE = new PacketType(PROTOCOL, SENDER, 0x3F, "MultiBlockChange", "SPacketMultiBlockChange");
|
public static final PacketType REMOVE_ENTITY_EFFECT = new PacketType(PROTOCOL, SENDER, 0x3F, "RemoveEntityEffect", "SPacketRemoveEntityEffect");
|
||||||
public static final PacketType SELECT_ADVANCEMENT_TAB = new PacketType(PROTOCOL, SENDER, 0x40, "SelectAdvancementTab", "SPacketSelectAdvancementsTab");
|
public static final PacketType RESOURCE_PACK_SEND = new PacketType(PROTOCOL, SENDER, 0x40, "ResourcePackSend", "SPacketResourcePackSend");
|
||||||
public static final PacketType SERVER_DATA = new PacketType(PROTOCOL, SENDER, 0x41, "ServerData");
|
public static final PacketType RESPAWN = new PacketType(PROTOCOL, SENDER, 0x41, "Respawn", "SPacketRespawn");
|
||||||
public static final PacketType SET_ACTION_BAR_TEXT = new PacketType(PROTOCOL, SENDER, 0x42, "SetActionBarText");
|
public static final PacketType ENTITY_HEAD_ROTATION = new PacketType(PROTOCOL, SENDER, 0x42, "EntityHeadRotation", "SPacketEntityHeadLook");
|
||||||
public static final PacketType SET_BORDER_CENTER = new PacketType(PROTOCOL, SENDER, 0x43, "SetBorderCenter");
|
public static final PacketType MULTI_BLOCK_CHANGE = new PacketType(PROTOCOL, SENDER, 0x43, "MultiBlockChange", "SPacketMultiBlockChange");
|
||||||
public static final PacketType SET_BORDER_LERP_SIZE = new PacketType(PROTOCOL, SENDER, 0x44, "SetBorderLerpSize");
|
public static final PacketType SELECT_ADVANCEMENT_TAB = new PacketType(PROTOCOL, SENDER, 0x44, "SelectAdvancementTab", "SPacketSelectAdvancementsTab");
|
||||||
public static final PacketType SET_BORDER_SIZE = new PacketType(PROTOCOL, SENDER, 0x45, "SetBorderSize");
|
public static final PacketType SERVER_DATA = new PacketType(PROTOCOL, SENDER, 0x45, "ServerData");
|
||||||
public static final PacketType SET_BORDER_WARNING_DELAY = new PacketType(PROTOCOL, SENDER, 0x46, "SetBorderWarningDelay");
|
public static final PacketType SET_ACTION_BAR_TEXT = new PacketType(PROTOCOL, SENDER, 0x46, "SetActionBarText");
|
||||||
public static final PacketType SET_BORDER_WARNING_DISTANCE = new PacketType(PROTOCOL, SENDER, 0x47, "SetBorderWarningDistance");
|
public static final PacketType SET_BORDER_CENTER = new PacketType(PROTOCOL, SENDER, 0x47, "SetBorderCenter");
|
||||||
public static final PacketType CAMERA = new PacketType(PROTOCOL, SENDER, 0x48, "Camera", "SPacketCamera");
|
public static final PacketType SET_BORDER_LERP_SIZE = new PacketType(PROTOCOL, SENDER, 0x48, "SetBorderLerpSize");
|
||||||
public static final PacketType HELD_ITEM_SLOT = new PacketType(PROTOCOL, SENDER, 0x49, "HeldItemSlot", "SPacketHeldItemChange");
|
public static final PacketType SET_BORDER_SIZE = new PacketType(PROTOCOL, SENDER, 0x49, "SetBorderSize");
|
||||||
public static final PacketType VIEW_CENTRE = new PacketType(PROTOCOL, SENDER, 0x4A, "ViewCentre");
|
public static final PacketType SET_BORDER_WARNING_DELAY = new PacketType(PROTOCOL, SENDER, 0x4A, "SetBorderWarningDelay");
|
||||||
public static final PacketType VIEW_DISTANCE = new PacketType(PROTOCOL, SENDER, 0x4B, "ViewDistance");
|
public static final PacketType SET_BORDER_WARNING_DISTANCE = new PacketType(PROTOCOL, SENDER, 0x4B, "SetBorderWarningDistance");
|
||||||
public static final PacketType SPAWN_POSITION = new PacketType(PROTOCOL, SENDER, 0x4C, "SpawnPosition", "SPacketSpawnPosition");
|
public static final PacketType CAMERA = new PacketType(PROTOCOL, SENDER, 0x4C, "Camera", "SPacketCamera");
|
||||||
public static final PacketType SCOREBOARD_DISPLAY_OBJECTIVE = new PacketType(PROTOCOL, SENDER, 0x4D, "ScoreboardDisplayObjective", "SPacketDisplayObjective");
|
public static final PacketType HELD_ITEM_SLOT = new PacketType(PROTOCOL, SENDER, 0x4D, "HeldItemSlot", "SPacketHeldItemChange");
|
||||||
public static final PacketType ENTITY_METADATA = new PacketType(PROTOCOL, SENDER, 0x4E, "EntityMetadata", "SPacketEntityMetadata");
|
public static final PacketType VIEW_CENTRE = new PacketType(PROTOCOL, SENDER, 0x4E, "ViewCentre");
|
||||||
public static final PacketType ATTACH_ENTITY = new PacketType(PROTOCOL, SENDER, 0x4F, "AttachEntity", "SPacketEntityAttach");
|
public static final PacketType VIEW_DISTANCE = new PacketType(PROTOCOL, SENDER, 0x4F, "ViewDistance");
|
||||||
public static final PacketType ENTITY_VELOCITY = new PacketType(PROTOCOL, SENDER, 0x50, "EntityVelocity", "SPacketEntityVelocity");
|
public static final PacketType SPAWN_POSITION = new PacketType(PROTOCOL, SENDER, 0x50, "SpawnPosition", "SPacketSpawnPosition");
|
||||||
public static final PacketType ENTITY_EQUIPMENT = new PacketType(PROTOCOL, SENDER, 0x51, "EntityEquipment", "SPacketEntityEquipment");
|
public static final PacketType SCOREBOARD_DISPLAY_OBJECTIVE = new PacketType(PROTOCOL, SENDER, 0x51, "ScoreboardDisplayObjective", "SPacketDisplayObjective");
|
||||||
public static final PacketType EXPERIENCE = new PacketType(PROTOCOL, SENDER, 0x52, "Experience", "SPacketSetExperience");
|
public static final PacketType ENTITY_METADATA = new PacketType(PROTOCOL, SENDER, 0x52, "EntityMetadata", "SPacketEntityMetadata");
|
||||||
public static final PacketType UPDATE_HEALTH = new PacketType(PROTOCOL, SENDER, 0x53, "UpdateHealth", "SPacketUpdateHealth");
|
public static final PacketType ATTACH_ENTITY = new PacketType(PROTOCOL, SENDER, 0x53, "AttachEntity", "SPacketEntityAttach");
|
||||||
public static final PacketType SCOREBOARD_OBJECTIVE = new PacketType(PROTOCOL, SENDER, 0x54, "ScoreboardObjective", "SPacketScoreboardObjective");
|
public static final PacketType ENTITY_VELOCITY = new PacketType(PROTOCOL, SENDER, 0x54, "EntityVelocity", "SPacketEntityVelocity");
|
||||||
public static final PacketType MOUNT = new PacketType(PROTOCOL, SENDER, 0x55, "Mount", "SPacketSetPassengers");
|
public static final PacketType ENTITY_EQUIPMENT = new PacketType(PROTOCOL, SENDER, 0x55, "EntityEquipment", "SPacketEntityEquipment");
|
||||||
public static final PacketType SCOREBOARD_TEAM = new PacketType(PROTOCOL, SENDER, 0x56, "ScoreboardTeam", "SPacketTeams");
|
public static final PacketType EXPERIENCE = new PacketType(PROTOCOL, SENDER, 0x56, "Experience", "SPacketSetExperience");
|
||||||
public static final PacketType SCOREBOARD_SCORE = new PacketType(PROTOCOL, SENDER, 0x57, "ScoreboardScore", "SPacketUpdateScore");
|
public static final PacketType UPDATE_HEALTH = new PacketType(PROTOCOL, SENDER, 0x57, "UpdateHealth", "SPacketUpdateHealth");
|
||||||
public static final PacketType UPDATE_SIMULATION_DISTANCE = new PacketType(PROTOCOL, SENDER, 0x58, "SetSimulationDistance");
|
public static final PacketType SCOREBOARD_OBJECTIVE = new PacketType(PROTOCOL, SENDER, 0x58, "ScoreboardObjective", "SPacketScoreboardObjective");
|
||||||
public static final PacketType SET_SUBTITLE_TEXT = new PacketType(PROTOCOL, SENDER, 0x59, "SetSubtitleText");
|
public static final PacketType MOUNT = new PacketType(PROTOCOL, SENDER, 0x59, "Mount", "SPacketSetPassengers");
|
||||||
public static final PacketType UPDATE_TIME = new PacketType(PROTOCOL, SENDER, 0x5A, "UpdateTime", "SPacketTimeUpdate");
|
public static final PacketType SCOREBOARD_TEAM = new PacketType(PROTOCOL, SENDER, 0x5A, "ScoreboardTeam", "SPacketTeams");
|
||||||
public static final PacketType SET_TITLE_TEXT = new PacketType(PROTOCOL, SENDER, 0x5B, "SetTitleText");
|
public static final PacketType SCOREBOARD_SCORE = new PacketType(PROTOCOL, SENDER, 0x5B, "ScoreboardScore", "SPacketUpdateScore");
|
||||||
public static final PacketType SET_TITLES_ANIMATION = new PacketType(PROTOCOL, SENDER, 0x5C, "SetTitlesAnimation");
|
public static final PacketType UPDATE_SIMULATION_DISTANCE = new PacketType(PROTOCOL, SENDER, 0x5C, "SetSimulationDistance");
|
||||||
public static final PacketType ENTITY_SOUND = new PacketType(PROTOCOL, SENDER, 0x5D, "EntitySound", "SPacketSoundEffect");
|
public static final PacketType SET_SUBTITLE_TEXT = new PacketType(PROTOCOL, SENDER, 0x5D, "SetSubtitleText");
|
||||||
public static final PacketType NAMED_SOUND_EFFECT = new PacketType(PROTOCOL, SENDER, 0x5E, "NamedSoundEffect");
|
public static final PacketType UPDATE_TIME = new PacketType(PROTOCOL, SENDER, 0x5E, "UpdateTime", "SPacketTimeUpdate");
|
||||||
public static final PacketType STOP_SOUND = new PacketType(PROTOCOL, SENDER, 0x5F, "StopSound");
|
public static final PacketType SET_TITLE_TEXT = new PacketType(PROTOCOL, SENDER, 0x5F, "SetTitleText");
|
||||||
public static final PacketType SYSTEM_CHAT = new PacketType(PROTOCOL, SENDER, 0x60, "SystemChat");
|
public static final PacketType SET_TITLES_ANIMATION = new PacketType(PROTOCOL, SENDER, 0x60, "SetTitlesAnimation");
|
||||||
public static final PacketType PLAYER_LIST_HEADER_FOOTER = new PacketType(PROTOCOL, SENDER, 0x61, "PlayerListHeaderFooter", "SPacketPlayerListHeaderFooter");
|
public static final PacketType ENTITY_SOUND = new PacketType(PROTOCOL, SENDER, 0x61, "EntitySound", "SPacketSoundEffect");
|
||||||
public static final PacketType NBT_QUERY = new PacketType(PROTOCOL, SENDER, 0x62, "NBTQuery");
|
public static final PacketType NAMED_SOUND_EFFECT = new PacketType(PROTOCOL, SENDER, 0x62, "NamedSoundEffect");
|
||||||
public static final PacketType COLLECT = new PacketType(PROTOCOL, SENDER, 0x63, "Collect", "SPacketCollectItem");
|
public static final PacketType STOP_SOUND = new PacketType(PROTOCOL, SENDER, 0x63, "StopSound");
|
||||||
public static final PacketType ENTITY_TELEPORT = new PacketType(PROTOCOL, SENDER, 0x64, "EntityTeleport", "SPacketEntityTeleport");
|
public static final PacketType SYSTEM_CHAT = new PacketType(PROTOCOL, SENDER, 0x64, "SystemChat");
|
||||||
public static final PacketType ADVANCEMENTS = new PacketType(PROTOCOL, SENDER, 0x65, "Advancements", "SPacketAdvancementInfo");
|
public static final PacketType PLAYER_LIST_HEADER_FOOTER = new PacketType(PROTOCOL, SENDER, 0x65, "PlayerListHeaderFooter", "SPacketPlayerListHeaderFooter");
|
||||||
public static final PacketType UPDATE_ATTRIBUTES = new PacketType(PROTOCOL, SENDER, 0x66, "UpdateAttributes", "SPacketEntityProperties");
|
public static final PacketType NBT_QUERY = new PacketType(PROTOCOL, SENDER, 0x66, "NBTQuery");
|
||||||
public static final PacketType UPDATE_ENABLED_FEATURES = new PacketType(PROTOCOL, SENDER, 0x67, "UpdateEnabledFeatures");
|
public static final PacketType COLLECT = new PacketType(PROTOCOL, SENDER, 0x67, "Collect", "SPacketCollectItem");
|
||||||
public static final PacketType ENTITY_EFFECT = new PacketType(PROTOCOL, SENDER, 0x68, "EntityEffect", "SPacketEntityEffect");
|
public static final PacketType ENTITY_TELEPORT = new PacketType(PROTOCOL, SENDER, 0x68, "EntityTeleport", "SPacketEntityTeleport");
|
||||||
public static final PacketType RECIPE_UPDATE = new PacketType(PROTOCOL, SENDER, 0x69, "RecipeUpdate");
|
public static final PacketType ADVANCEMENTS = new PacketType(PROTOCOL, SENDER, 0x69, "Advancements", "SPacketAdvancementInfo");
|
||||||
public static final PacketType TAGS = new PacketType(PROTOCOL, SENDER, 0x6A, "Tags");
|
public static final PacketType UPDATE_ATTRIBUTES = new PacketType(PROTOCOL, SENDER, 0x6A, "UpdateAttributes", "SPacketEntityProperties");
|
||||||
|
public static final PacketType UPDATE_ENABLED_FEATURES = new PacketType(PROTOCOL, SENDER, 0x6B, "UpdateEnabledFeatures");
|
||||||
|
public static final PacketType ENTITY_EFFECT = new PacketType(PROTOCOL, SENDER, 0x6C, "EntityEffect", "SPacketEntityEffect");
|
||||||
|
public static final PacketType RECIPE_UPDATE = new PacketType(PROTOCOL, SENDER, 0x6D, "RecipeUpdate");
|
||||||
|
public static final PacketType TAGS = new PacketType(PROTOCOL, SENDER, 0x6E, "Tags");
|
||||||
|
|
||||||
// ---- Removed in 1.9
|
// ---- Removed in 1.9
|
||||||
|
|
||||||
@ -389,33 +393,33 @@ public class PacketType implements Serializable, Cloneable, Comparable<PacketTyp
|
|||||||
public static final PacketType CHAT_ACK = new PacketType(PROTOCOL, SENDER, 0x03, "ChatAck");
|
public static final PacketType CHAT_ACK = new PacketType(PROTOCOL, SENDER, 0x03, "ChatAck");
|
||||||
public static final PacketType CHAT_COMMAND = new PacketType(PROTOCOL, SENDER, 0x04, "ChatCommand");
|
public static final PacketType CHAT_COMMAND = new PacketType(PROTOCOL, SENDER, 0x04, "ChatCommand");
|
||||||
public static final PacketType CHAT = new PacketType(PROTOCOL, SENDER, 0x05, "Chat", "CPacketChatMessage");
|
public static final PacketType CHAT = new PacketType(PROTOCOL, SENDER, 0x05, "Chat", "CPacketChatMessage");
|
||||||
public static final PacketType CLIENT_COMMAND = new PacketType(PROTOCOL, SENDER, 0x06, "ClientCommand", "CPacketClientStatus");
|
public static final PacketType CHAT_SESSION_UPDATE = new PacketType(PROTOCOL, SENDER, 0x06, "ChatSessionUpdate");
|
||||||
public static final PacketType SETTINGS = new PacketType(PROTOCOL, SENDER, 0x07, "Settings", "CPacketClientSettings");
|
public static final PacketType CLIENT_COMMAND = new PacketType(PROTOCOL, SENDER, 0x07, "ClientCommand", "CPacketClientStatus");
|
||||||
public static final PacketType TAB_COMPLETE = new PacketType(PROTOCOL, SENDER, 0x08, "TabComplete", "CPacketTabComplete");
|
public static final PacketType SETTINGS = new PacketType(PROTOCOL, SENDER, 0x08, "Settings", "CPacketClientSettings");
|
||||||
public static final PacketType ENCHANT_ITEM = new PacketType(PROTOCOL, SENDER, 0x09, "EnchantItem", "CPacketEnchantItem");
|
public static final PacketType TAB_COMPLETE = new PacketType(PROTOCOL, SENDER, 0x09, "TabComplete", "CPacketTabComplete");
|
||||||
public static final PacketType WINDOW_CLICK = new PacketType(PROTOCOL, SENDER, 0x0A, "WindowClick", "CPacketClickWindow");
|
public static final PacketType ENCHANT_ITEM = new PacketType(PROTOCOL, SENDER, 0x0A, "EnchantItem", "CPacketEnchantItem");
|
||||||
public static final PacketType CLOSE_WINDOW = new PacketType(PROTOCOL, SENDER, 0x0B, "CloseWindow", "CPacketCloseWindow");
|
public static final PacketType WINDOW_CLICK = new PacketType(PROTOCOL, SENDER, 0x0B, "WindowClick", "CPacketClickWindow");
|
||||||
public static final PacketType CUSTOM_PAYLOAD = new PacketType(PROTOCOL, SENDER, 0x0C, "CustomPayload", "CPacketCustomPayload");
|
public static final PacketType CLOSE_WINDOW = new PacketType(PROTOCOL, SENDER, 0x0C, "CloseWindow", "CPacketCloseWindow");
|
||||||
public static final PacketType B_EDIT = new PacketType(PROTOCOL, SENDER, 0x0D, "BEdit");
|
public static final PacketType CUSTOM_PAYLOAD = new PacketType(PROTOCOL, SENDER, 0x0D, "CustomPayload", "CPacketCustomPayload");
|
||||||
public static final PacketType ENTITY_NBT_QUERY = new PacketType(PROTOCOL, SENDER, 0x0E, "EntityNBTQuery");
|
public static final PacketType B_EDIT = new PacketType(PROTOCOL, SENDER, 0x0E, "BEdit");
|
||||||
public static final PacketType USE_ENTITY = new PacketType(PROTOCOL, SENDER, 0x0F, "UseEntity", "CPacketUseEntity");
|
public static final PacketType ENTITY_NBT_QUERY = new PacketType(PROTOCOL, SENDER, 0x0F, "EntityNBTQuery");
|
||||||
public static final PacketType JIGSAW_GENERATE = new PacketType(PROTOCOL, SENDER, 0x10, "JigsawGenerate");
|
public static final PacketType USE_ENTITY = new PacketType(PROTOCOL, SENDER, 0x10, "UseEntity", "CPacketUseEntity");
|
||||||
public static final PacketType KEEP_ALIVE = new PacketType(PROTOCOL, SENDER, 0x11, "KeepAlive", "CPacketKeepAlive");
|
public static final PacketType JIGSAW_GENERATE = new PacketType(PROTOCOL, SENDER, 0x11, "JigsawGenerate");
|
||||||
public static final PacketType DIFFICULTY_LOCK = new PacketType(PROTOCOL, SENDER, 0x12, "DifficultyLock");
|
public static final PacketType KEEP_ALIVE = new PacketType(PROTOCOL, SENDER, 0x12, "KeepAlive", "CPacketKeepAlive");
|
||||||
public static final PacketType POSITION = new PacketType(PROTOCOL, SENDER, 0x13, "Flying$PacketPlayInPosition", "Flying$Position", "CPacketPlayer$Position");
|
public static final PacketType DIFFICULTY_LOCK = new PacketType(PROTOCOL, SENDER, 0x13, "DifficultyLock");
|
||||||
public static final PacketType POSITION_LOOK = new PacketType(PROTOCOL, SENDER, 0x14, "Flying$PacketPlayInPositionLook", "Flying$PositionLook", "CPacketPlayer$PositionRotation");
|
public static final PacketType POSITION = new PacketType(PROTOCOL, SENDER, 0x14, "Flying$Position", "Flying$PacketPlayInPosition", "CPacketPlayer$Position");
|
||||||
public static final PacketType LOOK = new PacketType(PROTOCOL, SENDER, 0x15, "Flying$PacketPlayInLook", "Flying$Look", "CPacketPlayer$Rotation");
|
public static final PacketType POSITION_LOOK = new PacketType(PROTOCOL, SENDER, 0x15, "Flying$PositionLook", "Flying$PacketPlayInPositionLook", "CPacketPlayer$PositionRotation");
|
||||||
public static final PacketType GROUND = new PacketType(PROTOCOL, SENDER, 0x16, "Flying$d");
|
public static final PacketType LOOK = new PacketType(PROTOCOL, SENDER, 0x16, "Flying$Look", "Flying$PacketPlayInLook", "CPacketPlayer$Rotation");
|
||||||
public static final PacketType VEHICLE_MOVE = new PacketType(PROTOCOL, SENDER, 0x17, "VehicleMove", "CPacketVehicleMove");
|
public static final PacketType GROUND = new PacketType(PROTOCOL, SENDER, 0x17, "Flying$", "Flying$d");
|
||||||
public static final PacketType BOAT_MOVE = new PacketType(PROTOCOL, SENDER, 0x18, "BoatMove", "CPacketSteerBoat");
|
public static final PacketType VEHICLE_MOVE = new PacketType(PROTOCOL, SENDER, 0x18, "VehicleMove", "CPacketVehicleMove");
|
||||||
public static final PacketType PICK_ITEM = new PacketType(PROTOCOL, SENDER, 0x19, "PickItem");
|
public static final PacketType BOAT_MOVE = new PacketType(PROTOCOL, SENDER, 0x19, "BoatMove", "CPacketSteerBoat");
|
||||||
public static final PacketType AUTO_RECIPE = new PacketType(PROTOCOL, SENDER, 0x1A, "AutoRecipe", "CPacketPlaceRecipe");
|
public static final PacketType PICK_ITEM = new PacketType(PROTOCOL, SENDER, 0x1A, "PickItem");
|
||||||
public static final PacketType ABILITIES = new PacketType(PROTOCOL, SENDER, 0x1B, "Abilities", "CPacketPlayerAbilities");
|
public static final PacketType AUTO_RECIPE = new PacketType(PROTOCOL, SENDER, 0x1B, "AutoRecipe", "CPacketPlaceRecipe");
|
||||||
public static final PacketType BLOCK_DIG = new PacketType(PROTOCOL, SENDER, 0x1C, "BlockDig", "CPacketPlayerDigging");
|
public static final PacketType ABILITIES = new PacketType(PROTOCOL, SENDER, 0x1C, "Abilities", "CPacketPlayerAbilities");
|
||||||
public static final PacketType ENTITY_ACTION = new PacketType(PROTOCOL, SENDER, 0x1D, "EntityAction", "CPacketEntityAction");
|
public static final PacketType BLOCK_DIG = new PacketType(PROTOCOL, SENDER, 0x1D, "BlockDig", "CPacketPlayerDigging");
|
||||||
public static final PacketType STEER_VEHICLE = new PacketType(PROTOCOL, SENDER, 0x1E, "SteerVehicle", "CPacketInput");
|
public static final PacketType ENTITY_ACTION = new PacketType(PROTOCOL, SENDER, 0x1E, "EntityAction", "CPacketEntityAction");
|
||||||
public static final PacketType PONG = new PacketType(PROTOCOL, SENDER, 0x1F, "Pong");
|
public static final PacketType STEER_VEHICLE = new PacketType(PROTOCOL, SENDER, 0x1F, "SteerVehicle", "CPacketInput");
|
||||||
public static final PacketType CHAT_SESSION_UPDATE = new PacketType(PROTOCOL, SENDER, 0x20, "ChatSessionUpdate");
|
public static final PacketType PONG = new PacketType(PROTOCOL, SENDER, 0x20, "Pong");
|
||||||
public static final PacketType RECIPE_SETTINGS = new PacketType(PROTOCOL, SENDER, 0x21, "RecipeSettings");
|
public static final PacketType RECIPE_SETTINGS = new PacketType(PROTOCOL, SENDER, 0x21, "RecipeSettings");
|
||||||
public static final PacketType RECIPE_DISPLAYED = new PacketType(PROTOCOL, SENDER, 0x22, "RecipeDisplayed", "CPacketRecipeInfo");
|
public static final PacketType RECIPE_DISPLAYED = new PacketType(PROTOCOL, SENDER, 0x22, "RecipeDisplayed", "CPacketRecipeInfo");
|
||||||
public static final PacketType ITEM_NAME = new PacketType(PROTOCOL, SENDER, 0x23, "ItemName");
|
public static final PacketType ITEM_NAME = new PacketType(PROTOCOL, SENDER, 0x23, "ItemName");
|
||||||
|
@ -8,7 +8,7 @@ import com.comphenix.protocol.wrappers.Converters;
|
|||||||
|
|
||||||
public class InternalStructure extends AbstractStructure {
|
public class InternalStructure extends AbstractStructure {
|
||||||
|
|
||||||
protected InternalStructure(Object handle, StructureModifier<Object> structureModifier) {
|
public InternalStructure(Object handle, StructureModifier<Object> structureModifier) {
|
||||||
super(handle, structureModifier);
|
super(handle, structureModifier);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -85,6 +85,7 @@ public final class MinecraftProtocolVersion {
|
|||||||
map.put(new MinecraftVersion(1, 19, 1), 760);
|
map.put(new MinecraftVersion(1, 19, 1), 760);
|
||||||
map.put(new MinecraftVersion(1, 19, 2), 760);
|
map.put(new MinecraftVersion(1, 19, 2), 760);
|
||||||
map.put(new MinecraftVersion(1, 19, 3), 761);
|
map.put(new MinecraftVersion(1, 19, 3), 761);
|
||||||
|
map.put(new MinecraftVersion(1, 19, 4), 762);
|
||||||
|
|
||||||
return map;
|
return map;
|
||||||
}
|
}
|
||||||
|
@ -37,6 +37,11 @@ import org.bukkit.Server;
|
|||||||
*/
|
*/
|
||||||
public final class MinecraftVersion implements Comparable<MinecraftVersion>, Serializable {
|
public final class MinecraftVersion implements Comparable<MinecraftVersion>, Serializable {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Version 1.19.4 - the rest of the feature preview
|
||||||
|
*/
|
||||||
|
public static final MinecraftVersion FEATURE_PREVIEW_2 = new MinecraftVersion("1.19.4");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Version 1.19.3 - introducing feature preview
|
* Version 1.19.3 - introducing feature preview
|
||||||
*/
|
*/
|
||||||
@ -117,7 +122,7 @@ public final class MinecraftVersion implements Comparable<MinecraftVersion>, Ser
|
|||||||
/**
|
/**
|
||||||
* The latest release version of minecraft.
|
* The latest release version of minecraft.
|
||||||
*/
|
*/
|
||||||
public static final MinecraftVersion LATEST = FEATURE_PREVIEW_UPDATE;
|
public static final MinecraftVersion LATEST = FEATURE_PREVIEW_2;
|
||||||
|
|
||||||
// used when serializing
|
// used when serializing
|
||||||
private static final long serialVersionUID = -8695133558996459770L;
|
private static final long serialVersionUID = -8695133558996459770L;
|
||||||
|
@ -4,22 +4,21 @@ import com.comphenix.protocol.PacketType;
|
|||||||
import com.comphenix.protocol.injector.BukkitUnwrapper;
|
import com.comphenix.protocol.injector.BukkitUnwrapper;
|
||||||
import com.comphenix.protocol.reflect.EquivalentConverter;
|
import com.comphenix.protocol.reflect.EquivalentConverter;
|
||||||
import com.comphenix.protocol.reflect.accessors.Accessors;
|
import com.comphenix.protocol.reflect.accessors.Accessors;
|
||||||
import com.comphenix.protocol.reflect.accessors.ConstructorAccessor;
|
|
||||||
import com.comphenix.protocol.reflect.accessors.FieldAccessor;
|
import com.comphenix.protocol.reflect.accessors.FieldAccessor;
|
||||||
import com.comphenix.protocol.reflect.accessors.MethodAccessor;
|
import com.comphenix.protocol.reflect.accessors.MethodAccessor;
|
||||||
import com.comphenix.protocol.utility.MinecraftProtocolVersion;
|
|
||||||
import com.comphenix.protocol.utility.MinecraftReflection;
|
import com.comphenix.protocol.utility.MinecraftReflection;
|
||||||
import com.comphenix.protocol.utility.MinecraftVersion;
|
import com.comphenix.protocol.utility.MinecraftVersion;
|
||||||
import com.comphenix.protocol.utility.Util;
|
import com.comphenix.protocol.wrappers.ping.LegacyServerPing;
|
||||||
|
import com.comphenix.protocol.wrappers.ping.ServerPingImpl;
|
||||||
|
import com.comphenix.protocol.wrappers.ping.ServerPingRecord;
|
||||||
import com.google.common.base.Preconditions;
|
import com.google.common.base.Preconditions;
|
||||||
import com.google.common.base.Splitter;
|
import com.google.common.base.Splitter;
|
||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
import com.google.common.io.ByteStreams;
|
import com.google.common.io.ByteStreams;
|
||||||
|
|
||||||
import io.netty.buffer.ByteBuf;
|
import io.netty.buffer.ByteBuf;
|
||||||
import io.netty.buffer.Unpooled;
|
import io.netty.buffer.Unpooled;
|
||||||
import io.netty.handler.codec.base64.Base64;
|
import io.netty.handler.codec.base64.Base64;
|
||||||
import org.bukkit.Bukkit;
|
|
||||||
import org.bukkit.Server;
|
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
import javax.imageio.ImageIO;
|
import javax.imageio.ImageIO;
|
||||||
@ -37,52 +36,21 @@ import java.util.List;
|
|||||||
* Represents a server ping packet data.
|
* Represents a server ping packet data.
|
||||||
* @author Kristian
|
* @author Kristian
|
||||||
*/
|
*/
|
||||||
public class WrappedServerPing extends AbstractWrapper implements ClonableWrapper {
|
public class WrappedServerPing implements ClonableWrapper {
|
||||||
private static Class<?> GAME_PROFILE = MinecraftReflection.getGameProfileClass();
|
private static final Class<?> GAME_PROFILE = MinecraftReflection.getGameProfileClass();
|
||||||
private static Class<?> GAME_PROFILE_ARRAY = MinecraftReflection.getArrayClass(GAME_PROFILE);
|
|
||||||
|
|
||||||
// Server ping fields
|
|
||||||
private static Class<?> SERVER_PING = MinecraftReflection.getServerPingClass();
|
|
||||||
private static ConstructorAccessor SERVER_PING_CONSTRUCTOR = Accessors.getConstructorAccessor(SERVER_PING);
|
|
||||||
private static FieldAccessor DESCRIPTION = Accessors.getFieldAccessor(SERVER_PING, MinecraftReflection.getIChatBaseComponentClass(), true);
|
|
||||||
private static FieldAccessor PLAYERS = Accessors.getFieldAccessor(SERVER_PING, MinecraftReflection.getServerPingPlayerSampleClass(), true);
|
|
||||||
private static FieldAccessor VERSION = Accessors.getFieldAccessor(SERVER_PING, MinecraftReflection.getServerPingServerDataClass(), true);
|
|
||||||
private static FieldAccessor FAVICON = Accessors.getFieldAccessor(SERVER_PING, String.class, true);
|
|
||||||
private static FieldAccessor[] BOOLEAN_ACCESSORS = Accessors.getFieldAccessorArray(SERVER_PING, boolean.class, true);
|
|
||||||
|
|
||||||
// For converting to the underlying array
|
// For converting to the underlying array
|
||||||
private static EquivalentConverter<Iterable<? extends WrappedGameProfile>> PROFILE_CONVERT =
|
private static final EquivalentConverter<Iterable<? extends WrappedGameProfile>> PROFILE_CONVERT =
|
||||||
BukkitConverters.getArrayConverter(GAME_PROFILE, BukkitConverters.getWrappedGameProfileConverter());
|
BukkitConverters.getArrayConverter(GAME_PROFILE, BukkitConverters.getWrappedGameProfileConverter());
|
||||||
|
|
||||||
// Server ping player sample fields
|
|
||||||
private static Class<?> PLAYERS_CLASS = MinecraftReflection.getServerPingPlayerSampleClass();
|
|
||||||
private static ConstructorAccessor PLAYERS_CONSTRUCTOR = Accessors.getConstructorAccessor(PLAYERS_CLASS, int.class, int.class);
|
|
||||||
private static FieldAccessor[] PLAYERS_INTS = Accessors.getFieldAccessorArray(PLAYERS_CLASS, int.class, true);
|
|
||||||
private static FieldAccessor PLAYERS_PROFILES = Accessors.getFieldAccessor(PLAYERS_CLASS, GAME_PROFILE_ARRAY, true);
|
|
||||||
private static FieldAccessor PLAYERS_MAXIMUM = PLAYERS_INTS[0];
|
|
||||||
private static FieldAccessor PLAYERS_ONLINE = PLAYERS_INTS[1];
|
|
||||||
|
|
||||||
// Server ping serialization
|
|
||||||
private static Class<?> GSON_CLASS = MinecraftReflection.getMinecraftGsonClass();
|
|
||||||
private static MethodAccessor GSON_TO_JSON = Accessors.getMethodAccessor(GSON_CLASS, "toJson", Object.class);
|
|
||||||
private static MethodAccessor GSON_FROM_JSON = Accessors.getMethodAccessor(GSON_CLASS, "fromJson", String.class, Class.class);
|
|
||||||
private static FieldAccessor PING_GSON = Accessors.getMemorizing(Accessors.getFieldAccessor(
|
|
||||||
PacketType.Status.Server.SERVER_INFO.getPacketClass(), GSON_CLASS, true
|
|
||||||
));
|
|
||||||
|
|
||||||
// Server data fields
|
|
||||||
private static Class<?> VERSION_CLASS = MinecraftReflection.getServerPingServerDataClass();
|
|
||||||
private static ConstructorAccessor VERSION_CONSTRUCTOR = Accessors.getConstructorAccessor(VERSION_CLASS, String.class, int.class);
|
|
||||||
private static FieldAccessor VERSION_NAME = Accessors.getFieldAccessor(VERSION_CLASS, String.class, true);
|
|
||||||
private static FieldAccessor VERSION_PROTOCOL = Accessors.getFieldAccessor(VERSION_CLASS, int.class, true);
|
|
||||||
|
|
||||||
// Get profile from player
|
// Get profile from player
|
||||||
private static FieldAccessor ENTITY_HUMAN_PROFILE = Accessors.getFieldAccessor(
|
private static final FieldAccessor ENTITY_HUMAN_PROFILE = Accessors.getFieldAccessor(
|
||||||
MinecraftReflection.getEntityPlayerClass().getSuperclass(), GAME_PROFILE, true);
|
MinecraftReflection.getEntityPlayerClass().getSuperclass(), GAME_PROFILE, true);
|
||||||
|
|
||||||
// Inner class
|
// Server ping fields
|
||||||
private Object players; // may be NULL
|
private static final Class<?> SERVER_PING = MinecraftReflection.getServerPingClass();
|
||||||
private Object version;
|
|
||||||
|
private final ServerPingImpl impl;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Construct a new server ping initialized with a zero player count, and zero maximum.
|
* Construct a new server ping initialized with a zero player count, and zero maximum.
|
||||||
@ -90,34 +58,44 @@ public class WrappedServerPing extends AbstractWrapper implements ClonableWrappe
|
|||||||
* Note that the version string is set to 1.9.4.
|
* Note that the version string is set to 1.9.4.
|
||||||
*/
|
*/
|
||||||
public WrappedServerPing() {
|
public WrappedServerPing() {
|
||||||
super(MinecraftReflection.getServerPingClass());
|
this.impl = newImpl();
|
||||||
setHandle(SERVER_PING_CONSTRUCTOR.invoke());
|
|
||||||
resetPlayers();
|
resetPlayers();
|
||||||
resetVersion();
|
resetVersion();
|
||||||
}
|
}
|
||||||
|
|
||||||
private WrappedServerPing(Object handle) {
|
private WrappedServerPing(Object handle) {
|
||||||
super(MinecraftReflection.getServerPingClass());
|
this.impl = newImpl(handle);
|
||||||
setHandle(handle);
|
}
|
||||||
this.players = PLAYERS.get(handle);
|
|
||||||
this.version = VERSION.get(handle);
|
private ServerPingImpl newImpl() {
|
||||||
|
if (MinecraftVersion.FEATURE_PREVIEW_2.atOrAbove()) {
|
||||||
|
return new ServerPingRecord();
|
||||||
|
}
|
||||||
|
|
||||||
|
return new LegacyServerPing();
|
||||||
|
}
|
||||||
|
|
||||||
|
private ServerPingImpl newImpl(Object handle) {
|
||||||
|
if (MinecraftVersion.FEATURE_PREVIEW_2.atOrAbove()) {
|
||||||
|
return new ServerPingRecord();
|
||||||
|
}
|
||||||
|
|
||||||
|
return new LegacyServerPing(handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the player count and player maximum to the default values.
|
* Set the player count and player maximum to the default values.
|
||||||
*/
|
*/
|
||||||
protected void resetPlayers() {
|
protected void resetPlayers() {
|
||||||
players = PLAYERS_CONSTRUCTOR.invoke(0, 0);
|
impl.resetPlayers();
|
||||||
PLAYERS.set(handle, players);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reset the version string to the default state.
|
* Reset the version string to the default state.
|
||||||
*/
|
*/
|
||||||
protected void resetVersion() {
|
protected void resetVersion() {
|
||||||
MinecraftVersion minecraftVersion = MinecraftVersion.getCurrentVersion();
|
impl.resetVersion();
|
||||||
version = VERSION_CONSTRUCTOR.invoke(minecraftVersion.toString(), MinecraftProtocolVersion.getCurrentVersion());
|
|
||||||
VERSION.set(handle, version);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -135,7 +113,8 @@ public class WrappedServerPing extends AbstractWrapper implements ClonableWrappe
|
|||||||
* @return The wrapped server ping.
|
* @return The wrapped server ping.
|
||||||
*/
|
*/
|
||||||
public static WrappedServerPing fromJson(String json) {
|
public static WrappedServerPing fromJson(String json) {
|
||||||
return fromHandle(GSON_FROM_JSON.invoke(PING_GSON.get(null), json, SERVER_PING));
|
// return fromHandle(GSON_FROM_JSON.invoke(PING_GSON.get(null), json, SERVER_PING));
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -143,7 +122,7 @@ public class WrappedServerPing extends AbstractWrapper implements ClonableWrappe
|
|||||||
* @return The messge of the day.
|
* @return The messge of the day.
|
||||||
*/
|
*/
|
||||||
public WrappedChatComponent getMotD() {
|
public WrappedChatComponent getMotD() {
|
||||||
return WrappedChatComponent.fromHandle(DESCRIPTION.get(handle));
|
return WrappedChatComponent.fromHandle(impl.getMotD());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -151,7 +130,7 @@ public class WrappedServerPing extends AbstractWrapper implements ClonableWrappe
|
|||||||
* @param description - message of the day.
|
* @param description - message of the day.
|
||||||
*/
|
*/
|
||||||
public void setMotD(WrappedChatComponent description) {
|
public void setMotD(WrappedChatComponent description) {
|
||||||
DESCRIPTION.set(handle, description.getHandle());
|
impl.setMotD(description.getHandle());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -167,7 +146,7 @@ public class WrappedServerPing extends AbstractWrapper implements ClonableWrappe
|
|||||||
* @return The favicon, or NULL if no favicon will be displayed.
|
* @return The favicon, or NULL if no favicon will be displayed.
|
||||||
*/
|
*/
|
||||||
public CompressedImage getFavicon() {
|
public CompressedImage getFavicon() {
|
||||||
String favicon = (String) FAVICON.get(handle);
|
String favicon = impl.getFavicon();
|
||||||
return (favicon != null) ? CompressedImage.fromEncodedText(favicon) : null;
|
return (favicon != null) ? CompressedImage.fromEncodedText(favicon) : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -176,7 +155,7 @@ public class WrappedServerPing extends AbstractWrapper implements ClonableWrappe
|
|||||||
* @param image - the new compressed image or NULL if no favicon should be displayed.
|
* @param image - the new compressed image or NULL if no favicon should be displayed.
|
||||||
*/
|
*/
|
||||||
public void setFavicon(CompressedImage image) {
|
public void setFavicon(CompressedImage image) {
|
||||||
FAVICON.set(handle, (image != null) ? image.toEncodedText() : null);
|
impl.setFavicon((image != null) ? image.toEncodedText() : null);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -187,7 +166,7 @@ public class WrappedServerPing extends AbstractWrapper implements ClonableWrappe
|
|||||||
*/
|
*/
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public boolean isChatPreviewEnabled() {
|
public boolean isChatPreviewEnabled() {
|
||||||
return (Boolean) BOOLEAN_ACCESSORS[0].get(handle);
|
return impl.isChatPreviewEnabled();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -198,7 +177,7 @@ public class WrappedServerPing extends AbstractWrapper implements ClonableWrappe
|
|||||||
*/
|
*/
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public void setChatPreviewEnabled(boolean chatPreviewEnabled) {
|
public void setChatPreviewEnabled(boolean chatPreviewEnabled) {
|
||||||
BOOLEAN_ACCESSORS[0].set(handle, chatPreviewEnabled);
|
impl.setChatPreviewEnabled(chatPreviewEnabled);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -207,8 +186,7 @@ public class WrappedServerPing extends AbstractWrapper implements ClonableWrappe
|
|||||||
* @since 1.19.1
|
* @since 1.19.1
|
||||||
*/
|
*/
|
||||||
public boolean isEnforceSecureChat() {
|
public boolean isEnforceSecureChat() {
|
||||||
int index = MinecraftVersion.FEATURE_PREVIEW_UPDATE.atOrAbove() ? 0 : 1;
|
return impl.isEnforceSecureChat();
|
||||||
return (Boolean) BOOLEAN_ACCESSORS[index].get(handle);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -217,8 +195,7 @@ public class WrappedServerPing extends AbstractWrapper implements ClonableWrappe
|
|||||||
* @since 1.19.1
|
* @since 1.19.1
|
||||||
*/
|
*/
|
||||||
public void setEnforceSecureChat(boolean enforceSecureChat) {
|
public void setEnforceSecureChat(boolean enforceSecureChat) {
|
||||||
int index = MinecraftVersion.FEATURE_PREVIEW_UPDATE.atOrAbove() ? 0 : 1;
|
impl.setEnforceSecureChat(enforceSecureChat);
|
||||||
BOOLEAN_ACCESSORS[index].set(handle, enforceSecureChat);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -228,9 +205,7 @@ public class WrappedServerPing extends AbstractWrapper implements ClonableWrappe
|
|||||||
* @see #setPlayersOnline(int)
|
* @see #setPlayersOnline(int)
|
||||||
*/
|
*/
|
||||||
public int getPlayersOnline() {
|
public int getPlayersOnline() {
|
||||||
if (players == null)
|
return impl.getPlayersOnline();
|
||||||
throw new IllegalStateException("The player count has been hidden.");
|
|
||||||
return (Integer) PLAYERS_ONLINE.get(players);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -241,9 +216,7 @@ public class WrappedServerPing extends AbstractWrapper implements ClonableWrappe
|
|||||||
* @param online - online players.
|
* @param online - online players.
|
||||||
*/
|
*/
|
||||||
public void setPlayersOnline(int online) {
|
public void setPlayersOnline(int online) {
|
||||||
if (players == null)
|
impl.setPlayersOnline(online);
|
||||||
resetPlayers();
|
|
||||||
PLAYERS_ONLINE.set(players, online);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -253,9 +226,7 @@ public class WrappedServerPing extends AbstractWrapper implements ClonableWrappe
|
|||||||
* @see #setPlayersMaximum(int)
|
* @see #setPlayersMaximum(int)
|
||||||
*/
|
*/
|
||||||
public int getPlayersMaximum() {
|
public int getPlayersMaximum() {
|
||||||
if (players == null)
|
return impl.getPlayersMaximum();
|
||||||
throw new IllegalStateException("The player maximum has been hidden.");
|
|
||||||
return (Integer) PLAYERS_MAXIMUM.get(players);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -266,9 +237,7 @@ public class WrappedServerPing extends AbstractWrapper implements ClonableWrappe
|
|||||||
* @param maximum - maximum player count.
|
* @param maximum - maximum player count.
|
||||||
*/
|
*/
|
||||||
public void setPlayersMaximum(int maximum) {
|
public void setPlayersMaximum(int maximum) {
|
||||||
if (players == null)
|
impl.setPlayersMaximum(maximum);
|
||||||
resetPlayers();
|
|
||||||
PLAYERS_MAXIMUM.set(players, maximum);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -279,14 +248,7 @@ public class WrappedServerPing extends AbstractWrapper implements ClonableWrappe
|
|||||||
*/
|
*/
|
||||||
public void setPlayersVisible(boolean visible) {
|
public void setPlayersVisible(boolean visible) {
|
||||||
if (isPlayersVisible() != visible) {
|
if (isPlayersVisible() != visible) {
|
||||||
if (visible) {
|
impl.setPlayersVisible(visible);
|
||||||
// Recreate the count and maximum
|
|
||||||
Server server = Bukkit.getServer();
|
|
||||||
setPlayersMaximum(server.getMaxPlayers());
|
|
||||||
setPlayersOnline(Bukkit.getOnlinePlayers().size());
|
|
||||||
} else {
|
|
||||||
PLAYERS.set(handle, players = null);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -297,7 +259,7 @@ public class WrappedServerPing extends AbstractWrapper implements ClonableWrappe
|
|||||||
* @return TRUE if the player statistics is visible, FALSE otherwise.
|
* @return TRUE if the player statistics is visible, FALSE otherwise.
|
||||||
*/
|
*/
|
||||||
public boolean isPlayersVisible() {
|
public boolean isPlayersVisible() {
|
||||||
return players != null;
|
return impl.arePlayersVisible();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -305,9 +267,9 @@ public class WrappedServerPing extends AbstractWrapper implements ClonableWrappe
|
|||||||
* @return Logged in players or an empty list if no player names will be displayed.
|
* @return Logged in players or an empty list if no player names will be displayed.
|
||||||
*/
|
*/
|
||||||
public ImmutableList<WrappedGameProfile> getPlayers() {
|
public ImmutableList<WrappedGameProfile> getPlayers() {
|
||||||
if (players == null)
|
if (!isPlayersVisible())
|
||||||
return ImmutableList.of();
|
return ImmutableList.of();
|
||||||
Object playerProfiles = PLAYERS_PROFILES.get(players);
|
Object playerProfiles = impl.getPlayers();
|
||||||
if (playerProfiles == null)
|
if (playerProfiles == null)
|
||||||
return ImmutableList.of();
|
return ImmutableList.of();
|
||||||
return ImmutableList.copyOf(PROFILE_CONVERT.getSpecific(playerProfiles));
|
return ImmutableList.copyOf(PROFILE_CONVERT.getSpecific(playerProfiles));
|
||||||
@ -318,9 +280,9 @@ public class WrappedServerPing extends AbstractWrapper implements ClonableWrappe
|
|||||||
* @param profile - every logged in player.
|
* @param profile - every logged in player.
|
||||||
*/
|
*/
|
||||||
public void setPlayers(Iterable<? extends WrappedGameProfile> profile) {
|
public void setPlayers(Iterable<? extends WrappedGameProfile> profile) {
|
||||||
if (players == null)
|
if (!isPlayersVisible())
|
||||||
resetPlayers();
|
resetPlayers();
|
||||||
PLAYERS_PROFILES.set(players, (profile != null) ? PROFILE_CONVERT.getGeneric(profile) : null);
|
impl.setPlayers((profile != null) ? PROFILE_CONVERT.getGeneric(profile) : null);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -343,7 +305,7 @@ public class WrappedServerPing extends AbstractWrapper implements ClonableWrappe
|
|||||||
* @return The version name.
|
* @return The version name.
|
||||||
*/
|
*/
|
||||||
public String getVersionName() {
|
public String getVersionName() {
|
||||||
return (String) VERSION_NAME.get(version);
|
return impl.getVersionName();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -351,7 +313,7 @@ public class WrappedServerPing extends AbstractWrapper implements ClonableWrappe
|
|||||||
* @param name - the new version name.
|
* @param name - the new version name.
|
||||||
*/
|
*/
|
||||||
public void setVersionName(String name) {
|
public void setVersionName(String name) {
|
||||||
VERSION_NAME.set(version, name);
|
impl.setVersionName(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -359,7 +321,7 @@ public class WrappedServerPing extends AbstractWrapper implements ClonableWrappe
|
|||||||
* @return The protocol.
|
* @return The protocol.
|
||||||
*/
|
*/
|
||||||
public int getVersionProtocol() {
|
public int getVersionProtocol() {
|
||||||
return (Integer) VERSION_PROTOCOL.get(version);
|
return impl.getVersionProtocol();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -367,7 +329,12 @@ public class WrappedServerPing extends AbstractWrapper implements ClonableWrappe
|
|||||||
* @param protocol - the protocol number.
|
* @param protocol - the protocol number.
|
||||||
*/
|
*/
|
||||||
public void setVersionProtocol(int protocol) {
|
public void setVersionProtocol(int protocol) {
|
||||||
VERSION_PROTOCOL.set(version, protocol);
|
impl.setVersionProtocol(protocol);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object getHandle() {
|
||||||
|
return impl.getHandle();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -398,7 +365,8 @@ public class WrappedServerPing extends AbstractWrapper implements ClonableWrappe
|
|||||||
* @return The JSON representation.
|
* @return The JSON representation.
|
||||||
*/
|
*/
|
||||||
public String toJson() {
|
public String toJson() {
|
||||||
return (String) GSON_TO_JSON.invoke(PING_GSON.get(null), handle);
|
return null;
|
||||||
|
// return (String) GSON_TO_JSON.invoke(PING_GSON.get(null), getHandle());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -0,0 +1,399 @@
|
|||||||
|
package com.comphenix.protocol.wrappers.ping;
|
||||||
|
|
||||||
|
import com.comphenix.protocol.PacketType;
|
||||||
|
import com.comphenix.protocol.injector.BukkitUnwrapper;
|
||||||
|
import com.comphenix.protocol.reflect.EquivalentConverter;
|
||||||
|
import com.comphenix.protocol.reflect.accessors.Accessors;
|
||||||
|
import com.comphenix.protocol.reflect.accessors.ConstructorAccessor;
|
||||||
|
import com.comphenix.protocol.reflect.accessors.FieldAccessor;
|
||||||
|
import com.comphenix.protocol.reflect.accessors.MethodAccessor;
|
||||||
|
import com.comphenix.protocol.utility.MinecraftProtocolVersion;
|
||||||
|
import com.comphenix.protocol.utility.MinecraftReflection;
|
||||||
|
import com.comphenix.protocol.utility.MinecraftVersion;
|
||||||
|
import com.comphenix.protocol.wrappers.AbstractWrapper;
|
||||||
|
import com.comphenix.protocol.wrappers.BukkitConverters;
|
||||||
|
import com.comphenix.protocol.wrappers.WrappedChatComponent;
|
||||||
|
import com.comphenix.protocol.wrappers.WrappedGameProfile;
|
||||||
|
import com.google.common.collect.ImmutableList;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.Server;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents a server ping packet data.
|
||||||
|
* @author Kristian
|
||||||
|
*/
|
||||||
|
public class LegacyServerPing extends AbstractWrapper implements ServerPingImpl {
|
||||||
|
private static final Class<?> GAME_PROFILE = MinecraftReflection.getGameProfileClass();
|
||||||
|
|
||||||
|
// For converting to the underlying array
|
||||||
|
private static final EquivalentConverter<Iterable<? extends WrappedGameProfile>> PROFILE_CONVERT =
|
||||||
|
BukkitConverters.getArrayConverter(GAME_PROFILE, BukkitConverters.getWrappedGameProfileConverter());
|
||||||
|
|
||||||
|
// Get profile from player
|
||||||
|
private static final FieldAccessor ENTITY_HUMAN_PROFILE = Accessors.getFieldAccessor(
|
||||||
|
MinecraftReflection.getEntityPlayerClass().getSuperclass(), GAME_PROFILE, true);
|
||||||
|
|
||||||
|
private static final Class<?> GAME_PROFILE_ARRAY = MinecraftReflection.getArrayClass(GAME_PROFILE);
|
||||||
|
|
||||||
|
// Server ping fields
|
||||||
|
private static final Class<?> SERVER_PING = MinecraftReflection.getServerPingClass();
|
||||||
|
private static final ConstructorAccessor SERVER_PING_CONSTRUCTOR = Accessors.getConstructorAccessor(SERVER_PING);
|
||||||
|
private static final FieldAccessor DESCRIPTION = Accessors.getFieldAccessor(SERVER_PING, MinecraftReflection.getIChatBaseComponentClass(), true);
|
||||||
|
private static final FieldAccessor PLAYERS = Accessors.getFieldAccessor(SERVER_PING, MinecraftReflection.getServerPingPlayerSampleClass(), true);
|
||||||
|
private static final FieldAccessor VERSION = Accessors.getFieldAccessor(SERVER_PING, MinecraftReflection.getServerPingServerDataClass(), true);
|
||||||
|
private static final FieldAccessor FAVICON = Accessors.getFieldAccessor(SERVER_PING, String.class, true);
|
||||||
|
private static final FieldAccessor[] BOOLEAN_ACCESSORS = Accessors.getFieldAccessorArray(SERVER_PING, boolean.class, true);
|
||||||
|
|
||||||
|
// Server ping player sample fields
|
||||||
|
private static final Class<?> PLAYERS_CLASS = MinecraftReflection.getServerPingPlayerSampleClass();
|
||||||
|
private static final ConstructorAccessor PLAYERS_CONSTRUCTOR = Accessors.getConstructorAccessor(PLAYERS_CLASS, int.class, int.class);
|
||||||
|
private static final FieldAccessor[] PLAYERS_INTS = Accessors.getFieldAccessorArray(PLAYERS_CLASS, int.class, true);
|
||||||
|
private static final FieldAccessor PLAYERS_PROFILES = Accessors.getFieldAccessor(PLAYERS_CLASS, GAME_PROFILE_ARRAY, true);
|
||||||
|
private static final FieldAccessor PLAYERS_MAXIMUM = PLAYERS_INTS[0];
|
||||||
|
private static final FieldAccessor PLAYERS_ONLINE = PLAYERS_INTS[1];
|
||||||
|
|
||||||
|
// Server ping serialization
|
||||||
|
private static final Class<?> GSON_CLASS = MinecraftReflection.getMinecraftGsonClass();
|
||||||
|
private static final MethodAccessor GSON_TO_JSON = Accessors.getMethodAccessor(GSON_CLASS, "toJson", Object.class);
|
||||||
|
private static final MethodAccessor GSON_FROM_JSON = Accessors.getMethodAccessor(GSON_CLASS, "fromJson", String.class, Class.class);
|
||||||
|
private static final FieldAccessor PING_GSON = Accessors.getMemorizing(Accessors.getFieldAccessor(
|
||||||
|
PacketType.Status.Server.SERVER_INFO.getPacketClass(), GSON_CLASS, true
|
||||||
|
));
|
||||||
|
|
||||||
|
// Server data fields
|
||||||
|
private static final Class<?> VERSION_CLASS = MinecraftReflection.getServerPingServerDataClass();
|
||||||
|
private static final ConstructorAccessor VERSION_CONSTRUCTOR = Accessors.getConstructorAccessor(VERSION_CLASS, String.class, int.class);
|
||||||
|
private static final FieldAccessor VERSION_NAME = Accessors.getFieldAccessor(VERSION_CLASS, String.class, true);
|
||||||
|
private static final FieldAccessor VERSION_PROTOCOL = Accessors.getFieldAccessor(VERSION_CLASS, int.class, true);
|
||||||
|
|
||||||
|
|
||||||
|
// Inner class
|
||||||
|
private Object players; // may be NULL
|
||||||
|
private Object version;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Construct a new server ping initialized with a zero player count, and zero maximum.
|
||||||
|
* <p>
|
||||||
|
* Note that the version string is set to 1.9.4.
|
||||||
|
*/
|
||||||
|
public LegacyServerPing() {
|
||||||
|
super(MinecraftReflection.getServerPingClass());
|
||||||
|
setHandle(SERVER_PING_CONSTRUCTOR.invoke());
|
||||||
|
resetPlayers();
|
||||||
|
resetVersion();
|
||||||
|
}
|
||||||
|
|
||||||
|
public LegacyServerPing(Object handle) {
|
||||||
|
super(MinecraftReflection.getServerPingClass());
|
||||||
|
setHandle(handle);
|
||||||
|
this.players = PLAYERS.get(handle);
|
||||||
|
this.version = VERSION.get(handle);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the player count and player maximum to the default values.
|
||||||
|
*/
|
||||||
|
public void resetPlayers() {
|
||||||
|
players = PLAYERS_CONSTRUCTOR.invoke(0, 0);
|
||||||
|
PLAYERS.set(handle, players);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reset the version string to the default state.
|
||||||
|
*/
|
||||||
|
public void resetVersion() {
|
||||||
|
MinecraftVersion minecraftVersion = MinecraftVersion.getCurrentVersion();
|
||||||
|
version = VERSION_CONSTRUCTOR.invoke(minecraftVersion.toString(), MinecraftProtocolVersion.getCurrentVersion());
|
||||||
|
VERSION.set(handle, version);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Construct a wrapped server ping from a native NMS object.
|
||||||
|
* @param handle - the native object.
|
||||||
|
* @return The wrapped server ping object.
|
||||||
|
*/
|
||||||
|
public static LegacyServerPing fromHandle(Object handle) {
|
||||||
|
return new LegacyServerPing(handle);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Construct a wrapper server ping from an encoded JSON string.
|
||||||
|
* @param json - the JSON string.
|
||||||
|
* @return The wrapped server ping.
|
||||||
|
*/
|
||||||
|
public static LegacyServerPing fromJson(String json) {
|
||||||
|
return fromHandle(GSON_FROM_JSON.invoke(PING_GSON.get(null), json, SERVER_PING));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve the message of the day.
|
||||||
|
* @return The messge of the day.
|
||||||
|
*/
|
||||||
|
public WrappedChatComponent getMotD() {
|
||||||
|
return WrappedChatComponent.fromHandle(DESCRIPTION.get(handle));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the message of the day.
|
||||||
|
* @param description - message of the day.
|
||||||
|
*/
|
||||||
|
public void setMotD(Object description) {
|
||||||
|
DESCRIPTION.set(handle, description);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the message of the day.
|
||||||
|
* @param message - the message.
|
||||||
|
*/
|
||||||
|
public void setMotD(String message) {
|
||||||
|
setMotD(WrappedChatComponent.fromLegacyText(message));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve the compressed PNG file that is being displayed as a favicon.
|
||||||
|
* @return The favicon, or NULL if no favicon will be displayed.
|
||||||
|
*/
|
||||||
|
public String getFavicon() {
|
||||||
|
return (String) FAVICON.get(handle);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the compressed PNG file that is being displayed.
|
||||||
|
* @param image - the new compressed image or NULL if no favicon should be displayed.
|
||||||
|
*/
|
||||||
|
public void setFavicon(String image) {
|
||||||
|
FAVICON.set(handle, image);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve whether chat preview is enabled on the server.
|
||||||
|
* @return whether chat preview is enabled on the server.
|
||||||
|
* @since 1.19
|
||||||
|
* @deprecated Removed in 1.19.3
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
public boolean isChatPreviewEnabled() {
|
||||||
|
return (Boolean) BOOLEAN_ACCESSORS[0].get(handle);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets whether chat preview is enabled on the server.
|
||||||
|
* @param chatPreviewEnabled true if enabled, false otherwise.
|
||||||
|
* @since 1.19
|
||||||
|
* @deprecated Removed in 1.19.3
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
public void setChatPreviewEnabled(boolean chatPreviewEnabled) {
|
||||||
|
BOOLEAN_ACCESSORS[0].set(handle, chatPreviewEnabled);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets whether the server enforces secure chat.
|
||||||
|
* @return whether the server enforces secure chat.
|
||||||
|
* @since 1.19.1
|
||||||
|
*/
|
||||||
|
public boolean isEnforceSecureChat() {
|
||||||
|
int index = MinecraftVersion.FEATURE_PREVIEW_UPDATE.atOrAbove() ? 0 : 1;
|
||||||
|
return (Boolean) BOOLEAN_ACCESSORS[index].get(handle);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets whether the server enforces secure chat.
|
||||||
|
* @param enforceSecureChat true if enabled, false otherwise.
|
||||||
|
* @since 1.19.1
|
||||||
|
*/
|
||||||
|
public void setEnforceSecureChat(boolean enforceSecureChat) {
|
||||||
|
int index = MinecraftVersion.FEATURE_PREVIEW_UPDATE.atOrAbove() ? 0 : 1;
|
||||||
|
BOOLEAN_ACCESSORS[index].set(handle, enforceSecureChat);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve the displayed number of online players.
|
||||||
|
* @return The displayed number.
|
||||||
|
* @throws IllegalStateException If the player count has been hidden via {@link #setPlayersVisible(boolean)}.
|
||||||
|
* @see #setPlayersOnline(int)
|
||||||
|
*/
|
||||||
|
public int getPlayersOnline() {
|
||||||
|
if (players == null)
|
||||||
|
throw new IllegalStateException("The player count has been hidden.");
|
||||||
|
return (Integer) PLAYERS_ONLINE.get(players);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the displayed number of online players.
|
||||||
|
* <p>
|
||||||
|
* As of 1.7.2, this is completely unrestricted, and can be both positive and
|
||||||
|
* negative, as well as higher than the player maximum.
|
||||||
|
* @param online - online players.
|
||||||
|
*/
|
||||||
|
public void setPlayersOnline(int online) {
|
||||||
|
if (players == null)
|
||||||
|
resetPlayers();
|
||||||
|
PLAYERS_ONLINE.set(players, online);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve the displayed maximum number of players.
|
||||||
|
* @return The maximum number.
|
||||||
|
* @throws IllegalStateException If the player maximum has been hidden via {@link #setPlayersVisible(boolean)}.
|
||||||
|
* @see #setPlayersMaximum(int)
|
||||||
|
*/
|
||||||
|
public int getPlayersMaximum() {
|
||||||
|
if (players == null)
|
||||||
|
throw new IllegalStateException("The player maximum has been hidden.");
|
||||||
|
return (Integer) PLAYERS_MAXIMUM.get(players);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the displayed maximum number of players.
|
||||||
|
* <p>
|
||||||
|
* The 1.7.2 accepts any value as a player maximum, positive or negative. It even permits a player maximum that
|
||||||
|
* is less than the player count.
|
||||||
|
* @param maximum - maximum player count.
|
||||||
|
*/
|
||||||
|
public void setPlayersMaximum(int maximum) {
|
||||||
|
if (players == null)
|
||||||
|
resetPlayers();
|
||||||
|
PLAYERS_MAXIMUM.set(players, maximum);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set whether or not the player count and player maximum is visible.
|
||||||
|
* <p>
|
||||||
|
* Note that this may set the current player count and maximum to their respective real values.
|
||||||
|
* @param visible - TRUE if it should be visible, FALSE otherwise.
|
||||||
|
*/
|
||||||
|
public void setPlayersVisible(boolean visible) {
|
||||||
|
if (arePlayersVisible() != visible) {
|
||||||
|
if (visible) {
|
||||||
|
// Recreate the count and maximum
|
||||||
|
Server server = Bukkit.getServer();
|
||||||
|
setPlayersMaximum(server.getMaxPlayers());
|
||||||
|
setPlayersOnline(Bukkit.getOnlinePlayers().size());
|
||||||
|
} else {
|
||||||
|
PLAYERS.set(handle, players = null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine if the player count and maximum is visible.
|
||||||
|
* <p>
|
||||||
|
* If not, the client will display ??? in the same location.
|
||||||
|
* @return TRUE if the player statistics is visible, FALSE otherwise.
|
||||||
|
*/
|
||||||
|
public boolean arePlayersVisible() {
|
||||||
|
return players != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve a copy of all the logged in players.
|
||||||
|
* @return Logged in players or an empty list if no player names will be displayed.
|
||||||
|
*/
|
||||||
|
public ImmutableList<WrappedGameProfile> getPlayers() {
|
||||||
|
if (players == null)
|
||||||
|
return ImmutableList.of();
|
||||||
|
Object playerProfiles = PLAYERS_PROFILES.get(players);
|
||||||
|
if (playerProfiles == null)
|
||||||
|
return ImmutableList.of();
|
||||||
|
return ImmutableList.copyOf(PROFILE_CONVERT.getSpecific(playerProfiles));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the displayed list of logged in players.
|
||||||
|
* @param profile - every logged in player.
|
||||||
|
*/
|
||||||
|
public void setPlayers(Object profile) {
|
||||||
|
if (players == null)
|
||||||
|
resetPlayers();
|
||||||
|
PLAYERS_PROFILES.set(players, profile);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the displayed lst of logged in players.
|
||||||
|
* @param players - the players to display.
|
||||||
|
*/
|
||||||
|
public void setBukkitPlayers(Iterable<? extends Player> players) {
|
||||||
|
final List<WrappedGameProfile> profiles = new ArrayList<>();
|
||||||
|
|
||||||
|
for (Player player : players) {
|
||||||
|
Object profile = ENTITY_HUMAN_PROFILE.get(BukkitUnwrapper.getInstance().unwrapItem(player));
|
||||||
|
profiles.add(WrappedGameProfile.fromHandle(profile));
|
||||||
|
}
|
||||||
|
|
||||||
|
setPlayers(profiles);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve the version name of the current server.
|
||||||
|
* @return The version name.
|
||||||
|
*/
|
||||||
|
public String getVersionName() {
|
||||||
|
return (String) VERSION_NAME.get(version);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the version name of the current server.
|
||||||
|
* @param name - the new version name.
|
||||||
|
*/
|
||||||
|
public void setVersionName(String name) {
|
||||||
|
VERSION_NAME.set(version, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve the protocol number.
|
||||||
|
* @return The protocol.
|
||||||
|
*/
|
||||||
|
public int getVersionProtocol() {
|
||||||
|
return (Integer) VERSION_PROTOCOL.get(version);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the version protocol
|
||||||
|
* @param protocol - the protocol number.
|
||||||
|
*/
|
||||||
|
public void setVersionProtocol(int protocol) {
|
||||||
|
VERSION_PROTOCOL.set(version, protocol);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve a deep copy of the current wrapper object.
|
||||||
|
* @return The current object.
|
||||||
|
*/
|
||||||
|
public LegacyServerPing deepClone() {
|
||||||
|
LegacyServerPing copy = new LegacyServerPing();
|
||||||
|
WrappedChatComponent motd = getMotD();
|
||||||
|
|
||||||
|
copy.setPlayers(getPlayers());
|
||||||
|
copy.setFavicon(getFavicon());
|
||||||
|
copy.setMotD(motd != null ? motd.deepClone() : null);
|
||||||
|
copy.setVersionName(getVersionName());
|
||||||
|
copy.setVersionProtocol(getVersionProtocol());
|
||||||
|
|
||||||
|
if (arePlayersVisible()) {
|
||||||
|
copy.setPlayersMaximum(getPlayersMaximum());
|
||||||
|
copy.setPlayersOnline(getPlayersOnline());
|
||||||
|
} else {
|
||||||
|
copy.setPlayersVisible(false);
|
||||||
|
}
|
||||||
|
return copy;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve the underlying JSON representation of this server ping.
|
||||||
|
* @return The JSON representation.
|
||||||
|
*/
|
||||||
|
public String toJson() {
|
||||||
|
return (String) GSON_TO_JSON.invoke(PING_GSON.get(null), handle);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "WrappedServerPing< " + toJson() + ">";
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,42 @@
|
|||||||
|
package com.comphenix.protocol.wrappers.ping;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import com.comphenix.protocol.wrappers.WrappedChatComponent;
|
||||||
|
import com.comphenix.protocol.wrappers.WrappedGameProfile;
|
||||||
|
import com.comphenix.protocol.wrappers.WrappedServerPing.CompressedImage;
|
||||||
|
|
||||||
|
public interface ServerPingImpl {
|
||||||
|
Object getMotD();
|
||||||
|
void setMotD(Object description);
|
||||||
|
int getPlayersMaximum();
|
||||||
|
void setPlayersMaximum(int maxPlayers);
|
||||||
|
int getPlayersOnline();
|
||||||
|
void setPlayersOnline(int onlineCount);
|
||||||
|
Object getPlayers();
|
||||||
|
void setPlayers(Object playerSample);
|
||||||
|
String getVersionName();
|
||||||
|
void setVersionName(String versionName);
|
||||||
|
int getVersionProtocol();
|
||||||
|
void setVersionProtocol(int protocolVersion);
|
||||||
|
String getFavicon();
|
||||||
|
void setFavicon(String favicon);
|
||||||
|
boolean isEnforceSecureChat();
|
||||||
|
void setEnforceSecureChat(boolean safeChat);
|
||||||
|
|
||||||
|
void resetPlayers();
|
||||||
|
void resetVersion();
|
||||||
|
|
||||||
|
default boolean isChatPreviewEnabled() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
default void setChatPreviewEnabled(boolean enabled) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean arePlayersVisible();
|
||||||
|
void setPlayersVisible(boolean visible);
|
||||||
|
|
||||||
|
Object getHandle();
|
||||||
|
}
|
@ -0,0 +1,264 @@
|
|||||||
|
package com.comphenix.protocol.wrappers.ping;
|
||||||
|
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.util.Base64;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
import com.comphenix.protocol.events.AbstractStructure;
|
||||||
|
import com.comphenix.protocol.events.InternalStructure;
|
||||||
|
import com.comphenix.protocol.reflect.StructureModifier;
|
||||||
|
import com.comphenix.protocol.reflect.accessors.Accessors;
|
||||||
|
import com.comphenix.protocol.reflect.accessors.ConstructorAccessor;
|
||||||
|
import com.comphenix.protocol.utility.MinecraftProtocolVersion;
|
||||||
|
import com.comphenix.protocol.utility.MinecraftReflection;
|
||||||
|
import com.comphenix.protocol.utility.MinecraftVersion;
|
||||||
|
import com.comphenix.protocol.wrappers.*;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
|
||||||
|
public class ServerPingRecord implements ServerPingImpl {
|
||||||
|
private static Class<?> SERVER_PING;
|
||||||
|
private static Class<?> PLAYER_SAMPLE_CLASS;
|
||||||
|
private static Class<?> SERVER_DATA_CLASS;
|
||||||
|
|
||||||
|
private static WrappedChatComponent DEFAULT_DESCRIPTION;
|
||||||
|
|
||||||
|
private static ConstructorAccessor PING_CTOR;
|
||||||
|
|
||||||
|
private static boolean initialized;
|
||||||
|
|
||||||
|
private static void initialize() {
|
||||||
|
if (initialized) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
initialized = true;
|
||||||
|
|
||||||
|
try {
|
||||||
|
SERVER_PING = MinecraftReflection.getServerPingClass();
|
||||||
|
PLAYER_SAMPLE_CLASS = MinecraftReflection.getServerPingPlayerSampleClass();
|
||||||
|
SERVER_DATA_CLASS = MinecraftReflection.getServerPingServerDataClass();
|
||||||
|
|
||||||
|
PING_CTOR = Accessors.getConstructorAccessor(SERVER_PING.getConstructors()[0]);
|
||||||
|
|
||||||
|
DATA_WRAPPER = AutoWrapper
|
||||||
|
.wrap(ServerData.class, SERVER_DATA_CLASS)
|
||||||
|
.field(0, Converters.passthrough(String.class))
|
||||||
|
.field(1, Converters.passthrough(int.class));
|
||||||
|
|
||||||
|
SAMPLE_WRAPPER = AutoWrapper
|
||||||
|
.wrap(PlayerSample.class, PLAYER_SAMPLE_CLASS)
|
||||||
|
.field(0, Converters.passthrough(int.class))
|
||||||
|
.field(1, Converters.passthrough(int.class))
|
||||||
|
.field(2, Converters.passthrough(Object.class));
|
||||||
|
|
||||||
|
FAVICON_WRAPPER = AutoWrapper
|
||||||
|
.wrap(Favicon.class, MinecraftReflection.getMinecraftClass("network.protocol.status.ServerPing$a"))
|
||||||
|
.field(0, Converters.passthrough(byte[].class));
|
||||||
|
|
||||||
|
DEFAULT_DESCRIPTION = WrappedChatComponent.fromLegacyText("A Minecraft Server");
|
||||||
|
} catch (Exception ex) {
|
||||||
|
ex.printStackTrace(); // TODO
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class PlayerSample {
|
||||||
|
public int max;
|
||||||
|
public int online;
|
||||||
|
public Object sample;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class ServerData {
|
||||||
|
public String name;
|
||||||
|
public int protocol;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class Favicon {
|
||||||
|
public byte[] iconBytes;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static AutoWrapper<PlayerSample> SAMPLE_WRAPPER;
|
||||||
|
|
||||||
|
private static AutoWrapper<ServerData> DATA_WRAPPER;
|
||||||
|
|
||||||
|
private static AutoWrapper<Favicon> FAVICON_WRAPPER;
|
||||||
|
|
||||||
|
private Object description;
|
||||||
|
private PlayerSample playerSample;
|
||||||
|
private ServerData serverData;
|
||||||
|
private Favicon favicon;
|
||||||
|
private boolean enforceSafeChat;
|
||||||
|
private boolean playersVisible = true;
|
||||||
|
|
||||||
|
private static ServerData defaultData() {
|
||||||
|
ServerData data = new ServerData();
|
||||||
|
data.name = MinecraftVersion.getCurrentVersion().toString();
|
||||||
|
data.protocol = MinecraftProtocolVersion.getCurrentVersion();
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static PlayerSample defaultSample() {
|
||||||
|
PlayerSample sample = new PlayerSample();
|
||||||
|
sample.max = Bukkit.getMaxPlayers();
|
||||||
|
sample.online = Bukkit.getOnlinePlayers().size();
|
||||||
|
sample.sample = null;
|
||||||
|
return sample;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Favicon defaultFavicon() {
|
||||||
|
Favicon favicon = new Favicon();
|
||||||
|
favicon.iconBytes = new byte[0];
|
||||||
|
return favicon;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ServerPingRecord(Object handle) {
|
||||||
|
initialize();
|
||||||
|
|
||||||
|
StructureModifier<Object> modifier = new StructureModifier<>(handle.getClass()).withTarget(handle);
|
||||||
|
InternalStructure structure = new InternalStructure(handle, modifier);
|
||||||
|
|
||||||
|
this.description = structure.getChatComponents().readSafely(0);
|
||||||
|
|
||||||
|
StructureModifier<Optional<Object>> optionals = structure.getOptionals(Converters.passthrough(Object.class));
|
||||||
|
|
||||||
|
Optional<Object> sampleHandle = optionals.readSafely(0);
|
||||||
|
if (sampleHandle.isPresent()) {
|
||||||
|
this.playerSample = SAMPLE_WRAPPER.wrap(sampleHandle.get());
|
||||||
|
} else {
|
||||||
|
this.playerSample = defaultSample();
|
||||||
|
}
|
||||||
|
|
||||||
|
Optional<Object> dataHandle = optionals.readSafely(1);
|
||||||
|
if (dataHandle.isPresent()) {
|
||||||
|
this.serverData = DATA_WRAPPER.wrap(dataHandle.get());
|
||||||
|
} else {
|
||||||
|
this.serverData = defaultData();
|
||||||
|
}
|
||||||
|
|
||||||
|
Optional<Object> faviconHandle = optionals.readSafely(2);
|
||||||
|
if (faviconHandle.isPresent()) {
|
||||||
|
this.favicon = FAVICON_WRAPPER.wrap(faviconHandle.get());
|
||||||
|
} else {
|
||||||
|
this.favicon = defaultFavicon();
|
||||||
|
}
|
||||||
|
|
||||||
|
this.enforceSafeChat = structure.getBooleans().readSafely(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ServerPingRecord() {
|
||||||
|
initialize();
|
||||||
|
|
||||||
|
this.description = DEFAULT_DESCRIPTION;
|
||||||
|
this.favicon = defaultFavicon();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object getMotD() {
|
||||||
|
return description;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setMotD(Object description) {
|
||||||
|
this.description = description;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getPlayersMaximum() {
|
||||||
|
return playerSample.max;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setPlayersMaximum(int maxPlayers) {
|
||||||
|
playerSample.max = maxPlayers;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getPlayersOnline() {
|
||||||
|
return playerSample.online;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setPlayersOnline(int onlineCount) {
|
||||||
|
playerSample.online = onlineCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object getPlayers() {
|
||||||
|
return playerSample;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setPlayers(Object playerSample) {
|
||||||
|
this.playerSample.sample = playerSample;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getVersionName() {
|
||||||
|
return serverData.name;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setVersionName(String versionName) {
|
||||||
|
serverData.name = versionName;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getVersionProtocol() {
|
||||||
|
return serverData.protocol;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setVersionProtocol(int protocolVersion) {
|
||||||
|
serverData.protocol = protocolVersion;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getFavicon() {
|
||||||
|
return new String(favicon.iconBytes, StandardCharsets.UTF_8);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setFavicon(String favicon) {
|
||||||
|
this.favicon.iconBytes = favicon.getBytes(StandardCharsets.UTF_8);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEnforceSecureChat() {
|
||||||
|
return enforceSafeChat;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setEnforceSecureChat(boolean safeChat) {
|
||||||
|
this.enforceSafeChat = safeChat;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void resetPlayers() {
|
||||||
|
this.playerSample = defaultSample();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void resetVersion() {
|
||||||
|
this.serverData = defaultData();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean arePlayersVisible() {
|
||||||
|
return playersVisible;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setPlayersVisible(boolean visible) {
|
||||||
|
this.playersVisible = visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object getHandle() {
|
||||||
|
Optional<Object> players = Optional.of(SAMPLE_WRAPPER.unwrap(playerSample));
|
||||||
|
Optional<Object> version = Optional.of(DATA_WRAPPER.unwrap(serverData));
|
||||||
|
Optional<Object> favHandle = Optional.of(FAVICON_WRAPPER.unwrap(favicon));
|
||||||
|
|
||||||
|
return PING_CTOR.invoke(description, players, version, favHandle, enforceSafeChat);
|
||||||
|
}
|
||||||
|
}
|
@ -14,10 +14,10 @@ import org.apache.logging.log4j.LogManager;
|
|||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.Server;
|
import org.bukkit.Server;
|
||||||
import org.bukkit.World;
|
import org.bukkit.World;
|
||||||
import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
|
import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
|
||||||
import org.bukkit.craftbukkit.v1_19_R2.CraftWorld;
|
import org.bukkit.craftbukkit.v1_19_R3.CraftWorld;
|
||||||
import org.bukkit.craftbukkit.v1_19_R2.inventory.CraftItemFactory;
|
import org.bukkit.craftbukkit.v1_19_R3.inventory.CraftItemFactory;
|
||||||
import org.bukkit.craftbukkit.v1_19_R2.util.Versioning;
|
import org.bukkit.craftbukkit.v1_19_R3.util.Versioning;
|
||||||
import org.spigotmc.SpigotWorldConfig;
|
import org.spigotmc.SpigotWorldConfig;
|
||||||
|
|
||||||
import static org.mockito.Mockito.mock;
|
import static org.mockito.Mockito.mock;
|
||||||
|
@ -61,7 +61,9 @@ public class PacketTypeTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public static void main(String[] args) throws Exception {
|
// @Test
|
||||||
|
// public static void main(String[] args) throws Exception {
|
||||||
|
public void generateNewPackets() throws Exception {
|
||||||
MinecraftReflectionTestUtil.init();
|
MinecraftReflectionTestUtil.init();
|
||||||
|
|
||||||
Set<Class<?>> allTypes = new HashSet<>();
|
Set<Class<?>> allTypes = new HashSet<>();
|
||||||
@ -71,7 +73,7 @@ public class PacketTypeTest {
|
|||||||
for (EnumProtocol protocol : protocols) {
|
for (EnumProtocol protocol : protocols) {
|
||||||
System.out.println(WordUtils.capitalize(protocol.name().toLowerCase()));
|
System.out.println(WordUtils.capitalize(protocol.name().toLowerCase()));
|
||||||
|
|
||||||
Field field = EnumProtocol.class.getDeclaredField("j");
|
Field field = EnumProtocol.class.getDeclaredField("k");
|
||||||
field.setAccessible(true);
|
field.setAccessible(true);
|
||||||
|
|
||||||
Map<EnumProtocolDirection, Object> map = (Map<EnumProtocolDirection, Object>) field.get(protocol);
|
Map<EnumProtocolDirection, Object> map = (Map<EnumProtocolDirection, Object>) field.get(protocol);
|
||||||
@ -173,18 +175,35 @@ public class PacketTypeTest {
|
|||||||
|
|
||||||
className = classNames.get(classNames.size() - 1);
|
className = classNames.get(classNames.size() - 1);
|
||||||
|
|
||||||
// Format it like SET_PROTOCOL
|
PacketType existing = null;
|
||||||
StringBuilder fieldName = new StringBuilder();
|
try {
|
||||||
char[] chars = className.toCharArray();
|
existing = PacketType.fromClass(clazz);
|
||||||
for (int i = 0; i < chars.length; i++) {
|
if (existing.isDynamic()) {
|
||||||
char c = chars[i];
|
existing = null;
|
||||||
if (i != 0 && Character.isUpperCase(c)) {
|
|
||||||
fieldName.append("_");
|
|
||||||
}
|
}
|
||||||
fieldName.append(Character.toUpperCase(c));
|
} catch (Exception ignored) {
|
||||||
|
// doesn't exist
|
||||||
}
|
}
|
||||||
|
|
||||||
builder.append(fieldName.toString().replace("N_B_T", "NBT"));
|
String fieldName;
|
||||||
|
if (existing == null) {
|
||||||
|
// Format it like SET_PROTOCOL
|
||||||
|
StringBuilder fieldNameBuilder = new StringBuilder();
|
||||||
|
char[] chars = className.toCharArray();
|
||||||
|
for (int i = 0; i < chars.length; i++) {
|
||||||
|
char c = chars[i];
|
||||||
|
if (i != 0 && Character.isUpperCase(c)) {
|
||||||
|
fieldNameBuilder.append("_");
|
||||||
|
}
|
||||||
|
fieldNameBuilder.append(Character.toUpperCase(c));
|
||||||
|
}
|
||||||
|
|
||||||
|
fieldName = fieldNameBuilder.toString().replace("N_B_T", "NBT");
|
||||||
|
} else {
|
||||||
|
fieldName = existing.name();
|
||||||
|
}
|
||||||
|
|
||||||
|
builder.append(fieldName);
|
||||||
builder.append(" = ");
|
builder.append(" = ");
|
||||||
|
|
||||||
// Add spacing
|
// Add spacing
|
||||||
@ -282,7 +301,7 @@ public class PacketTypeTest {
|
|||||||
|
|
||||||
EnumProtocol[] protocols = EnumProtocol.values();
|
EnumProtocol[] protocols = EnumProtocol.values();
|
||||||
for (EnumProtocol protocol : protocols) {
|
for (EnumProtocol protocol : protocols) {
|
||||||
Field field = EnumProtocol.class.getDeclaredField("j");
|
Field field = EnumProtocol.class.getDeclaredField("k");
|
||||||
field.setAccessible(true);
|
field.setAccessible(true);
|
||||||
|
|
||||||
Map<EnumProtocolDirection, Object> map = (Map<EnumProtocolDirection, Object>) field.get(protocol);
|
Map<EnumProtocolDirection, Object> map = (Map<EnumProtocolDirection, Object>) field.get(protocol);
|
||||||
|
@ -827,7 +827,8 @@ public class PacketContainerTest {
|
|||||||
// Try constructing all the packets
|
// Try constructing all the packets
|
||||||
for (PacketType type : PacketType.values()) {
|
for (PacketType type : PacketType.values()) {
|
||||||
// TODO: try to support chat - for now chat contains to many sub classes to properly clone it
|
// TODO: try to support chat - for now chat contains to many sub classes to properly clone it
|
||||||
if (type.isDeprecated() || !type.isSupported() || type.name().contains("CUSTOM_PAYLOAD") || type.name().contains("CHAT")) {
|
if (type.isDeprecated() || !type.isSupported() || type.name().contains("CUSTOM_PAYLOAD") || type.name().contains("CHAT")
|
||||||
|
|| type.name().contains("DELIMITER")) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,8 +12,8 @@ import net.minecraft.server.level.PlayerChunkMap;
|
|||||||
import net.minecraft.server.level.PlayerChunkMap.EntityTracker;
|
import net.minecraft.server.level.PlayerChunkMap.EntityTracker;
|
||||||
import net.minecraft.server.level.WorldServer;
|
import net.minecraft.server.level.WorldServer;
|
||||||
import net.minecraft.world.entity.Entity;
|
import net.minecraft.world.entity.Entity;
|
||||||
import org.bukkit.craftbukkit.v1_19_R2.CraftWorld;
|
import org.bukkit.craftbukkit.v1_19_R3.CraftWorld;
|
||||||
import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
|
import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
|
||||||
import org.junit.jupiter.api.BeforeAll;
|
import org.junit.jupiter.api.BeforeAll;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
@ -13,7 +13,7 @@ import net.minecraft.world.level.ChunkCoordIntPair;
|
|||||||
import net.minecraft.world.level.block.state.IBlockData;
|
import net.minecraft.world.level.block.state.IBlockData;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.block.Block;
|
import org.bukkit.block.Block;
|
||||||
import org.bukkit.craftbukkit.v1_19_R2.inventory.CraftItemStack;
|
import org.bukkit.craftbukkit.v1_19_R3.inventory.CraftItemStack;
|
||||||
import org.bukkit.entity.Entity;
|
import org.bukkit.entity.Entity;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
import org.junit.jupiter.api.AfterAll;
|
import org.junit.jupiter.api.AfterAll;
|
||||||
|
@ -3,7 +3,7 @@ package com.comphenix.protocol.utility;
|
|||||||
public class MinecraftReflectionTestUtil {
|
public class MinecraftReflectionTestUtil {
|
||||||
|
|
||||||
public static final String RELEASE_TARGET = "1.19.3";
|
public static final String RELEASE_TARGET = "1.19.3";
|
||||||
public static final String PACKAGE_VERSION = "v1_19_R2";
|
public static final String PACKAGE_VERSION = "v1_19_R3";
|
||||||
public static final String NMS = "net.minecraft";
|
public static final String NMS = "net.minecraft";
|
||||||
public static final String OBC = "org.bukkit.craftbukkit." + PACKAGE_VERSION;
|
public static final String OBC = "org.bukkit.craftbukkit." + PACKAGE_VERSION;
|
||||||
|
|
||||||
|
@ -8,6 +8,8 @@ import static org.junit.jupiter.api.Assertions.assertFalse;
|
|||||||
import static org.junit.jupiter.api.Assertions.assertSame;
|
import static org.junit.jupiter.api.Assertions.assertSame;
|
||||||
|
|
||||||
import com.comphenix.protocol.BukkitInitialization;
|
import com.comphenix.protocol.BukkitInitialization;
|
||||||
|
import com.comphenix.protocol.utility.MinecraftReflection;
|
||||||
|
|
||||||
import net.minecraft.advancements.AdvancementDisplay;
|
import net.minecraft.advancements.AdvancementDisplay;
|
||||||
import net.minecraft.advancements.AdvancementFrameType;
|
import net.minecraft.advancements.AdvancementFrameType;
|
||||||
import net.minecraft.network.chat.IChatBaseComponent;
|
import net.minecraft.network.chat.IChatBaseComponent;
|
||||||
@ -20,100 +22,100 @@ import org.junit.jupiter.api.Test;
|
|||||||
|
|
||||||
public class AutoWrapperTest {
|
public class AutoWrapperTest {
|
||||||
|
|
||||||
@BeforeAll
|
@BeforeAll
|
||||||
public static void initializeBukkit() {
|
public static void initializeBukkit() {
|
||||||
BukkitInitialization.initializeAll();
|
BukkitInitialization.initializeAll();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testToNms() {
|
public void testToNms() {
|
||||||
WrappedAdvancementDisplay display = new WrappedAdvancementDisplay();
|
WrappedAdvancementDisplay display = new WrappedAdvancementDisplay();
|
||||||
display.title = WrappedChatComponent.fromText("Test123");
|
display.title = WrappedChatComponent.fromText("Test123");
|
||||||
display.description = WrappedChatComponent.fromText("Test567");
|
display.description = WrappedChatComponent.fromText("Test567");
|
||||||
display.item = new ItemStack(Material.GOLD_INGOT);
|
display.item = new ItemStack(Material.GOLD_INGOT);
|
||||||
display.background = new MinecraftKey("test");
|
display.background = new MinecraftKey("test");
|
||||||
display.frameType = WrappedFrameType.CHALLENGE;
|
display.frameType = WrappedFrameType.CHALLENGE;
|
||||||
display.announceChat = false;
|
display.announceChat = false;
|
||||||
display.showToast = true;
|
display.showToast = true;
|
||||||
display.hidden = true;
|
display.hidden = true;
|
||||||
display.x = 5f;
|
display.x = 5f;
|
||||||
display.y = 67f;
|
display.y = 67f;
|
||||||
|
|
||||||
AdvancementDisplay nms = (AdvancementDisplay) displayWrapper().unwrap(display);
|
AdvancementDisplay nms = (AdvancementDisplay) displayWrapper().unwrap(display);
|
||||||
|
|
||||||
assertTrue(nms.h());
|
assertTrue(nms.h());
|
||||||
assertTrue(nms.j());
|
assertTrue(nms.j());
|
||||||
assertFalse(nms.i());
|
assertFalse(nms.i());
|
||||||
assertEquals("test", nms.d().a());
|
assertEquals("test", nms.d().a());
|
||||||
validateRawText(nms.a(), "Test123");
|
validateRawText(nms.a(), "Test123");
|
||||||
validateRawText(nms.b(), "Test567");
|
validateRawText(nms.b(), "Test567");
|
||||||
assertSame(AdvancementFrameType.b, nms.e());
|
assertSame(AdvancementFrameType.b, nms.e());
|
||||||
assertSame(Items.nv, nms.c().c());
|
assertSame(MinecraftReflection.getBukkitItemStack(nms.c()).getType(), Material.GOLD_INGOT);
|
||||||
assertEquals(5f, nms.f(), 0f);
|
assertEquals(5f, nms.f(), 0f);
|
||||||
assertEquals(67f, nms.g(), 0f);
|
assertEquals(67f, nms.g(), 0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testFromNms() {
|
public void testFromNms() {
|
||||||
AdvancementDisplay display = new AdvancementDisplay(
|
AdvancementDisplay display = new AdvancementDisplay(
|
||||||
new net.minecraft.world.item.ItemStack(Items.rc),
|
(net.minecraft.world.item.ItemStack)MinecraftReflection.getMinecraftItemStack(new ItemStack(Material.ENDER_EYE)),
|
||||||
IChatBaseComponent.b("Test123"),
|
IChatBaseComponent.b("Test123"),
|
||||||
IChatBaseComponent.b("Test567"),
|
IChatBaseComponent.b("Test567"),
|
||||||
new net.minecraft.resources.MinecraftKey("minecraft", "test"),
|
new net.minecraft.resources.MinecraftKey("minecraft", "test"),
|
||||||
AdvancementFrameType.b,
|
AdvancementFrameType.b,
|
||||||
true,
|
true,
|
||||||
false,
|
false,
|
||||||
true
|
true
|
||||||
);
|
);
|
||||||
display.a(5f, 67f);
|
display.a(5f, 67f);
|
||||||
|
|
||||||
WrappedAdvancementDisplay wrapped = displayWrapper().wrap(display);
|
WrappedAdvancementDisplay wrapped = displayWrapper().wrap(display);
|
||||||
|
|
||||||
assertTrue(wrapped.showToast);
|
assertTrue(wrapped.showToast);
|
||||||
assertTrue(wrapped.hidden);
|
assertTrue(wrapped.hidden);
|
||||||
assertFalse(wrapped.announceChat);
|
assertFalse(wrapped.announceChat);
|
||||||
assertEquals("test", wrapped.background.getKey());
|
assertEquals("test", wrapped.background.getKey());
|
||||||
assertEquals("{\"text\":\"Test123\"}", wrapped.title.getJson());
|
assertEquals("{\"text\":\"Test123\"}", wrapped.title.getJson());
|
||||||
assertEquals("{\"text\":\"Test567\"}", wrapped.description.getJson());
|
assertEquals("{\"text\":\"Test567\"}", wrapped.description.getJson());
|
||||||
assertSame(WrappedFrameType.CHALLENGE, wrapped.frameType);
|
assertSame(WrappedFrameType.CHALLENGE, wrapped.frameType);
|
||||||
assertSame(Material.ENDER_EYE, wrapped.item.getType());
|
assertSame(Material.ENDER_EYE, wrapped.item.getType());
|
||||||
assertEquals(5f, wrapped.x, 0f);
|
assertEquals(5f, wrapped.x, 0f);
|
||||||
assertEquals(67f, wrapped.y, 0f);
|
assertEquals(67f, wrapped.y, 0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
private AutoWrapper<WrappedAdvancementDisplay> displayWrapper() {
|
private AutoWrapper<WrappedAdvancementDisplay> displayWrapper() {
|
||||||
return AutoWrapper
|
return AutoWrapper
|
||||||
.wrap(WrappedAdvancementDisplay.class, "advancements.AdvancementDisplay", "advancements.DisplayInfo")
|
.wrap(WrappedAdvancementDisplay.class, "advancements.AdvancementDisplay", "advancements.DisplayInfo")
|
||||||
.field(0, BukkitConverters.getWrappedChatComponentConverter())
|
.field(0, BukkitConverters.getWrappedChatComponentConverter())
|
||||||
.field(1, BukkitConverters.getWrappedChatComponentConverter())
|
.field(1, BukkitConverters.getWrappedChatComponentConverter())
|
||||||
.field(2, BukkitConverters.getItemStackConverter())
|
.field(2, BukkitConverters.getItemStackConverter())
|
||||||
.field(3, MinecraftKey.getConverter())
|
.field(3, MinecraftKey.getConverter())
|
||||||
.field(4, EnumWrappers.getGenericConverter(getMinecraftClass("advancements.AdvancementFrameType", "advancements.FrameType"),
|
.field(4, EnumWrappers.getGenericConverter(getMinecraftClass("advancements.AdvancementFrameType", "advancements.FrameType"),
|
||||||
WrappedFrameType.class));
|
WrappedFrameType.class));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void validateRawText(IChatBaseComponent component, String expected) {
|
private void validateRawText(IChatBaseComponent component, String expected) {
|
||||||
LiteralContents content = assertInstanceOf(LiteralContents.class, component.b());
|
LiteralContents content = assertInstanceOf(LiteralContents.class, component.b());
|
||||||
assertEquals(expected, content.a());
|
assertEquals(expected, content.a());
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum WrappedFrameType {
|
public enum WrappedFrameType {
|
||||||
TASK,
|
TASK,
|
||||||
CHALLENGE,
|
CHALLENGE,
|
||||||
GOAL
|
GOAL
|
||||||
}
|
}
|
||||||
|
|
||||||
public static final class WrappedAdvancementDisplay {
|
public static final class WrappedAdvancementDisplay {
|
||||||
|
|
||||||
public WrappedChatComponent title;
|
public WrappedChatComponent title;
|
||||||
public WrappedChatComponent description;
|
public WrappedChatComponent description;
|
||||||
public ItemStack item;
|
public ItemStack item;
|
||||||
public MinecraftKey background;
|
public MinecraftKey background;
|
||||||
public WrappedFrameType frameType;
|
public WrappedFrameType frameType;
|
||||||
public boolean showToast;
|
public boolean showToast;
|
||||||
public boolean announceChat;
|
public boolean announceChat;
|
||||||
public boolean hidden;
|
public boolean hidden;
|
||||||
public float x;
|
public float x;
|
||||||
public float y;
|
public float y;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,9 +19,9 @@ import net.minecraft.world.level.block.state.IBlockData;
|
|||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.block.BlockFace;
|
import org.bukkit.block.BlockFace;
|
||||||
import org.bukkit.block.data.type.GlassPane;
|
import org.bukkit.block.data.type.GlassPane;
|
||||||
import org.bukkit.craftbukkit.v1_19_R2.block.data.CraftBlockData;
|
import org.bukkit.craftbukkit.v1_19_R3.block.data.CraftBlockData;
|
||||||
import org.bukkit.craftbukkit.v1_19_R2.block.impl.CraftStainedGlassPane;
|
import org.bukkit.craftbukkit.v1_19_R3.block.impl.CraftStainedGlassPane;
|
||||||
import org.bukkit.craftbukkit.v1_19_R2.util.CraftMagicNumbers;
|
import org.bukkit.craftbukkit.v1_19_R3.util.CraftMagicNumbers;
|
||||||
import org.junit.jupiter.api.BeforeAll;
|
import org.junit.jupiter.api.BeforeAll;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
@ -56,7 +56,7 @@ public class WrappedBlockDataTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testDataCreation() {
|
public void testDataCreation() {
|
||||||
IBlockData nmsData = CraftMagicNumbers.getBlock(Material.CYAN_STAINED_GLASS_PANE).n();
|
IBlockData nmsData = CraftMagicNumbers.getBlock(Material.CYAN_STAINED_GLASS_PANE).o();
|
||||||
GlassPane data = (GlassPane) CraftBlockData.fromData(nmsData);
|
GlassPane data = (GlassPane) CraftBlockData.fromData(nmsData);
|
||||||
data.setFace(BlockFace.EAST, true);
|
data.setFace(BlockFace.EAST, true);
|
||||||
|
|
||||||
|
@ -21,8 +21,8 @@ import com.comphenix.protocol.wrappers.WrappedDataWatcher.Registry;
|
|||||||
import com.comphenix.protocol.wrappers.WrappedDataWatcher.Serializer;
|
import com.comphenix.protocol.wrappers.WrappedDataWatcher.Serializer;
|
||||||
import com.comphenix.protocol.wrappers.WrappedDataWatcher.WrappedDataWatcherObject;
|
import com.comphenix.protocol.wrappers.WrappedDataWatcher.WrappedDataWatcherObject;
|
||||||
import net.minecraft.world.entity.projectile.EntityEgg;
|
import net.minecraft.world.entity.projectile.EntityEgg;
|
||||||
import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEgg;
|
import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEgg;
|
||||||
import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
|
import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
|
||||||
import org.junit.jupiter.api.BeforeAll;
|
import org.junit.jupiter.api.BeforeAll;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
@ -25,7 +25,7 @@ import net.minecraft.world.level.chunk.ILightAccess;
|
|||||||
import net.minecraft.world.level.lighting.LightEngine;
|
import net.minecraft.world.level.lighting.LightEngine;
|
||||||
import org.apache.commons.lang3.builder.EqualsBuilder;
|
import org.apache.commons.lang3.builder.EqualsBuilder;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.craftbukkit.v1_19_R2.CraftWorld;
|
import org.bukkit.craftbukkit.v1_19_R3.CraftWorld;
|
||||||
import org.junit.jupiter.api.BeforeAll;
|
import org.junit.jupiter.api.BeforeAll;
|
||||||
import org.junit.jupiter.api.Disabled;
|
import org.junit.jupiter.api.Disabled;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
@ -58,7 +58,7 @@ public class WrappedLevelChunkDataTest {
|
|||||||
when(nmsWorld.v_()).thenReturn(256);
|
when(nmsWorld.v_()).thenReturn(256);
|
||||||
when(nmsWorld.ai()).thenReturn(16); // LevelHeightAccessor is mocked and therefore always returns 0, there are further methods like this which might cause errors in the future
|
when(nmsWorld.ai()).thenReturn(16); // LevelHeightAccessor is mocked and therefore always returns 0, there are further methods like this which might cause errors in the future
|
||||||
|
|
||||||
when(nmsWorld.m_()).thenReturn(engine);
|
when(nmsWorld.l_()).thenReturn(engine);
|
||||||
}
|
}
|
||||||
|
|
||||||
private final WorldServer nmsWorld;
|
private final WorldServer nmsWorld;
|
||||||
@ -69,7 +69,7 @@ public class WrappedLevelChunkDataTest {
|
|||||||
this.nmsWorld = ((CraftWorld) Bukkit.getWorlds().get(0)).getHandle();
|
this.nmsWorld = ((CraftWorld) Bukkit.getWorlds().get(0)).getHandle();
|
||||||
this.chunk = new Chunk(nmsWorld, new ChunkCoordIntPair(5, 5));
|
this.chunk = new Chunk(nmsWorld, new ChunkCoordIntPair(5, 5));
|
||||||
|
|
||||||
IBlockData bellData = BuiltInRegistries.f.a(new MinecraftKey("bell")).n();
|
IBlockData bellData = BuiltInRegistries.f.a(new MinecraftKey("bell")).o();
|
||||||
|
|
||||||
chunk.b(0).a(0, 0, 0, bellData);
|
chunk.b(0).a(0, 0, 0, bellData);
|
||||||
chunk.a(new TileEntityBell(BlockPosition.b, bellData));
|
chunk.a(new TileEntityBell(BlockPosition.b, bellData));
|
||||||
@ -77,7 +77,7 @@ public class WrappedLevelChunkDataTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testChunkData() {
|
public void testChunkData() {
|
||||||
ClientboundLevelChunkWithLightPacket packet = new ClientboundLevelChunkWithLightPacket(chunk, nmsWorld.m_(), null, null, false);
|
ClientboundLevelChunkWithLightPacket packet = new ClientboundLevelChunkWithLightPacket(chunk, nmsWorld.l_(), null, null, false);
|
||||||
PacketContainer container = PacketContainer.fromPacket(packet);
|
PacketContainer container = PacketContainer.fromPacket(packet);
|
||||||
Object rawInstance = container.getSpecificModifier(MinecraftReflection.getLevelChunkPacketDataClass()).read(0);
|
Object rawInstance = container.getSpecificModifier(MinecraftReflection.getLevelChunkPacketDataClass()).read(0);
|
||||||
Object virtualInstance = BukkitConverters.getWrappedChunkDataConverter().getGeneric(container.getLevelChunkData().read(0));
|
Object virtualInstance = BukkitConverters.getWrappedChunkDataConverter().getGeneric(container.getLevelChunkData().read(0));
|
||||||
@ -117,7 +117,7 @@ public class WrappedLevelChunkDataTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testLightData() {
|
public void testLightData() {
|
||||||
ClientboundLevelChunkWithLightPacket packet = new ClientboundLevelChunkWithLightPacket(chunk, nmsWorld.m_(), null, null, false);
|
ClientboundLevelChunkWithLightPacket packet = new ClientboundLevelChunkWithLightPacket(chunk, nmsWorld.l_(), null, null, false);
|
||||||
PacketContainer container = PacketContainer.fromPacket(packet);
|
PacketContainer container = PacketContainer.fromPacket(packet);
|
||||||
|
|
||||||
randomizeBitSets(container.getSpecificModifier(MinecraftReflection.getLightUpdatePacketDataClass()).read(0));
|
randomizeBitSets(container.getSpecificModifier(MinecraftReflection.getLightUpdatePacketDataClass()).read(0));
|
||||||
|
Loading…
Reference in New Issue
Block a user