Изменить свой скин...

Статус
Закрыто для дальнейших ответов.

Namer_PRO

Активный участник
Пользователь
Баллы
76
Имя в Minecraft
Namer_PRO
Добрый вечер.

Пишу плагин на смену скина игрока. Скин сам по себе меняется, но возникла проблема:

Новый скин виден только другим игрокам, но не ему самому.

Как это исправить?

Вот мой код:
PHP:
    public static void setSkin(Player player, String name)
    {
     
        try
        {
         
            String uuid = getPlayerUUID(name);
         
            if(uuid.equalsIgnoreCase("204"))
            {
             
                player.sendMessage(ChatColor.RED + "This player doesn't exist!");
             
                return;
             
            }
         
            HttpsURLConnection connection = (HttpsURLConnection) new URL(String.format("https://sessionserver.mojang.com/session/minecraft/profile/" + uuid + "?unsigned=false")).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];
             
                GameProfile profile = ((CraftPlayer) player).getHandle().getProfile();
             
                profile.getProperties().removeAll("textures");
                profile.getProperties().put("textures", new Property("textures", skin, signature));
             
                Plugin plugin = Bukkit.getPluginManager().getPlugin("MyPlugin");
             
                Bukkit.getOnlinePlayers().stream().filter(p -> p.getUniqueId() != player.getUniqueId()).forEach(p -> {
                    ((CraftPlayer) p).getHandle().playerConnection.sendPacket(new PacketPlayOutEntityDestroy(p.getEntityId()));
                    ((CraftPlayer) p).getHandle().playerConnection.sendPacket(new PacketPlayOutNamedEntitySpawn(((CraftPlayer) player).getHandle()));
                    Bukkit.getServer().getScheduler().runTask(plugin, () -> p.hidePlayer(plugin, player));
                    Bukkit.getServer().getScheduler().runTaskLater(plugin, () -> p.showPlayer(plugin, player), 5);
                });
             
                player.sendMessage(ChatColor.GREEN + "Skin was successfully changed! You look like " + name + " now!");
             
                return;
             
            }
            else
            {
             
                if(connection.getResponseCode() == 429)
                {
                
                    player.sendMessage(ChatColor.RED + "Don't change skin so fast!");
                 
                    return;
                
                }
                else
                {
                
                    System.out.println("Couldn't open connection with response code: " + connection.getResponseCode() + " (" + connection.getResponseMessage() + ")");
                 
                    return;
                
                }
             
            }
         
        }
        catch (IOException e)
        {
         
            e.printStackTrace();
            return;
         
        }
     
    }
 
    public static String getPlayerUUID(String name)
    {
     
        try
        {
         
            HttpsURLConnection connection = (HttpsURLConnection) new URL(String.format("https://api.mojang.com/users/profiles/minecraft/" + name)).openConnection();
         
            if (connection.getResponseCode() == HttpsURLConnection.HTTP_OK)
            {
             
                String reply = new BufferedReader(new InputStreamReader(connection.getInputStream())).readLine();
                String uuid = reply.split("\"id\":\"")[1].split("\"")[0];
             
                return uuid;
             
            }
            else
            {
             
                return connection.getResponseCode() + "";
             
            }
         
        }
        catch(IOException e)
        {
         
            e.printStackTrace();
            return null;
         
        }
     
    }
 
Последнее редактирование:
Попробуй глянуть в исходники skinrestorer, это там реализовано. Там идёт какое-то принудительное обновление.
 
