掉渣渣
本帖最后由 掉渣渣 于 2022-8-11 02:00 编辑

mod怎么通过玩家名字获取 EntityPlayer 对象
或者    org.bukkit.entity.Player     怎么转换成     net.minecraft.entity.player.EntityPlayer


roj234
考虑到跨版本的兼容性,建议使用反射,并且插件端的玩家类名字不会是这样的,可以看一下什么是NMS
Player等接口通常由对应版本的CraftPlayer类实现,部分实现有getHandle方法获取NMS对象,但是存在与否不影响反射(可以访问字段)

CraftPlayer: org.bukkit.craftbukkit.v【主版本号】_【子版本号】_R【api版本号】.entity.CraftPlayer
EntityPlayer: net.minecraft.server.v1_12_R1.EntityPlayer
NMS: net.minecraft.server

如果你从模组过来,请知道插件和模组的类名不一样
EntityPlayer = EntityPlayerMP
EntityHuman = EntityPlayer
等...和其它区别

那么如何解决你的问题
Player p = xxx;
Field f = getField(p.getClass(), "entity");
Object nms = f.get(p);

注意,除非你不想要跨服务端版本,否则不要转换成NMS,而是保持Object,使用反射操作



    public static Field getFields(Class<?> clazz, String name) throws NoSuchFieldException {
        while (clazz != null && clazz != Object.class) {
            try {
                return clazz.getDeclaredField(name);
            } catch (NoSuchFieldException e) {}
            clazz = clazz.getSuperclass();
        }
        throw new NoSuchFieldException(name);
    }


备注,你写了那么多居然是模组,看来我白写了,但是写了这么多就别浪费
模组的话:
这是1.12.2的代码

        for (EntityPlayerMP p : FMLCommonHandler.instance().getMinecraftServerInstance().getPlayerList().getPlayers()) {
            if (p.getName().equals("名字")) {
                return p;
            }
        }

两者都需要玩家在线
不在线的话,插件可以看看OfflinePlayer,模组不太清楚。

掉渣渣
roj234 发表于 2022-8-11 04:17
考虑到跨版本的兼容性,建议使用反射,并且插件端的玩家类名字不会是这样的,可以看一下什么是NMS
Player等 ...

写了这么多  实在辛苦了 感谢 可能只能反射了