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

redacted

Тема в разделе "Разработка плагинов для новичков", создана пользователем MrTerf, 28 июл 2018.

Статус темы:
Закрыта.
  1. LuckyZeeRo

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

    Баллы:
    96
    Имя в Minecraft:
    i0xHeX
    Да, все таки его в начале надо было дописать, я спешу и уже устал, вообще не думаю :)
     
  2. Cool_boy

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

    Баллы:
    96
    Имя в Minecraft:
    prettydude
    А я вот не врубаюсь почему не сохраняет тип головы. Он же в MaterialData хранится.
     
  3. Cool_boy

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

    Баллы:
    96
    Имя в Minecraft:
    prettydude
    Текстуру если там скин игрока? Только через NMS.
    (Возможно когда-то я напишу API для этого и коммитну в Bukkit, но не сегодня :cool:)
     
  4. LuckyZeeRo

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

    Баллы:
    96
    Имя в Minecraft:
    i0xHeX
    Ой не не не, лучше уже бери через Skull вручную, но пока подожди, попробуем решить проблему, может завтра на свежий разум будет более понятно.
     
  5. Cool_boy

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

    Баллы:
    96
    Имя в Minecraft:
    prettydude
    Я проверил как в самой игре работает /clone. Примерно так само как в коде выше. Не пойму почему у тебя не меняет.

    На какую версию пишешь?
     
  6. LuckyZeeRo

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

    Баллы:
    96
    Имя в Minecraft:
    i0xHeX
    Ну дак вот порешаем за скины. В любом случае решение будет, на крайняк запилим очень жесткие костыли.
     
  7. LuckyZeeRo

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

    Баллы:
    96
    Имя в Minecraft:
    i0xHeX
    Я вот только что попробовал последний зафикшеный код, ту же голову дракона копирует в голову скелета.
     
  8. Cool_boy

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

    Баллы:
    96
    Имя в Minecraft:
    prettydude
    Попробуй вручную setData(byte) делать (хотя этот метод и так делает setData в самом MaterialData, а значит копируется с ним). Могу на 1.13 с BlockData попробовать, работает ли.
     
  9. Cool_boy

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

    Баллы:
    96
    Имя в Minecraft:
    prettydude
    Оказалось что менять NBT можно даже через строку как в игре.
    https://github.com/deanveloper/SkullCreator/
     
  10. Cool_boy

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

    Баллы:
    96
    Имя в Minecraft:
    prettydude
    Это о скинах. И я не уверен умеет ли Bukkit в копирование таких штук. Надеюсь что да
     
  11. l_Slime_l

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

    Баллы:
    76
    Через nms думаю можно что-нибудь сделать. Тот же url на скин можно запросто получить.
     
  12. l_Slime_l

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

    Баллы:
    76
    Вот код на копирование блока. Голова зомби, эндер дракона копируется нормально (не превращается в голову скелета). Скины пока что не копирует.
    Код:
    public void copyBlock(Block from, Block to) {
            to.setType(from.getType());
          
            if(from.getType() == Material.SKULL) {
                Skull skull = (Skull) from.getState();
                Skull toSkull = (Skull) to.getState();
              
                toSkull.setSkullType(skull.getSkullType());
                toSkull.setRotation(skull.getRotation());
                toSkull.update();
            }
          
            BlockState state = from.getState();
            BlockState targetState = to.getState();
          
            targetState.setData(state.getData());
          
            targetState.update();
        }
    Вот код с копированием скинов) С рефлексией вы как-нибудь сами там))
    Код:
    public void copyBlock(Block from, Block to) {
            to.setType(from.getType());
           
            if(from.getType() == Material.SKULL) {
                Skull skull = (Skull) from.getState();
                Skull toSkull = (Skull) to.getState();
               
                toSkull.setSkullType(skull.getSkullType());
           
                toSkull.setRotation(skull.getRotation());
               
                toSkull.update();
               
                final String url = getSkullURL(from, false);
               
                if(url != null) setSkullWithNonPlayerProfile(getSkullURL(from, false), to);
    
            }
           
            BlockState state = from.getState();
            BlockState targetState = to.getState();
           
            targetState.setData(state.getData());
           
            targetState.update();
        }
       
        public String getSkullURL(Block b, boolean onlyNum){
             
            Skull skull = (Skull) b.getState();
            if(skull.getSkullType() != SkullType.PLAYER) return null;
            TileEntitySkull skullTile = (TileEntitySkull) ((CraftWorld)skull.getWorld()).getHandle().getTileEntity(new BlockPosition(skull.getX(), skull.getY(), skull.getZ()));
            GameProfile profile = skullTile.getGameProfile();
           
            if(profile == null) return null;
           
            Collection<Property> textures = profile.getProperties().get("textures");
           
            if(textures.isEmpty() || textures == null) return null;
           
            String text = "";
         
            for (Property texture : textures) {
                text = texture.getValue();
            }
         
            String decoded = Base64Coder.decodeString(text);
            String url = decoded.replace("{textures:{SKIN:{url:\"", "").replace("\"}}}", "").trim();
            String textureNumber = decoded.replace("{textures:{SKIN:{url:\"", "").replace("\"}}}", "").replace("http://textures.minecraft.net/texture/", "").trim();
         
            return onlyNum ? textureNumber : url;
        }
       
        
        public static GameProfile getNonPlayerProfile(String skinURL) {
            GameProfile newSkinProfile = new GameProfile(UUID.randomUUID(), null);
            newSkinProfile.getProperties().put("textures", new Property("textures", Base64Coder.encodeString("{textures:{SKIN:{url:\"" + skinURL + "\"}}}")));
            return newSkinProfile;
        }
       
        
        public static void setSkullWithNonPlayerProfile(String skinURL, Block skull) {
            if(skull.getType() != Material.SKULL) throw new IllegalArgumentException("Block must be a skull.");
            TileEntitySkull skullTile = (TileEntitySkull)((CraftWorld)skull.getWorld()).getHandle().getTileEntity(new BlockPosition(skull.getX(), skull.getY(), skull.getZ()));
            skullTile.setGameProfile(getNonPlayerProfile(skinURL));
            skull.getState().update();
        }
     
    Последнее редактирование: 29 июл 2018
  13. LuckyZeeRo

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

    Баллы:
    96
    Имя в Minecraft:
    i0xHeX
    Работает идеально. Дальше только сделать поддержку разных версий остается.
    PHP:
    import org.bukkit.craftbukkit.v1_12_R1.CraftWorld;
    import net.minecraft.server.v1_12_R1.NBTTagCompound;
    import net.minecraft.server.v1_12_R1.TileEntity;

    public 
    void copyBlock(Player playerBlock fromBlock to) {
        
    to.setType(from.getType());
        
    BlockState state from.getState();
        
    BlockState targetState to.getState();
        
    targetState.setData(state.getData());
        
    targetState.update(true);
        if (
    from.getType() == Material.SKULLcopySkull(playerfromto);
    }

    public 
    void copySkull(Player playerBlock fromBlock to) {
        
    Location fromLoc from.getLocation();
        
    Location toLoc to.getLocation();
        
    int fromX fromLoc.getBlockX();
        
    int fromY fromLoc.getBlockY();
        
    int fromZ fromLoc.getBlockZ();
        
    int toX toLoc.getBlockX();
        
    int toY toLoc.getBlockY();
        
    int toZ toLoc.getBlockZ();
      
        
    CraftWorld cw = (CraftWorldplayer.getWorld();
        
    TileEntity fromTileEntity cw.getTileEntityAt(fromXfromYfromZ);
        
    TileEntity toTileEntity cw.getTileEntityAt(toXtoYtoZ);
        
    NBTTagCompound fromNBT = new NBTTagCompound();
        
    fromTileEntity.save(fromNBT);
      
        
    NBTTagCompound toNBT = (NBTTagCompoundfromNBT.clone();
        
    toNBT.setInt("x"toX);
        
    toNBT.setInt("y"toY);
        
    toNBT.setInt("z"toZ);
        
    toTileEntity.load(toNBT);
        
    toTileEntity.update();
    }
    Сойдет в принципе для любых TileEntity, не только голов.
     
  14. l_Slime_l

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

    Баллы:
    76
    Я тут сидел, гугл весь перерыл, а он тут бац и через 2 метода копирование со скинами сделал.. Но мой способ тож работает хД
     
  15. l_Slime_l

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

    Баллы:
    76
    Так импорты nms надо.
     
  16. l_Slime_l

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

    Баллы:
    76
    Попробуй способ, который посоветовал LuckyZeeRo, он работает, я чекнул. Там тоже кстати NMS импорты нужны)
     
  17. LuckyZeeRo

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

    Баллы:
    96
    Имя в Minecraft:
    i0xHeX
    Ну ты можешь себе импорт сделать такой как там есть под твою версию. В эклипсе Ctrl + Shift + O.
    А можешь изучить как работать с NMS и рефлекцией, чтобы почти плюнуть на эти версии.

    P.S. Зачем 1.12, если она баганная?
     
  18. l_Slime_l

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

    Баллы:
    76
    А чем 1.12 баганая?
     
  19. l_Slime_l

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

    Баллы:
    76
    Что ты в библиотеках добавляешь? Spigot API (вес ~4 мб) или Spigot (вес ~40 мб) ?
     
  20. l_Slime_l

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

    Баллы:
    76
    Ну значит у тебя полюбому должны быть импорты net.minecraft.server.v1_12_R1 ....
    Скинь ошибку при наведении на неё.
     
Статус темы:
Закрыта.

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