package com.bergerkiller.bukkit.common.server;
import java.util.List;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import com.bergerkiller.bukkit.common.Common;
import com.bergerkiller.bukkit.common.internal.CommonNMS;
import com.bergerkiller.bukkit.common.reflection.MethodAccessor;
import com.bergerkiller.bukkit.common.reflection.SafeMethod;
import com.bergerkiller.bukkit.common.utils.StringUtil;
public class CraftBukkitServer extends CommonServerBase {
/**
* Defines the Package Version
*/
public String PACKAGE_VERSION;
/**
* Defines the Minecraft Version
*/
public String MC_VERSION;
/**
* Defines the net.minecraft.server root path
*/
public String NMS_ROOT_VERSIONED;
/**
* Defines the org.bukkit.craftbukkit root path
*/
public String CB_ROOT_VERSIONED;
@Override
public boolean init() {
// Find out what package version is used
String serverPath = Bukkit.getServer().getClass().getName();
if (!serverPath.startsWith(Common.CB_ROOT)) {
return false;
}
PACKAGE_VERSION = StringUtil.getBefore(serverPath.substring(Common.CB_ROOT.length() + 1), ".");
// Obtain the versioned roots
if (PACKAGE_VERSION.isEmpty()) {
NMS_ROOT_VERSIONED = Common.NMS_ROOT;
CB_ROOT_VERSIONED = Common.CB_ROOT;
} else {
NMS_ROOT_VERSIONED = Common.NMS_ROOT + "." + PACKAGE_VERSION;
CB_ROOT_VERSIONED = Common.CB_ROOT + "." + PACKAGE_VERSION;
}
// Figure out the MC version from the server
MC_VERSION = PACKAGE_VERSION;
return true;
}
@Override
public void postInit() {
try {
// Obtain MinecraftServer instance from server
Class<?> server = Class.forName(CB_ROOT_VERSIONED + ".CraftServer");
MethodAccessor<Object> getServer = new SafeMethod<Object>(server, "getServer");
Object minecraftServerInstance = getServer.invoke(Bukkit.getServer());
// Use MinecraftServer instance to obtain the version
Class<?> mcServer = minecraftServerInstance.getClass();
MethodAccessor<String> getVersion = new SafeMethod<String>(mcServer, "getVersion");
MC_VERSION = getVersion.invoke(minecraftServerInstance);
} catch (Throwable t) {
t.printStackTrace();
}
}
@Override
public String getClassName(String path) {
if (path.startsWith(Common.NMS_ROOT) && !path.startsWith(NMS_ROOT_VERSIONED)) {
return NMS_ROOT_VERSIONED + path.substring(Common.NMS_ROOT.length());
}
if (path.startsWith(Common.CB_ROOT) && !path.startsWith(CB_ROOT_VERSIONED)) {
return CB_ROOT_VERSIONED + path.substring(Common.CB_ROOT.length());
}
return path;
}
@Override
public String getMethodName(Class<?> type, String methodName, Class<?>... params) {
return methodName;
}
@Override
public String getFieldName(Class<?> type, String fieldName) {
return fieldName;
}
@Override
@SuppressWarnings("unchecked")
public List<Integer> getEntityRemoveQueue(Player player) {
return CommonNMS.getNative(player).removeQueue;
}
@Override
public boolean isCompatible() {
return PACKAGE_VERSION.isEmpty() || PACKAGE_VERSION.equals(Common.DEPENDENT_MC_VERSION);
}
@Override
public String getMinecraftVersion() {
return MC_VERSION;
}
@Override
public String getServerVersion() {
return (PACKAGE_VERSION.isEmpty() ? "(Unknown)" : PACKAGE_VERSION) + " (Minecraft " + MC_VERSION + ")";
}
@Override
public String getServerDescription() {
String desc = Bukkit.getServer().getVersion();
desc = desc.replace(" (MC: " + MC_VERSION + ")", "");
return desc;
}
@Override
public String getServerName() {
return "CraftBukkit";
}
}