Java craftbukkit.v1_15_R1.entity.CraftPlayer无法施放

Java craftbukkit.v1_15_R1.entity.CraftPlayer无法施放,java,plugins,minecraft,Java,Plugins,Minecraft,我的英语不好,但我不得不问一下这个错误,因为我在任何地方都不能很好地理解它 我正在制作minecraft插件以返回玩家选择的位置 但是我无法修复这个错误 这是整个错误日志 [10:57:29] [Server thread/INFO]: Player issued server command: /setposition [10:57:29] [Server thread/ERROR]: null org.bukkit.command.CommandException: Unhandled ex

我的英语不好,但我不得不问一下这个错误,因为我在任何地方都不能很好地理解它

我正在制作minecraft插件以返回玩家选择的位置

但是我无法修复这个错误

这是整个错误日志

[10:57:29] [Server thread/INFO]: Player issued server command: /setposition
[10:57:29] [Server thread/ERROR]: null
org.bukkit.command.CommandException: Unhandled exception executing command 'setposition' in plugin Main v0.1
        at org.bukkit.command.PluginCommand.execute(PluginCommand.java:47) ~[Server.jar:git-Spigot-6de3d4b-fc24934]
        at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:149) ~[Server.jar:git-Spigot-6de3d4b-fc24934]
        at org.bukkit.craftbukkit.v1_15_R1.CraftServer.dispatchCommand(CraftServer.java:723) ~[Server.jar:git-Spigot-6de3d4b-fc24934]
        at net.minecraft.server.v1_15_R1.PlayerConnection.handleCommand(PlayerConnection.java:1658) ~[Server.jar:git-Spigot-6de3d4b-fc24934]
        at net.minecraft.server.v1_15_R1.PlayerConnection.a(PlayerConnection.java:1498) ~[Server.jar:git-Spigot-6de3d4b-fc24934]
        at net.minecraft.server.v1_15_R1.PacketPlayInChat.a(PacketPlayInChat.java:47) ~[Server.jar:git-Spigot-6de3d4b-fc24934]
        at net.minecraft.server.v1_15_R1.PacketPlayInChat.a(PacketPlayInChat.java:1) ~[Server.jar:git-Spigot-6de3d4b-fc24934]
        at net.minecraft.server.v1_15_R1.PlayerConnectionUtils.lambda$0(PlayerConnectionUtils.java:19) ~[Server.jar:git-Spigot-6de3d4b-fc24934]
        at net.minecraft.server.v1_15_R1.TickTask.run(SourceFile:18) [Server.jar:git-Spigot-6de3d4b-fc24934]
        at net.minecraft.server.v1_15_R1.IAsyncTaskHandler.executeTask(SourceFile:144) [Server.jar:git-Spigot-6de3d4b-fc24934]
        at net.minecraft.server.v1_15_R1.IAsyncTaskHandlerReentrant.executeTask(SourceFile:23) [Server.jar:git-Spigot-6de3d4b-fc24934]
        at net.minecraft.server.v1_15_R1.IAsyncTaskHandler.executeNext(SourceFile:118) [Server.jar:git-Spigot-6de3d4b-fc24934]
        at net.minecraft.server.v1_15_R1.MinecraftServer.ba(MinecraftServer.java:918) [Server.jar:git-Spigot-6de3d4b-fc24934]
        at net.minecraft.server.v1_15_R1.MinecraftServer.executeNext(MinecraftServer.java:911) [Server.jar:git-Spigot-6de3d4b-fc24934]
        at net.minecraft.server.v1_15_R1.IAsyncTaskHandler.awaitTasks(SourceFile:127) [Server.jar:git-Spigot-6de3d4b-fc24934]
        at net.minecraft.server.v1_15_R1.MinecraftServer.sleepForTick(MinecraftServer.java:895) [Server.jar:git-Spigot-6de3d4b-fc24934]
        at net.minecraft.server.v1_15_R1.MinecraftServer.run(MinecraftServer.java:828) [Server.jar:git-Spigot-6de3d4b-fc24934]
        at java.lang.Thread.run(Unknown Source) [?:1.8.0_241]
Caused by: java.lang.ClassCastException: org.bukkit.craftbukkit.v1_15_R1.entity.CraftPlayer cannot be cast to package1.PlayerPosition
        at package1.SetPosition.onCommand(SetPosition.java:16) ~[?:?]
        at org.bukkit.command.PluginCommand.execute(PluginCommand.java:45) ~[Server.jar:git-Spigot-6de3d4b-fc24934]
        ... 17 more