Попробуй глянуть в исходники skinrestorer, это там реализовано. Там идёт какое-то принудительное обновление.
Игрока я обновил (т.е. уничтожил и заново создал), но скин так и не появился. Может, в коде чего:
PHP:
                EntityPlayer ep = ((CraftPlayer) player).getHandle();
                WorldServer wServ =(WorldServer)ep.getWorld();
             
                Bukkit.getOnlinePlayers().stream().forEach(p ->
                {
                 
                    EntityPlayer curEp = ((CraftPlayer) p).getHandle();
                 
                    if(curEp.getBukkitEntity().canSee(ep.getBukkitEntity()))
                    {
                     
                        PlayerConnection curCon = curEp.playerConnection;
                     
                        curCon.sendPacket(new PacketPlayOutPlayerInfo(EnumPlayerInfoAction.REMOVE_PLAYER));
                        curCon.sendPacket(new PacketPlayOutPlayerInfo(EnumPlayerInfoAction.ADD_PLAYER));
                     
                        Bukkit.getServer().getScheduler().runTask(plugin, () -> p.hidePlayer(plugin, player));
                        Bukkit.getServer().getScheduler().runTaskLater(plugin, () -> p.showPlayer(plugin, player), 5);
                     
                        if(curEp.getId() != ep.getId())
                        {
                         
                               curCon.sendPacket(new PacketPlayOutEntityDestroy(ep.getId()));
                               curCon.sendPacket(new PacketPlayOutNamedEntitySpawn(ep));
                               curCon.sendPacket(new PacketPlayOutEntityHeadRotation(ep, (byte)MathHelper.d(ep.getHeadRotation() * 256.0F / 360.0F)));
                           
                        }
                       
                        for(int i = 0; i < EnumItemSlot.values().length; i++)
                        {
                           
                               EnumItemSlot slot = EnumItemSlot.values()[i];
                               ItemStack stack = ep.getEquipment(slot);
                           
                               if(!stack.isEmpty())
                               {
                               
                                curCon.sendPacket(new PacketPlayOutEntityEquipment(((CraftPlayer) player).getEntityId(), slot, stack));
                             
                               }
                         
                        }
                     
                    }
                 
                });
                 
                PlayerConnection con = ep.playerConnection;
             
                con.sendPacket(new PacketPlayOutRespawn(wServ.worldProvider.getDimensionManager(), wServ.getDifficulty(), wServ.getWorldData().getType(), ep.playerInteractManager.getGameMode()));
                con.sendPacket(new PacketPlayOutPosition(ep.locX, ep.locY, ep.locZ, ep.yaw, ep.pitch, new HashSet<EnumPlayerTeleportFlags>(), 0));
                con.sendPacket(new PacketPlayOutHeldItemSlot(ep.inventory.itemInHandIndex));
                con.sendPacket(new PacketPlayOutEntityMetadata(ep.getId(), ep.getDataWatcher(), true));
                ep.updateAbilities();
                ep.triggerHealthUpdate();
                ep.updateInventory(ep.defaultContainer);
                ep.getBukkitEntity().recalculatePermissions();
 
Последнее редактирование:
Проблему решил!
Возможно, в коде еще есть какие-то проблемы, но скин меняется правильно.

Кому интересно, вот код обновления скина:
PHP:
    public static void updatePlayerSkin(Player player)
    {
     
        EntityPlayer ep = ((CraftPlayer) player).getHandle();
        WorldServer wServ = (WorldServer) ep.getWorld();
     
        Bukkit.getOnlinePlayers().stream().forEach(p ->
        {
         
            EntityPlayer curEp = ((CraftPlayer) p).getHandle();
         
            if(curEp.getBukkitEntity().canSee(ep.getBukkitEntity()))
            {
             
                PlayerConnection curCon = curEp.playerConnection;
             
                curCon.sendPacket(new PacketPlayOutPlayerInfo(EnumPlayerInfoAction.REMOVE_PLAYER, ep));
                curCon.sendPacket(new PacketPlayOutPlayerInfo(EnumPlayerInfoAction.ADD_PLAYER, ep));
             
                if(curEp.getId() != ep.getId())
                {
                 
                       curCon.sendPacket(new PacketPlayOutEntityDestroy(((CraftPlayer) player).getEntityId()));
                       curCon.sendPacket(new PacketPlayOutNamedEntitySpawn(ep));
                       curCon.sendPacket(new PacketPlayOutEntityHeadRotation(ep, (byte)MathHelper.d(ep.getHeadRotation() * 256.0F / 360.0F)));
                   
                }
             
                   for(int i = 0; i < EnumItemSlot.values().length; i++)
                {
                   
                       EnumItemSlot slot = EnumItemSlot.values()[i];
                       ItemStack stack = ep.getEquipment(slot);
                   
                       if(!stack.isEmpty())
                       {
                       
                        curCon.sendPacket(new PacketPlayOutEntityEquipment(((CraftPlayer) player).getEntityId(), slot, stack));
                     
                       }
                 
                }
             
            }
         
        });
         
        PlayerConnection con = ep.playerConnection;
     
        con.sendPacket(new PacketPlayOutRespawn(wServ.worldProvider.getDimensionManager(), wServ.getDifficulty(), wServ.getWorldData().getType(), ep.playerInteractManager.getGameMode()));
        con.sendPacket(new PacketPlayOutPosition(ep.locX, ep.locY, ep.locZ, ep.yaw, ep.pitch, new HashSet<EnumPlayerTeleportFlags>(), 0));
        con.sendPacket(new PacketPlayOutHeldItemSlot(ep.inventory.itemInHandIndex));
        con.sendPacket(new PacketPlayOutEntityMetadata(ep.getId(), ep.getDataWatcher(), true));
        ep.updateAbilities();
        ep.triggerHealthUpdate();
        ep.updateInventory(ep.defaultContainer);
        ep.getBukkitEntity().recalculatePermissions();
     
    }

Тема закрыта.

Если кто-то найдет в моем коде ошибку и захочет помочь, пишите в личные сообщения, буду благодарен 🙂
 
Последнее редактирование:
Статус
Закрыто для дальнейших ответов.
Назад
Верх