Skip to content

Commit

Permalink
1.7 support, now 1.7 - 1.12.2, automatically grabbing NMS version
Browse files Browse the repository at this point in the history
  • Loading branch information
Nixuge committed Aug 25, 2024
1 parent 5466140 commit d5c61dc
Show file tree
Hide file tree
Showing 5 changed files with 71 additions and 27 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ private PacketAdapterLoader() {
private static @Nullable Class<?> tryLoadVersion(@NotNull String serverVersion) {
switch (serverVersion) {
case "1.7.10":
case "1.12.2":
return tryLoadImplementationClass(LEGACY_REFLECTIONS);
case "1.8.8":
return tryLoadImplementationClass(V1_8_R3);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,15 +21,16 @@
import java.util.Collection;

import static net.megavex.scoreboardlibrary.implementation.packetAdapter.legacyreflections.PacketAccessors.*;
import static net.megavex.scoreboardlibrary.implementation.packetAdapter.legacyreflections.RandomUtils.is1_8Plus;

public class ObjectivePacketAdapterImpl implements ObjectivePacketAdapter {
private static final ConstructorAccessor<Object> packetPlayOutScoreboardObjectiveConstructor = ReflectUtil.findConstructorOrThrow(packetPlayOutScoreboardObjectiveClass);
private static final ConstructorAccessor<Object> packetPlayOutScoreboardDisplayObjectiveConstructor = ReflectUtil.findConstructorOrThrow(packetPlayOutScoreboardDisplayObjectiveClass);
private static final ConstructorAccessor<Object> packetPlayOutScoreboardScoreConstructor = ReflectUtil.findConstructorOrThrow(packetPlayOutScoreboardScoreClass, String.class);

private static final Object enumScoreboardActionChange = RandomUtils.getStaticField(enumScoreboardActionClass, "CHANGE");
private static final Object enumScoreboardHealthInteger = RandomUtils.getStaticField(enumScoreboardHealthDisplayClass, "INTEGER");
private static final Object enumScoreboardHealthHearts = RandomUtils.getStaticField(enumScoreboardHealthDisplayClass, "HEARTS");
private static final Object enumScoreboardActionChange = is1_8Plus ? RandomUtils.getStaticField(enumScoreboardActionClass, "CHANGE") : null;
private static final Object enumScoreboardHealthInteger = is1_8Plus ? RandomUtils.getStaticField(enumScoreboardHealthDisplayClass, "INTEGER") : null;
private static final Object enumScoreboardHealthHearts = is1_8Plus ? RandomUtils.getStaticField(enumScoreboardHealthDisplayClass, "HEARTS") : null;

private final PacketSender<Object> sender;
private final String objectiveName;
Expand Down Expand Up @@ -84,7 +85,12 @@ public void sendScore(
Object packet = packetPlayOutScoreboardScoreConstructor.invoke(entry);
PacketAccessors.SCORE_OBJECTIVE_NAME_FIELD.set(packet, objectiveName);
PacketAccessors.SCORE_VALUE_FIELD.set(packet, value);
PacketAccessors.SCORE_ACTION_FIELD.set(packet, enumScoreboardActionChange);
if (is1_8Plus) {
PacketAccessors.SCORE_ACTION_FIELD_1_8.set(packet, enumScoreboardActionChange);
} else {
PacketAccessors.SCORE_ACTION_FIELD_1_7.set(packet, 0);
}

sender.sendPacket(players, packet);
}

Expand All @@ -107,19 +113,21 @@ public void removeScore(@NotNull Collection<Player> players, @NotNull String ent
String legacyValue = LegacyFormatUtil.limitLegacyText(LegacyComponentSerializer.legacySection().serialize(value), ObjectiveConstants.LEGACY_VALUE_CHAR_LIMIT);
PacketAccessors.OBJECTIVE_DISPLAY_NAME_FIELD.set(packet, legacyValue);

Object nmsRenderType;
switch (renderType) {
case INTEGER:
nmsRenderType = enumScoreboardHealthInteger;
break;
case HEARTS:
nmsRenderType = enumScoreboardHealthHearts;
break;
default:
throw new IllegalStateException();
if (is1_8Plus) {
Object nmsRenderType;
switch (renderType) {
case INTEGER:
nmsRenderType = enumScoreboardHealthInteger;
break;
case HEARTS:
nmsRenderType = enumScoreboardHealthHearts;
break;
default:
throw new IllegalStateException();
}
PacketAccessors.OBJECTIVE_HEALTH_DISPLAY_FIELD.set(packet, nmsRenderType);
}

PacketAccessors.OBJECTIVE_HEALTH_DISPLAY_FIELD.set(packet, nmsRenderType);
return packet;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,22 @@

import java.util.Collection;

import static net.megavex.scoreboardlibrary.implementation.packetAdapter.legacyreflections.RandomUtils.is1_7Minus;
import static net.megavex.scoreboardlibrary.implementation.packetAdapter.legacyreflections.RandomUtils.is1_8Plus;

public final class PacketAccessors {
public static final Class<Object> packetPlayOutScoreboardObjectiveClass =
RandomUtils.getServerClass("PacketPlayOutScoreboardObjective");
public static final Class<Object> enumScoreboardHealthDisplayClass =
RandomUtils.getServerClass("IScoreboardCriteria$EnumScoreboardHealthDisplay");
is1_8Plus ? RandomUtils.getServerClass("IScoreboardCriteria$EnumScoreboardHealthDisplay") : null;

public static final Class<Object> packetPlayOutScoreboardDisplayObjectiveClass =
RandomUtils.getServerClass("PacketPlayOutScoreboardDisplayObjective");

public static final Class<Object> packetPlayOutScoreboardScoreClass =
RandomUtils.getServerClass("PacketPlayOutScoreboardScore");
public static final Class<Object> enumScoreboardActionClass =
RandomUtils.getServerClass("PacketPlayOutScoreboardScore$EnumScoreboardAction");
is1_8Plus ? RandomUtils.getServerClass("PacketPlayOutScoreboardScore$EnumScoreboardAction") : null;

public static final Class<Object> packetPlayOutScoreboardTeamClass =
RandomUtils.getServerClass("PacketPlayOutScoreboardTeam");
Expand All @@ -28,7 +31,7 @@ public final class PacketAccessors {
public static final FieldAccessor<Object, String> OBJECTIVE_DISPLAY_NAME_FIELD =
ReflectUtil.findField(packetPlayOutScoreboardObjectiveClass, 1, String.class);
public static final FieldAccessor<Object, Object> OBJECTIVE_HEALTH_DISPLAY_FIELD =
ReflectUtil.findField(packetPlayOutScoreboardObjectiveClass, 0, enumScoreboardHealthDisplayClass);
is1_8Plus ? ReflectUtil.findField(packetPlayOutScoreboardObjectiveClass, 0, enumScoreboardHealthDisplayClass) : null;
public static final FieldAccessor<Object, Integer> OBJECTIVE_MODE_FIELD =
ReflectUtil.findField(packetPlayOutScoreboardObjectiveClass, 0, int.class);

Expand All @@ -41,8 +44,11 @@ public final class PacketAccessors {
ReflectUtil.findField(packetPlayOutScoreboardScoreClass, 1, String.class);
public static final FieldAccessor<Object, Integer> SCORE_VALUE_FIELD =
ReflectUtil.findField(packetPlayOutScoreboardScoreClass, 0, int.class);
public static final FieldAccessor<Object, Object> SCORE_ACTION_FIELD =
ReflectUtil.findField(packetPlayOutScoreboardScoreClass, 0, enumScoreboardActionClass);

public static final FieldAccessor<Object, Object> SCORE_ACTION_FIELD_1_8 =
is1_8Plus ? ReflectUtil.findField(packetPlayOutScoreboardScoreClass, 0, enumScoreboardActionClass) : null;
public static final FieldAccessor<Object, Integer> SCORE_ACTION_FIELD_1_7 =
is1_7Minus ? ReflectUtil.findField(packetPlayOutScoreboardScoreClass, 1, int.class) : null;

public static final FieldAccessor<Object, String> TEAM_NAME_FIELD =
ReflectUtil.findField(packetPlayOutScoreboardTeamClass, 0, String.class);
Expand All @@ -53,7 +59,7 @@ public final class PacketAccessors {
public static final FieldAccessor<Object, String> TEAM_SUFFIX_FIELD =
ReflectUtil.findField(packetPlayOutScoreboardTeamClass, 3, String.class);
public static final FieldAccessor<Object, String> TEAM_NAME_TAG_VISIBILITY_FIELD =
ReflectUtil.findField(packetPlayOutScoreboardTeamClass, 4, String.class);
is1_8Plus ? ReflectUtil.findField(packetPlayOutScoreboardTeamClass, 4, String.class) : null;
public static final FieldAccessor<Object, Integer> TEAM_COLOR_FIELD =
ReflectUtil.findField(packetPlayOutScoreboardTeamClass, 0, int.class);
@SuppressWarnings("rawtypes")
Expand All @@ -62,7 +68,7 @@ public final class PacketAccessors {
public static final FieldAccessor<Object, Integer> TEAM_MODE_FIELD =
ReflectUtil.findField(packetPlayOutScoreboardTeamClass, 1, int.class);
public static final FieldAccessor<Object, Integer> TEAM_RULES_FIELD =
ReflectUtil.findField(packetPlayOutScoreboardTeamClass, 2, int.class);
is1_8Plus ? ReflectUtil.findField(packetPlayOutScoreboardTeamClass, 2, int.class) : null;

private PacketAccessors() {
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,22 +1,30 @@
package net.megavex.scoreboardlibrary.implementation.packetAdapter.legacyreflections;

import org.bukkit.Bukkit;

import java.lang.reflect.InvocationTargetException;

public class RandomUtils {
public static final String MINECRAFT_VERSION = "v1_8_R3";
private static final String NMS_VERSION_STRING = Bukkit.getServer().getClass().getPackage().getName().split("\\.")[3];
public static final VersionType MINECRAFT_VERSION = VersionType.fromNmsVersion(NMS_VERSION_STRING);

public static final boolean is1_8Plus = MINECRAFT_VERSION.isHigherOrEqual(VersionType.v1_8);
public static final boolean is1_7Minus = MINECRAFT_VERSION.isLower(VersionType.v1_8);

public static Class<Object> getClass(String fullPath) {
System.out.println("IS 1.8 PLUS: " + is1_8Plus);
System.out.println("MC VERSION: " + MINECRAFT_VERSION);
try {
return (Class<Object>)Class.forName(fullPath);
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
}
public static Class<Object> getServerClass(String path) {
return getClass(String.format("net.minecraft.server.%s.%s", MINECRAFT_VERSION, path));
return getClass(String.format("net.minecraft.server.%s.%s", NMS_VERSION_STRING, path));
}
public static Class<Object> getCraftBukkitClass(String path) {
return getClass(String.format("org.bukkit.craftbukkit.%s.%s", MINECRAFT_VERSION, path));
return getClass(String.format("org.bukkit.craftbukkit.%s.%s", NMS_VERSION_STRING, path));
}

// TODO: method cache, either for all methods (cache elements & reuse when called) or for commonly used methods (dedicated fields)
Expand Down Expand Up @@ -50,4 +58,19 @@ public static Object getStaticField(Class<?> clazz, String fieldName) {
throw new RuntimeException(e);
}
}

enum VersionType {
v1_7, v1_8, v1_9, v1_10, v1_11, v1_12;

public boolean isHigherOrEqual(VersionType other) {
return this.ordinal() >= other.ordinal();
}
public boolean isLower(VersionType other) {
return !isHigherOrEqual(other);
}

public static VersionType fromNmsVersion(String version) {
return valueOf(version.split("_R")[0]);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@

import static net.megavex.scoreboardlibrary.implementation.commons.LegacyFormatUtil.limitLegacyText;
import static net.megavex.scoreboardlibrary.implementation.packetAdapter.legacyreflections.PacketAccessors.packetPlayOutScoreboardTeamClass;
import static net.megavex.scoreboardlibrary.implementation.packetAdapter.legacyreflections.RandomUtils.is1_8Plus;

public class TeamsPacketAdapterImpl implements TeamsPacketAdapter {
private static final Class<Object> enumChatFormatClass = RandomUtils.getServerClass("EnumChatFormat");
Expand Down Expand Up @@ -89,7 +90,9 @@ public void sendProperties(@NotNull PropertiesPacketType packetType, @NotNull Co
PacketAccessors.TEAM_DISPLAY_NAME_FIELD.set(packet, displayName);
PacketAccessors.TEAM_PREFIX_FIELD.set(packet, prefix);
PacketAccessors.TEAM_SUFFIX_FIELD.set(packet, suffix);
PacketAccessors.TEAM_NAME_TAG_VISIBILITY_FIELD.set(packet, properties.nameTagVisibility().key());
if (is1_8Plus) {
PacketAccessors.TEAM_NAME_TAG_VISIBILITY_FIELD.set(packet, properties.nameTagVisibility().key());
}

NamedTextColor color = properties.playerColor();
if (color != null) {
Expand All @@ -116,7 +119,10 @@ public void sendProperties(@NotNull PropertiesPacketType packetType, @NotNull Co
PacketAccessors.TEAM_COLOR_FIELD.set(packet, teamColorField);
}

PacketAccessors.TEAM_RULES_FIELD.set(packet, properties.packOptions());
if (is1_8Plus) {
PacketAccessors.TEAM_RULES_FIELD.set(packet, properties.packOptions());
}

if (packetType == PropertiesPacketType.CREATE) {
PacketAccessors.TEAM_ENTRIES_FIELD.set(packet, ImmutableList.copyOf(properties.syncedEntries()));
}
Expand Down

0 comments on commit d5c61dc

Please sign in to comment.