Skip to content

Commit

Permalink
Add support for 1.17, update version to 1.2.2
Browse files Browse the repository at this point in the history
  • Loading branch information
MinusKube committed Aug 3, 2021
1 parent 0bf6834 commit 0649103
Show file tree
Hide file tree
Showing 4 changed files with 67 additions and 47 deletions.
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ Scoreboard API for your Minecraft Sponge and Bukkit Plugins.
**You can use this as a Plugin, or just add it to your dependencies.**

## Features:
- Works for all the **Bukkit** versions since **1.7** (even **1.15**!).
- Works for all the **Bukkit** versions since **1.7** (even **1.17**!).
- Works with **Sponge**! (Tell me if a version is not compatible)
- No blinking!
- Max characters per line:
Expand Down Expand Up @@ -83,10 +83,10 @@ repositories {
}
dependencies {
compile 'fr.minuskube:netherboard-bukkit:1.2.1'
compile 'fr.minuskube:netherboard-bukkit:1.2.2'
// Or if you use Sponge:
// compile 'fr.minuskube:netherboard-sponge:1.2.1'
// compile 'fr.minuskube:netherboard-sponge:1.2.2'
}
```

Expand All @@ -102,7 +102,7 @@ dependencies {
<artifactId>netherboard-sponge</artifactId>
-->

<version>1.2.1</version>
<version>1.2.2</version>
</dependency>
```

