とりあえず書いたやつを乗っけてそこに解説を入れるぜ
import com.google.gson.Gson;
import com.mojang.authlib.properties.Property;
import net.minecraft.server.v1_14_R1.EntityPlayer;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.craftbukkit.v1_14_R1.entity.CraftPlayer;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.java.JavaPlugin;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.List;
import java.util.UUID;
public class PluginMain extends JavaPlugin {
@Override
public void onEnable() {
getCommand("skin").setExecutor(this);
}
@Override
public void onDisable() {
}
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
boolean isPlayer = sender instanceof Player;
if (!isPlayer) {
sender.sendMessage(ChatColor.RED + "プレイヤーのみ実行可能です");
return true;
}
if (args.length != 1) return false;
changeSkin(this,(Player)sender,Bukkit.getOfflinePlayer(args[0]).getUniqueId());
return true;
}
public void changeSkin(Plugin plugin, Player target, UUID skin) {
for (Player p:Bukkit.getOnlinePlayers()) p.hidePlayer(plugin,target);
EntityPlayer player = ((CraftPlayer)target).getHandle();
try {
URL url = new URL(String.format("https://sessionserver.mojang.com/session/minecraft/profile/%s?unsigned=false", skin.toString().replace("-","")));
Profile profile = new Gson().fromJson(new InputStreamReader(url.openStream()),Profile.class);
player.getProfile().getProperties().removeAll("textures");
player.getProfile().getProperties().put("textures",profile.properties.get(0));
} catch (IOException ex) {
ex.printStackTrace();
}
for (Player p : Bukkit.getOnlinePlayers()) {
p.showPlayer(plugin, target);
}
}
public class Profile {
public String id;
public String name;
public List<Property> properties;
}
}
これは/skin <PlayerName>というコマンドを実行すると
他人から見たスキンが変わるものです。
まず、このプログラムの根幹となっているのは
Mojangが提供しているスキンのデータを表示するAPIです。
https://sessionserver.mojang.com/session/minecraft/profile/<UUID>?unsigned=false
<UUID>のところをスキンを取得したいプレイヤーのUUIDに置き換えると
{
"id" : "183cc743add64399a2d3a7a4094779d3",
"name" : "tagucha",
"properties" : [ {
"name" : "textures",
"value" : "ewogICJ0aW1lc3RhbXAiIDogMTU5MDUwMTMwOTU4NywKICAicHJvZmlsZUlkIiA6ICIxODNjYzc0M2FkZDY0Mzk5YTJkM2E3YTQwOTQ3NzlkMyIsCiAgInByb2ZpbGVOYW1lIiA6ICJ0YWd1Y2hhIiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlL2U3N2Y5OWQxNzU3NWUwN2E1ZDI0ZmRiMDc1MjQxMGI3Yzg3NTRiMzhmMjJhZWI1ODgxOTA4YzQzNGZiYTI3M2MiLAogICAgICAibWV0YWRhdGEiIDogewogICAgICAgICJtb2RlbCIgOiAic2xpbSIKICAgICAgfQogICAgfQogIH0KfQ==",
"signature" : "lr3SSouoTuZR1ofVI6+KbzZICiSxHg31UIcOIUABzeOryRh8fmTrmqnZkDS97xRPtDwvIbjz0qkuaC2Lcl6GQqCuXJzQx5yvzk7e/jjgDY/mztPuPkXWHrvr/zdUZ3wHg/jXL1dmOebZsCR+SRiieNBB9kKAw/rMUunlgmh+mjUbid3StlwQJOdrfgE1DuBmpxhJiNkC5PdKG7XLLHmUP5I5koqn+mYVPi2iAn5hJAFy/4llYV1iv0PAFItSwjMdnh21siiE7VERWqYOcipMK0t9PayVeSKDkgHZ4JLcffpCGBuehnC/WcS7ZfQczV6Dea4xAtBQxU0QtwHT9m07fu70yb5g4EI5lA2tNbZBgQK0hYSR1SLF1C80MsNU4Hcsa0Fql0n2Pq1VZPN6uK4L0rXmCgYroCIKk30LImszkqrrMvr5h8QxuMOOo4Gf4XdddDvWY43AujFJJ5iLRQrsSX9SylhQlsB53SfZ3z32GWidpNpXGnhUWQ07ImsStoxJO2Rsscl93IpqsYtG0HCWyqWKwkzDK1mymfTceZbUQVeI9HXg8NVVDr74sD0j4DHgUtWosNMSCFm6a0r/owzGO/upCeZgAeqpkk8LG7t89QzZoY448FKF800j1StnTw14xNH6iw/F7DSr2v1zMlxpJ2ohalzP1zgRLUG76YwLy6c="
} ]
}
というような文字列が得られます。これがスキンの情報です。
これはJSONと呼ばれるデータフォーマットで、Gsonというクラスを使ってこれを扱いやすい
形にしてEntityPlayerというクラスの中のGameProfileに保存されている
スキンのデータを書き換えています。
しかし、これだけだと更新されないので、スキンを変える前にプレイヤーを非表示
変更後にプレイヤーを表示すれば、更新するためのパケットが内包されている
ので比較的簡単に更新ができます。