当前位置: 首页 > 知识库问答 >
问题:

在《我的世界》中用NMS改变玩家皮肤(Bukkit/Spigot)

常雅珺
2023-03-14

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

提前感谢!

共有1个答案

齐奕
2023-03-14

我自己想通了。原来一个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;
    }
}
 类似资料:
  • 我正在编写一个bukkit插件,它应该能够向玩家发送游戏档案更新,以改变玩家的皮肤。但在游戏机上,它说,皮肤签名是无效的。如何获得有效的皮肤签名? 我通过打开以下链接获得签名和其他数据:https://sessionserver.mojang.com/session/minecraft/profile/b4be22fdb7004478839c787357d78cbe?unsigned=false

  • 我正在尝试将所有在线玩家设置为游戏模式0(生存)(我做一个varo插件) 以下是我的代码: 如果我开始倒计时,并且调用了startVaro()方法,我会得到一个错误: 为什么我有这个错误?我该如何解决它?

  • 我正在尝试查看玩家的库存中是否有以下物品,如果有,我想移除这些物品并向他们发送消息,说该物品已被移除,但我不知道如何做到这一点,这就是我目前拥有的: 我在.contains(bannedItems,1))行上收到一个错误。 谢谢你的帮助!

  • GUISkins are a collection of GUIStyles that can be applied to your GUI. Each Control type has its own Style definition. Skins are intended to allow you to apply style to an entire UI, instead of a sin

  • 我正在用libgdx写一个游戏,我借用了这个皮肤。来自教程的json(和相关文件)。 正在使用的字体(默认)在更密集的屏幕上以一种丑陋的方式缩放,因此我使用自己的超大字体生成-在游戏本身中,我将其缩放到一个合理的大小(基本上我使用)。我现在使用的字体是前一种字体的3倍大。 我更改了在皮肤中使用哪个字体的参考。json文件,因此,我所有的按钮、标题和其他东西都有一个巨大的字体显示。 有办法缩放. j

  • 我知道你可以得到损坏的原因 在实体损坏事件中,但是我还没有找到返回造成损坏的实体的方法。我需要找出这一点,这样我就可以检查玩家的库存中是否有某个物品。