|
25 | 25 | import de.dytanic.cloudnet.ext.bridge.player.IPlayerManager; |
26 | 26 | import de.dytanic.cloudnet.ext.bridge.server.BridgeServerHelper; |
27 | 27 | import de.dytanic.cloudnet.wrapper.Wrapper; |
| 28 | +import java.lang.invoke.MethodHandle; |
| 29 | +import java.lang.invoke.MethodHandles; |
| 30 | +import java.lang.invoke.MethodType; |
| 31 | +import java.net.InetAddress; |
28 | 32 | import java.net.InetSocketAddress; |
| 33 | +import java.util.function.Supplier; |
| 34 | +import java.util.logging.Level; |
29 | 35 | import org.bukkit.Bukkit; |
30 | 36 | import org.bukkit.event.HandlerList; |
31 | 37 | import org.bukkit.event.server.ServerListPingEvent; |
32 | 38 | import org.bukkit.plugin.java.JavaPlugin; |
| 39 | +import org.jetbrains.annotations.Nullable; |
33 | 40 |
|
34 | 41 | public final class BukkitCloudNetBridgePlugin extends JavaPlugin { |
35 | 42 |
|
| 43 | + private Supplier<ServerListPingEvent> serverListPingEventConstructor; |
| 44 | + |
36 | 45 | @Override |
37 | 46 | public synchronized void onEnable() { |
38 | 47 | BukkitCloudNetHelper.init(); |
@@ -70,14 +79,12 @@ private void runFireServerListPingEvent() { |
70 | 79 | boolean value = false; |
71 | 80 |
|
72 | 81 | try { |
73 | | - ServerListPingEvent serverListPingEvent = new ServerListPingEvent( |
74 | | - new InetSocketAddress("127.0.0.1", 53345).getAddress(), |
75 | | - BridgeServerHelper.getMotd(), |
76 | | - Bukkit.getOnlinePlayers().size(), |
77 | | - BridgeServerHelper.getMaxPlayers() |
78 | | - ); |
79 | | - Bukkit.getPluginManager().callEvent(serverListPingEvent); |
| 82 | + ServerListPingEvent serverListPingEvent = this.constructServerListPingEvent(); |
| 83 | + if (serverListPingEvent == null) { |
| 84 | + return; |
| 85 | + } |
80 | 86 |
|
| 87 | + Bukkit.getPluginManager().callEvent(serverListPingEvent); |
81 | 88 | if (!serverListPingEvent.getMotd().equalsIgnoreCase(BridgeServerHelper.getMotd())) { |
82 | 89 | hasToUpdate = true; |
83 | 90 | BridgeServerHelper.setMotd(serverListPingEvent.getMotd()); |
@@ -106,4 +113,48 @@ private void runFireServerListPingEvent() { |
106 | 113 | } |
107 | 114 | }, 0, 10); |
108 | 115 | } |
| 116 | + |
| 117 | + private @Nullable ServerListPingEvent constructServerListPingEvent() { |
| 118 | + if (this.serverListPingEventConstructor == null) { |
| 119 | + try { |
| 120 | + // new method in 1.19 and above |
| 121 | + MethodHandle constructor = MethodHandles.publicLookup().findConstructor( |
| 122 | + ServerListPingEvent.class, |
| 123 | + MethodType.methodType(void.class, InetAddress.class, String.class, boolean.class, int.class, int.class)); |
| 124 | + this.serverListPingEventConstructor = () -> { |
| 125 | + try { |
| 126 | + return (ServerListPingEvent) constructor.invokeExact( |
| 127 | + new InetSocketAddress("127.0.0.1", 53345).getAddress(), |
| 128 | + BridgeServerHelper.getMotd(), |
| 129 | + false, |
| 130 | + Bukkit.getOnlinePlayers().size(), |
| 131 | + BridgeServerHelper.getMaxPlayers()); |
| 132 | + } catch (Throwable throwable) { |
| 133 | + // wait what |
| 134 | + this.getLogger().log( |
| 135 | + Level.SEVERE, |
| 136 | + "Unable to construct ServerListPingEvent using modern constructor; disabling event calling", |
| 137 | + throwable); |
| 138 | + this.serverListPingEventConstructor = () -> null; |
| 139 | + return null; |
| 140 | + } |
| 141 | + }; |
| 142 | + } catch (IllegalAccessException exception) { |
| 143 | + // wait what |
| 144 | + this.serverListPingEventConstructor = () -> null; |
| 145 | + this.getLogger().log( |
| 146 | + Level.SEVERE, |
| 147 | + "Unable to access modern constructor of ServerListPingEvent; disabling event calling", |
| 148 | + exception); |
| 149 | + } catch (NoSuchMethodException exception) { |
| 150 | + // old method before 1.18 |
| 151 | + this.serverListPingEventConstructor = () -> new ServerListPingEvent( |
| 152 | + new InetSocketAddress("127.0.0.1", 53345).getAddress(), |
| 153 | + BridgeServerHelper.getMotd(), |
| 154 | + Bukkit.getOnlinePlayers().size(), |
| 155 | + BridgeServerHelper.getMaxPlayers()); |
| 156 | + } |
| 157 | + } |
| 158 | + return this.serverListPingEventConstructor.get(); |
| 159 | + } |
109 | 160 | } |
0 commit comments