@Override public String toString() { Class<?> clazz = getPacketClass(); if (clazz == null) return name() + "[" + protocol + ", " + sender + ", " + currentId + ", classNames: " + Arrays.toString(classNames) + " (unregistered)]"; else return name() + "[class=" + clazz.getSimpleName() + ", id=" + currentId + "]"; }
@Override public Object getGeneric(MultiBlockChangeInfo specific) { try { if (constructor == null) { constructor = nmsClass.getConstructor( PacketType.Play.Server.MULTI_BLOCK_CHANGE.getPacketClass(), short.class, MinecraftReflection.getIBlockDataClass() ); } return constructor.newInstance( null, specific.location, BukkitConverters.getWrappedBlockDataConverter().getGeneric(specific.data) ); } catch (Throwable ex) { throw new RuntimeException("Failed to construct MultiBlockChangeInfo instance.", ex); } }
public static Class<?> getSoundEffectClass() { try { return getMinecraftClass("SoundEffect"); } catch (RuntimeException ex) { FuzzyReflection fuzzy = FuzzyReflection.fromClass(PacketType.Play.Server.NAMED_SOUND_EFFECT.getPacketClass(), true); Field field = fuzzy.getFieldByType("(.*)(Sound)(.*)"); return setMinecraftClass("SoundEffect", field.getType()); } }
/** * Retrieve the Gson class used by Minecraft. * @return The Gson class. */ public static Class<?> getMinecraftGsonClass() { try { return getMinecraftLibraryClass("com.google.gson.Gson"); } catch (RuntimeException e) { Class<?> match = FuzzyReflection.fromClass(PacketType.Status.Server.SERVER_INFO.getPacketClass(), true) .getFieldByType("(.*)(google.gson.Gson)").getType(); return setMinecraftLibraryClass("com.google.gson.Gson", match); } }
/** * Retrieve the attribute snapshot class. * <p> * This stores the final value of an attribute, along with all the associated computational steps. * @return The attribute snapshot class. */ public static Class<?> getAttributeSnapshotClass() { try { return getMinecraftClass("AttributeSnapshot", "PacketPlayOutUpdateAttributes$AttributeSnapshot"); } catch (RuntimeException ex) { try { // It should be the parameter of a list in the update attributes packet FuzzyReflection fuzzy = FuzzyReflection.fromClass(PacketType.Play.Server.UPDATE_ATTRIBUTES.getPacketClass(), true); Field field = fuzzy.getFieldByType("attributes", Collection.class); Type param = ((ParameterizedType) field.getGenericType()).getActualTypeArguments()[0]; return setMinecraftClass("AttributeSnapshot", (Class<?>) param); } catch (Throwable ex1) { return getMinecraftClass("AttributeSnapshot"); } } }
PACKET_LOGIN_CLIENT = PacketType.Login.Client.START.getPacketClass(); PACKET_SET_PROTOCOL = PacketType.Handshake.Client.SET_PROTOCOL.getPacketClass(); } catch (Throwable ex) {
sender.sendMessage(ChatColor.GREEN + "Now logging " + type.getPacketClass().getSimpleName()); return true;
PROTOCOL_CLASS = getEnum(PacketType.Handshake.Client.SET_PROTOCOL.getPacketClass(), 0); CLIENT_COMMAND_CLASS = getEnum(PacketType.Play.Client.CLIENT_COMMAND.getPacketClass(), 0); CHAT_VISIBILITY_CLASS = getEnum(PacketType.Play.Client.SETTINGS.getPacketClass(), 0); DIFFICULTY_CLASS = getEnum(PacketType.Play.Server.LOGIN.getPacketClass(), 1); ENTITY_USE_ACTION_CLASS = getEnum(PacketType.Play.Client.USE_ENTITY.getPacketClass(), 0); GAMEMODE_CLASS = getEnum(PacketType.Play.Server.LOGIN.getPacketClass(), 0); RESOURCE_PACK_STATUS_CLASS = getEnum(PacketType.Play.Client.RESOURCE_PACK_STATUS.getPacketClass(), 0); PLAYER_INFO_ACTION_CLASS = getEnum(PacketType.Play.Server.PLAYER_INFO.getPacketClass(), 0); TITLE_ACTION_CLASS = getEnum(PacketType.Play.Server.TITLE.getPacketClass(), 0); WORLD_BORDER_ACTION_CLASS = getEnum(PacketType.Play.Server.WORLD_BORDER.getPacketClass(), 0); COMBAT_EVENT_TYPE_CLASS = getEnum(PacketType.Play.Server.COMBAT_EVENT.getPacketClass(), 0); PLAYER_DIG_TYPE_CLASS = getEnum(PacketType.Play.Client.BLOCK_DIG.getPacketClass(), 1); PLAYER_ACTION_CLASS = getEnum(PacketType.Play.Client.ENTITY_ACTION.getPacketClass(), 0); SCOREBOARD_ACTION_CLASS = getEnum(PacketType.Play.Server.SCOREBOARD_SCORE.getPacketClass(), 0); PARTICLE_CLASS = getEnum(PacketType.Play.Server.WORLD_PARTICLES.getPacketClass(), 0); SOUND_CATEGORY_CLASS = getEnum(PacketType.Play.Server.CUSTOM_SOUND_EFFECT.getPacketClass(), 0); ITEM_SLOT_CLASS = getEnum(PacketType.Play.Server.ENTITY_EQUIPMENT.getPacketClass(), 0); HAND_CLASS = getEnum(PacketType.Play.Client.USE_ENTITY.getPacketClass(), 1); DIRECTION_CLASS = getEnum(PacketType.Play.Client.USE_ITEM.getPacketClass(), 0); CHAT_TYPE_CLASS = getEnum(PacketType.Play.Server.CHAT.getPacketClass(), 0);
/** * Retrieve the GameProfile class in 1.7.2 and later. * * @return The game profile class. * @throws IllegalStateException If we are running 1.6.4 or earlier. */ public static Class<?> getGameProfileClass() { if (!isUsingNetty()) throw new IllegalStateException("GameProfile does not exist in version 1.6.4 and earlier."); try { return getClass("com.mojang.authlib.GameProfile"); } catch (Throwable ex) { try { return getClass("net.minecraft.util.com.mojang.authlib.GameProfile"); } catch (Throwable ex1) { FuzzyReflection reflection = FuzzyReflection.fromClass(PacketType.Login.Client.START.getPacketClass(), true); FuzzyFieldContract contract = FuzzyFieldContract.newBuilder() .banModifier(Modifier.STATIC) .typeMatches(FuzzyMatchers.matchRegex("(.*)(GameProfile)", 1)) .build(); return reflection.getField(contract).getType(); } } }
/** * Retrieve the ServerPing class in Minecraft 1.7.2. * @return The ServerPing class. */ public static Class<?> getServerPingClass() { if (!isUsingNetty()) throw new IllegalStateException("ServerPing is only supported in 1.7.2."); try { return getMinecraftClass("ServerPing"); } catch (RuntimeException e) { Class<?> statusServerInfo = PacketType.Status.Server.SERVER_INFO.getPacketClass(); // Find a server ping object AbstractFuzzyMatcher<Class<?>> serverPingContract = FuzzyClassContract.newBuilder(). field(FuzzyFieldContract.newBuilder().typeExact(String.class).build()). field(FuzzyFieldContract.newBuilder().typeDerivedOf(getIChatBaseComponentClass()).build()). build(). and(getMinecraftObjectMatcher()); return setMinecraftClass("ServerPing", FuzzyReflection.fromClass(statusServerInfo, true). getField(FuzzyFieldContract.matchType(serverPingContract)).getType()); } }