Expand Down
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ subprojects {
sourceCompatibility = '1.8'

group 'fr.minuskube'
version '1.2.1'
version '1.2.2'

repositories {
mavenCentral()
Expand Down
102 changes: 61 additions & 41 deletions bukkit/src/main/java/fr/minuskube/netherboard/bukkit/util/NMS.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@ public class NMS {

private static final Logger LOGGER = LoggerFactory.getLogger(NMS.class);

private static String packageName;
private static Version version;
private static final String OLD_PACKAGE_NAME;
private static final Version VERSION;

public static final Field PLAYER_SCORES;

Expand All @@ -38,11 +38,9 @@ public class NMS {

static {
String name = Bukkit.getServer().getClass().getPackage().getName();

String ver = name.substring(name.lastIndexOf('.') + 1);
version = new Version(ver);

packageName = "net.minecraft.server." + ver;
VERSION = new Version(ver);
OLD_PACKAGE_NAME = "net.minecraft.server." + ver;

Field playerScores = null;

Expand All @@ -62,29 +60,43 @@ public class NMS {
Method sendPacket = null;

try {
Class<?> packetScoreClass = getClass("PacketPlayOutScoreboardScore");
Class<?> packetDisplayClass = getClass("PacketPlayOutScoreboardDisplayObjective");
Class<?> packetObjClass = getClass("PacketPlayOutScoreboardObjective");
Class<?> packetScoreClass = getClass("net.minecraft.network.protocol.game", "PacketPlayOutScoreboardScore");
Class<?> packetDisplayClass = getClass("net.minecraft.network.protocol.game", "PacketPlayOutScoreboardDisplayObjective");
Class<?> packetObjClass = getClass("net.minecraft.network.protocol.game", "PacketPlayOutScoreboardObjective");

Class<?> scoreClass = getClass("ScoreboardScore");
Class<?> scoreActionClass = getClass("ScoreboardServer$Action");
Class<?> scoreClass = getClass("net.minecraft.world.scores", "ScoreboardScore");

Class<?> sbClass = getClass("Scoreboard");
Class<?> objClass = getClass("ScoreboardObjective");
Class<?> sbClass = getClass("net.minecraft.world.scores", "Scoreboard");
Class<?> objClass = getClass("net.minecraft.world.scores", "ScoreboardObjective");

Class<?> playerClass = getClass("EntityPlayer");
Class<?> playerConnectionClass = getClass("PlayerConnection");
Class<?> packetClass = getClass("Packet");
Class<?> playerClass = getClass("net.minecraft.server.level", "EntityPlayer");
Class<?> playerConnectionClass = getClass("net.minecraft.server.network", "PlayerConnection");
Class<?> packetClass = getClass("net.minecraft.network.protocol", "Packet");

playerScores = sbClass.getDeclaredField("playerScores");
playerScores.setAccessible(true);

sbScore = scoreClass.getConstructor(sbClass, objClass, String.class);
sbScoreSet = scoreClass.getMethod("setScore", int.class);

packetObj = packetObjClass.getConstructor(objClass, int.class);

switch(version.getMajor()) {
packetDisplay = packetDisplayClass.getConstructor(int.class, objClass);

sendPacket = playerConnectionClass.getMethod("sendPacket", packetClass);

if (VERSION.isBelow1_17()) {
playerScores = sbClass.getDeclaredField("playerScores");
playerScores.setAccessible(true);

playerConnection = playerClass.getField("playerConnection");
}
else {
playerScores = sbClass.getDeclaredField("j");
playerScores.setAccessible(true);

playerConnection = playerClass.getField("b");
}

switch (VERSION.getMajor()) {
case "1.7":
packetScore = packetScoreClass.getConstructor(scoreClass, int.class);
break;
Expand All @@ -97,18 +109,15 @@ public class NMS {
packetScoreRemove = packetScoreClass.getConstructor(String.class, objClass);
break;
default:
Class<?> scoreActionClass = getClass("net.minecraft.server", "ScoreboardServer$Action");

packetScore = packetScoreClass.getConstructor(scoreActionClass,
String.class, String.class, int.class);

enumScoreActionChange = scoreActionClass.getEnumConstants()[0];
enumScoreActionRemove = scoreActionClass.getEnumConstants()[1];
break;
}

packetDisplay = packetDisplayClass.getConstructor(int.class, objClass);

playerConnection = playerClass.getField("playerConnection");
sendPacket = playerConnectionClass.getMethod("sendPacket", packetClass);
} catch(Exception e) {
LOGGER.error("Error while loading NMS methods. (Unsupported Minecraft version?)", e);
}
Expand All @@ -132,33 +141,31 @@ public class NMS {
}

public static Version getVersion() {
return version;
return VERSION;
}

public static Class<?> getClass(String name) {
try {
return Class.forName(packageName + "." + name);
} catch(ClassNotFoundException e) {
return null;
}
public static Class<?> getClass(String realPackageName, String name) throws ClassNotFoundException {
String packageName = VERSION.isBelow1_17() ? OLD_PACKAGE_NAME : realPackageName;

return Class.forName(packageName + "." + name);
}

private static Map<Class<?>, Method> handles = new HashMap<>();
private static final Map<Class<?>, Method> HANDLES = new HashMap<>();
public static Object getHandle(Object obj) throws NoSuchMethodException,
InvocationTargetException, IllegalAccessException {

Class<?> clazz = obj.getClass();

if(!handles.containsKey(clazz)) {
if(!HANDLES.containsKey(clazz)) {
Method method = clazz.getDeclaredMethod("getHandle");

if(!method.isAccessible())
method.setAccessible(true);

handles.put(clazz, method);
HANDLES.put(clazz, method);
}

return handles.get(clazz).invoke(obj);
return HANDLES.get(clazz).invoke(obj);
}

public static void sendPacket(Object packet, Player... players) {
Expand All @@ -174,25 +181,38 @@ public static void sendPacket(Object packet, Player... players) {

public static class Version {

private String name;
private final String name;

private String major;
private String minor;
private final String major;
private final String minor;

Version(String name) {
this.name = name;

String[] splitted = name.split("_");
String[] splitName = name.split("_");

this.major = splitted[0].substring(1) + "." + splitted[1];
this.minor = splitted[2].substring(1);
this.major = splitName[0].substring(1) + "." + splitName[1];
this.minor = splitName[2].substring(1);
}

public String getName() { return name; }

public String getMajor() { return major; }
public String getMinor() { return minor; }

public boolean isBelow1_17() {
return major.equals("1.7") ||
major.equals("1.8") ||
major.equals("1.9") ||
major.equals("1.10") ||
major.equals("1.11") ||
major.equals("1.12") ||
major.equals("1.13") ||
major.equals("1.14") ||
major.equals("1.15") ||
major.equals("1.16");
}

}

}
2 changes: 1 addition & 1 deletion bukkit/src/main/resources/plugin.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
name: Netherboard
version: 1.2.1
version: 1.2.2
description: Scoreboard API for your Bukkit Plugins.
author: MinusKube
website: https://github.com/MinusKube/netherboard
Expand Down

0 comments on commit 0649103

Please sign in to comment.