"异常插件类型"错误

时间:2014-05-24 16:34:17

标签: bukkit

使用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());
            }
        }
    }

我不明白为什么它不起作用。有什么帮助吗?

2 个答案:

答案 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());
        }
    }
}