回来了

玩家可以通过setposition命令移动到所选位置

package package1;

import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import net.md_5.bungee.api.ChatColor;

public class Back implements CommandExecutor {

    public boolean onCommand(CommandSender sender, Command command, String label, String[] args)
    {
        if(sender instanceof Player) {
            Player p = (Player) sender;
            PlayerPosition pp = (PlayerPosition) p;
            if(pp.location.equals(null)) {
                p.sendMessage(ChatColor.RED + "Set Your Position To Back First By Using SetPosition.");
                return false;

            }
            else 
            {

                p.teleport(pp.location);
            return true;

            }

        }
        return false;
    }

}

这是PlayerPosition班

这个类扩展了Player

和添加位置

package package1;

import org.bukkit.Location;
import org.bukkit.entity.Player;

public abstract class PlayerPosition implements Player {
    public Location location;

    PlayerPosition(Location l){
        this.location = l;
    }



}

这是设置位置命令

package package1;

import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;

import net.md_5.bungee.api.ChatColor;

public class SetPosition implements CommandExecutor {

    public boolean onCommand(CommandSender sender, Command command, String label, String[] args)
    {
        if(sender instanceof Player) {
            Player p = (Player) sender;
            PlayerPosition pp = (PlayerPosition) p;

            pp.location = p.getLocation();

            p.sendMessage(ChatColor.BLUE + "Position Setting Complete.");
            return true;



        }   
    return false;

    }

}

如何修复它?

Player是一个接口,而不是一个类,因此任何实现Player接口的类都必须实现Player中的所有方法

例如:

public interface MyInterface {
    public void aMethod();
}
如果您有一个实现了
myIntefrace
的类,那么您的类必须实现
aMethod

public class MyClass implements MyInterface {
    public void aMethod() {
        //Do something
    }
}
有关更多信息,请参阅此处:

因此,如果您想要
PlayerPosition
实现
Player
,您必须自己实现
Player
界面中包含的大量方法。因此,根本不建议这样做

正因为如此,你不能从
CraftPlayer
PlayerPosition
施放

一种解决方法是将播放器位置保存在
/setposition
上的
HashMap
中,并在
返回时从中获取

您的问题的解决方案可以是:

SetPosition.java:

public class SetPosition implements CommandExecutor {
    @Override
    public boolean onCommand(CommandSender theSender, Command command, String s, String[] strings) {
        if (theSender instanceof Player) {
            Player p = (Player) theSender;
            PluginCore.getInstance().setLocation(p, p.getLocation());
            p.sendMessage(ChatColor.BLUE + "Position Setting Complete.");
        }
        return false;
    }
}
Back.java:

public class Back implements CommandExecutor {
    @Override
    public boolean onCommand(CommandSender theSender, Command command, String s, String[] strings) {
        if (theSender instanceof Player) {
            Player p = (Player) theSender;
            Location location = PluginCore.getInstance().getLocation(p);
            if (location == null) {
                p.sendMessage(ChatColor.RED + "Set Your Position To Back First By Using SetPosition.");
            } else {
                p.teleport(location);
            }
        }
        return false;
    }
}
PluginCore.java:(主类)

公共类PluginCore扩展了JavaPlugin{
私有静态插件核心实例;
私有HashMap位置=新HashMap();
@凌驾
public void onEnable(){
实例=此;
this.getCommand(“back”).setExecutor(new back());
这个.getCommand(“setposition”).setExecutor(新的setposition());
}
公共静态插件核心getInstance(){
返回实例;
}
公共位置getLocations(玩家p){
返回位置。获取(p);
}
公共无效设置位置(玩家p,位置){
这个。位置。放置(p,位置);
}
}
我希望有帮助

public class PluginCore extends JavaPlugin {

    private static PluginCore instance;

    private HashMap<Player, Location> locations = new HashMap<Player, Location>();

    @Override
    public void onEnable() {
        instance = this;
        this.getCommand("back").setExecutor(new Back());
        this.getCommand("setposition").setExecutor(new SetPosition());
    }

    public static PluginCore getInstance() {
        return instance;
    }

    public Location getLocations(Player p) {
        return locations.get(p);
    }

    public void setLocation(Player p, Location location) {
        this.locations.put(p, location);
    }
}