Solved Trouble (DoubleChest)

Discussion in 'Plugin Development' started by Kassestral, Jul 8, 2014.

Thread Status:
Not open for further replies.
  1. Offline

    Kassestral

    For some reason I keep getting an error saying that the doublechest block cannot be defined as a double chest? any help?

    Relevant Code
    Code:java
    1. @SuppressWarnings("deprecation")
    2. @EventHandler
    3. public void trommelPlace(BlockPlaceEvent event){
    4. Block block = event.getBlock();
    5. Player player = event.getPlayer();
    6.  
    7. if(block.getType() == Material.FURNACE && player.getItemInHand().getItemMeta().getDisplayName().equals(ChatColor.AQUA + "Trommel") == true){
    8.  
    9. File locationsdir = new File(this.getDataFolder() + File.separator + "users" + File.separator + player.getUniqueId() + ".yml");
    10. FileConfiguration config = YamlConfiguration.loadConfiguration(locationsdir);
    11.  
    12. config.set("Player", player.getName());
    13. config.set("World", player.getWorld().getName().toString());
    14. config.set("CoordinateX", block.getX());
    15. config.set("CoordinateY", block.getY());
    16. config.set("CoordinateZ", block.getZ());
    17. try {
    18. config.save(locationsdir);
    19. } catch (IOException e1) {
    20. e1.printStackTrace();
    21. }


    Line 49
    Code:java
    1. DoubleChest chest = (DoubleChest) Bukkit.getServer().getWorld("world").getBlockAt(config.getInt("CoordinateX"), config.getInt("CoordinateY"), config.getInt("CoordinateZ")).getState();


    Error Code
    Code:
    [11:44:18 WARN]: [Trommel] Task #12 for Trommel v0.1 generated an exception
    java.lang.ClassCastException: org.bukkit.craftbukkit.v1_7_R3.block.CraftChest cannot be cast to org.bukkit.block.DoubleChest
        at com.kassestral.plugins.trommel.Plugin$1.run(Plugin.java:49) ~[?:?]
        at org.bukkit.craftbukkit.v1_7_R3.scheduler.CraftTask.run(CraftTask.java:53) ~[bukkit.jar:git-Bukkit-1.7.2-R0.3-66-g43d8943-b3078jnks]
        at org.bukkit.craftbukkit.v1_7_R3.scheduler.CraftScheduler.mainThreadHeartbeat(CraftScheduler.java:345) [bukkit.jar:git-Bukkit-1.7.2-R0.3-66-g43d8943-b3078jnks]
        at net.minecraft.server.v1_7_R3.MinecraftServer.v(MinecraftServer.java:600) [bukkit.jar:git-Bukkit-1.7.2-R0.3-66-g43d8943-b3078jnks]
        at net.minecraft.server.v1_7_R3.DedicatedServer.v(DedicatedServer.java:260) [bukkit.jar:git-Bukkit-1.7.2-R0.3-66-g43d8943-b3078jnks]
        at net.minecraft.server.v1_7_R3.MinecraftServer.u(MinecraftServer.java:558) [bukkit.jar:git-Bukkit-1.7.2-R0.3-66-g43d8943-b3078jnks]
        at net.minecraft.server.v1_7_R3.MinecraftServer.run(MinecraftServer.java:469) [bukkit.jar:git-Bukkit-1.7.2-R0.3-66-g43d8943-b3078jnks]
        at net.minecraft.server.v1_7_R3.ThreadServerApplication.run(SourceFile:628) [bukkit.jar:git-Bukkit-1.7.2-R0.3-66-g43d8943-b3078jnks]
    [11:44:19 INFO]: runnable executed :3
    [11:44:19 WARN]: [Trommel] Task #12 for Trommel v0.1 generated an exception
    java.lang.ClassCastException: org.bukkit.craftbukkit.v1_7_R3.block.CraftChest cannot be cast to org.bukkit.block.DoubleChest
        at com.kassestral.plugins.trommel.Plugin$1.run(Plugin.java:49) ~[?:?]
        at org.bukkit.craftbukkit.v1_7_R3.scheduler.CraftTask.run(CraftTask.java:53) ~[bukkit.jar:git-Bukkit-1.7.2-R0.3-66-g43d8943-b3078jnks]
        at org.bukkit.craftbukkit.v1_7_R3.scheduler.CraftScheduler.mainThreadHeartbeat(CraftScheduler.java:345) [bukkit.jar:git-Bukkit-1.7.2-R0.3-66-g43d8943-b3078jnks]
        at net.minecraft.server.v1_7_R3.MinecraftServer.v(MinecraftServer.java:600) [bukkit.jar:git-Bukkit-1.7.2-R0.3-66-g43d8943-b3078jnks]
        at net.minecraft.server.v1_7_R3.DedicatedServer.v(DedicatedServer.java:260) [bukkit.jar:git-Bukkit-1.7.2-R0.3-66-g43d8943-b3078jnks]
        at net.minecraft.server.v1_7_R3.MinecraftServer.u(MinecraftServer.java:558) [bukkit.jar:git-Bukkit-1.7.2-R0.3-66-g43d8943-b3078jnks]
        at net.minecraft.server.v1_7_R3.MinecraftServer.run(MinecraftServer.java:469) [bukkit.jar:git-Bukkit-1.7.2-R0.3-66-g43d8943-b3078jnks]
        at net.minecraft.server.v1_7_R3.ThreadServerApplication.run(SourceFile:628) [bukkit.jar:git-Bukkit-1.7.2-R0.3-66-g43d8943-b3078jnks]
    [11:44:20 INFO]: runnable executed :3
    [11:44:20 WARN]: [Trommel] Task #12 for Trommel v0.1 generated an exception
    java.lang.ClassCastException: org.bukkit.craftbukkit.v1_7_R3.block.CraftChest cannot be cast to org.bukkit.block.DoubleChest
        at com.kassestral.plugins.trommel.Plugin$1.run(Plugin.java:49) ~[?:?]
        at org.bukkit.craftbukkit.v1_7_R3.scheduler.CraftTask.run(CraftTask.java:53) ~[bukkit.jar:git-Bukkit-1.7.2-R0.3-66-g43d8943-b3078jnks]
        at org.bukkit.craftbukkit.v1_7_R3.scheduler.CraftScheduler.mainThreadHeartbeat(CraftScheduler.java:345) [bukkit.jar:git-Bukkit-1.7.2-R0.3-66-g43d8943-b3078jnks]
        at net.minecraft.server.v1_7_R3.MinecraftServer.v(MinecraftServer.java:600) [bukkit.jar:git-Bukkit-1.7.2-R0.3-66-g43d8943-b3078jnks]
        at net.minecraft.server.v1_7_R3.DedicatedServer.v(DedicatedServer.java:260) [bukkit.jar:git-Bukkit-1.7.2-R0.3-66-g43d8943-b3078jnks]
        at net.minecraft.server.v1_7_R3.MinecraftServer.u(MinecraftServer.java:558) [bukkit.jar:git-Bukkit-1.7.2-R0.3-66-g43d8943-b3078jnks]
        at net.minecraft.server.v1_7_R3.MinecraftServer.run(MinecraftServer.java:469) [bukkit.jar:git-Bukkit-1.7.2-R0.3-66-g43d8943-b3078jnks]
        at net.minecraft.server.v1_7_R3.ThreadServerApplication.run(SourceFile:628) [bukkit.jar:git-Bukkit-1.7.2-R0.3-66-g43d8943-b3078jnks]
    Help ASAP would be appreciated

    KingFaris11 Necrodoom

    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: Jun 9, 2016
  2. Use Chest and getInventory (not getBlockInventory() because that returns only that one chest, not both).

    DoubleChest is just an Inventory holder, it isn't actually the block. You can do this if you want:
    Code:
    Chest chest = (Chest) block.getState();
    InventoryHolder iH = chest.getInventory().getHolder();
    if (iH instanceof DoubleChest) {
         DoubleChest doubleChest = (DoubleChest) iH;
    }
    
    By the way, line 7 of the first relevant code you posted, you're going to get a NullPointerException most of the time as only items renamed have a display name. First check if it has one, itemMeta.hasDisplayName().

    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: Jun 9, 2016
  3. Offline

    Kassestral

    KingFaris11
    Thanks that worked, however how can I take only 1 cobblestone from the inventory per seconds?

    Current code
    Code:java
    1. public void onEnable(){
    2. initialize();
    3. trommelItem();
    4. pm.registerEvents(this, this);
    5. if(plugin == null){
    6. plugin = this;
    7. }
    8.  
    9. BukkitScheduler scheduler = Bukkit.getServer().getScheduler();
    10.  
    11. scheduler.scheduleSyncRepeatingTask(this, new Runnable() {
    12. @Override
    13. public void run() {
    14. Bukkit.getServer().getLogger().info("runnable executed :3");
    15.  
    16. for (File file : new File(plugin.getDataFolder() + File.separator + "users").listFiles()){
    17. FileConfiguration config = YamlConfiguration.loadConfiguration(file);
    18. Chest chest = (Chest) Bukkit.getServer().getWorld("world").getBlockAt(config.getInt("CoordinateX"), config.getInt("CoordinateY"), config.getInt("CoordinateZ")).getState();
    19. InventoryHolder iH = chest.getInventory().getHolder();
    20.  
    21. if (iH instanceof DoubleChest) {
    22. DoubleChest doubleChest = (DoubleChest) iH;
    23. if(doubleChest.getInventory().contains(Material.COBBLESTONE)){
    24. doubleChest.getInventory().remove(Material.COBBLESTONE);
    25. }
    26. }
    27. }
    28.  
    29. }
    30. }, 0L, 20L);


    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: Jun 9, 2016
  4. Offline

    Heirteir

    Kassestral
    doubleChest.getInventory.remove(new ItemStack(Material.COBBLESTONE, AmountYouWantToRemove));

    May be spelling errors I didn't check :p
     
  5. Offline

    Kassestral

    Heirteir
    I tried that, it only takes out the single cobblestone stacks, anything bigger than 2 is untouched
     
  6. Offline

    Heirteir

    Kassestral
    oh yeah forgot about that you could do
    Code:java
    1. for (int x = 0; x < amountyouwanttoremove; x++){
    2. doubleChest.getInventory().remove(Material.COBBLESTONE);
    3. }


    Kassestral
    Are you trying to remove all cobblestone?
    if you are you can do
    Code:java
    1. while (inv.contains(Material.COBBLESTONE)){
    2. inv.remove(Material.COBBLESTONE);
    3. }


    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: Jun 9, 2016
  7. Offline

    Kassestral

    Heirteir
    Well I want to get the amount of cobblestone that the double chest contains, and then take 1 away per second
     
  8. Offline

    Heirteir

    Kassestral
    1 per second would be
    Code:java
    1. new BukkitRunnable(){
    2. public void run(){
    3. if (inv.contains(Material.COBBLESTONE))
    4. inv.remove(Material.COBBLESTONE);
    5. else
    6. this.cancel();
    7. }
    8. }.runTaskTimer(plugin, 0L, 20L);


    where plugin is your main class that extends JavaPlugin and 0L is the delay, 20L is 1 second because it is ticks.
     
  9. Offline

    Kassestral

    Heirteir
    I know but like I said here
    Code:java
    1. if(doubleChest.getInventory().contains(Material.COBBLESTONE)){
    2. doubleChest.getInventory().remove(Material.COBBLESTONE);

    this removes ALL of the cobblestone, not just one
     
  10. Offline

    Heirteir

    Kassestral
    oh then did you try .removeItem(); I can't remember if that takes a Material or an ItemStack but either way it's simple just .removeItem(Material.COBBLESTONE); or .removeItem(new ItemStack(Material.COBBLESTONE));
     
  11. Offline

    Kassestral

    Heirteir
    Its alright I made a form of method that seems to work
    Code:java
    1. if (iH instanceof DoubleChest) {
    2. DoubleChest doubleChest = (DoubleChest) iH;
    3. if(doubleChest.getInventory().contains(Material.COBBLESTONE)){
    4. doubleChest.getInventory().getItem(doubleChest.getInventory().first(Material.COBBLESTONE)).setAmount(doubleChest.getInventory().getItem(doubleChest.getInventory().first(Material.COBBLESTONE)).getAmount() - 1);
    5. }
    6. }
    :) now I just need to work out how to define a different chest xD
     
  12. Offline

    Waffles87

    I had a similar problem and I ultimately came up with the same solution for removing just one of an item. However, I found that if the ItemStack you are working on only has an amount of 1, then setAmount(0) wouldn't actually remove it. (Although I haven't tried it on 1.7.9... maybe it does now which would make this post irrelevant).

    What I had to do was something like this:
    (I removed some conditions that aren't relevant so there may be typos... but basically check if the amount is 1 and set the item to null if it is.)

    ItemStack[] items = inv.getContents();
    ItemStack tempItem = items[inv.first(Material.COBBLESTONE)];

    if (tempItem != null) {
    if (tempItem.getAmount() == 1)
    inv.setItem(items[inv.first(Material.COBBLESTONE)], null);
    else
    tempItem.setAmount(tempItem.getAmount() - 1;
    }
     
  13. getAmount() -1 will leave the last item.

    I suggest doing the following:

    Code:java
    1. ItemStack is = new ItemStack(get an itemstack here);
    2. is.setAmount(1);
    3. getInventory().remove(is);
     
  14. Offline

    Kassestral

    adventuretc
    Thank you but I realised this while testing and came up with this
    Code:java
    1. if(resultChest.getInventory().firstEmpty() == -1){
    2. Bukkit.getServer().broadcastMessage("Chest now full");
    3. }
    4. else{
    5. if(doubleChest.getInventory().getItem(doubleChest.getInventory().first(Material.COBBLESTONE)).getAmount() == 1){
    6. //Checking if only 1 cobblestone left
    7. doubleChest.getInventory().remove(Material.COBBLESTONE);
    8. resultChest.getInventory().addItem(new ItemStack(Material.GRAVEL, 1));
    9. }
    10. else{
    11. //Method for taking cobblestone
    12. doubleChest.getInventory().getItem(doubleChest.getInventory().first(Material.COBBLESTONE)).setAmount(doubleChest.getInventory().getItem(doubleChest.getInventory().first(Material.COBBLESTONE)).getAmount() - 1);
    13. resultChest.getInventory().addItem(new ItemStack(Material.GRAVEL, 1));
    14. }
    15. }
     
  15. With that code if you have a stack of 1 item and a stack of 64 items, all will be removed :p
     
  16. Offline

    Kassestral

    adventuretc
    Ah thank you :) never noticed that, its now fixed and working well!
    Code:java
    1. if(resultChest.getInventory().firstEmpty() == -1){
    2. Bukkit.getServer().broadcastMessage("Chest now full");
    3. }
    4. else{
    5. if(doubleChest.getInventory().getItem(doubleChest.getInventory().first(Material.COBBLESTONE)).getAmount() == 1){
    6. //Checking if only 1 cobblestone left
    7. doubleChest.getInventory().remove(new ItemStack(Material.COBBLESTONE, 1));
    8. resultChest.getInventory().addItem(new ItemStack(Material.GRAVEL, 1));
    9. }
    10. else{
    11. //Method for taking cobblestone
    12. doubleChest.getInventory().getItem(doubleChest.getInventory().first(Material.COBBLESTONE)).setAmount(doubleChest.getInventory().getItem(doubleChest.getInventory().first(Material.COBBLESTONE)).getAmount() - 1);
    13. resultChest.getInventory().addItem(new ItemStack(Material.GRAVEL, 1));
    14. }
    15. }


    Hey sorry I only just saw your post :3 thanks for the advice but its working fine now haha xD setting the amount to 0 still doesnt work though

    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: Jun 9, 2016
  17. Offline

    Heirteir

    Kassestral
    Why don't you just use .removeItem(); :3
     
  18. I'm confused - any errors/problems?
     
  19. Offline

    Kassestral

    Last edited by a moderator: Jun 9, 2016
Thread Status:
Not open for further replies.

Share This Page