我真护啊
本帖最后由 我真护啊 于 2023-1-15 00:45 编辑

创建实体的时候写EntityType.PLAYER就报错 如何创建一个和自己一样的实体呢

跪求大佬求解

Player player = (Player) sender;
player.getWorld().spawnEntity(player.getLocation(), EntityType.PLAYER);
[00:21:39 ERROR]: null
org.bukkit.command.CommandException: Unhandled exception executing command 'morequit' in plugin MoreQuit v1.0-SNAPSHOT
        at org.bukkit.command.PluginCommand.execute(PluginCommand.java:47) ~[purpur-api-1.18.2-R0.1-SNAPSHOT.jar:?]
        at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:172) ~[purpur-api-1.18.2-R0.1-SNAPSHOT.jar:?]
        at org.bukkit.craftbukkit.v1_18_R2.CraftServer.dispatchCommand(CraftServer.java:906) ~[purpur-1.18.2.jar:git-Purpur-1632]
        at net.minecraft.server.network.ServerGamePacketListenerImpl.handleCommand(ServerGamePacketListenerImpl.java:2390) ~[?:?]
        at net.minecraft.server.network.ServerGamePacketListenerImpl.handleChat(ServerGamePacketListenerImpl.java:2201) ~[?:?]
        at net.minecraft.server.network.ServerGamePacketListenerImpl.handleChat(ServerGamePacketListenerImpl.java:2182) ~[?:?]
        at net.minecraft.network.protocol.game.ServerboundChatPacket.handle(ServerboundChatPacket.java:46) ~[?:?]
        at net.minecraft.network.protocol.game.ServerboundChatPacket.a(ServerboundChatPacket.java:6) ~[?:?]
        at net.minecraft.network.protocol.PacketUtils.lambda$ensureRunningOnSameThread$1(PacketUtils.java:51) ~[?:?]
        at net.minecraft.server.TickTask.run(TickTask.java:18) ~[purpur-1.18.2.jar:git-Purpur-1632]
        at net.minecraft.util.thread.BlockableEventLoop.doRunTask(BlockableEventLoop.java:153) ~[?:?]
        at net.minecraft.util.thread.ReentrantBlockableEventLoop.doRunTask(ReentrantBlockableEventLoop.java:24) ~[?:?]
        at net.minecraft.server.MinecraftServer.doRunTask(MinecraftServer.java:1427) ~[purpur-1.18.2.jar:git-Purpur-1632]
        at net.minecraft.server.MinecraftServer.d(MinecraftServer.java:188) ~[purpur-1.18.2.jar:git-Purpur-1632]
        at net.minecraft.util.thread.BlockableEventLoop.pollTask(BlockableEventLoop.java:126) ~[?:?]
        at net.minecraft.server.MinecraftServer.pollTaskInternal(MinecraftServer.java:1404) ~[purpur-1.18.2.jar:git-Purpur-1632]
        at net.minecraft.server.MinecraftServer.pollTask(MinecraftServer.java:1397) ~[purpur-1.18.2.jar:git-Purpur-1632]
        at net.minecraft.util.thread.BlockableEventLoop.managedBlock(BlockableEventLoop.java:136) ~[?:?]
        at net.minecraft.server.MinecraftServer.waitUntilNextTick(MinecraftServer.java:1375) ~[purpur-1.18.2.jar:git-Purpur-1632]
        at net.minecraft.server.MinecraftServer.runServer(MinecraftServer.java:1257) ~[purpur-1.18.2.jar:git-Purpur-1632]
        at net.minecraft.server.MinecraftServer.lambda$spin$1(MinecraftServer.java:321) ~[purpur-1.18.2.jar:git-Purpur-1632]
        at java.lang.Thread.run(Thread.java:833) ~[?:?]
