使用CraftBukkit 1.7.9作为外部Jar文件(构建路径)
注意:我的服务器正在运行CraftBukkit 1.7.9
您好,
每当我使用此插件(CustomJoinSigns)时,都会出现一大堆错误日志:
24.05 09:19:09 [Server] INFO ... 10 more
24.05 09:19:09 [Server] INFO at org.bukkit.plugin.java.PluginClassLoader.(PluginClassLoader.java:52) ~[Bukkit_Dev.1.7.9.jar:git-Bukkit-1.7.9-R0.1-1-g5786276-b3085jnks]
24.05 09:19:09 [Server] INFO at java.lang.Class.newInstance(Unknown Source) ~[?:1.7.0_55]
24.05 09:19:09 [Server] INFO Caused by: java.lang.InstantiationException: me.pvpcraftnetwork.customjoinsigns.Main
24.05 09:19:09 [Server] INFO at net.minecraft.server.v1_7_R3.ThreadServerApplication.run(SourceFile:628) [Bukkit_Dev.1.7.9.jar:git-Bukkit-1.7.9-R0.1-1-g5786276-b3085jnks]
24.05 09:19:09 [Server] INFO at net.minecraft.server.v1_7_R3.MinecraftServer.run(MinecraftServer.java:436) [Bukkit_Dev.1.7.9.jar:git-Bukkit-1.7.9-R0.1-1-g5786276-b3085jnks]
24.05 09:19:09 [Server] INFO at net.minecraft.server.v1_7_R3.DedicatedServer.init(DedicatedServer.java:126) [Bukkit_Dev.1.7.9.jar:git-Bukkit-1.7.9-R0.1-1-g5786276-b3085jnks]
24.05 09:19:09 [Server] INFO at net.minecraft.server.v1_7_R3.DedicatedPlayerList.(SourceFile:14) [Bukkit_Dev.1.7.9.jar:git-Bukkit-1.7.9-R0.1-1-g5786276-b3085jnks]
24.05 09:19:09 [Server] INFO at net.minecraft.server.v1_7_R3.PlayerList.(PlayerList.java:68) [Bukkit_Dev.1.7.9.jar:git-Bukkit-1.7.9-R0.1-1-g5786276-b3085jnks]
24.05 09:19:09 [Server] INFO at org.bukkit.craftbukkit.v1_7_R3.CraftServer.(CraftServer.java:317) [Bukkit_Dev.1.7.9.jar:git-Bukkit-1.7.9-R0.1-1-g5786276-b3085jnks]
24.05 09:19:09 [Server] INFO at org.bukkit.craftbukkit.v1_7_R3.CraftServer.loadPlugins(CraftServer.java:355) [Bukkit_Dev.1.7.9.jar:git-Bukkit-1.7.9-R0.1-1-g5786276-b3085jnks]
24.05 09:19:09 [Server] INFO at org.bukkit.plugin.SimplePluginManager.loadPlugins(SimplePluginManager.java:251) [Bukkit_Dev.1.7.9.jar:git-Bukkit-1.7.9-R0.1-1-g5786276-b3085jnks]
24.05 09:19:09 [Server] INFO at org.bukkit.plugin.SimplePluginManager.loadPlugin(SimplePluginManager.java:328) ~[Bukkit_Dev.1.7.9.jar:git-Bukkit-1.7.9-R0.1-1-g5786276-b3085jnks]
24.05 09:19:09 [Server] INFO at org.bukkit.plugin.java.JavaPluginLoader.loadPlugin(JavaPluginLoader.java:127) ~[Bukkit_Dev.1.7.9.jar:git-Bukkit-1.7.9-R0.1-1-g5786276-b3085jnks]
24.05 09:19:09 [Server] INFO at org.bukkit.plugin.java.PluginClassLoader.(PluginClassLoader.java:56) ~[Bukkit_Dev.1.7.9.jar:git-Bukkit-1.7.9-R0.1-1-g5786276-b3085jnks]
24.05 09:19:09 [Server] INFO org.bukkit.plugin.InvalidPluginException: Abnormal plugin type
24.05 09:19:09 [Server] ERROR Could not load 'plugins/CustomJoinSigns.jar' in folder 'plugins'
这是插件:
package me.pvpcraftnetwork.customjoinsigns;
import java.util.HashMap;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.block.SignChangeEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.plugin.java.JavaPlugin;
public class Main extends JavaPlugin implements Listener {
public static Bukkit plugin;
public final HashMap<Location, String> signs = new HashMap<Location, String>();
public Main(Bukkit instance) {
plugin = instance;
}
public void onEnable() {
getLogger().info("[PvpCraft Network] {Custom Join Signs} has been enabled!");
}
public void onDisable() {
getLogger().info("[PvpCraft Network] {Custom Join Signs} has been disabled!");
}
@EventHandler
public void onSignChange(SignChangeEvent event){
if(event.getLine(0).equalsIgnoreCase("Minigame")) {
signs.put(event.getBlock().getLocation(), event.getPlayer().getName());
event.getPlayer().sendMessage("[PvpCraft Network] {Custom Join Signs} Custom Join Sign created! Now type in: /cjs [Custom Join Sign Arena Number] setarenaname");
}
}
@EventHandler
public void onBlockBreak(BlockBreakEvent event){
Player player = event.getPlayer();
if(signs.containsKey(event.getBlock().getLocation()) && !signs.containsValue(event.getPlayer().getName()) || !player.isOp()) {
event.setCancelled(true);
} else {
signs.remove(event.getBlock().getLocation());
}
}
@EventHandler
public void onPlayerInteract(PlayerInteractEvent event){
Player player = event.getPlayer();
if(signs.containsKey(event.getClickedBlock().getLocation())) {
player.teleport(player.getWorld().getSpawnLocation());
}
}
}
我不明白为什么它不起作用。有什么帮助吗?
答案 0 :(得分:0)
你不能拥有一个非默认构造函数的插件。
public Main(Bukkit instance) {
plugin = instance;
}
无效。首先,Bukkit
是主服务器的接口,而不是您的插件实例。如果您想要插件的公共静态实例,那么您将使用:
public static Main instance;
public void onEnable() {
instance = this;
}
但是我会说这也是一个糟糕的设计实践。任何经理或工人类都应该只传递一个类实例:
public class SomeManager {
private final Main plugin;
public SomeManager(Main plugin) {
this.plugin = plugin;
}
}
在你的主要课程中:
private SomeManager something;
public void onEnable() {
this.something = new SomeManager(this);
}
答案 1 :(得分:0)
您需要摆脱Main
课程中的构造函数。它无效:
public Main(Bukkit instance){
plugin = instance;
}
如果您想从其他任何地方访问主类,可以在任何方法的主类 NOT 中添加它:
public static Main plugin;
然后在onEnable()
:
plugin = this;
因此,您的onEnable()
方法可能如下所示:
public void onEnable(){
plugin = this;//assign the plugin to this class
getLogger().info("[PvpCraft Network] {Custom Join Signs} has been disabled!");
}
我更深入地解释Here。
所以,你的主要课程应该是这样的:
public class Main extends JavaPlugin implements Listener {
public static Bukkit plugin;
public final HashMap<Location, String> signs = new HashMap<Location, String>();
public static Main plugin;//access this class by using Main.plugin
public void onEnable(){
plugin = this;//assign the plugin variable to this class. Make SURE that you do this first!
getLogger().info("[PvpCraft Network] {Custom Join Signs} has been enabled!");
}
public void onDisable() {
plugin = null;//set the plugin to null to prevent memory leaks
getLogger().info("[PvpCraft Network] {Custom Join Signs} has been disabled!");
}
@EventHandler
public void onSignChange(SignChangeEvent event){
if(event.getLine(0).equalsIgnoreCase("Minigame")) {
signs.put(event.getBlock().getLocation(), event.getPlayer().getName());
event.getPlayer().sendMessage("[PvpCraft Network] {Custom Join Signs} Custom Join Sign created! Now type in: /cjs [Custom Join Sign Arena Number] setarenaname");
}
}
@EventHandler
public void onBlockBreak(BlockBreakEvent event){
Player player = event.getPlayer();
if(signs.containsKey(event.getBlock().getLocation()) && !signs.containsValue(event.getPlayer().getName()) || !player.isOp()) {
event.setCancelled(true);
} else {
signs.remove(event.getBlock().getLocation());
}
}
@EventHandler
public void onPlayerInteract(PlayerInteractEvent event){
Player player = event.getPlayer();
if(signs.containsKey(event.getClickedBlock().getLocation())) {
player.teleport(player.getWorld().getSpawnLocation());
}
}
}