Вопрос Проблема с MetaData или же несоответствие инстансов плагина

er1one

Разработчик
Пользователь
Сообщения
94
Решения
5
Веб-сайт
er1one.ru
Есть у меня такой вот объект:
Java:
public class Merchant {

    private String ownerName;
    private Block block;
    private List<MerchantRecipe> goods = new ArrayList<>();
    private List<ItemStack> treasury = new ArrayList<>();

    public Merchant(String ownerName, Block block) {
        this.ownerName = ownerName;
        this.block = block;
    }

    public void save() {
        if(this.block.hasMetadata("merchant")) {
            this.block.removeMetadata("merchant", VanillaBarterShop.getInstance());
        }
        this.block.setMetadata("merchant", new FixedMetadataValue(VanillaBarterShop.getInstance(), this));
    }

    public List<MerchantRecipe> getGoods() {
        return this.goods;
    }

    public List<ItemStack> getTreasury() {
        return this.treasury;
    }

    public Block getBlock() {
        return block;
    }

    public String getOwnerName() {
        return ownerName;
    }

    public void setGoods(List<MerchantRecipe> goods) {
        this.goods = goods;
    }

    public void setTreasury(List<ItemStack> treasury) {
        this.treasury = treasury;
    }
}
Он сохраняет себя в метадату блока. Когда я хочу получить его таким способом:
Java:
Merchant merchant = (Merchant) event.getClickedBlock().getMetadata("merchant").get(0).value();
Я получаю его и могу взаимодействовать, НО ТОЛЬКО ДО ПЕРЕЗАГРУЗКИ СЕРВЕРА. После перезапуска, плагин мне выдает EventException: null
По причине того, что не может закастить Merchant в Merchant плагина до перезагрузки.
Ошибка:
Код:
[15:47:47 ERROR]: Could not pass event PlayerInteractEvent to VanillaBarterShop v1.0-SNAPSHOT
org.bukkit.event.EventException: null
        at org.bukkit.plugin.EventExecutor$2.execute(EventExecutor.java:72) ~[patched_1.12.2.jar:git-Paper-1620]
        at co.aikar.timings.TimedEventExecutor.execute(TimedEventExecutor.java:78) ~[patched_1.12.2.jar:git-Paper-1620]
        at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[patched_1.12.2.jar:git-Paper-1620]
        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:513) ~[patched_1.12.2.jar:git-Paper-1620]
        at org.bukkit.craftbukkit.v1_12_R1.event.CraftEventFactory.callPlayerInteractEvent(CraftEventFactory.java:236) ~[patched_1.12.2.jar:git-Paper-1620]
        at net.minecraft.server.v1_12_R1.PlayerInteractManager.a(PlayerInteractManager.java:486) ~[patched_1.12.2.jar:git-Paper-1620]
        at net.minecraft.server.v1_12_R1.PlayerConnection.a(PlayerConnection.java:1011) ~[patched_1.12.2.jar:git-Paper-1620]
        at net.minecraft.server.v1_12_R1.PacketPlayInUseItem.a(PacketPlayInUseItem.java:37) ~[patched_1.12.2.jar:git-Paper-1620]
        at net.minecraft.server.v1_12_R1.PacketPlayInUseItem.a(PacketPlayInUseItem.java:5) ~[patched_1.12.2.jar:git-Paper-1620]
        at net.minecraft.server.v1_12_R1.PlayerConnectionUtils.lambda$ensureMainThread$0(PlayerConnectionUtils.java:14) ~[patched_1.12.2.jar:git-Paper-1620]
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) ~[?:?]
        at java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[?:?]
        at net.minecraft.server.v1_12_R1.SystemUtils.a(SourceFile:46) ~[patched_1.12.2.jar:git-Paper-1620]
        at net.minecraft.server.v1_12_R1.MinecraftServer.D(MinecraftServer.java:850) ~[patched_1.12.2.jar:git-Paper-1620]
        at net.minecraft.server.v1_12_R1.DedicatedServer.D(DedicatedServer.java:423) ~[patched_1.12.2.jar:git-Paper-1620]
        at net.minecraft.server.v1_12_R1.MinecraftServer.C(MinecraftServer.java:774) ~[patched_1.12.2.jar:git-Paper-1620]
        at net.minecraft.server.v1_12_R1.MinecraftServer.run(MinecraftServer.java:666) ~[patched_1.12.2.jar:git-Paper-1620]
        at java.lang.Thread.run(Thread.java:833) [?:?]
Caused by: java.lang.ClassCastException: class ru.er1one.vanillabartershop.utils.Merchant cannot be cast to class ru.er1one.vanillabartershop.utils.Merchant (ru.er1one.vanillabartershop.utils.Merchant is in unnamed module of loader org.bukkit.plugin.java.PluginClassLoader @59299c24; ru.er1one.vanillabartershop.utils.Merchant is in unnamed module of loader org.bukkit.plugin.java.PluginClassLoader @60905ab7)
        at ru.er1one.vanillabartershop.handlers.PlaceListener.onBlockInteract(PlaceListener.java:53) ~[?:?]
        at com.destroystokyo.paper.event.executor.asm.generated.GeneratedEventExecutor207.execute(Unknown Source) ~[?:?]
        at org.bukkit.plugin.EventExecutor$2.execute(EventExecutor.java:70) ~[patched_1.12.2.jar:git-Paper-1620]
        ... 17 more
Объединено

Я знаю, что такой подход к хранению объекта нежелателен, но в силу ограниченных сроков, очень нужно
 