Caused by: java.lang.IllegalArgumentException: Cannot spawn an entity for org.bukkit.entity.Player
        at org.bukkit.craftbukkit.v1_18_R2.CraftRegionAccessor.createEntity(CraftRegionAccessor.java:916) ~[purpur-1.18.2.jar:git-Purpur-1632]
        at org.bukkit.craftbukkit.v1_18_R2.CraftRegionAccessor.spawn(CraftRegionAccessor.java:497) ~[purpur-1.18.2.jar:git-Purpur-1632]
        at org.bukkit.craftbukkit.v1_18_R2.CraftRegionAccessor.spawn(CraftRegionAccessor.java:493) ~[purpur-1.18.2.jar:git-Purpur-1632]
        at org.bukkit.craftbukkit.v1_18_R2.CraftRegionAccessor.spawn(CraftRegionAccessor.java:479) ~[purpur-1.18.2.jar:git-Purpur-1632]
        at org.bukkit.craftbukkit.v1_18_R2.CraftRegionAccessor.spawnEntity(CraftRegionAccessor.java:387) ~[purpur-1.18.2.jar:git-Purpur-1632]
        at www.pinkmc.com.morequit.command.MainCommand.onCommand(MainCommand.java:25) ~[MoreQuit.jar:?]
        at org.bukkit.command.PluginCommand.execute(PluginCommand.java:45) ~[purpur-api-1.18.2-R0.1-SNAPSHOT.jar:?]
        ... 21 more


名副其实
参照 Citizens 生成 NPC 的写法,直接将皮肤也覆盖在该 NPC 上即可。

我真护啊
名副其实 发表于 2023-1-15 02:22
参照 Citizens 生成 NPC 的写法,直接将皮肤也覆盖在该 NPC 上即可。

感谢大哥 实现了

Water_wa
public static void send(Player p) {
                EntityPlayer ep = ((CraftPlayer) p).getHandle();
                WorldServer ws = ((CraftWorld) p.getLocation().getWorld()).getHandle();
                MinecraftServer mc = ep.server;
                net.minecraft.server.v1_8_R3.World w = ((CraftWorld) p.getWorld()).getHandle();
                PlayerInteractManager interact = new PlayerInteractManager(w);
                GameProfile gp = new GameProfile(UUID.randomUUID() , "§c测试");
                EntityPlayer npc = new EntityPlayer(mc, ws, gp, interact);
                Location loc = p.getLocation();
                PlayerConnection pc = ep.playerConnection;
                npc.setPosition(loc.getX(), loc.getY(), loc.getZ());
                PacketPlayOutPlayerInfo pi = new PacketPlayOutPlayerInfo(EnumPlayerInfoAction.ADD_PLAYER, npc);
                PacketPlayOutNamedEntitySpawn spawn = new PacketPlayOutNamedEntitySpawn(npc);
                pc.sendPacket(pi);
                pc.sendPacket(spawn);
                pc.sendPacket(new PacketPlayOutPlayerInfo(EnumPlayerInfoAction.REMOVE_PLAYER, npc));
                FakePlayer.npcs.add(npc);
                hideNpcName(p , npc);
        }
npc换皮肤的没研究过,这个是生成一个玩家npc,youtube有详细教程

Water_wa
public static void hideNpcName(Player p , EntityPlayer npc) {
                ScoreboardTeam team = new ScoreboardTeam(((CraftScoreboard) Bukkit.getScoreboardManager().getMainScoreboard()).getHandle(), p.getName());
                team.setNameTagVisibility(EnumNameTagVisibility.NEVER);
                for(Player pl : Bukkit.getOnlinePlayers()) {
                        target.add(pl.getName());
                }
                for(EntityPlayer npcs : FakePlayer.npcs) {
                        target.add(npcs.getName());
                }
                EntityPlayer ep = ((CraftPlayer) p).getHandle();
                PlayerConnection pc = ep.playerConnection;
                pc.sendPacket(new PacketPlayOutScoreboardTeam(team, 1));
                pc.sendPacket(new PacketPlayOutScoreboardTeam(team, 0));
                pc.sendPacket(new PacketPlayOutScoreboardTeam(team, target, 3));
    }
这个可加可不加,隐藏npc名字的