Save and load spawner blockstate into a config file

Discussion in 'Plugin Development' started by Cri16228, Apr 15, 2018.

Thread Status:
Not open for further replies.
  1. I have a problem to save the blockstate to config and load them when a player place/break a spawner
    I want to create the same spawner with the saved blockstates when a player break it with a silk pick
    Code:
    @EventHandler
        public void onSpawnerBreak(BlockBreakEvent e) {
            Block b = e.getBlock();
            Player p = e.getPlayer();
            if (b.getType() == Material.MOB_SPAWNER) {
                ItemStack hand = p.getItemInHand();
                if (hand.containsEnchantment(Enchantment.SILK_TOUCH)) {
                    e.setCancelled(true);
                    b.setType(Material.AIR);
                    Location l = b.getLocation();
                    double ax = l.getX();
                    DecimalFormat xf = new DecimalFormat("0");
                    String x = xf.format(ax).replaceAll("-", "");
    
                    double ay = l.getY();
                    DecimalFormat yf = new DecimalFormat("0");
                    String y = yf.format(ay).replaceAll("-", "");
    
                    double az = l.getZ();
                    DecimalFormat zf = new DecimalFormat("0");
                    String z = zf.format(az).replaceAll("-", "");
                    int level = SpawnersFile.getSpawners().getInt("spawners." + x + y + z + ".Level");
                    String ent = SpawnersFile.getSpawners().getString("spawners." + x + y + z + ".Mob");
                    int delay = SpawnersFile.getSpawners().getInt("spawners." + x + y + z + ".Delay");
                    int mindelay = SpawnersFile.getSpawners().getInt("spawners." + x + y + z + ".MinDelay");
                    int maxdelay = SpawnersFile.getSpawners().getInt("spawners." + x + y + z + ".MaxDelay");
                    int amount = SpawnersFile.getSpawners().getInt("spawners." + x + y + z + ".Spawn-Amount");
                        ItemStack spawner = new ItemStack(Material.MOB_SPAWNER);
                        ItemMeta spawnerMeta = spawner.getItemMeta();
                        BlockState blockState = e.getBlock().getState();
                        CreatureSpawner s = ((CreatureSpawner) blockState);
                        s.setSpawnedType(EntityType.valueOf(ent));
                        s.setDelay(delay);
                        s.setMinSpawnDelay(mindelay);
                        s.setMaxSpawnDelay(maxdelay);
                        s.setSpawnCount(amount);
                        s.update();
                        spawnerMeta.setDisplayName(SpawnerCheck.SpawnerName(b));
                        String lore = Main.color("&9Livello: " + String.valueOf(level));
                        spawnerMeta.setLore(Collections.singletonList(lore));
                        SpawnersFile.getSpawners().set("spawners." + x + y + z, null);
                        SpawnersFile.saveSpawnersFile();
                }
            }
        }
    
        @EventHandler
        public void onSpawnerPlace(BlockPlaceEvent e) {
            Block b = e.getBlockPlaced();
            ItemStack inh = e.getPlayer().getItemInHand();
            if (b != null && inh != null) {
                if (inh.getType() == Material.MOB_SPAWNER) {
                    if (b.getType() == Material.MOB_SPAWNER) {
                        BlockState blockState = b.getState();
                        CreatureSpawner spawner = (CreatureSpawner) blockState;
                        String ent = spawner.getSpawnedType().toString();
                        ItemMeta im = inh.getItemMeta();
                        //common
                        Location l = b.getLocation();
                        double ax = l.getX();
                        DecimalFormat xf = new DecimalFormat("0");
                        String x = xf.format(ax).replaceAll("-", "");
    
                        double ay = l.getY();
                        DecimalFormat yf = new DecimalFormat("0");
                        String y = yf.format(ay).replaceAll("-", "");
    
                        double az = l.getZ();
                        DecimalFormat zf = new DecimalFormat("0");
                        String z = zf.format(az).replaceAll("-", "");
                        if (im.getDisplayName().equals(Main.color("&7Common Chicken Spawner"))) {
                            setSpawner(b, EntityType.CHICKEN);
                            SpawnersFile.getSpawners().set("spawners." + x + y + z + ".Level", 1);
                            SpawnersFile.getSpawners().set("spawners." + x + y + z + ".Mob", ent);
                            SpawnersFile.getSpawners().set("spawners." + x + y + z + ".Delay", spawner.getDelay());
                            SpawnersFile.getSpawners().set("spawners." + x + y + z + ".MinDelay", spawner.getMinSpawnDelay());
                            SpawnersFile.getSpawners().set("spawners." + x + y + z + ".MaxDelay", spawner.getMaxSpawnDelay());
                            SpawnersFile.getSpawners().set("spawners." + x + y + z + ".Spawn-Amount", spawner.getSpawnCount());
                            SpawnersFile.saveSpawnersFile();
    Console error (open)

    Code:
    [18:42:31] [Server thread/ERROR]: Could not pass event BlockPlaceEvent to CustomSpawners v0.2
    org.bukkit.event.EventException: null
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:306) ~[spigot-1.12.jar:git-Spigot-596221b-9a1fc1e]
        at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[spigot-1.12.jar:git-Spigot-596221b-9a1fc1e]
        at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:499) [spigot-1.12.jar:git-Spigot-596221b-9a1fc1e]
        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:484) [spigot-1.12.jar:git-Spigot-596221b-9a1fc1e]
        at org.bukkit.craftbukkit.v1_12_R1.event.CraftEventFactory.callBlockPlaceEvent(CraftEventFactory.java:149) [spigot-1.12.jar:git-Spigot-596221b-9a1fc1e]
        at net.minecraft.server.v1_12_R1.ItemStack.placeItem(ItemStack.java:207) [spigot-1.12.jar:git-Spigot-596221b-9a1fc1e]
        at net.minecraft.server.v1_12_R1.PlayerInteractManager.a(PlayerInteractManager.java:505) [spigot-1.12.jar:git-Spigot-596221b-9a1fc1e]
        at net.minecraft.server.v1_12_R1.PlayerConnection.a(PlayerConnection.java:944) [spigot-1.12.jar:git-Spigot-596221b-9a1fc1e]
        at net.minecraft.server.v1_12_R1.PacketPlayInUseItem.a(PacketPlayInUseItem.java:37) [spigot-1.12.jar:git-Spigot-596221b-9a1fc1e]
        at net.minecraft.server.v1_12_R1.PacketPlayInUseItem.a(PacketPlayInUseItem.java:1) [spigot-1.12.jar:git-Spigot-596221b-9a1fc1e]
        at net.minecraft.server.v1_12_R1.PlayerConnectionUtils$1.run(SourceFile:13) [spigot-1.12.jar:git-Spigot-596221b-9a1fc1e]
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_112]
        at java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:1.8.0_112]
        at net.minecraft.server.v1_12_R1.SystemUtils.a(SourceFile:46) [spigot-1.12.jar:git-Spigot-596221b-9a1fc1e]
        at net.minecraft.server.v1_12_R1.MinecraftServer.D(MinecraftServer.java:747) [spigot-1.12.jar:git-Spigot-596221b-9a1fc1e]
        at net.minecraft.server.v1_12_R1.DedicatedServer.D(DedicatedServer.java:405) [spigot-1.12.jar:git-Spigot-596221b-9a1fc1e]
        at net.minecraft.server.v1_12_R1.MinecraftServer.C(MinecraftServer.java:678) [spigot-1.12.jar:git-Spigot-596221b-9a1fc1e]
        at net.minecraft.server.v1_12_R1.MinecraftServer.run(MinecraftServer.java:576) [spigot-1.12.jar:git-Spigot-596221b-9a1fc1e]
        at java.lang.Thread.run(Thread.java:745) [?:1.8.0_112]
    Caused by: java.lang.NoSuchMethodError: org.bukkit.block.CreatureSpawner.getMaxSpawnDelay()I
        at me.spawners.Events.SpawnerPlace.onSpawnerPlace(SpawnerPlace.java:92) ~[?:?]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_112]
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_112]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_112]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_112]
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:302) ~[spigot-1.12.jar:git-Spigot-596221b-9a1fc1e]
        ... 18 more
    [18:42:33] [Server thread/ERROR]: Could not pass event BlockBreakEvent to CustomSpawner v0.2
    org.bukkit.event.EventException: null
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:306) ~[spigot-1.12.jar:git-Spigot-596221b-9a1fc1e]
        at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[spigot-1.12.jar:git-Spigot-596221b-9a1fc1e]
        at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:499) [spigot-1.12.jar:git-Spigot-596221b-9a1fc1e]
        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:484) [spigot-1.12.jar:git-Spigot-596221b-9a1fc1e]
        at net.minecraft.server.v1_12_R1.PlayerInteractManager.breakBlock(PlayerInteractManager.java:290) [spigot-1.12.jar:git-Spigot-596221b-9a1fc1e]
        at net.minecraft.server.v1_12_R1.PlayerInteractManager.a(PlayerInteractManager.java:123) [spigot-1.12.jar:git-Spigot-596221b-9a1fc1e]
        at net.minecraft.server.v1_12_R1.PlayerConnection.a(PlayerConnection.java:868) [spigot-1.12.jar:git-Spigot-596221b-9a1fc1e]
        at net.minecraft.server.v1_12_R1.PacketPlayInBlockDig.a(SourceFile:40) [spigot-1.12.jar:git-Spigot-596221b-9a1fc1e]
        at net.minecraft.server.v1_12_R1.PacketPlayInBlockDig.a(SourceFile:10) [spigot-1.12.jar:git-Spigot-596221b-9a1fc1e]
        at net.minecraft.server.v1_12_R1.PlayerConnectionUtils$1.run(SourceFile:13) [spigot-1.12.jar:git-Spigot-596221b-9a1fc1e]
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_112]
        at java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:1.8.0_112]
        at net.minecraft.server.v1_12_R1.SystemUtils.a(SourceFile:46) [spigot-1.12.jar:git-Spigot-596221b-9a1fc1e]
        at net.minecraft.server.v1_12_R1.MinecraftServer.D(MinecraftServer.java:747) [spigot-1.12.jar:git-Spigot-596221b-9a1fc1e]
        at net.minecraft.server.v1_12_R1.DedicatedServer.D(DedicatedServer.java:405) [spigot-1.12.jar:git-Spigot-596221b-9a1fc1e]
        at net.minecraft.server.v1_12_R1.MinecraftServer.C(MinecraftServer.java:678) [spigot-1.12.jar:git-Spigot-596221b-9a1fc1e]
        at net.minecraft.server.v1_12_R1.MinecraftServer.run(MinecraftServer.java:576) [spigot-1.12.jar:git-Spigot-596221b-9a1fc1e]
        at java.lang.Thread.run(Thread.java:745) [?:1.8.0_112]
    Caused by: java.lang.ClassCastException: org.bukkit.craftbukkit.v1_12_R1.inventory.CraftMetaBlockState cannot be cast to org.bukkit.block.CreatureSpawner
        at me.spawners.Events.SpawnerPlace.onSpawnerBreak(SpawnerPlace.java:62) ~[?:?]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_112]
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_112]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_112]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_112]
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:302) ~[spigot-1.12.jar:git-Spigot-596221b-9a1fc1e]
        ... 17 more
     
  2. Offline

    MightyOne

    "org.bukkit.craftbukkit.v1_12_R1.inventory.CraftMetaBlockState cannot be cast to org.bukkit.block.CreatureSpawner"

    Seems like you imported the wrong BlockState
     
  3. Which is the right import?
     
  4. @Cri16228
    import org.bukkit.block.BlockState;
     
  5. Here my imports
    Code:
    import org.bukkit.Location;
    import org.bukkit.Material;
    import org.bukkit.block.Block;
    import org.bukkit.block.BlockState;
    import org.bukkit.block.CreatureSpawner;
    import org.bukkit.enchantments.Enchantment;
    import org.bukkit.entity.EntityType;
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.block.BlockBreakEvent;
    import org.bukkit.event.block.BlockPlaceEvent;
    import org.bukkit.inventory.ItemStack;
    import org.bukkit.inventory.meta.ItemMeta;
    
    import java.text.DecimalFormat;
    import java.util.Collections;
    
     
  6. Up
     
  7. Offline

    MightyOne

    Anyway. If the error says wrong class somehow you use the craftbukkit BlockState and not the bukkit one. It's on you to look up your code and find out how this happens.
     
  8. So probably I use the wrong API?
     
Thread Status:
Not open for further replies.

Share This Page