我遇到了一个非常奇怪的问题,我什至不知道我是否可以这样做。
基本上我有两个函数,witch应该具有相同的名称,但是会得到具有相同名称的不同参数对象。
这是因为我想为游戏Minecraft
编写一个插件,并且该插件应与BungeeCord 和 Bukkit服务器兼容。
public static void sendMessage(org.bukkit.command.CommandSender p, String k, Object...i){
//fancy stuff
}
public static void sendMessage(net.md_5.bungee.api.CommandSender p, String k, Object...i){
//fancy stuff
}
如果该插件是由 Bukkit 服务器加载的,则该插件对net.md_5.bungee.api.CommandSender
一无所知,因为这是 BungeeCord 服务器核心的一类。与org.bukkit.command.CommandSender
相同, Bukkit 使用它,而 BungeeCore 则不使用。
即使是面团,我也可以使用IntellIJ编译代码,我对此表示怀疑,因为如果将其反编译,它看起来像这样:
import org.bukkit.command.CommandSender;
public static void sendMessage(CommandSender p, String k, Object...i){
//fancy stuff
}
public static void sendMessage(net.md_5.bungee.api.CommandSender p, String k, Object...i){
//fancy stuff
}
我的第一个问题是:我什至可以这样做,还是因为并非所有类都已加载,甚至是面团永远都无法访问,这会给出例外吗?
现在,如果第一个问题可以由Sure you can
回答,那么为什么使用此sendMessage(
函数编译Bukkit或BungeeCord插件会出现编译问题?
因为如果这样不起作用,我可以肯定的是,至少可以将未装入的类放入代码块中,因为该代码可以正常工作,甚至在不工作时也不会引发异常由使用org.bukkit.craftbukkit.v1_13_R2.entity.CraftPlayer
的服务器加载的文件虽然在导入文件中:
import org.bukkit.entity.Player;
import org.bukkit.craftbukkit.v1_13_R2.entity.CraftPlayer;
public static int getPing(Player p) {
String version = getVersion(instance.getServer());
if (version.startsWith("v1_8")) {
return ((org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer)p).getHandle().playerConnection.player.ping;
} else if (version.startsWith("v1_9")) {
return ((org.bukkit.craftbukkit.v1_9_R2.entity.CraftPlayer)p).getHandle().playerConnection.player.ping;
} else if (version.startsWith("v1_10")) {
return ((org.bukkit.craftbukkit.v1_10_R1.entity.CraftPlayer)p).getHandle().playerConnection.player.ping;
} else if (version.startsWith("v1_11")) {
return ((org.bukkit.craftbukkit.v1_11_R1.entity.CraftPlayer)p).getHandle().playerConnection.player.ping;
} else if (version.startsWith("v1_12")) {
return ((org.bukkit.craftbukkit.v1_12_R1.entity.CraftPlayer)p).getHandle().playerConnection.player.ping;
} else {
return ((CraftPlayer)p).getHandle().playerConnection.player.ping;
}
}
那么这真的是我根本无法做的事情吗?或者这是IntellIJ编译器的问题,如果可以的话,我该如何解决呢?
答案 0 :(得分:0)
我对您的想法的尝试是在子类中调用方法。找不到类是一个参数可能是一个问题。当我访问类时(只是我的猜测),尝试加载参数以确定要使用的方法。
所以输出如下。
您访问的班级有:
public static void sendMessage(Object player, String k, Object...i){
if(isBukkit())
MyBukkitUtils.sendMessage(player, k, i);
else
MyBungeeUtils.sendMessage(player, k, i);
}
MyBukkitUtils:
public static void sendMessage(Object player, String k, Object...i){
if(!(player instanceOf CommandSender))
return;
CommandSender p = (CommandSender) player;
//fancy stuff
}
与MyBungeeUtils相同,仅与BunggeeCommandSender相同。
我不知道您的代码,但是如果您必须将所有内容分开,则可以只编写两个插件(一个用于spigot,一个用于橡皮筋),并在其中包含通用代码的地方都使用include库。 / p>