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

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());
Все проверочные сообщения в консоль отрабатывают, ошибок нет, но инвентарь не открывается.
Ради интереса пробовал дублировать и открывать инвентарь игрока, он открывается без проблем, а этот, новый никак не хочет, что я делаю неправильно, подскажите?
 
Удивительно, с другим типом инвентаря всё норм, а так - нет
Код:
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};
 
Последнее редактирование:
Удивительно, с другим типом инвентаря всё норм, а так - нет
Код:
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};

Угу, вот и я о том, что другие инвентари открываются, а торговый нет :(
 
Последнее редактирование:
Тсс, это секретная фраза.
Хочу еще спросить, как бы вы посоветовали сохранять торговые наборы в БД, вот у меня класс, слизан с вашего:
Код:
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амое странное, что подобные способы преобразования других классов и коллекций классов, я использую много раз, там все нормально, а вот именно в этом случае чего то не хочет работать :(
 
Последнее редактирование:
И не будет работать, там же все за абстракциями.
 
Хочу еще спросить, как бы вы посоветовали сохранять торговые наборы в БД, вот у меня класс, слизан с вашего:
Код:
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амое странное, что подобные способы преобразования других классов и коллекций классов, я использую много раз, там все нормально, а вот именно в этом случае чего то не хочет работать :(
а зачем это жсоном в базу пихать?
 
Я к SQLite как то привык, с мускулом никогда не работал, он сохранит объект как есть, без каких либо преобразований?
Нет, он за абстракцией, ток ручками. У стака даже yml серилизатор не полный, хотя уже лучше в 1.13, начал понимать атрибуты. Но тег головы со скином все еще не знает и тег инструентов для приключения .
 
Сделал я так,
класс предмета:
Код:
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, в переменную и базу они передаются нормально, а в обратном преобразовании теряются.

Запись в базу проходит нормально, вот как этот объект там выглядит:
[{"item1":{"type":"IRON_NUGGET","data":{"type":452,"data":0},"lore":[],"displayName":"§3Серебряный §e§lТалер","enchantment":{"Enchantment[34, DURABILITY]":10},"amount":51},"rewardItem":{"type":"GOLD_NUGGET","data":{"type":371,"data":0},"lore":[],"displayName":"§6Золотой §e§lТалер","enchantment":{"Enchantment[34, DURABILITY]":10},"amount":1}}]
Вот метод преобразования строки в объект:
Код:
    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);
Подскажите где я напартачил?
 
Последнее редактирование:
Вот на.
Код:
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);
    }
}
 
Спасибо большое! Немного изменил и все работает идеально!))
Нет, еще не совсем идеально, нужно еще различать предметы по 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
}}]
 
Назад
Верх