Skip to content

Commit 187b688

Browse files
authored
Merge pull request #7 from SocketByte/dev
Merge dev to master
2 parents f4399ca + 9666bab commit 187b688

File tree

29 files changed

+402
-256
lines changed

29 files changed

+402
-256
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/Client.java

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,21 @@
44
import org.bukkit.boss.BossBar;
55
import org.bukkit.plugin.java.JavaPlugin;
66
import org.mcservernetwork.client.command.NetworkCommand;
7+
import org.mcservernetwork.client.listener.TimeSyncListener;
8+
import org.mcservernetwork.client.listener.WeatherSyncListener;
79
import org.mcservernetwork.commons.listener.StatusListener;
810
import org.mcservernetwork.client.listener.TransferAcceptListener;
911
import org.mcservernetwork.client.listener.bukkit.*;
1012
import org.mcservernetwork.client.task.ActionBarTask;
1113
import org.mcservernetwork.client.task.BorderTask;
1214
import org.mcservernetwork.client.util.TPSUtils;
13-
import org.mcservernetwork.commons.ClientStatusHandler;
15+
import org.mcservernetwork.commons.KeepAliveHandler;
1416
import org.mcservernetwork.commons.NetworkAPI;
1517
import org.mcservernetwork.commons.net.Channel;
1618
import org.mcservernetwork.commons.net.NetworkLogger;
1719
import org.mcservernetwork.commons.net.Sector;
18-
import org.mcservernetwork.commons.net.packet.PacketAccept;
19-
import org.mcservernetwork.commons.net.packet.PacketStatus;
20-
import org.mcservernetwork.commons.net.packet.PacketTransfer;
20+
import org.mcservernetwork.commons.net.packet.*;
21+
import org.mcservernetwork.commons.service.Service;
2122
import pl.socketbyte.opengui.OpenGUI;
2223

2324
import java.util.concurrent.CountDownLatch;
@@ -41,8 +42,6 @@ public static Sector getCurrentSector() {
4142
return NetworkAPI.Sectors.getSector(sectorName);
4243
}
4344