Есть у меня такой вот объект:
Java:
public class Merchant {

    private String ownerName;
    private Block block;
    private List<MerchantRecipe> goods = new ArrayList<>();
    private List<ItemStack> treasury = new ArrayList<>();

    public Merchant(String ownerName, Block block) {
        this.ownerName = ownerName;
        this.block = block;
    }

    public void save() {
        if(this.block.hasMetadata("merchant")) {
            this.block.removeMetadata("merchant", VanillaBarterShop.getInstance());
        }
        this.block.setMetadata("merchant", new FixedMetadataValue(VanillaBarterShop.getInstance(), this));
    }

    public List<MerchantRecipe> getGoods() {
        return this.goods;
    }

    public List<ItemStack> getTreasury() {
        return this.treasury;
    }

    public Block getBlock() {
        return block;
    }

    public String getOwnerName() {
        return ownerName;
    }

    public void setGoods(List<MerchantRecipe> goods) {
        this.goods = goods;
    }

    public void setTreasury(List<ItemStack> treasury) {
        this.treasury = treasury;
    }
}
Он сохраняет себя в метадату блока. Когда я хочу получить его таким способом:
Java:
Merchant merchant = (Merchant) event.getClickedBlock().getMetadata("merchant").get(0).value();
Я получаю его и могу взаимодействовать, НО ТОЛЬКО ДО ПЕРЕЗАГРУЗКИ СЕРВЕРА. После перезапуска, плагин мне выдает EventException: null
По причине того, что не может закастить Merchant в Merchant плагина до перезагрузки.
Ошибка:
Код:
[15:47:47 ERROR]: Could not pass event PlayerInteractEvent to VanillaBarterShop v1.0-SNAPSHOT
org.bukkit.event.EventException: null
        at org.bukkit.plugin.EventExecutor$2.execute(EventExecutor.java:72) ~[patched_1.12.2.jar:git-Paper-1620]
        at co.aikar.timings.TimedEventExecutor.execute(TimedEventExecutor.java:78) ~[patched_1.12.2.jar:git-Paper-1620]
        at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[patched_1.12.2.jar:git-Paper-1620]
        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:513) ~[patched_1.12.2.jar:git-Paper-1620]
        at org.bukkit.craftbukkit.v1_12_R1.event.CraftEventFactory.callPlayerInteractEvent(CraftEventFactory.java:236) ~[patched_1.12.2.jar:git-Paper-1620]
        at net.minecraft.server.v1_12_R1.PlayerInteractManager.a(PlayerInteractManager.java:486) ~[patched_1.12.2.jar:git-Paper-1620]
        at net.minecraft.server.v1_12_R1.PlayerConnection.a(PlayerConnection.java:1011) ~[patched_1.12.2.jar:git-Paper-1620]
        at net.minecraft.server.v1_12_R1.PacketPlayInUseItem.a(PacketPlayInUseItem.java:37) ~[patched_1.12.2.jar:git-Paper-1620]
        at net.minecraft.server.v1_12_R1.PacketPlayInUseItem.a(PacketPlayInUseItem.java:5) ~[patched_1.12.2.jar:git-Paper-1620]
        at net.minecraft.server.v1_12_R1.PlayerConnectionUtils.lambda$ensureMainThread$0(PlayerConnectionUtils.java:14) ~[patched_1.12.2.jar:git-Paper-1620]
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) ~[?:?]
        at java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[?:?]
        at net.minecraft.server.v1_12_R1.SystemUtils.a(SourceFile:46) ~[patched_1.12.2.jar:git-Paper-1620]
        at net.minecraft.server.v1_12_R1.MinecraftServer.D(MinecraftServer.java:850) ~[patched_1.12.2.jar:git-Paper-1620]
        at net.minecraft.server.v1_12_R1.DedicatedServer.D(DedicatedServer.java:423) ~[patched_1.12.2.jar:git-Paper-1620]
        at net.minecraft.server.v1_12_R1.MinecraftServer.C(MinecraftServer.java:774) ~[patched_1.12.2.jar:git-Paper-1620]
        at net.minecraft.server.v1_12_R1.MinecraftServer.run(MinecraftServer.java:666) ~[patched_1.12.2.jar:git-Paper-1620]
        at java.lang.Thread.run(Thread.java:833) [?:?]
Caused by: java.lang.ClassCastException: class ru.er1one.vanillabartershop.utils.Merchant cannot be cast to class ru.er1one.vanillabartershop.utils.Merchant (ru.er1one.vanillabartershop.utils.Merchant is in unnamed module of loader org.bukkit.plugin.java.PluginClassLoader @59299c24; ru.er1one.vanillabartershop.utils.Merchant is in unnamed module of loader org.bukkit.plugin.java.PluginClassLoader @60905ab7)
        at ru.er1one.vanillabartershop.handlers.PlaceListener.onBlockInteract(PlaceListener.java:53) ~[?:?]
        at com.destroystokyo.paper.event.executor.asm.generated.GeneratedEventExecutor207.execute(Unknown Source) ~[?:?]
        at org.bukkit.plugin.EventExecutor$2.execute(EventExecutor.java:70) ~[patched_1.12.2.jar:git-Paper-1620]
        ... 17 more
Объединено

Я знаю, что такой подход к хранению объекта нежелателен, но в силу ограниченных сроков, очень нужно
метадата не сохраняется после перезагрузки. Используй PersistentDataContainer.
 
Назад
Сверху Снизу