Skip to content

Commit

Permalink
Downgrade to latest SpongeAPI 8.2.0
Browse files Browse the repository at this point in the history
And use reflection to register a listener for either Leave or Disconnect
  • Loading branch information
pschichtel committed Jun 13, 2024
1 parent 196ca0f commit f921a38
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 61 deletions.
2 changes: 1 addition & 1 deletion implementations/sponge/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ dependencies {
}

sponge {
apiVersion("11.0.0-SNAPSHOT")
apiVersion("8.2.0")
license("MIT")
loader {
name(PluginLoaders.JAVA_PLAIN)
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,11 @@
import org.spongepowered.api.command.Command;
import org.spongepowered.api.config.ConfigDir;
import org.spongepowered.api.entity.living.player.server.ServerPlayer;
import org.spongepowered.api.event.Event;
import org.spongepowered.api.event.EventListener;
import org.spongepowered.api.event.EventListenerRegistration;
import org.spongepowered.api.event.Listener;
import org.spongepowered.api.event.Order;
import org.spongepowered.api.event.lifecycle.RefreshGameEvent;
import org.spongepowered.api.event.lifecycle.RegisterCommandEvent;
import org.spongepowered.api.event.lifecycle.StartedEngineEvent;
Expand All @@ -56,10 +60,12 @@
import org.spongepowered.plugin.PluginContainer;

import java.io.IOException;
import java.lang.reflect.Method;
import java.nio.file.Path;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutorService;
import java.util.function.Consumer;

@org.spongepowered.plugin.builtin.jvm.Plugin(Plugin.PLUGIN_ID)
public class SpongePlugin implements Server {
Expand Down Expand Up @@ -183,23 +189,58 @@ public void onPlayerJoin(ServerSideConnectionEvent.Join evt) {
onlinePlayerList.add(player);
}

@Listener
public void onPlayerLeave(ServerSideConnectionEvent.Leave evt) {
UUID playerUUID = evt.player().uniqueId();
onlinePlayerMap.remove(playerUUID);
synchronized (onlinePlayerList) {
onlinePlayerList.removeIf(p -> p.getUuid().equals(playerUUID));
}
}

@Override
public String getMinecraftVersion() {
return Sponge.platform().minecraftVersion().name();
}

@SuppressWarnings("unchecked")
private void handlePlayerLeave(Order order, Consumer<ServerPlayer> handle) {
Class<? extends Event> eventClass;
try {
// This is for API 11 and newer
eventClass = (Class<? extends Event>) Class.forName("org.spongepowered.api.event.network.ServerSideConnectionEvent.Leave");
} catch (ClassNotFoundException e) {
try {
// THis is for API 10 and earlier
eventClass = (Class<? extends Event>) Class.forName("org.spongepowered.api.event.network.ServerSideConnectionEvent.Disconnect");
} catch (ClassNotFoundException ex) {
ex.addSuppressed(e);
Logger.global.logError("Failed to load either Leave or Disconnect event classes!", ex);
return;
}
}

try {
final Method playerMethod = eventClass.getDeclaredMethod("player");
final EventListenerRegistration<? extends Event> registration = EventListenerRegistration.builder(eventClass)
.plugin(pluginContainer)
.order(order)
.listener((EventListener<Event>) event -> handle.accept((ServerPlayer) playerMethod.invoke(event)))
.build();
Sponge.eventManager().registerListener(registration);
} catch (NoSuchMethodException e) {
Logger.global.logError("Failed to lookup player() method on the Event class!", e);
}
}

@Override
public void registerListener(ServerEventListener listener) {
Sponge.eventManager().registerListeners(this.pluginContainer, new EventForwarder(listener));
final EventListenerRegistration<ServerSideConnectionEvent.Join> joinRegistration = EventListenerRegistration.builder(ServerSideConnectionEvent.Join.class)
.plugin(pluginContainer)
.order(Order.POST)
.listener(e -> listener.onPlayerJoin(e.player().uniqueId()))
.build();
Sponge.eventManager().registerListener(joinRegistration);

handlePlayerLeave(Order.POST, player -> listener.onPlayerLeave(player.uniqueId()));
handlePlayerLeave(Order.DEFAULT, player -> {
UUID playerUUID = player.uniqueId();
onlinePlayerMap.remove(playerUUID);
synchronized (onlinePlayerList) {
onlinePlayerList.removeIf(p -> p.getUuid().equals(playerUUID));
}
});
}

@Override
Expand Down

0 comments on commit f921a38

Please sign in to comment.