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

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

提前致谢!

解决方法:

我自己想通了.事实证明,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;
    }
}
上一篇:linux – Crontab权限被拒绝


下一篇:Python3.5 执行发邮件Exchangelib(=)