切换玩家持有镐的能力的 Minecraft 命令会导致服务器崩溃。为什么?

时间:2021-02-15 12:23:55

标签: java minecraft

所以,我想在我的“BasicStuff”插件(插件名称)中使用 /togglepickaxe 来让玩家在每次手里拿着镐时扔掉镐。如果有人也遇到过这个问题,请告诉我为什么会发生这种情况,因为我多次遇到这个问题:/这是我的代码,它在执行命令后使服务器崩溃:

package MainPackage;
import java.util.LinkedList;

import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.java.JavaPlugin;

public class Main extends JavaPlugin{
    
    public static LinkedList<String> nopickaxeplayers = new LinkedList<String>();
    
    @Override
    public void onEnable()
    {
        System.out.println("TogglePickaxe is enable");
    }
    
    @Override
    public void onDisable()
    {
        System.out.println("TogglePickaxe is disabled");
    }
    
    public boolean onCommand(CommandSender sender, Command cmd, String cmdlabel, String[] args)
    {
        if(cmdlabel.equalsIgnoreCase("togglepickaxe"))
        {
            if(sender instanceof Player)
            {
                Player player = (Player) sender;
                if(player.hasPermission("BasicStuff.togglepickaxe"))
                {
                    if(args.length == 1)
                    {
                        Player trolled_player = Bukkit.getPlayer(args[0]);
                        
                        if(trolled_player == null)
                        {
                            player.sendMessage(ChatColor.RED + args[0] + " is not online");
                            return false;
                        }       
                        
                        if(trolled_player.hasPermission("BasicStuff.togglepickaxe.exempt"))
                        {
                            player.sendMessage(ChatColor.RED + "You can't deny pickaxe usage on this Player");
                            return false;
                        }   
                        
                        if(Main.nopickaxeplayers.contains(trolled_player.getName()))
                        {
                            Main.nopickaxeplayers.remove(trolled_player.getName());
                            trolled_player.sendMessage(ChatColor.GOLD + "You can use Pickaxes again");
                            player.sendMessage(ChatColor.GOLD + trolled_player.getName() + " can use Pickaxes again");
                        }
                        else
                        {
                            Main.nopickaxeplayers.add(trolled_player.getName());
                            Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(this, new Runnable()
                            {
                                @Override
                                public void run()
                                {
                                    Player player;
                                    while(Main.nopickaxeplayers.size() > 0)
                                    {
                                        for(int i = 0; i < Main.nopickaxeplayers.size(); i++) {
                                            if(Bukkit.getPlayer(Main.nopickaxeplayers.get(i)) != null)
                                            {
                                                player = Bukkit.getPlayer(Main.nopickaxeplayers.get(i));
                                                if(player.getInventory().getItemInMainHand() != null) {
                                                    if(player.getInventory().getItemInMainHand().getType() == Material.DIAMOND_PICKAXE
                                                            || player.getInventory().getItemInMainHand().getType() == Material.GOLDEN_PICKAXE
                                                            || player.getInventory().getItemInMainHand().getType() == Material.IRON_PICKAXE
                                                            || player.getInventory().getItemInMainHand().getType() == Material.NETHERITE_PICKAXE
                                                            || player.getInventory().getItemInMainHand().getType() == Material.STONE_PICKAXE
                                                            || player.getInventory().getItemInMainHand().getType() == Material.WOODEN_PICKAXE
                                                            )
                                                            {                                                   
                                                                ItemStack axe = player.getInventory().getItemInMainHand();
                                                                player.getInventory().setItemInMainHand(null);
                                                                player.getWorld().dropItemNaturally(player.getLocation(), axe);         
                                                            }
                                                }                                                                               
                                            }
                                        }
                                    }
                                }
                            }, 0, 5);
                            trolled_player.sendMessage(ChatColor.GOLD + "You can no longer use Pickaxes");
                            player.sendMessage(ChatColor.GOLD + trolled_player.getName() + " can no longer use Pickaxes");
                        }   
                    }// if args.length == 1
                    else
                    {
                        player.sendMessage("/togglepickaxe <player>");
                    }
                }
                else
                {
                    player.sendMessage(ChatColor.DARK_RED + "You don't have permission to do that");
                }
            }
            else
            {
                sender.sendMessage(ChatColor.RED + "Only Players can execute /togglepickaxe <player>");
            }
        }   
    return false;
}//onCommand

}//类

这是错误代码,它并没有真正说明太多(我猜)

