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

Нет, еще не совсем идеально, нужно еще различать предметы по 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
}}]
В методах equals и hashCode можно использовать EqualsBuilder HashCodeBuilder из apache commons lang3.
 
Да просто гетер сетер на durability
Стер, потому, что Damageable в meta, в версии 1.12.2 нет, да и прочность мне не нужна, мне нужно именно MaterialData, а вот запихать ее из своего класса обратно в ItemStack не получается.
 
В методах equals и hashCode можно использовать EqualsBuilder HashCodeBuilder из apache commons lang3.
Суть не в проверках, с этим все нормально, с сравнением как раз проблем нет, проблема в этом:
мне нужно именно MaterialData, а вот запихать ее из своего класса обратно в ItemStack не получается.
 
Хотя в пепер апи вроде можно без фейк жителя делать.
 
Хотя в пепер апи вроде можно без фейк жителя делать.
В этом куске кода:

Код:
    public void addTrade(Villager villager, ItemStack stack1, ItemStack stack2, ItemStack stack3, int maxUses) {
        List<MerchantRecipe> recs = villager.getRecipes();
        if (stack2 != null) {
            MerchantRecipe rec = new MerchantRecipe(stack1, maxUses);
            rec.addIngredient(stack2);
            rec.addIngredient(stack3);
            recs.add(rec);
        } else {
            MerchantRecipe rec = new MerchantRecipe(stack1, maxUses);
            rec.addIngredient(stack2);
            recs.add(rec);
        }
        villager.setRecipes(recs);
    }
ругалось на строку: "recs.add(rec);", заменил это: "List<MerchantRecipe> recs = villager.getRecipes();" на "List<MerchantRecipe> recs = new ArrayList<>();", все стало работать. Спасибо.

Но все равно не совсем понятен новый инвентарь, похоже там добавилось что-то на подобии прокачки торговца, знать бы как это все стразу на максимум поставить... Вернее, где установить уровень и опыт понятно, где можно узнать какие они максимально возможные?
 
Последнее редактирование:
Нашел, максимальный уровень торговца 5.
 
"List<MerchantRecipe> recs = new ArrayList<>();", все стало работать
Но, этот вариант подходит только если у торговца один рецепт.
Попробовал такой вариант:
Код:
        List<MerchantRecipe> recs = villager.getRecipes();
        if (recs == null || recs.isEmpty()) recs = new ArrayList<>();
Он не помогает, аналогичная ошибка, ругается на "recs.add(rec);" следующим образом:

Код:
org.bukkit.event.EventException: null
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:319) ~[middle16.jar:git-Spigot-ff439d1-24c79a1]
        at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:70) ~[middle16.jar:git-Spigot-ff439d1-24c79a1]
        at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:589) ~[middle16.jar:git-Spigot-ff439d1-24c79a1]
        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:576) ~[middle16.jar:git-Spigot-ff439d1-24c79a1]
        at net.minecraft.server.v1_16_R3.PlayerConnection.a(PlayerConnection.java:1956) ~[middle16.jar:git-Spigot-ff439d1-24c79a1]
        at net.minecraft.server.v1_16_R3.PacketPlayInUseEntity.a(SourceFile:74) ~[middle16.jar:git-Spigot-ff439d1-24c79a1]
        at net.minecraft.server.v1_16_R3.PacketPlayInUseEntity.a(SourceFile:13) ~[middle16.jar:git-Spigot-ff439d1-24c79a1]
        at net.minecraft.server.v1_16_R3.PlayerConnectionUtils.lambda$0(PlayerConnectionUtils.java:19) ~[middle16.jar:git-Spigot-ff439d1-24c79a1]
        at net.minecraft.server.v1_16_R3.TickTask.run(SourceFile:18) ~[middle16.jar:git-Spigot-ff439d1-24c79a1]
        at net.minecraft.server.v1_16_R3.IAsyncTaskHandler.executeTask(SourceFile:144) ~[middle16.jar:git-Spigot-ff439d1-24c79a1]
        at net.minecraft.server.v1_16_R3.IAsyncTaskHandlerReentrant.executeTask(SourceFile:23) ~[middle16.jar:git-Spigot-ff439d1-24c79a1]
        at net.minecraft.server.v1_16_R3.IAsyncTaskHandler.executeNext(SourceFile:118) ~[middle16.jar:git-Spigot-ff439d1-24c79a1]
        at net.minecraft.server.v1_16_R3.MinecraftServer.bb(MinecraftServer.java:942) ~[middle16.jar:git-Spigot-ff439d1-24c79a1]
        at net.minecraft.server.v1_16_R3.MinecraftServer.executeNext(MinecraftServer.java:935) ~[middle16.jar:git-Spigot-ff439d1-24c79a1]
        at net.minecraft.server.v1_16_R3.IAsyncTaskHandler.executeAll(SourceFile:103) ~[middle16.jar:git-Spigot-ff439d1-24c79a1]
        at net.minecraft.server.v1_16_R3.MinecraftServer.sleepForTick(MinecraftServer.java:918) ~[middle16.jar:git-Spigot-ff439d1-24c79a1]
        at net.minecraft.server.v1_16_R3.MinecraftServer.w(MinecraftServer.java:851) ~[middle16.jar:git-Spigot-ff439d1-24c79a1]
        at net.minecraft.server.v1_16_R3.MinecraftServer.lambda$0(MinecraftServer.java:164) ~[middle16.jar:git-Spigot-ff439d1-24c79a1]
        at java.lang.Thread.run(Thread.java:748) [?:1.8.0_232]
Caused by: java.lang.UnsupportedOperationException
        at java.util.Collections$UnmodifiableCollection.add(Collections.java:1057) ~[?:1.8.0_232]
        at net.wealth_mc.mystery.specific.market.traders.VillTrade.addTrade(VillTrade.java:38) ~[?:?]
        at net.wealth_mc.mystery.specific.market.traders.TradesWork.onPlayerInteractEntityEvent(TradesWork.java:66) ~[?:?]
        at net.wealth_mc.mystery.listener.ListenerBukkit.onCheckClick(ListenerBukkit.java:245) ~[?:?]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_232]
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_232]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_232]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_232]
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:315) ~[middle16.jar:git-Spigot-ff439d1-24c79a1]
        ... 18 more
@alexandrage не подскажете что можно сделать?
 
Он не помогает, аналогичная ошибка, ругается на "recs.add(rec);" следующим образом:
Решил проблему следующим образом:
Код:
List<MerchantRecipe> recs = new ArrayList<MerchantRecipe>(villager.getRecipes());
Еще есть непонятки какие-то с самими торгами, они почему-то ломаются, предметы из рецепта заменяются воздухом иногда и перезаписываются в БД, но пока не пойму на каком этапе это происходит
 
Назад
Верх