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 org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.Iterator;
import java.util.UUID;
//1.14.4前提です...書き忘れてた
// コマンド /skin <player名> でスキンを変えることができます
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("-","")));
Iterator<String> it = new BufferedReader(new InputStreamReader(url.openStream())).lines().iterator();
String arg = "";
while (it.hasNext()) arg += it.next();
JSONObject object = new JSONObject(arg).getJSONArray("properties").getJSONObject(0);
player.getProfile().getProperties().removeAll("textures");
player.getProfile().getProperties().put("textures", new Property("textures", object.getString("value"), object.getString("signature")));
} catch (IOException | JSONException ex) {
ex.printStackTrace();
}
for (Player p : Bukkit.getOnlinePlayers()) p.showPlayer(plugin, target);
}
}
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.event.Listener;
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;
/*
jsonをorg.jsonではなくGsonを使って書いたバージョン
こっちの方がすっきりしてる気がする
*/
public class PluginMain extends JavaPlugin implements Listener {
@Override
public void onEnable() {
getCommand("skin").setExecutor(this);
getServer().getPluginManager().registerEvents(this,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;
}
}