[13:11:13 ERROR]: Fatal error trying to convert TogglePickaxe v1.0:MainPackage/Main$1.class
org.bukkit.plugin.AuthorNagException: No legacy enum constant for GOLDEN_PICKAXE. Did you forget to define a modern (1.13+) api-version in your plugin.yml?
        at org.bukkit.craftbukkit.v1_16_R3.util.Commodore$1$1.visitFieldInsn(Commodore.java:314) ~[paper.jar:git-Paper-414]
        at org.bukkit.craftbukkit.libs.org.objectweb.asm.ClassReader.readCode(ClassReader.java:2415) ~[paper.jar:git-Paper-414]
        at org.bukkit.craftbukkit.libs.org.objectweb.asm.ClassReader.readMethod(ClassReader.java:1488) ~[paper.jar:git-Paper-414]
        at org.bukkit.craftbukkit.libs.org.objectweb.asm.ClassReader.accept(ClassReader.java:718) ~[paper.jar:git-Paper-414]
        at org.bukkit.craftbukkit.libs.org.objectweb.asm.ClassReader.accept(ClassReader.java:401) ~[paper.jar:git-Paper-414]
        at org.bukkit.craftbukkit.v1_16_R3.util.Commodore.convert(Commodore.java:174) ~[paper.jar:git-Paper-414]
        at org.bukkit.craftbukkit.v1_16_R3.util.CraftMagicNumbers.processClass(CraftMagicNumbers.java:340) ~[paper.jar:git-Paper-414]
        at org.bukkit.plugin.java.PluginClassLoader.findClass(PluginClassLoader.java:155) ~[paper.jar:git-Paper-414]
        at org.bukkit.plugin.java.JavaPluginLoader.getClassByName(JavaPluginLoader.java:216) ~[paper.jar:git-Paper-414]
        at org.bukkit.plugin.java.PluginClassLoader.findClass(PluginClassLoader.java:122) ~[paper.jar:git-Paper-414]
        at org.bukkit.plugin.java.PluginClassLoader.findClass(PluginClassLoader.java:111) ~[paper.jar:git-Paper-414]
        at java.lang.ClassLoader.loadClass(Unknown Source) ~[?:1.8.0_251]
        at java.lang.ClassLoader.loadClass(Unknown Source) ~[?:1.8.0_251]
        at MainPackage.Main.onCommand(Main.java:67) ~[?:?]
        at org.bukkit.command.PluginCommand.execute(PluginCommand.java:45) ~[paper.jar:git-Paper-414]
        at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:159) ~[paper.jar:git-Paper-414]
        at org.bukkit.craftbukkit.v1_16_R3.CraftServer.dispatchCommand(CraftServer.java:807) ~[paper.jar:git-Paper-414]
        at net.minecraft.server.v1_16_R3.PlayerConnection.handleCommand(PlayerConnection.java:2021) ~[paper.jar:git-Paper-414]
        at net.minecraft.server.v1_16_R3.PlayerConnection.c(PlayerConnection.java:1832) ~[paper.jar:git-Paper-414]
        at net.minecraft.server.v1_16_R3.PlayerConnection.a(PlayerConnection.java:1785) ~[paper.jar:git-Paper-414]
        at net.minecraft.server.v1_16_R3.PacketPlayInChat.a(PacketPlayInChat.java:47) ~[paper.jar:git-Paper-414]
        at net.minecraft.server.v1_16_R3.PacketPlayInChat.a(PacketPlayInChat.java:5) ~[paper.jar:git-Paper-414]
        at net.minecraft.server.v1_16_R3.PlayerConnectionUtils.lambda$ensureMainThread$1(PlayerConnectionUtils.java:23) ~[paper.jar:git-Paper-414]
        at net.minecraft.server.v1_16_R3.TickTask.run(SourceFile:18) ~[paper.jar:git-Paper-414]
        at net.minecraft.server.v1_16_R3.IAsyncTaskHandler.executeTask(IAsyncTaskHandler.java:136) ~[paper.jar:git-Paper-414]
        at net.minecraft.server.v1_16_R3.IAsyncTaskHandlerReentrant.executeTask(SourceFile:23) ~[paper.jar:git-Paper-414]
        at net.minecraft.server.v1_16_R3.IAsyncTaskHandler.executeNext(IAsyncTaskHandler.java:109) ~[paper.jar:git-Paper-414]
        at net.minecraft.server.v1_16_R3.MinecraftServer.bb(MinecraftServer.java:1132) ~[paper.jar:git-Paper-414]
        at net.minecraft.server.v1_16_R3.MinecraftServer.executeNext(MinecraftServer.java:1125) ~[paper.jar:git-Paper-414]
        at net.minecraft.server.v1_16_R3.IAsyncTaskHandler.executeAll(IAsyncTaskHandler.java:95) ~[paper.jar:git-Paper-414]
        at net.minecraft.server.v1_16_R3.MinecraftServer.a(MinecraftServer.java:1261) ~[paper.jar:git-Paper-414]
        at net.minecraft.server.v1_16_R3.MinecraftServer.w(MinecraftServer.java:996) ~[paper.jar:git-Paper-414]
        at net.minecraft.server.v1_16_R3.MinecraftServer.lambda$a$0(MinecraftServer.java:173) ~[paper.jar:git-Paper-414]
        at java.lang.Thread.run(Unknown Source) [?:1.8.0_251]

这是 plugin.yml:

name: TogglePickaxe
author: StepsisObserver
version: 1.0

main: MainPackage.Main

commands:
  togglepickaxe:
    description: toggles if a player can use a pickaxe

我使用 spigot.jar 作为参考库,我的服务器是 paper.jar(不是 spigot/bukkit),但对于我所有的其他插件工作:(

1 个答案:

答案 0 :(得分:0)

我找到了解决方案...我在重复任务调度程序中使用了一个 while 循环... 我删除了 while( size > 0) 并将其更改为 if (size == 0) Bukkit.getScheduler().cancelTask​​(taskId);