Skip to content

Commit 9666bab

Browse files
committed
Optimize ActionBar API
1 parent 57fde5c commit 9666bab

File tree

3 files changed

+52
-70
lines changed

3 files changed

+52
-70
lines changed

NetworkClient/src/main/java/com/connorlinfoot/actionbarapi/ActionBarAPI.java

Lines changed: 52 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -4,100 +4,85 @@
44
import org.bukkit.entity.Player;
55
import org.bukkit.scheduler.BukkitRunnable;
66
import org.mcservernetwork.client.Client;
7+
import org.mcservernetwork.client.util.ColorUtils;
78
import org.mcservernetwork.client.util.reflection.ReflectionUtils;
9+
import pl.socketbyte.opengui.ColorUtil;
810

911
import java.lang.reflect.Field;
1012
import java.lang.reflect.Method;
1113

1214
public class ActionBarAPI {
13-
private static String nmsver;
14-
private static boolean useOldMethods = false;
15+
private static String nms = Bukkit.getServer().getClass().getPackage().getName().substring(Bukkit.getServer().getClass().getPackage().getName().lastIndexOf(".") + 1);
16+
private static boolean useOldMethods = nms.startsWith("v1_8_") || nms.startsWith("v1_7_");
17+
18+
private static Class<?> craftPlayerClass;
19+
private static Class<?> packetPlayOutChatClass;
20+
private static Class<?> packetClass;
21+
private static Class<?> chatSerializerClass;
22+
private static Class<?> iChatBaseComponentClass;
23+
private static Method craftPlayerHandleMethod;
24+
private static Method m3;
25+
26+
// 1.8+
27+
private static Class<?> chatComponentTextClass;
28+
private static Class<?> chatMessageTypeClass;
29+
private static Object chatMessageType;
30+
1531
static {
16-
nmsver = ReflectionUtils.getNmsVersion();
32+
try {
33+
craftPlayerClass = Class.forName("org.bukkit.craftbukkit." + nms + ".entity.CraftPlayer");
34+
packetPlayOutChatClass = Class.forName("net.minecraft.server." + nms + ".PacketPlayOutChat");
35+
packetClass = Class.forName("net.minecraft.server." + nms + ".Packet");
36+
iChatBaseComponentClass = Class.forName("net.minecraft.server." + nms + ".IChatBaseComponent");
37+
chatSerializerClass = iChatBaseComponentClass.getDeclaredClasses()[0];
38+
craftPlayerHandleMethod = craftPlayerClass.getDeclaredMethod("getHandle");
39+
40+
if (useOldMethods) {
41+
m3 = chatSerializerClass.getDeclaredMethod("a", String.class);
42+
}
43+
else {
44+
chatComponentTextClass = Class.forName("net.minecraft.server." + nms + ".ChatComponentText");
45+
iChatBaseComponentClass = Class.forName("net.minecraft.server." + nms + ".IChatBaseComponent");
46+
47+
chatMessageTypeClass = Class.forName("net.minecraft.server." + nms + ".ChatMessageType");
48+
Object[] chatMessageTypes = chatMessageTypeClass.getEnumConstants();
1749

18-
if (nmsver.equalsIgnoreCase("v1_8_R1") || nmsver.startsWith("v1_7_")) { // Not sure if 1_7 works for the protocol hack?
19-
useOldMethods = true;
50+
for (Object obj : chatMessageTypes) {
51+
if (obj.toString().equals("GAME_INFO")) {
52+
chatMessageType = obj;
53+
}
54+
}
55+
}
56+
} catch (ClassNotFoundException | NoSuchMethodException e) {
57+
throw new RuntimeException("Could not properly setup ActionBar", e);
2058
}
2159
}
2260

2361
public static void sendActionBar(Player player, String message) {
2462
if (!player.isOnline()) {
2563
return;
2664
}
65+
2766
try {
28-
Class<?> craftPlayerClass = Class.forName("org.bukkit.craftbukkit." + nmsver + ".entity.CraftPlayer");
2967
Object craftPlayer = craftPlayerClass.cast(player);
3068
Object packet;
31-
Class<?> packetPlayOutChatClass = Class.forName("net.minecraft.server." + nmsver + ".PacketPlayOutChat");
32-
Class<?> packetClass = Class.forName("net.minecraft.server." + nmsver + ".Packet");
69+
3370
if (useOldMethods) {
34-
Class<?> chatSerializerClass = Class.forName("net.minecraft.server." + nmsver + ".ChatSerializer");
35-
Class<?> iChatBaseComponentClass = Class.forName("net.minecraft.server." + nmsver + ".IChatBaseComponent");
36-
Method m3 = chatSerializerClass.getDeclaredMethod("a", String.class);
37-
Object cbc = iChatBaseComponentClass.cast(m3.invoke(chatSerializerClass, "{\"text\": \"" + message + "\"}"));
71+
Object cbc = iChatBaseComponentClass.cast(m3.invoke(chatSerializerClass, "{\"text\": \"" + ColorUtils.fixColors(message) + "\"}"));
3872
packet = packetPlayOutChatClass.getConstructor(new Class<?>[]{iChatBaseComponentClass, byte.class}).newInstance(cbc, (byte) 2);
39-
} else {
40-
Class<?> chatComponentTextClass = Class.forName("net.minecraft.server." + nmsver + ".ChatComponentText");
41-
Class<?> iChatBaseComponentClass = Class.forName("net.minecraft.server." + nmsver + ".IChatBaseComponent");
42-
try {
43-
Class<?> chatMessageTypeClass = Class.forName("net.minecraft.server." + nmsver + ".ChatMessageType");
44-
Object[] chatMessageTypes = chatMessageTypeClass.getEnumConstants();
45-
Object chatMessageType = null;
46-
for (Object obj : chatMessageTypes) {
47-
if (obj.toString().equals("GAME_INFO")) {
48-
chatMessageType = obj;
49-
}
50-
}
51-
Object chatCompontentText = chatComponentTextClass.getConstructor(new Class<?>[]{String.class}).newInstance(message);
52-
packet = packetPlayOutChatClass.getConstructor(new Class<?>[]{iChatBaseComponentClass, chatMessageTypeClass}).newInstance(chatCompontentText, chatMessageType);
53-
} catch (ClassNotFoundException cnfe) {
54-
Object chatCompontentText = chatComponentTextClass.getConstructor(new Class<?>[]{String.class}).newInstance(message);
55-
packet = packetPlayOutChatClass.getConstructor(new Class<?>[]{iChatBaseComponentClass, byte.class}).newInstance(chatCompontentText, (byte) 2);
56-
}
5773
}
58-
Method craftPlayerHandleMethod = craftPlayerClass.getDeclaredMethod("getHandle");
74+
else {
75+
Object chatComponentText = chatComponentTextClass.getConstructor(new Class<?>[]{String.class}).newInstance(ColorUtils.fixColors(message));
76+
packet = packetPlayOutChatClass.getConstructor(new Class<?>[]{iChatBaseComponentClass, chatMessageTypeClass == null ? byte.class : chatMessageTypeClass}).newInstance(chatComponentText, chatMessageType == null ? ((byte) 2) : chatMessageType);
77+
}
78+
5979
Object craftPlayerHandle = craftPlayerHandleMethod.invoke(craftPlayer);
6080
Field playerConnectionField = craftPlayerHandle.getClass().getDeclaredField("playerConnection");
6181
Object playerConnection = playerConnectionField.get(craftPlayerHandle);
6282
Method sendPacketMethod = playerConnection.getClass().getDeclaredMethod("sendPacket", packetClass);
6383
sendPacketMethod.invoke(playerConnection, packet);
6484
} catch (Exception e) {
65-
e.printStackTrace();
66-
}
67-
}
68-
69-
public static void sendActionBar(final Player player, final String message, int duration) {
70-
sendActionBar(player, message);
71-
72-
if (duration >= 0) {
73-
// Sends empty message at the end of the duration. Allows messages shorter than 3 seconds, ensures precision.
74-
new BukkitRunnable() {
75-
@Override
76-
public void run() {
77-
sendActionBar(player, "");
78-
}
79-
}.runTaskLater(Client.getInstance(), duration + 1);
80-
}
81-
82-
// Re-sends the messages every 3 seconds so it doesn't go away from the player's screen.
83-
while (duration > 40) {
84-
duration -= 40;
85-
new BukkitRunnable() {
86-
@Override
87-
public void run() {
88-
sendActionBar(player, message);
89-
}
90-
}.runTaskLater(Client.getInstance(), (long) duration);
91-
}
92-
}
93-
94-
public static void sendActionBarToAllPlayers(String message) {
95-
sendActionBarToAllPlayers(message, -1);
96-
}
97-
98-
public static void sendActionBarToAllPlayers(String message, int duration) {
99-
for (Player p : Bukkit.getOnlinePlayers()) {
100-
sendActionBar(p, message, duration);
85+
throw new RuntimeException("Could not send ActionBar", e);
10186
}
10287
}
10388
}

NetworkClient/src/main/java/org/mcservernetwork/client/command/NetworkCommand.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import org.bukkit.command.CommandSender;
66
import org.bukkit.entity.Player;
77
import org.mcservernetwork.client.util.inventory.NetworkOverviewPanel;
8-
import org.mcservernetwork.commons.io.DeepSerializationFormat;
98

109
public class NetworkCommand implements CommandExecutor {
1110
@Override

NetworkCommons/src/main/java/org/mcservernetwork/commons/future/TrackedFutureProvider.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22

33
import java.util.HashMap;
44
import java.util.Map;
5-
import java.util.concurrent.CompletableFuture;
6-
import java.util.function.Consumer;
75

86
public class TrackedFutureProvider<I, V> {
97

0 commit comments

Comments
 (0)