Essentials/providers/NMSReflectionProvider/src/main/java/net/ess3/nms/refl/providers/ReflServerStateProvider.java

59 lines
1.9 KiB
Java

package net.ess3.nms.refl.providers;
import net.ess3.nms.refl.ReflUtil;
import net.ess3.provider.ServerStateProvider;
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
public class ReflServerStateProvider implements ServerStateProvider {
private final Object nmsServer;
private final MethodHandle nmsIsRunning;
public ReflServerStateProvider() {
Object serverObject = null;
MethodHandle isRunning = null;
final String MDFIVEMAGICLETTER;
if (ReflUtil.getNmsVersionObject().isHigherThanOrEqualTo(ReflUtil.V1_19_R2)) {
MDFIVEMAGICLETTER = "v";
} else if (ReflUtil.getNmsVersionObject().isHigherThanOrEqualTo(ReflUtil.V1_19_R1)) {
MDFIVEMAGICLETTER = "u";
} else if (ReflUtil.getNmsVersionObject().isHigherThanOrEqualTo(ReflUtil.V1_18_R1)) {
MDFIVEMAGICLETTER = "v";
} else {
MDFIVEMAGICLETTER = "isRunning";
}
final Class<?> nmsClass = ReflUtil.getNMSClass("MinecraftServer");
try {
serverObject = nmsClass.getMethod("getServer").invoke(null);
isRunning = MethodHandles.lookup().findVirtual(nmsClass,
MDFIVEMAGICLETTER, //TODO jmp said he may make this better
MethodType.methodType(boolean.class));
} catch (final Exception e) {
e.printStackTrace();
}
nmsServer = serverObject;
nmsIsRunning = isRunning;
}
@Override
public boolean isStopping() {
if (nmsServer != null && nmsIsRunning != null) {
try {
return !(boolean) nmsIsRunning.invoke(nmsServer);
} catch (final Throwable throwable) {
throwable.printStackTrace();
}
}
return false;
}
@Override
public String getDescription() {
return "NMS Reflection Server State Provider";
}
}