44-
private ScheduledExecutorService service = Executors.newScheduledThreadPool(4);
45-
4645
@Override
4746
public void onEnable() {
4847
instance = this;
@@ -61,16 +60,19 @@ public void onEnable() {
6160
getServer().getPluginManager().registerEvents(new PlayerMoveListener(), this);
6261
getServer().getPluginManager().registerEvents(new PlayerJoinListener(), this);
6362
getServer().getPluginManager().registerEvents(new PlayerTeleportListener(), this);
63+
getServer().getPluginManager().registerEvents(new PlayerPortalListener(), this);
6464
getServer().getPluginManager().registerEvents(new PlayerQuitListener(), this);
6565
getServer().getPluginManager().registerEvents(new ProtectionListeners(), this);
6666

6767
Bukkit.getScheduler().runTaskTimerAsynchronously(this, new BorderTask(), 0L, 3L);
6868
Bukkit.getScheduler().runTaskTimerAsynchronously(this, new ActionBarTask(), 20L, 20L);
6969

7070
NetworkAPI.Net.subscribeAndListen(Channel.STATUS, PacketStatus.class, new StatusListener());
71+
NetworkAPI.Net.subscribeAndListen(Channel.WEATHER_SYNC, PacketWeatherSync.class, new WeatherSyncListener());
72+
NetworkAPI.Net.subscribeAndListen(Channel.TIME_SYNC, PacketTimeSync.class, new TimeSyncListener());
7173
NetworkAPI.Net.listen(Channel.sector(sectorName), PacketTransfer.class, new TransferAcceptListener());
7274

73-
ClientStatusHandler.run(() -> {
75+
KeepAliveHandler.run(() -> {
7476
PacketStatus packet = new PacketStatus();
7577
packet.sectorName = Client.getCurrentSector().getSectorName();
7678
packet.players = Bukkit.getOnlinePlayers().size();
@@ -113,7 +115,7 @@ public void onDisable() {
113115
for (BossBar bar : PlayerMoveListener.BOSSBARS.values()) {
114116
bar.removeAll();
115117
}
116-
service.shutdown();
118+
Service.shutdown();
117119
NetworkAPI.Net.unsubscribe(Channel.sector(sectorName));
118120
NetworkAPI.Net.disconnect();
119121
}

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
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package org.mcservernetwork.client.listener;
2+
3+
import org.bukkit.Bukkit;
4+
import org.bukkit.World;
5+
import org.mcservernetwork.client.Client;
6+
import org.mcservernetwork.commons.NetworkAPI;
7+
import org.mcservernetwork.commons.net.packet.PacketTimeSync;
8+
9+
public class TimeSyncListener implements NetworkAPI.Net.Listener<PacketTimeSync> {
10+
@Override
11+
public void receive(PacketTimeSync packet) {
12+
Bukkit.getScheduler().runTask(Client.getInstance(), () -> {
13+
for (World world : Bukkit.getWorlds()) {
14+
if (world.getEnvironment() != World.Environment.NORMAL)
15+
continue;
16+
world.setFullTime(packet.time);
17+
}
18+
});
19+
}
20+
}
Lines changed: 9 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,12 @@
11
package org.mcservernetwork.client.listener;
22

33
import org.bukkit.*;
4-
import org.bukkit.entity.Entity;
5-
import org.bukkit.entity.EntityType;
64
import org.bukkit.entity.Player;
7-
import org.bukkit.potion.PotionEffect;
8-
import org.bukkit.potion.PotionEffectType;
95
import org.mcservernetwork.client.Client;
10-
import org.mcservernetwork.client.io.BukkitSerializer;
116
import org.mcservernetwork.client.util.PlayerUtils;
7+
import org.mcservernetwork.client.util.manager.PlayerTransferManager;
128
import org.mcservernetwork.commons.NetworkAPI;
9+
import org.mcservernetwork.commons.future.TrackedFutureProvider;
1310
import org.mcservernetwork.commons.net.packet.PacketPlayerInfo;
1411
import org.mcservernetwork.commons.net.packet.PacketTransfer;
1512
import org.mcservernetwork.commons.net.packet.persist.PlayerSectorData;
@@ -24,9 +21,6 @@
2421

2522
public class TransferAcceptListener implements NetworkAPI.Net.Listener<PacketTransfer> {
2623

27-
public static final Map<UUID, CompletableFuture<Player>> PLAYER_FUTURES = new HashMap<>();
28-
private static final ScheduledExecutorService service = Executors.newScheduledThreadPool(4);
29-
3024
@Override
3125
public void receive(PacketTransfer packet) {
3226
PacketPlayerInfo info = packet.info;
@@ -35,31 +29,20 @@ public void receive(PacketTransfer packet) {
3529
if (info == null)
3630
return;
3731

38-
CompletableFuture<Player> future = new CompletableFuture<>();
39-
future.thenAccept(player -> {
32+
PlayerTransferManager.getProvider()
33+
.create(playerId)
34+
.withTimeout(8, TimeUnit.SECONDS)
35+
.completed(player -> {
4036
PlayerUtils.unwrap(player, info);
41-
PLAYER_FUTURES.remove(playerId);
4237

4338
PlayerSectorData data = new PlayerSectorData();
4439
data.currentSectorName = Client.getCurrentSector().getSectorName();
4540
NetworkAPI.Net.set(player.getUniqueId().toString(), data);
4641
});
4742

4843
Player player = Bukkit.getPlayer(playerId);
49-
if (player != null) {
50-
future.complete(player);
51-
return;
52-
}
53-
54-
PLAYER_FUTURES.put(playerId, future);
55-
service.schedule(() -> {
56-
CompletableFuture<Player> completableFuture = PLAYER_FUTURES.get(playerId);
57-
if (completableFuture == null)
58-
return;
59-
60-
completableFuture.cancel(false);
61-
PLAYER_FUTURES.remove(playerId);
62-
}, 8, TimeUnit.SECONDS);
63-
44+
if (player != null)
45+
PlayerTransferManager.getProvider()
46+
.complete(playerId, player);
6447
}
6548
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package org.mcservernetwork.client.listener;
2+
3+
import org.bukkit.Bukkit;
4+
import org.bukkit.World;
5+
import org.mcservernetwork.client.Client;
6+
import org.mcservernetwork.commons.NetworkAPI;
7+
import org.mcservernetwork.commons.net.packet.PacketWeatherSync;
8+
9+
public class WeatherSyncListener implements NetworkAPI.Net.Listener<PacketWeatherSync> {
10+
@Override
11+
public void receive(PacketWeatherSync packet) {
12+
Bukkit.getScheduler().runTask(Client.getInstance(), () -> {
13+
for (World world : Bukkit.getWorlds()) {
14+
if (world.getEnvironment() != World.Environment.NORMAL)
15+
continue;
16+
switch (packet.weather) {
17+
case CLEAR:
18+
world.setThundering(false);
19+
world.setStorm(false);
20+
break;
21+
case STORMING:
22+
world.setThundering(false);
23+
world.setStorm(true);
24+
break;
25+
case THUNDERING:
26+
world.setThundering(true);
27+
world.setStorm(true);
28+
break;
29+
}
30+
}
31+
});
32+
}
33+
}

NetworkClient/src/main/java/org/mcservernetwork/client/listener/bukkit/PlayerJoinListener.java

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,17 @@
44
import org.bukkit.event.EventHandler;
55
import org.bukkit.event.Listener;
66
import org.bukkit.event.player.PlayerJoinEvent;
7-
import org.mcservernetwork.client.listener.TransferAcceptListener;
8-
9-
import java.util.concurrent.CompletableFuture;
7+
import org.mcservernetwork.client.util.manager.PlayerTransferManager;
108

119
public class PlayerJoinListener implements Listener {
1210

1311
@EventHandler
1412
public void onPlayerJoin(PlayerJoinEvent event) {
1513
Player player = event.getPlayer();
1614

17-
CompletableFuture<Player> future = TransferAcceptListener.PLAYER_FUTURES.get(player.getUniqueId());
18-
if (future != null) {
15+
if (PlayerTransferManager.getProvider()
16+
.complete(player.getUniqueId(), player)) {
1917
event.setJoinMessage(null);
20-
future.complete(player);
2118
}
2219
}
2320

0 commit comments

Comments
 (0)