Solved Counting Blocks, always getting 0

Discussion in 'Plugin Development' started by Kleinerminer, Dec 19, 2014.

Thread Status:
Not open for further replies.
  1. Hello community,
    I got a problem with my code - The class represents an area that is used as a building (in combination with Towny). I try to count a block type within it and always get the value 0:
    Code:
    package me.kleinerminer.building;
    
    import java.util.HashMap;
    
    import me.kleinerminer.threads.LumberhutWork;
    import me.kleinerminer.townyplots.TownyPlots;
    
    import org.bukkit.Location;
    import org.bukkit.Material;
    import org.bukkit.World;
    
    import com.palmergames.bukkit.towny.TownySettings;
    import com.palmergames.bukkit.towny.object.Town;
    
    public class Lumberhut extends Building {
       String[] levelBlocks = new String[11]; //Get the blocks for the levels, as array
       int level = 0;
       int y;
       int y2;
       int blockAmount; //Basic block count for level 1
       int blockAmountLevel; //Block count per level up
       Town town;
       String type = "lumberhut";
       // World world;
       private TownyPlots plugin;
       private LumberhutWork work;
       public Lumberhut(Location loc, Town town, int id, TownyPlots townyplots) {
         super((int) loc.getX(), (int) loc.getZ(), loc.getWorld(), id);
         this.plugin = townyplots;
         this.x = (int) loc.getX();
         this.z = (int) loc.getZ();
         y = plugin.config.getInt("lumberhut.lowestY");
         y2 = plugin.config.getInt("lumberhut.highestY");
         int size = 16;
         if(plugin.config.getBoolean("useTownyPlotSize")) {
           size = TownySettings.getTownBlockSize();
         } else {
           size = plugin.config.getInt("plotSize");
         }
         setX2(x + size);
         setZ2(z + size);
         this.town = town;
         setWorld(loc.getWorld());
         setId(id);;
         this.work = new LumberhutWork(plugin, this);
         work.start();
         levelBlocks = plugin.config.getString("lumberhut.blocktype").split(", ");
         blockAmount = plugin.config.getInt("lumberhut.levelBlockAmount");
         blockAmountLevel = plugin.config.getInt("lumberhut.levelBlockAmountPerLevel");
       }
       
       public Location[] outputChest = new Location[40];
       private int[] blockCountGiven = new int[10]; //Index = Index of the block's level
       
       
       public void refreshLevel() {
         level = 0;
         for(int i = 0; (i < levelBlocks.length); i++){ //Now add the blocks given to the array
           Location l1 = new Location(world, x, y, z);
           Location l2 = new Location(world, x2, y2, z2);
           if(levelBlocks[i] == null) break;
          int totalBlocks = plugin.buildinghandler.scanBlocks(l1, l2, Material.getMaterial(levelBlocks[i])); //HERE IS THE PROBLEM
           blockCountGiven[i] = totalBlocks;
         }
         plugin.getLogger().info("BlockCount given: " + blockCountGiven[0]); //ALWAYS 0
         
         countLevels: for(int i = 0; i < 10; i++) {
           int i2 = 0; //Counter for foreach loop
           for(String blockMaterial : levelBlocks) { //Loop to check every block type every time, not only one block type
             if(requiredBlockAmount().get(blockMaterial) > blockCountGiven[i2])
               break countLevels; //Break the whole loop nest, some block count is lower than required
             
             i2++;
           }
           level++; //foreach loop should proove that all block amounts fit the next level, so raise the level
         }
       }
       private HashMap<String, Integer> requiredBlockAmount() { //Returns <Block ID, AmountForNextLevel>
         HashMap<String, Integer> levelMap = new HashMap<String, Integer>();
         int i = 0;
         for(String s : levelBlocks) {
           if(i >= level + 1) break;
           levelMap.put(s, blockAmount + (level - i)*blockAmountLevel);
           i++;
         }
         return levelMap;
       }
       @Override
       void registerChests() {
         // TODO Put the given chests in the array (For FlatfileHandler)
         
       }
       
    //Getters and Setters are down here
    }
    
    As you can see, the plugin.buildinghandler.scanBlocks(l1, l2, Material.getMaterial(levelBlocks)); line always returns 0. I already tested the method by command and it worked. It is purposed to count blocks of a specific materials within an area.
    I've checked the following:
    - Location 1 (l1) is smaller than Location 2 (l2)
    - The Material String is WOOD, and there is also wood (Planks) in the area

    The scanBlocks Method:
    Code:
      public int scanBlocks(Location l1, Location l2, Material material) {
        World w = l1.getWorld();
        int iTotalBlocks = 0;
        for(int x=l1.getBlockX() ; x<=l2.getBlockX(); x++){
        for(int y=l1.getBlockY();y<=l2.getBlockY(); y++){
        for(int z=l1.getBlockZ();z<=l2.getBlockZ(); z++){
        if(w.getBlockAt(x,y,z).getType().equals(material))
        iTotalBlocks++;
        }
        }
        }
       
        return iTotalBlocks;
       }
    
    Greetings
     
  2. @Kleinerminer Debug the code to see what parts are executed and the value of the variables.
     
  3. Code:
    for(int i = 0; (i < levelBlocks.length); i++){ //Now add the blocks given to the array
           Location l1 = new Location(world, x, y, z);
           Location l2 = new Location(world, x2, y2, z2);
           if(levelBlocks[i] == null) break;
           plugin.getLogger().info("Coords 1: "+l1.getX()+"/"+l1.getY()+"/"+l1.getZ()); //TODO remove!
           plugin.getLogger().info("Coords 2: "+l2.getX()+"/"+l2.getY()+"/"+l2.getZ()); //TODO remove!
           plugin.getLogger().info("Material as String: "+levelBlocks[i]); //TODO remove!
           plugin.getLogger().info("Material: "+Material.getMaterial(levelBlocks[i])); //TODO remove!
          int totalBlocks = plugin.buildinghandler.countBlocks(l1, l2, Material.getMaterial(levelBlocks[i]));
           blockCountGiven[i] = totalBlocks;
         }
    
    Output:
    18:01:45 [INFO] [TownyPlots] Coords 1: -240.0/40.0/240.0
    18:01:45 [INFO] [TownyPlots] Coords 2: -224.0/140.0/256.0
    18:01:45 [INFO] [TownyPlots] Material as String: WOOD
    18:01:45 [INFO] [TownyPlots] Material: WOOD
    18:01:45 [INFO] [TownyPlots] Coords 1: -240.0/40.0/240.0
    18:01:45 [INFO] [TownyPlots] Coords 2: -224.0/140.0/256.0
    18:01:45 [INFO] [TownyPlots] Material as String: COBBLESTONE
    18:01:45 [INFO] [TownyPlots] Material: COBBLESTONE
    18:01:45 [INFO] [TownyPlots] BlockCount given: 0
     
  4. Code:
      public int countBlocks(Location l1, Location l2, Material material) {
        World w = l1.getWorld();
        int totalBlocks = 0;
        for(int x=l1.getBlockX() ; x<=l2.getBlockX(); x++){
        for(int y=l1.getBlockY();y<=l2.getBlockY(); y++){
        for(int z=l1.getBlockZ();z<=l2.getBlockZ(); z++){
        if(w.getBlockAt(x,y,z).getType().equals(material))
        totalBlocks++;
        plugin.getLogger().info((w.getBlockAt(x,y,z).getType().toString())); //TODO remove
        }
        }
        }
    
    (I renamed the Method)

    Output:
    Show Spoiler

    18:09:06 [INFO] [TownyPlots] DIRT
    18:09:06 [INFO] [TownyPlots] DIRT
    18:09:07 [INFO] [TownyPlots] DIRT
    18:09:07 [INFO] [TownyPlots] STONE
    18:09:07 [INFO] [TownyPlots] STONE
    18:09:07 [INFO] [TownyPlots] STONE
    18:09:07 [INFO] [TownyPlots] STONE
    18:09:07 [INFO] [TownyPlots] STONE
    18:09:07 [INFO] [TownyPlots] DIRT
    18:09:07 [INFO] [TownyPlots] DIRT
    18:09:07 [INFO] [TownyPlots] DIRT
    18:09:07 [INFO] [TownyPlots] DIRT
    18:09:07 [INFO] [TownyPlots] STONE
    18:09:07 [INFO] [TownyPlots] STONE
    18:09:07 [INFO] [TownyPlots] STONE
    18:09:07 [INFO] [TownyPlots] STONE
    18:09:07 [INFO] [TownyPlots] DIRT
    18:09:07 [INFO] [TownyPlots] DIRT
    18:09:07 [INFO] [TownyPlots] DIRT
    18:09:07 [INFO] [TownyPlots] DIRT
    18:09:07 [INFO] [TownyPlots] STONE
    18:09:07 [INFO] [TownyPlots] STONE
    18:09:07 [INFO] [TownyPlots] STONE
    18:09:07 [INFO] [TownyPlots] STONE
    18:09:07 [INFO] [TownyPlots] DIRT
    18:09:07 [INFO] [TownyPlots] DIRT
    18:09:07 [INFO] [TownyPlots] DIRT
    18:09:07 [INFO] [TownyPlots] DIRT
    18:09:07 [INFO] [TownyPlots] DIRT
    18:09:07 [INFO] [TownyPlots] DIRT
    18:09:07 [INFO] [TownyPlots] DIRT
    18:09:07 [INFO] [TownyPlots] STONE
    18:09:07 [INFO] [TownyPlots] STONE
    18:09:07 [INFO] [TownyPlots] STONE
    18:09:07 [INFO] [TownyPlots] STONE
    18:09:07 [INFO] [TownyPlots] STONE
    18:09:07 [INFO] [TownyPlots] STONE
    18:09:07 [INFO] [TownyPlots] STONE
    18:09:07 [INFO] [TownyPlots] STONE
    18:09:07 [INFO] [TownyPlots] STONE
    18:09:07 [INFO] [TownyPlots] DIRT
    18:09:07 [INFO] [TownyPlots] DIRT
    18:09:07 [INFO] [TownyPlots] DIRT
    18:09:07 [INFO] [TownyPlots] DIRT
    18:09:07 [INFO] [TownyPlots] DIRT
    18:09:07 [INFO] [TownyPlots] DIRT
    18:09:07 [INFO] [TownyPlots] DIRT
    18:09:07 [INFO] [TownyPlots] DIRT
    18:09:07 [INFO] [TownyPlots] DIRT
    18:09:07 [INFO] [TownyPlots] STONE
    18:09:07 [INFO] [TownyPlots] STONE
    18:09:07 [INFO] [TownyPlots] STONE
    18:09:07 [INFO] [TownyPlots] STONE
    18:09:07 [INFO] [TownyPlots] DIRT
    18:09:07 [INFO] [TownyPlots] STONE
    18:09:07 [INFO] [TownyPlots] STONE
    18:09:07 [INFO] [TownyPlots] STONE
    18:09:07 [INFO] [TownyPlots] DIRT
    18:09:07 [INFO] [TownyPlots] DIRT
    18:09:07 [INFO] CONSOLE: Stopping the server..
    18:09:07 [INFO] [TownyPlots] DIRT
    18:09:07 [INFO] [TownyPlots] DIRT
    18:09:07 [INFO] [TownyPlots] DIRT
    18:09:07 [INFO] [TownyPlots] DIRT
    18:09:07 [INFO] [TownyPlots] DIRT
    18:09:07 [INFO] [TownyPlots] DIRT
    18:09:07 [INFO] [TownyPlots] DIRT
    18:09:07 [INFO] [TownyPlots] STONE
    18:09:07 [INFO] [TownyPlots] STONE
    18:09:07 [INFO] [TownyPlots] DIRT
    18:09:07 [INFO] [TownyPlots] DIRT
    18:09:07 [INFO] [TownyPlots] DIRT
    18:09:07 [INFO] [TownyPlots] DIRT
    18:09:07 [INFO] [TownyPlots] STONE
    18:09:07 [INFO] [TownyPlots] STONE
    18:09:07 [INFO] [TownyPlots] STONE
    18:09:07 [INFO] [TownyPlots] STONE
    18:09:07 [INFO] [TownyPlots] DIRT
    18:09:07 [INFO] [TownyPlots] DIRT
    18:09:07 [INFO] [TownyPlots] DIRT
    18:09:07 [INFO] [TownyPlots] STONE
    18:09:07 [INFO] [TownyPlots] DIRT
    18:09:07 [INFO] Stopping server
    18:09:07 [INFO] [TownyPlots] DIRT
    18:09:07 [INFO] [TownyPlots] DIRT
    18:09:07 [INFO] [TownyPlots] STONE
    18:09:07 [INFO] [TownyPlots] STONE
    18:09:07 [INFO] [TownyPlots] DIRT
    18:09:07 [INFO] [TownyPlots] DIRT
    18:09:07 [INFO] [TownyPlots] DIRT
    18:09:07 [INFO] [TownyPlots] DIRT
    18:09:07 [INFO] [TownyPlots] DIRT
    18:09:07 [INFO] [TownyPlots] STONE
    18:09:07 [INFO] [TownyPlots] STONE
    18:09:07 [INFO] [TownyPlots] STONE
    18:09:07 [INFO] [TownyPlots] STONE
    18:09:07 [INFO] [TownyPlots] STONE
    18:09:07 [INFO] [TownyPlots] STONE
    18:09:07 [INFO] [TownyPlots] STONE
    18:09:07 [INFO] [TownyPlots] DIRT
    18:09:07 [INFO] [TownyPlots] DIRT
    18:09:07 [INFO] [TownyPlots] STONE
    18:09:07 [INFO] [TownyPlots] STONE
    18:09:07 [INFO] [TownyPlots] STONE
    18:09:07 [INFO] [TownyPlots] DIRT
    18:09:07 [INFO] [TownyPlots] DIRT
    18:09:07 [INFO] [TownyPlots] Disabling TownyPlots v0.3
    18:09:07 [INFO] [TownyPlots] DIRT
    18:09:07 [INFO] [TownyPlots] DIRT
    18:09:07 [INFO] [TownyPlots] DIRT
    18:09:07 [INFO] [TownyPlots] STONE
    18:09:07 [INFO] [TownyPlots] STONE
    18:09:07 [INFO] [TownyPlots] STONE
    18:09:07 [INFO] [TownyPlots] STONE
    18:09:07 [INFO] [TownyPlots] STONE
    18:09:07 [INFO] [TownyPlots] STONE
    18:09:07 [INFO] [TownyPlots] STONE
    18:09:07 [INFO] [TownyPlots] STONE
    18:09:07 [INFO] [TownyPlots] STONE
    18:09:07 [INFO] [TownyPlots] STONE
    18:09:07 [INFO] [TownyPlots] STONE
    18:09:07 [INFO] [TownyPlots] STONE
    18:09:08 [INFO] [TownyPlots] DIRT
    18:09:08 [INFO] [TownyPlots] DIRT
    18:09:08 [INFO] [TownyPlots] DIRT
    18:09:08 [INFO] [TownyPlots] DIRT
    18:09:08 [INFO] [TownyPlots] STONE
    18:09:08 [INFO] [TownyPlots] STONE
    18:09:08 [INFO] [TownyPlots] STONE
    18:09:08 [INFO] [TownyPlots] STONE
    18:09:08 [INFO] [TownyPlots] STONE
    18:09:08 [INFO] [TownyPlots] STONE
    18:09:08 [INFO] [TownyPlots] STONE
    18:09:08 [INFO] [TownyPlots] STONE
    18:09:08 [INFO] [TownyPlots] STONE
    18:09:08 [INFO] [TownyPlots] STONE
    18:09:08 [INFO] [TownyPlots] STONE
    18:09:08 [INFO] [TownyPlots] STONE
    18:09:08 [INFO] [TownyPlots] STONE
    18:09:08 [INFO] [TownyPlots] STONE
    18:09:08 [INFO] [TownyPlots] STONE
    18:09:08 [INFO] [TownyPlots] STONE
    18:09:08 [INFO] [TownyPlots] STONE
    18:09:08 [INFO] [TownyPlots] STONE
    18:09:08 [INFO] [TownyPlots] STONE
    18:09:08 [INFO] [TownyPlots] STONE
    18:09:08 [INFO] [TownyPlots] STONE
    18:09:08 [INFO] [TownyPlots] STONE
    18:09:08 [INFO] [TownyPlots] STONE
    18:09:08 [INFO] [TownyPlots] STONE
    18:09:08 [INFO] [TownyPlots] STONE
    18:09:08 [INFO] [TownyPlots] STONE
    18:09:08 [INFO] [TownyPlots] STONE
    18:09:08 [INFO] [TownyPlots] STONE
    18:09:08 [INFO] [TownyPlots] STONE
    18:09:08 [INFO] [TownyPlots] STONE
    18:09:08 [INFO] [TownyPlots] STONE
    18:09:08 [INFO] [TownyPlots] STONE
    18:09:08 [INFO] [TownyPlots] STONE
    18:09:08 [INFO] [TownyPlots] STONE
    18:09:08 [INFO] [TownyPlots] STONE
    18:09:08 [INFO] [TownyPlots] STONE
    18:09:08 [INFO] [TownyPlots] STONE
    18:09:08 [INFO] [TownyPlots] STONE
    18:09:08 [INFO] [TownyPlots] STONE
    18:09:08 [INFO] [TownyPlots] STONE
    18:09:08 [INFO] [TownyPlots] STONE
    18:09:08 [INFO] [TownyPlots] STONE
    18:09:08 [INFO] [TownyPlots] DIRT
    18:09:08 [INFO] [TownyPlots] DIRT
    18:09:08 [INFO] [TownyPlots] DIRT
    18:09:08 [INFO] [TownyPlots] TownyPlots Disabled!
    18:09:08 [INFO] [TownyPlots] DIRT
    18:09:08 [INFO] [TownyPlots] DIRT
    18:09:08 [INFO] [TownyPlots] STONE
    18:09:08 [INFO] [TownyPlots] STONE
    18:09:08 [INFO] [TownyPlots] STONE
    18:09:08 [INFO] [TownyPlots] STONE
    18:09:08 [INFO] [TownyPlots] STONE
    18:09:08 [INFO] [TownyPlots] STONE
    18:09:08 [INFO] [TownyPlots] STONE
    18:09:08 [INFO] [TownyPlots] STONE
    18:09:08 [INFO] [TownyPlots] STONE
    18:09:08 [INFO] [TownyPlots] STONE
    18:09:08 [INFO] [TownyPlots] STONE
    18:09:08 [INFO] [TownyPlots] STONE
    18:09:08 [INFO] [TownyPlots] DIRT
    18:09:08 [INFO] [TownyPlots] DIRT
    18:09:08 [INFO] [TownyPlots] DIRT
    18:09:08 [INFO] [TownyPlots] DIRT
    18:09:08 [INFO] [TownyPlots] DIRT
    18:09:08 [INFO] [TownyPlots] DIRT
    18:09:08 [INFO] [TownyPlots] DIRT
    18:09:08 [INFO] [TownyPlots] DIRT
    18:09:08 [INFO] [TownyPlots] DIRT
    18:09:08 [INFO] [TownyPlots] DIRT
    18:09:08 [INFO] [TownyPlots] DIRT
    18:09:08 [INFO] [TownyPlots] GRASS
    18:09:08 [INFO] [TownyPlots] SNOW
    18:09:08 [INFO] [TownyPlots] STONE
    18:09:08 [INFO] [TownyPlots] STONE
    18:09:08 [INFO] [TownyPlots] STONE
    18:09:08 [INFO] [TownyPlots] STONE
    18:09:08 [INFO] [TownyPlots] GRASS
    18:09:08 [INFO] [TownyPlots] GRASS
    18:09:08 [INFO] [TownyPlots] GRASS
    18:09:08 [INFO] [TownyPlots] GRASS
    18:09:08 [INFO] [TownyPlots] GRASS
    18:09:08 [INFO] [TownyPlots] DIRT
    18:09:08 [INFO] [TownyPlots] DIRT
    18:09:08 [INFO] [TownyPlots] DIRT
    18:09:08 [INFO] [TownyPlots] DIRT
    18:09:08 [INFO] [TownyPlots] DIRT
    18:09:08 [INFO] [TownyPlots] DIRT
    18:09:08 [INFO] [TownyPlots] SNOW
    18:09:08 [INFO] [Towny] Disabling Towny v0.88.0.0_(1.6.4)
    18:09:08 [INFO] [TownyPlots] AIR
    18:09:08 [INFO] [TownyPlots] SNOW
    18:09:08 [INFO] [TownyPlots] SNOW
    18:09:08 [INFO] [TownyPlots] GRASS
     
  5. Kleinerminer likes this.
  6. Offline

    Lolmewn

    Iterate from the minimum to the maximum - so instead of using x=l1.getBlockX(), use x=Math.min(l1.getBlockX(), l2.getBlockX()). Same for y and z of course.
     
    Kleinerminer likes this.
  7. I was searching for wooden planks, and there are some. I guess. :D

    Thanks for the tip! I found the problem: The coords are saved the wrong way. Don't ask me why.

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

    Lolmewn

    Why?!?! Aaaah I can't stand the tension!
     
  9. I had useless code saying
    Code:
    int z = (int)(loc.getZ() - (loc.getZ() % size));
    if(loc.getZ() < 0) int z = (int)(loc.getZ() + (loc.getZ() % size));
    
     
Thread Status:
Not open for further replies.

Share This Page