craftbukkit.v1_15_R1.entity.CraftPlayer не может быть разыгран - PullRequest
0 голосов
/ 18 марта 2020

Я не очень хорош в Engli sh, но мне нужно спросить об этой ошибке, потому что я нигде не могу ее исправить.

Я делаю плагин для 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;
    }



}

и его команда 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 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;

    }

}

Как я могу это исправить?

1 Ответ

0 голосов
/ 24 марта 2020

Player - это интерфейс, а не класс, поэтому любой класс, реализующий интерфейс Player, должен также реализовать все методы в Player.

Пример:

public interface MyInterface {
    public void aMethod();
}

Если у вас есть класс, который реализует myIntefrace, тогда ваш класс должен реализовать aMethod:

public class MyClass implements MyInterface {
    public void aMethod() {
        //Do something
    }
}

Подробнее см. здесь: Java Интерфейсы

Так что, если вы хотели PlayerPosition Для реализации Player вам потребуется реализовать большое количество методов, содержащихся в интерфейсе Player. Таким образом, вообще не рекомендуется.

Из-за этого вы не можете разыграть от CraftPlayer до PlayerPosition.

Обходным решением будет сохранение местоположения игрока в HashMap на /setposition и получить его от него на back.

Решением вашей проблемы может быть следующее:

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;
    }
}

Назад. 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: (Основной класс)

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);
    }
}

Надеюсь, это помогло!

...