|
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