Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

Помогите Получение png файла для SkinRestorer

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

Статус темы:
Закрыта.
  1. Автор темы
    maxim0098

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

    Баллы:
    66
    Имя в Minecraft:
    _Nevad_
    Пишу дополнение для SkinRestorer'а. Как известно этот плагин может заменять скины игроков только на существующие из базы майна. Хочу расширить этот плагин, добавив возможность менять скин на свой. То есть например командой /skin url [полный путь к .png файлу]. Хотел бы узнать, как можно используя API SkinRestorer'а получать путь к этому .png файлу и присваивать его как скин.
    Чтобы было проще, оставлю базовый метод использования API:
    Код:
    package skinsrestorer.shared.api;
    
    import java.io.ByteArrayOutputStream;
    import java.io.DataOutputStream;
    
    import org.bukkit.Bukkit;
    import org.bukkit.entity.Player;
    
    import net.minecraft.util.com.google.common.collect.Iterables;
    import skinsrestorer.bukkit.SkinsRestorer;
    import skinsrestorer.bungee.SkinApplier;
    import skinsrestorer.shared.storage.Locale;
    import skinsrestorer.shared.storage.SkinStorage;
    import skinsrestorer.shared.utils.MojangAPI;
    import skinsrestorer.shared.utils.MojangAPI.SkinRequestException;
    import skinsrestorer.shared.utils.ReflectionUtil;
    
    public class SkinsRestorerAPI {
    
        /**
         * This method is used to set player's skin.
         * <p>
         * Keep in mind it just sets the skin, <b>you have to apply the skin using
         * another method! </b>
         * <p>
         * Method will not do anything if it fails to get the skin from MojangAPI or
         * database!
         *
         * @param playerName
         *            = Player's nick name
         *
         * @param skinName
         *            = Skin's name
         */
        public static void setSkin(final String playerName, final String skinName) {
            try {
                new Thread(new Runnable() {
    
                    @Override
                    public void run() {
    
                        Object textures = null;
    
                        try {
                            textures = MojangAPI.getSkinProperty(MojangAPI.getUUID(skinName));
    
                            if (textures == null)
                                throw new SkinRequestException(Locale.NO_SKIN_DATA);
    
                            SkinStorage.setSkinData(skinName, textures);
                            SkinStorage.setPlayerSkin(playerName, skinName);
                        } catch (SkinRequestException e) {
                            SkinStorage.setPlayerSkin(playerName, skinName);
                        }
    
                    }
    
                }).run();
            } catch (Throwable t) {
                Player p = Iterables.getFirst(Bukkit.getOnlinePlayers(), null);
    
                if (p != null) {
                    ByteArrayOutputStream b = new ByteArrayOutputStream();
                    DataOutputStream out = new DataOutputStream(b);
    
                    try {
                        out.writeUTF("SkinsRestorer");
                        out.writeUTF(playerName);
                        out.writeUTF(skinName);
    
                        p.sendPluginMessage(SkinsRestorer.getInstance(), "BungeeCord", b.toByteArray());
    
                        out.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    
        /**
         * This method is used to check if player has set a skin. If player has no
         * skin assigned (so playerName = skinName), the method will return false.
         * Else if player has a skin assigned, returns true.
         *
         * @param playerName
         *            = Player's nick name
         */
        public static boolean hasSkin(String playerName) {
            return SkinStorage.getPlayerSkin(playerName) != null;
        }
    
        /**
         * This method is used to get player's skin name.
         *
         * When player has no skin OR his skin name equals his username, returns
         * null (this is because of cache clean ups)
         *
         * @param playerName
         *            = Player's nick name
         */
        public static String getSkinName(String playerName) {
            return SkinStorage.getPlayerSkin(playerName);
        }
    
        /**
         * Used for instant skin applying.
         *
         * @param player
         *            = Player's instance (either ProxiedPlayer or Player)
         */
        public static void applySkin(Object player) {
            try {
                SkinsRestorer.getInstance().getFactory().updateSkin((Player) player);
            } catch (Throwable t) {
                try {
                    ReflectionUtil.invokeMethod(SkinApplier.class, null, "applySkin", player);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    
        /**
         * Used to remove player's skin.
         *
         * You have to use apply method if you want instant results.
         *
         * @param playername
         *            = Player's nick name
         *
         */
        public static void removeSkin(String playername) {
            SkinStorage.removePlayerSkin(playername);
        }
    }
     
    Последнее редактирование: 15 авг 2016
  2. Хостинг MineCraft
    <
  3. Dymeth

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

    Баллы:
    76
    SkinRestorer не способен на такое, насколько мне известно. Я не уверен, что вообще какой-либо публичный плагин может проворачивать такие финты.
    Общий алгоритм таков: получаешь от игрока URL, с него сохраняешь скин-картинку, загружаешь её через лицензионный аккаунт на minecraft.net, при этом кэшируешь у себя сигнатуру и текстуру, обновляешь скин на клиентах. На практике с этим можно очень долго жеваться. Я под старую версию сайта такое делал, под новую пока не дойдут руки.

    Если собрался делать, учти несколько факторов:
    1) Апи minecraft (и mojang) имеет некоторые ограничения не количество запросов. Есть смысл использовать прокси и параллельно несколько аккаунтов.
    2) При первых использованиях хоста (или прокси) будут вылетать контрольные вопросы. Лично я с этим пока не заморачивался, проходил проверку вручную, ибо тестировал плагин только на локалке.
    3) При заходе из совсем уж подозрительных мест аккаунт могут и вовсе заблокировать. У меня такое произошло, когда попытался запустить плагин из Франции на Linux, хотя всегда входил из России с Windows.

    Желаю удачи. В общем-то, больше ничего и не остаётся. Штука приличной костыльности и сложности.
     
  4. slavik123123123

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

    Баллы:
    143
    Имя в Minecraft:
    Leymooooooooooo
    Так делает ChangeSkin
     
  5. Dymeth

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

    Баллы:
    76
    Опаньки, здорово! Пойду позаимствую код...

    UPD: Позаимствовал. Оказывается, система minecraft.net полностью изменилась. Теперь можно производить действия с аккаунтом при помощи обычных http-запросов, имея лишь токен. Ну, либо так и раньше было, только я об этом не знал и делал всё через одно место: файл сначала качал на свой сервер, а потом уже с него на minecraft.net.
     
    Последнее редактирование: 16 авг 2016
  6. Автор темы
    maxim0098

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

    Баллы:
    66
    Имя в Minecraft:
    _Nevad_
    Я так понял твой метод направлен только на игроков с лицензией? Просто я собирался пилить это на свой пиратский сервак, ибо смысл делать такую функцию для тех, кто и так может свободно менять скин.[DOUBLEPOST=1471328910,1471327774][/DOUBLEPOST]Была идея делать запрос на указанный url, если по указанному пути есть png файл, то копировать его в отдельную папку на сервере с именем равным uuid игрока, сделавшим запрос. А далее уже используя скинресторер доставать этот файл и присваивать его игроку с одноименным uuid. Такая идея вообще реализуема?
     
  7. Dymeth

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

    Баллы:
    76
    Без лицензионного minecrft ты никак не установишь собственный скин картинкой. Я ж не предлагаю использовать аккаунты игроков. Они могут быть и пиратами. А вот тебе придётся купить как минимум одного "подопытного", на котором и будут постоянно меняться скины. А в идеале несколько аккаунтов + несколько прокси. Это позволит избегать лимитов запросов к серверам minecraft. Но, опять же, я не в теме ограничений новой версии сайта (апи) minecraft.net. Поищи официальную информацию.
    По поводу СкинРесторера я уже сказал. В нём нет такой возможности. Он не работает с файлами вообще, максимум устанавливает "чужие" скины.
    Тебе, вон, Славик скинул плагин, в котором производится авторизация аккаунтов и загрузка скинов. Можешь код оттуда вытащить, благо даже гитхаб есть. Если там и апи есть (я не интересовался), используй его.
    Говорю же, я так раньше делал. Сейчас появилась возможность загружать скины на minecraft.net напрямую по URL. Вот только есть вероятность, что аккаунты начнут блокировать за большое количество "кривых" скинов - мол, сервера майнкрафта попросту нагружаешь, баднюган. Есть смысл проверить. Если действительно подозрения возникнут, и вправду придётся картинки через свой сервер пропускать. В ином случае, если всё в порядке, это делать совершенно не обязательно.
     
  8. slavik123123123

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

    Баллы:
    143
    Имя в Minecraft:
    Leymooooooooooo
    В том плагине вроде есть проверка на кривые скины.
     
  9. Автор темы
    maxim0098

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

    Баллы:
    66
    Имя в Minecraft:
    _Nevad_
    Ясно, спасибо за помощь. Пойду пожалуй читать кучу документаций по майновскому апи.
     
Статус темы:
Закрыта.

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