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

Помогите Работа с торговым инвентарем

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

  1. Автор темы
    Korvinius

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

    Баллы:
    88
    Здравствуйте, пытаюсь создать торговый инвентарь, но он почему то не хочет открываться, вот тестовый код:
    Код:
            Bukkit.getServer().getLogger().info("market - 3");
            String name = "Торговец";
            Inventory i = Bukkit.getServer().createInventory(null, InventoryType.MERCHANT, name);
            ItemStack i1 = new ItemStack(Material.APPLE);
            i1.setAmount(10);
            ItemStack i2 = new ItemStack(Material.BONE);
            i2.setAmount(2);
            ItemStack i3 = new ItemStack(Material.DIAMOND_AXE);
            i3.setAmount(1);
            Bukkit.getServer().getLogger().info("market - 4 "+i.getType());
            ItemStack[] recipe = new ItemStack[3];
            recipe[0] = i1;
            recipe[1] = i2;
            recipe[2] = i3;
            i.setContents(recipe);
            Bukkit.getServer().getLogger().info("market - 5 "+i.getName());
            player.openInventory(i);
            Bukkit.getServer().getLogger().info("market - 7 "+i.getTitle());
    Все проверочные сообщения в консоль отрабатывают, ошибок нет, но инвентарь не открывается.
    Ради интереса пробовал дублировать и открывать инвентарь игрока, он открывается без проблем, а этот, новый никак не хочет, что я делаю неправильно, подскажите?
     
  2. lamovski

    lamovski Участник

    Баллы:
    31
    Имя в Minecraft:
    lamovski
    Удивительно, с другим типом инвентаря всё норм, а так - нет
    Код:
     
    String name = "Торговец";
    Inventory i = Bukkit.getServer().createInventory(null, InventoryType.DROPPER, name);
    ItemStack i1 = new ItemStack(Material.APPLE, 10);
    ItemStack i2 = new ItemStack(Material.BONE, 2);
    ItemStack i3 = new ItemStack(Material.DIAMOND_AXE, 1);
    Bukkit.getServer().getLogger().info("market - 4 "+i.getSize());
    ItemStack[] recipe = new ItemStack[] {i1, i2, i3};
    i.setContents(recipe);
    Bukkit.getServer().getLogger().info("market - 5 "+i.getName());
    player.openInventory(i);
    Bukkit.getServer().getLogger().info("market - 7 "+i.getTitle());
    P. S. почему так много сложностей?
    Вместо setAmount() число можно прописать при инициализации
    Код:
    ItemStack i1 = new ItemStack(Material.APPLE, 10);
    При инициализации массива можно сразу прописать содержимое
    Код:
    ItemStack[] recipe = new ItemStack[]{i1, i2, i3};
     
    Последнее редактирование: 26 мар 2019
  3. Автор темы
    Korvinius

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

    Баллы:
    88
    Угу, вот и я о том, что другие инвентари открываются, а торговый нет :(
     
  4. alexandrage

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

    Баллы:
    173
  5. hyndorik

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

    Баллы:
    98
    Имя в Minecraft:
    hyndo
    А ооп где?
     
  6. alexandrage

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

    Баллы:
    173
    Тсс, это секретная фраза.
     
  7. Автор темы
    Korvinius

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

    Баллы:
    88
    Последнее редактирование: 2 апр 2019
  8. Автор темы
    Korvinius

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

    Баллы:
    88
    Хочу еще спросить, как бы вы посоветовали сохранять торговые наборы в БД, вот у меня класс, слизан с вашего:
    Код:
    public class Trade {
    
        private ItemStack item1;
        private ItemStack item2;
        private ItemStack rewardItem;
    
        public Trade(ItemStack item1, ItemStack item2, ItemStack rewardItem) {
            this.item1 = item1;
            this.item2 = item2;
            this.rewardItem = rewardItem;
        }
    
        public Trade(ItemStack item1, ItemStack rewardItem) {
            this.item1 = item1;
            this.rewardItem = rewardItem;
        }
    
    
        public boolean hasItem2() {
            return this.item2 != null;
        }
    
        public ItemStack getItem1() {
            return this.item1;
        }
    
        public ItemStack getItem2() {
            return this.item2;
        }
    
        public ItemStack getRewardItem() {
            return this.rewardItem;
        }
    
        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + ((rewardItem == null) ? 0 : rewardItem.hashCode());
            return result;
        }
    
        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            Trade other = (Trade) obj;
            if (rewardItem == null) {
                if (other.rewardItem != null)
                    return false;
            } else if (!rewardItem.equals(other.rewardItem))
                return false;
            return true;
        }
    
        @Override
        public String toString() {
            return "Trade [item1=" + item1 + ", item2=" + item2 + ", rewardItem=" + rewardItem + "]";
        }
    
     
    }
    Я для сохранения торгового набора в БД, пытаюсь их преобразовать в строку Json:
    Код:
        public String stringTrades(List<Trade> trs) {
            if (trs==null || trs.isEmpty()) return "";
            Gson gson = new GsonBuilder()
                    .setPrettyPrinting()
                    .create();
            String json = gson.toJson(trs);
            return json;
        }
    И у меня куча ошибок именно в процессе преобразования, на этой строке: String json = gson.toJson(trs);
    Пробовал самые разные способы, даже создавал класс Сериализации, всегда одно и то же:
    [02:18:59] [Server thread/INFO]: Korvinius issued server command: /my addtrade Storm
    [02:18:59] [Server thread/INFO]: + 1
    [02:18:59] [Server thread/INFO]: + 2
    [02:18:59] [Server thread/INFO]: + 3
    [02:18:59] [Server thread/INFO]: + 4
    [02:18:59] [Server thread/INFO]: + 5
    [02:18:59] [Server thread/INFO]: + 6
    [02:18:59] [Server thread/ERROR]: null
    org.bukkit.command.CommandException: Unhandled exception executing command 'my' in plugin Mystery v0.7.5.7
    at org.bukkit.command.PluginCommand.execute(PluginCommand.java:46) ~[middle12.jar:git-Spigot-eb3d921-2b93d83]
    at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:141) ~[middle12.jar:git-Spigot-eb3d921-2b93d83]
    at org.bukkit.craftbukkit.v1_12_R1.CraftServer.dispatchCommand(CraftServer.java:648) ~[middle12.jar:git-Spigot-eb3d921-2b93d83]
    at net.minecraft.server.v1_12_R1.PlayerConnection.handleCommand(PlayerConnection.java:1397) [middle12.jar:git-Spigot-eb3d921-2b93d83]
    at net.minecraft.server.v1_12_R1.PlayerConnection.a(PlayerConnection.java:1232) [middle12.jar:git-Spigot-eb3d921-2b93d83]
    at net.minecraft.server.v1_12_R1.PacketPlayInChat.a(PacketPlayInChat.java:45) [middle12.jar:git-Spigot-eb3d921-2b93d83]
    at net.minecraft.server.v1_12_R1.PacketPlayInChat.a(PacketPlayInChat.java:1) [middle12.jar:git-Spigot-eb3d921-2b93d83]
    at net.minecraft.server.v1_12_R1.PlayerConnectionUtils$1.run(SourceFile:13) [middle12.jar:git-Spigot-eb3d921-2b93d83]
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_151]
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:1.8.0_151]
    at net.minecraft.server.v1_12_R1.SystemUtils.a(SourceFile:46) [middle12.jar:git-Spigot-eb3d921-2b93d83]
    at net.minecraft.server.v1_12_R1.MinecraftServer.D(MinecraftServer.java:748) [middle12.jar:git-Spigot-eb3d921-2b93d83]
    at net.minecraft.server.v1_12_R1.DedicatedServer.D(DedicatedServer.java:406) [middle12.jar:git-Spigot-eb3d921-2b93d83]
    at net.minecraft.server.v1_12_R1.MinecraftServer.C(MinecraftServer.java:679) [middle12.jar:git-Spigot-eb3d921-2b93d83]
    at net.minecraft.server.v1_12_R1.MinecraftServer.run(MinecraftServer.java:577) [middle12.jar:git-Spigot-eb3d921-2b93d83]
    at java.lang.Thread.run(Thread.java:748) [?:1.8.0_151]
    Caused by: java.lang.StackOverflowError
    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:383) ~[middle12.jar:git-Spigot-eb3d921-2b93d83]
    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:378) ~[middle12.jar:git-Spigot-eb3d921-2b93d83]
    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:383) ~[middle12.jar:git-Spigot-eb3d921-2b93d83]
    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:378) ~[middle12.jar:git-Spigot-eb3d921-2b93d83]
    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:383) ~[middle12.jar:git-Spigot-eb3d921-2b93d83]
    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:378) ~[middle12.jar:git-Spigot-eb3d921-2b93d83]
    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:383) ~[middle12.jar:git-Spigot-eb3d921-2b93d83]
    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:378) ~[middle12.jar:git-Spigot-eb3d921-2b93d83]
    at com.google

    Здесь очень много точно такого же .....
    потом


    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:383) ~[middle12.jar:git-Spigot-eb3d921-2b93d83]
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:158) ~[middle12.jar:git-Spigot-eb3d921-2b93d83]
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:100) ~[middle12.jar:git-Spigot-eb3d921-2b93d83]
    at com.google.gson.Gson.getAdapter(Gson.java:423) ~[middle12.jar:git-Spigot-eb3d921-2b93d83]
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:115) ~[middle12.jar:git-Spigot-eb3d921-2b93d83]
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:164) ~[middle12.jar:git-Spigot-eb3d921-2b93d83]
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:100) ~[middle12.jar:git-Spigot-eb3d921-2b93d83]
    at com.google.gson.Gson.getAdapter(Gson.java:423) ~[middle12.jar:git-Spigot-eb3d921-2b93d83]
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:115) ~[middle12.jar:git-Spigot-eb3d921-2b93d83]
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:164) ~[middle12.jar:git-Spigot-eb3d921-2b93d83]
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:100) ~[middle12.jar:git-Spigot-eb3d921-2b93d83]
    at com.google.gson.Gson.getAdapter(Gson.java:423) ~[middle12.jar:git-Spigot-eb3d921-2b93d83]
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:115) ~[middle12.jar:git-Spigot-eb3d921-2b93d83]
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:164) ~[middle12.jar:git-Spigot-eb3d921-2b93d83]
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:100) ~[middle12.jar:git-Spigot-eb3d921-2b93d83]
    at com.google.gson.Gson.getAdapter(Gson.java:423) ~[middle12.jar:git-Spigot-eb3d921-2b93d83]
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:115) ~[middle12.jar:git-Spigot-eb3d921-2b93d83]
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:164) ~[middle12.jar:git-Spigot-eb3d921-2b93d83]
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:100) ~[middle12.jar:git-Spigot-eb3d921-2b93d83]
    at com.google.gson.Gson.getAdapter(Gson.java:423) ~[middle12.jar:git-Spigot-eb3d921-2b93d83]
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:115) ~[middle12.jar:git-Spigot-eb3d921-2b93d83]
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:164) ~[middle12.jar:git-Spigot-eb3d921-2b93d83]
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:100) ~[middle12.jar:git-Spigot-eb3d921-2b93d83]
    at com.google.gson.Gson.getAdapter(Gson.java:423) ~[middle12.jar:git-Spigot-eb3d921-2b93d83]
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:115) ~[middle12.jar:git-Spigot-eb3d921-2b93d83]
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:164) ~[middle12.jar:git-Spigot-eb3d921-2b93d83]
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:100) ~[middle12.jar:git-Spigot-eb3d921-2b93d83]

    такого тоже очень много...

    Может я что то делаю не правильно или есть другой способ преобразовать набор торгов в строку, для сохранение в бд SQLite

    Cамое странное, что подобные способы преобразования других классов и коллекций классов, я использую много раз, там все нормально, а вот именно в этом случае чего то не хочет работать :(
     
    Последнее редактирование: 2 апр 2019
  9. alexandrage

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

    Баллы:
    173
    И не будет работать, там же все за абстракциями.
     
  10. Автор темы
    Korvinius

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

    Баллы:
    88
    Как же мне их сохранить? Может попробовать создать свой класс на подобии ItemStack, только немного попроще?
     
  11. alexandrage

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

    Баллы:
    173
    Ага.
     
  12. hyndorik

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

    Баллы:
    98
    Имя в Minecraft:
    hyndo
    а зачем это жсоном в базу пихать?
     
  13. Автор темы
    Korvinius

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

    Баллы:
    88
    А где же его хранить?
     
  14. hyndorik

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

    Баллы:
    98
    Имя в Minecraft:
    hyndo
    В мускуле, но человеческими средствами
     
  15. Автор темы
    Korvinius

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

    Баллы:
    88
    Я к SQLite как то привык, с мускулом никогда не работал, он сохранит объект как есть, без каких либо преобразований?
     
  16. alexandrage

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

    Баллы:
    173
    Нет, он за абстракцией, ток ручками. У стака даже yml серилизатор не полный, хотя уже лучше в 1.13, начал понимать атрибуты. Но тег головы со скином все еще не знает и тег инструентов для приключения .
     
  17. Автор темы
    Korvinius

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

    Баллы:
    88
    Сделал я так,
    класс предмета:
    Код:
    public class MyItem {
    
        private Material type;
        private MaterialData data;
        private List<String> lore = new ArrayList<>();
        private String displayName;
        private Map<Enchantment, Integer> enchantment = new HashMap<>();
        private int amount;
     
        public MyItem(Material type, int amount) {
            super();
            this.type = type;
            this.amount = amount;
        }
    
        public MyItem(Material type, MaterialData data, List<String> lore, String displayName,
                Map<Enchantment, Integer> enchantment, int amount) {
            super();
            this.type = type;
            this.data = data;
            this.lore = lore;
            this.displayName = displayName;
            this.enchantment = enchantment;
            this.amount = amount;
        }
    
        public Material getType() {
            return type;
        }
        public void setType(Material type) {
            this.type = type;
        }
        public MaterialData getData() {
            return data;
        }
        public void setData(MaterialData data) {
            this.data = data;
        }
        public int getAmount() {
            return amount;
        }
        public void setAmount(int amount) {
            this.amount = amount;
        }
        public Map<Enchantment, Integer> getEnchantments() {
            return enchantment;
        }
        public void setEnchantments(Map<Enchantment, Integer> ench) {
            this.enchantment = ench;
        }
        public List<String> getLore() {
            return lore;
        }
        public void setLore(List<String> lore) {
            this.lore = lore;
        }
        public String getDisplayName() {
            return displayName;
        }
        public void setDisplayName(String displayName) {
            this.displayName = displayName;
        }
    
        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + amount;
            result = prime * result + ((data == null) ? 0 : data.hashCode());
            result = prime * result + ((displayName == null) ? 0 : displayName.hashCode());
            result = prime * result + ((enchantment == null) ? 0 : enchantment.hashCode());
            result = prime * result + ((lore == null) ? 0 : lore.hashCode());
            result = prime * result + ((type == null) ? 0 : type.hashCode());
            return result;
        }
    
        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            MyItem other = (MyItem) obj;
            if (amount != other.amount)
                return false;
            if (data == null) {
                if (other.data != null)
                    return false;
            } else if (!data.equals(other.data))
                return false;
            if (displayName == null) {
                if (other.displayName != null)
                    return false;
            } else if (!displayName.equals(other.displayName))
                return false;
            if (enchantment == null) {
                if (other.enchantment != null)
                    return false;
            } else if (!enchantment.equals(other.enchantment))
                return false;
            if (lore == null) {
                if (other.lore != null)
                    return false;
            } else if (!lore.equals(other.lore))
                return false;
            if (type != other.type)
                return false;
            return true;
        }
    
        @Override
        public String toString() {
            return "MyItem [type=" + type + ", data=" + data + ", lore=" + lore + ", displayName=" + displayName
                    + ", enchantment=" + enchantment + ", amount=" + amount + "]";
        }
    
    }
    Метод преобразования:
    Код:
        public static MyItem getItemStack(ItemStack i) {
            MyItem item = new MyItem(i.getType(), i.getAmount());
            if (i.getData() != null) item.setData(i.getData());
            if (i.hasItemMeta()) {
                if (i.getItemMeta().getDisplayName()!=null)
                    item.setDisplayName(i.getItemMeta().getDisplayName());
                if (i.getItemMeta().getLore() != null && !i.getItemMeta().getLore().isEmpty())
                    item.setLore(i.getItemMeta().getLore());
            }
            if (!i.getEnchantments().isEmpty()) item.setEnchantments(i.getEnchantments());
            return item;
        }
    Метод обратного преобразования:
    Код:
        public static ItemStack getItem(MyItem i) {
            ItemStack item = new ItemStack(i.getType(), i.getAmount());
            if (i.getData() != null) item.setData(i.getData());
            if (i.getDisplayName() != null)
                item.getItemMeta().setDisplayName(i.getDisplayName());
            if (i.getLore() != null && !i.getLore().isEmpty())
                item.getItemMeta().setLore(i.getLore());
            if (i.getEnchantments() != null && !i.getEnchantments().isEmpty()) {
                for(Entry<Enchantment, Integer> entry : i.getEnchantments().entrySet()) {
                    item.addUnsafeEnchantment(entry.getKey(), entry.getValue());
                }
            }
            return item;
        }
    Первое, что меня смущает, это обратное преобразование, походу я неправильно сделал с ItemMeta так как в предметях с DisplayName и Lore, в переменную и базу они передаются нормально, а в обратном преобразовании теряются.

    Запись в базу проходит нормально, вот как этот объект там выглядит:
    Вот метод преобразования строки в объект:
    Код:
        public List<Trade> getTrades(String str) {
            List<Trade> trs = new ArrayList<>();
            if (isStringNull(str)) return trs;
            Trade[] mcArray = new Gson().fromJson(str, Trade[].class);
            trs = new ArrayList<>(Arrays.asList(mcArray));
            return trs;
        }
    И второе, здесь, опять вылазит ошибка, по идее там еще что то с получением зачарований в объект Trade из строки Json у меня не правильно:
    [02:24:51] [Server thread/INFO]: [Mystery] Enabling Mystery v0.7.5.7
    [02:24:51] [Server thread/ERROR]: Error occurred while enabling Mystery v0.7.5.7 (Is it up to date?)
    java.lang.RuntimeException: Unable to invoke no-args constructor for class org.bukkit.enchantments.Enchantment. Register an InstanceCreator with Gson for this type may fix this problem.
    at com.google.gson.internal.ConstructorConstructor$14.construct(ConstructorConstructor.java:226) ~[middle12.jar:git-Spigot-eb3d921-2b93d83]
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:210) ~[middle12.jar:git-Spigot-eb3d921-2b93d83]
    at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:41) ~[middle12.jar:git-Spigot-eb3d921-2b93d83]
    at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.read(MapTypeAdapterFactory.java:186) ~[middle12.jar:git-Spigot-eb3d921-2b93d83]
    at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.read(MapTypeAdapterFactory.java:145) ~[middle12.jar:git-Spigot-eb3d921-2b93d83]
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:129) ~[middle12.jar:git-Spigot-eb3d921-2b93d83]
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:220) ~[middle12.jar:git-Spigot-eb3d921-2b93d83]
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:129) ~[middle12.jar:git-Spigot-eb3d921-2b93d83]
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:220) ~[middle12.jar:git-Spigot-eb3d921-2b93d83]
    at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:41) ~[middle12.jar:git-Spigot-eb3d921-2b93d83]
    at com.google.gson.internal.bind.ArrayTypeAdapter.read(ArrayTypeAdapter.java:72) ~[middle12.jar:git-Spigot-eb3d921-2b93d83]
    at com.google.gson.Gson.fromJson(Gson.java:887) ~[middle12.jar:git-Spigot-eb3d921-2b93d83]
    at com.google.gson.Gson.fromJson(Gson.java:852) ~[middle12.jar:git-Spigot-eb3d921-2b93d83]
    at com.google.gson.Gson.fromJson(Gson.java:801) ~[middle12.jar:git-Spigot-eb3d921-2b93d83]
    at com.google.gson.Gson.fromJson(Gson.java:773) ~[middle12.jar:git-Spigot-eb3d921-2b93d83]
    at net.wealth_mc.mystery.db.MyTradeSQLite.getTrades(MyTradeSQLite.java:115) ~[?:?]
    at net.wealth_mc.mystery.db.MyTradeSQLite.getTradesmansDB(MyTradeSQLite.java:59) ~[?:?]
    at net.wealth_mc.mystery.eco.TradesWork.getTradesmanDB(TradesWork.java:209) ~[?:?]
    at net.wealth_mc.mystery.Mystery.loadConfMystery(Mystery.java:250) ~[?:?]
    at net.wealth_mc.mystery.Mystery.onEnable(Mystery.java:160) ~[?:?]
    at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:264) ~[middle12.jar:git-Spigot-eb3d921-2b93d83]
    at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:337) [middle12.jar:git-Spigot-eb3d921-2b93d83]
    at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:403) [middle12.jar:git-Spigot-eb3d921-2b93d83]
    at org.bukkit.craftbukkit.v1_12_R1.CraftServer.enablePlugin(CraftServer.java:381) [middle12.jar:git-Spigot-eb3d921-2b93d83]
    at org.bukkit.craftbukkit.v1_12_R1.CraftServer.enablePlugins(CraftServer.java:330) [middle12.jar:git-Spigot-eb3d921-2b93d83]
    at net.minecraft.server.v1_12_R1.MinecraftServer.t(MinecraftServer.java:422) [middle12.jar:git-Spigot-eb3d921-2b93d83]
    at net.minecraft.server.v1_12_R1.MinecraftServer.l(MinecraftServer.java:383) [middle12.jar:git-Spigot-eb3d921-2b93d83]
    at net.minecraft.server.v1_12_R1.MinecraftServer.a(MinecraftServer.java:338) [middle12.jar:git-Spigot-eb3d921-2b93d83]
    at net.minecraft.server.v1_12_R1.DedicatedServer.init(DedicatedServer.java:272) [middle12.jar:git-Spigot-eb3d921-2b93d83]
    at net.minecraft.server.v1_12_R1.MinecraftServer.run(MinecraftServer.java:545) [middle12.jar:git-Spigot-eb3d921-2b93d83]
    at java.lang.Thread.run(Thread.java:748) [?:1.8.0_151]
    Caused by: java.lang.UnsupportedOperationException: Abstract class can't be instantiated! Class name: org.bukkit.enchantments.Enchantment
    at com.google.gson.internal.UnsafeAllocator.assertInstantiable(UnsafeAllocator.java:120) ~[middle12.jar:git-Spigot-eb3d921-2b93d83]
    at com.google.gson.internal.UnsafeAllocator.access$000(UnsafeAllocator.java:31) ~[middle12.jar:git-Spigot-eb3d921-2b93d83]
    at com.google.gson.internal.UnsafeAllocator$1.newInstance(UnsafeAllocator.java:49) ~[middle12.jar:git-Spigot-eb3d921-2b93d83]
    at com.google.gson.internal.ConstructorConstructor$14.construct(ConstructorConstructor.java:223) ~[middle12.jar:git-Spigot-eb3d921-2b93d83]
    ... 30 more
    ругается на эту строку кода: Trade[] mcArray = new Gson().fromJson(str, Trade[].class);
    Подскажите где я напартачил?
     
    Последнее редактирование: 3 апр 2019
  18. alexandrage

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

    Баллы:
    173
    Вот на.
    Код:
    package Example;
    
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.Map.Entry;
    
    import org.bukkit.Material;
    import org.bukkit.NamespacedKey;
    import org.bukkit.enchantments.Enchantment;
    import org.*********ventory.ItemStack;
    import org.*********ventory.meta.Damageable;
    import org.*********ventory.meta.ItemMeta;
    
    import com.google.gson.Gson;
    import com.google.gson.GsonBuilder;
    
    public class Stack {
        private String material;
        private Integer durability;
        private List<String> lore;
        private String displayName;
        private Map<String, Integer> enchantment;
        private int amount;
    
        public Stack(ItemStack stack) {
            this.material = stack.getType().name();
            ItemMeta meta = stack.getItemMeta();
            if (meta instanceof Damageable) {
                this.durability = ((Damageable) meta).getDamage();
            }
            if (meta.hasLore()) {
                this.lore = meta.getLore();
            }
            if (meta.hasDisplayName()) {
                this.displayName = meta.getDisplayName();
            }
            if (meta.hasEnchants()) {
                this.enchantment = new HashMap<String, Integer>();
                for(Entry<Enchantment, Integer> ench : meta.getEnchants().entrySet()) {
                    this.enchantment.put(ench.getKey().getKey().getKey(), ench.getValue());
                }
            }
            this.amount = stack.getAmount();
        }
    
        public ItemStack getStack() {
            ItemStack stack = new ItemStack(Material.getMaterial(this.material));
            ItemMeta meta = stack.getItemMeta();
            if (this.durability != null) {
                if (meta instanceof Damageable) {
                    ((Damageable) meta).setDamage(durability);
                }
            }
    
            if (this.lore != null) {
                meta.setLore(this.lore);
            }
    
            if (this.displayName != null) {
                meta.setDisplayName(this.displayName);
            }
    
            if (this.enchantment != null) {
                for (Entry<String, Integer> ench : this.enchantment.entrySet()) {
                    meta.addEnchant(Enchantment.getByKey(NamespacedKey.minecraft(ench.getKey())), ench.getValue(), true);
                }
            }
    
            stack.setAmount(this.amount);
            stack.setItemMeta(meta);
            return stack;
        }
    
        @Override
        public String toString() {
            Gson gson = new GsonBuilder().setPrettyPrinting().create();
            return gson.toJson(this);
        }
    }
     
  19. Автор темы
    Korvinius

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

    Баллы:
    88
    Спасибо большое! Немного изменил и все работает идеально!))
     
    Последнее редактирование: 4 апр 2019
  20. Автор темы
    Korvinius

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

    Баллы:
    88
    Нет, еще не совсем идеально, нужно еще различать предметы по MaterialData, сделал так:
    Код:
    public class MyItem {
        private String material;
        private MaterialData data;
        private List<String> lore;
        private String displayName;
        private Map<String, Integer> enchantment;
        private int amount;
    
        public MyItem(ItemStack stack) {
            this.material = stack.getType().name();
            this.data = stack.getData();
            ItemMeta meta = stack.getItemMeta();
            if (meta.hasLore()) {
                this.lore = meta.getLore();
            }
            if (meta.hasDisplayName()) {
                this.displayName = meta.getDisplayName();
            }
            if (meta.hasEnchants()) {
                this.enchantment = new HashMap<String, Integer>();
                for(Entry<Enchantment, Integer> ench : meta.getEnchants().entrySet()) {
                    this.enchantment.put(ench.getKey().getName(), ench.getValue());
                }
            }
            this.amount = stack.getAmount();
        }
    
        public ItemStack getStack() {
            ItemStack stack = new ItemStack(Material.getMaterial(this.material));
            ItemMeta meta = stack.getItemMeta();
    
            if (this.lore != null) {
                meta.setLore(this.lore);
            }
    
            if (this.displayName != null) {
                meta.setDisplayName(this.displayName);
            }
    
            if (this.enchantment != null) {
                for (Entry<String, Integer> ench : this.enchantment.entrySet()) {
                    meta.addEnchant(Enchantment.getByName(ench.getKey()), ench.getValue(), true);
                }
            }
    
            stack.setData(this.data);
            stack.setAmount(this.amount);
            stack.setItemMeta(meta);
            return stack;
        }
    
        public String getMaterial() {
            return material;
        }
    
        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + amount;
            result = prime * result + ((data == null) ? 0 : data.hashCode());
            result = prime * result + ((displayName == null) ? 0 : displayName.hashCode());
            result = prime * result + ((enchantment == null) ? 0 : enchantment.hashCode());
            result = prime * result + ((lore == null) ? 0 : lore.hashCode());
            result = prime * result + ((material == null) ? 0 : material.hashCode());
            return result;
        }
    
        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            MyItem other = (MyItem) obj;
            if (amount != other.amount)
                return false;
            if (data == null) {
                if (other.data != null)
                    return false;
            } else if (!data.equals(other.data))
                return false;
            if (displayName == null) {
                if (other.displayName != null)
                    return false;
            } else if (!displayName.equals(other.displayName))
                return false;
            if (enchantment == null) {
                if (other.enchantment != null)
                    return false;
            } else if (!enchantment.equals(other.enchantment))
                return false;
            if (lore == null) {
                if (other.lore != null)
                    return false;
            } else if (!lore.equals(other.lore))
                return false;
            if (material == null) {
                if (other.material != null)
                    return false;
            } else if (!material.equals(other.material))
                return false;
            return true;
        }
    
        @Override
        public String toString() {
            Gson gson = new GsonBuilder().setPrettyPrinting().create();
            return gson.toJson(this);
        }
    }
    
    MaterialData, в базу передается, а обратно в ItemStack нет, значит я опять это делаю неправильно :( вот как записывается в бд:
    Код:
    [{"item1":{
      "material": "COBBLESTONE",
      "data": {
        "type": 4,
        "data": 0
      },
      "amount": 1
    },"item2":{
      "material": "STONE",
      "data": {
        "type": 1,
        "data": 1
      },
      "amount": 1
    },"rewardItem":{
      "material": "STONE",
      "data": {
        "type": 1,
        "data": 3
      },
      "amount": 1
    }}]
     

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