在Minecraft(Bukkit / Spigot)中使用NMS更改玩家皮肤

时间:2017-08-22 05:03:20

标签: java minecraft bukkit

我目前正在制作一个插件,可让您假设其他玩家的身份。它几乎完美无缺:您的UUID和用户名更改为您认为服务器身份的用户的UUID和用户名,并且就服务器和插件而言,您似乎是该播放器。您将拥有与他们相同的级别,相同的权限,一切。我无法获得的一件事是皮肤。我曾经认为,当UUID出现时,玩家的皮肤会被其他玩家改变,但事实并非如此。我使用反射来更改GameProfile和EntityPlayer中的UUID(uniqueID字段是从Entity继承的),并且获取播放器的UUID的所有方法都返回插件设置的UUID。我通过反编译的NMS和Bukkit / Spigot论坛进行挖掘,但所有这些似乎表明皮肤应该随UUID而改变。我将一个PlayerQuitEvent和PlayerJoinEvent发送到插件来模拟真实玩家离开和假定玩家加入,并向所有玩家发送数据包以从tab和ingame中删除旧玩家,然后添加新玩家。如果可以避免,我宁愿不使用ProtocolLib。任何帮助将不胜感激,任何人都能指出我正确的方向吗?

提前致谢!

2 个答案:

答案 0 :(得分:3)

我自己想通了。事实证明,GameProfile包含皮肤纹理。必须从Mojang会话服务器请求此纹理。这是代码:

public static boolean setSkin(GameProfile profile, UUID uuid) {
    try {
        HttpsURLConnection connection = (HttpsURLConnection) new URL(String.format("https://sessionserver.mojang.com/session/minecraft/profile/%s?unsigned=false", UUIDTypeAdapter.fromUUID(uuid))).openConnection();
        if (connection.getResponseCode() == HttpsURLConnection.HTTP_OK) {
            String reply = new BufferedReader(new InputStreamReader(connection.getInputStream())).readLine();
            String skin = reply.split("\"value\":\"")[1].split("\"")[0];
            String signature = reply.split("\"signature\":\"")[1].split("\"")[0];
            profile.getProperties().put("textures", new Property("textures", skin, signature));
            return true;
        } else {
            System.out.println("Connection could not be opened (Response code " + connection.getResponseCode() + ", " + connection.getResponseMessage() + ")");
            return false;
        }
    } catch (IOException e) {
        e.printStackTrace();
        return false;
    }
}

答案 1 :(得分:0)

始终使用 Ctrl + Shift + O 。它将导入您需要的所有东西。