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