1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем Namer_PRO, 4 апр 2019.

?

Возможно ли реализовать то, что я хочу?

  1. Да, 100%)))

    1 голосов
    33,3%
  2. Нет!!!

    2 голосов
    66,7%
Статус темы:
Закрыта.
  1. Автор темы
    Namer_PRO

    Namer_PRO Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Namer_PRO
    Добрый вечер.

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

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

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

    Вот мой код:
    PHP:
        public static void setSkin(Player playerString 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 = ((CraftPlayerplayer).getHandle().getProfile();
                 
                    
    profile.getProperties().removeAll("textures");
                    
    profile.getProperties().put("textures", new Property("textures"skinsignature));
                 
                    
    Plugin plugin Bukkit.getPluginManager().getPlugin("MyPlugin");
                 
                    
    Bukkit.getOnlinePlayers().stream().filter(-> p.getUniqueId() != player.getUniqueId()).forEach(-> {
                        ((
    CraftPlayerp).getHandle().playerConnection.sendPacket(new PacketPlayOutEntityDestroy(p.getEntityId()));
                        ((
    CraftPlayerp).getHandle().playerConnection.sendPacket(new PacketPlayOutNamedEntitySpawn(((CraftPlayerplayer).getHandle()));
                        
    Bukkit.getServer().getScheduler().runTask(plugin, () -> p.hidePlayer(pluginplayer));
                        
    Bukkit.getServer().getScheduler().runTaskLater(plugin, () -> p.showPlayer(pluginplayer), 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;
             
            }
         
        }
     
    Последнее редактирование: 4 апр 2019
  2. Автор темы
    Namer_PRO

    Namer_PRO Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Namer_PRO
    Рад любому совету :)
     
  3. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Перезайти на сервер. Или рефлексией вроде как.
     
  4. _TheZit445_

    _TheZit445_ Активный участник Пользователь

    Баллы:
    76
    Skype:
    kirik2425
    Имя в Minecraft:
    _TheZit445_
    Попробуй глянуть в исходники skinrestorer, это там реализовано. Там идёт какое-то принудительное обновление.
     
  5. Автор темы
    Namer_PRO

    Namer_PRO Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Namer_PRO
    Игрока я обновил (т.е. уничтожил и заново создал), но скин так и не появился. Может, в коде чего:
    PHP:
                    EntityPlayer ep = ((CraftPlayerplayer).getHandle();
                    
    WorldServer wServ =(WorldServer)ep.getWorld();
                 
                    
    Bukkit.getOnlinePlayers().stream().forEach(->
                    {
                     
                        
    EntityPlayer curEp = ((CraftPlayerp).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(pluginplayer));
                            
    Bukkit.getServer().getScheduler().runTaskLater(plugin, () -> p.showPlayer(pluginplayer), 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 0EnumItemSlot.values().lengthi++)
                            {
                               
                                   
    EnumItemSlot slot EnumItemSlot.values()[i];
                                   
    ItemStack stack ep.getEquipment(slot);
                               
                                   if(!
    stack.isEmpty())
                                   {
                                   
                                    
    curCon.sendPacket(new PacketPlayOutEntityEquipment(((CraftPlayerplayer).getEntityId(), slotstack));
                                 
                                   }
                             
                            }
                         
                        }
                     
                    });
                     
                    
    PlayerConnection con ep.playerConnection;
                 
                    
    con.sendPacket(new PacketPlayOutRespawn(wServ.worldProvider.getDimensionManager(), wServ.getDifficulty(), wServ.getWorldData().getType(), ep.playerInteractManager.getGameMode()));
                    
    con.sendPacket(new PacketPlayOutPosition(ep.locXep.locYep.locZep.yawep.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();
     
    Последнее редактирование: 4 апр 2019
  6. Автор темы
    Namer_PRO

    Namer_PRO Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Namer_PRO
  7. Автор темы
    Namer_PRO

    Namer_PRO Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Namer_PRO
    Проблему решил!
    Возможно, в коде еще есть какие-то проблемы, но скин меняется правильно.

    Кому интересно, вот код обновления скина:
    PHP:
        public static void updatePlayerSkin(Player player)
        {
         
            
    EntityPlayer ep = ((CraftPlayerplayer).getHandle();
            
    WorldServer wServ = (WorldServerep.getWorld();
         
            
    Bukkit.getOnlinePlayers().stream().forEach(->
            {
             
                
    EntityPlayer curEp = ((CraftPlayerp).getHandle();
             
                if(
    curEp.getBukkitEntity().canSee(ep.getBukkitEntity()))
                {
                 
                    
    PlayerConnection curCon curEp.playerConnection;
                 
                    
    curCon.sendPacket(new PacketPlayOutPlayerInfo(EnumPlayerInfoAction.REMOVE_PLAYERep));
                    
    curCon.sendPacket(new PacketPlayOutPlayerInfo(EnumPlayerInfoAction.ADD_PLAYERep));
                 
                    if(
    curEp.getId() != ep.getId())
                    {
                     
                           
    curCon.sendPacket(new PacketPlayOutEntityDestroy(((CraftPlayerplayer).getEntityId()));
                           
    curCon.sendPacket(new PacketPlayOutNamedEntitySpawn(ep));
                           
    curCon.sendPacket(new PacketPlayOutEntityHeadRotation(ep, (byte)MathHelper.d(ep.getHeadRotation() * 256.0F 360.0F)));
                       
                    }
                 
                       for(
    int i 0EnumItemSlot.values().lengthi++)
                    {
                       
                           
    EnumItemSlot slot EnumItemSlot.values()[i];
                           
    ItemStack stack ep.getEquipment(slot);
                       
                           if(!
    stack.isEmpty())
                           {
                           
                            
    curCon.sendPacket(new PacketPlayOutEntityEquipment(((CraftPlayerplayer).getEntityId(), slotstack));
                         
                           }
                     
                    }
                 
                }
             
            });
             
            
    PlayerConnection con ep.playerConnection;
         
            
    con.sendPacket(new PacketPlayOutRespawn(wServ.worldProvider.getDimensionManager(), wServ.getDifficulty(), wServ.getWorldData().getType(), ep.playerInteractManager.getGameMode()));
            
    con.sendPacket(new PacketPlayOutPosition(ep.locXep.locYep.locZep.yawep.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();
         
        }
    Тема закрыта.

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

Поделиться этой страницей