I want to regenerate a piece of land. It first has to save the blocks, and when I tell it to, regenerate. Right now, this is my code: Code: private World w; private Location spawn1, spawn2, spec; private HashMap<Location, Block> blocks = new HashMap<Location, Block>(); public Arena(Location first, Location two){ if(first.getBlockX() > two.getBlockX()){ lowestX = two.getBlockX(); highestX = first.getBlockX(); }else{ lowestX = first.getBlockX(); highestX = two.getBlockX(); } if(first.getBlockY() > two.getBlockY()){ lowestY = two.getBlockY(); highestY = first.getBlockY(); }else{ lowestY = first.getBlockY(); highestY = two.getBlockY(); } if(first.getBlockZ() > two.getBlockZ()){ lowestZ = two.getBlockZ(); highestZ = first.getBlockZ(); }else{ lowestZ = first.getBlockZ(); highestZ = two.getBlockZ(); } w = first.getWorld(); addBlocksToArray(); } private void addBlocksToArray() { for(int a = lowestX; a < highestX; a++){ for(int b = lowestY; b < highestY; b++){ for(int c = lowestZ; c < highestZ; c++){ Location loc = new Location(w, a, b, c); blocks.put(loc, Bukkit.getWorld(w.getName()).getBlockAt(loc)); System.out.println(a + "," + b + "," + c + " added."); } } } } public void regenArena(){ for(Location loc: blocks.keySet()){ loc.getBlock().setTypeId(blocks.get(loc).getTypeId()); } } It doesn't add any blocks in the addBlockToArray() Did I do something wrong? Or does anyone know how WorldEdit does this? I searched their code but it's so much :O Can't find it.. EDIT by Moderator: merged posts, please use the edit button instead of double posting.
1. You code ist not complete / correct, where did you declare lowestX, highestX, ... 2. Bukkit has a method: http://jd.bukkit.org/apidocs/org/bukkit/World.html#regenerateChunk(int, int) and WorldEdit used the Bukkit method: LocalWorld.regenerate(Region region, EditSession editSession) implementation search for "regenerate": https://github.com/sk89q/worldedit/...a/com/sk89q/worldedit/bukkit/BukkitWorld.java
I know the code is not complete, but I think the variables are obvious. The lowestX and highestX (and the others) are gotten from 2 locations, here: Code: public class Arena { private int lowestX, lowestY, lowestZ, highestX, highestY, highestZ; private World w; private Location spawn1, spawn2, spec; private HashMap<Location, Block> blocks = new HashMap<Location, Block>(); public Arena(Location first, Location two){ if(first.getBlockX() > two.getBlockX()){ lowestX = two.getBlockX(); highestX = first.getBlockX(); }else{ lowestX = first.getBlockX(); highestX = two.getBlockX(); } if(first.getBlockY() > two.getBlockY()){ lowestY = two.getBlockY(); highestY = first.getBlockY(); }else{ lowestY = first.getBlockY(); highestY = two.getBlockY(); } if(first.getBlockZ() > two.getBlockZ()){ lowestZ = two.getBlockZ(); highestZ = first.getBlockZ(); }else{ lowestZ = first.getBlockZ(); highestZ = two.getBlockZ(); } w = first.getWorld(); addBlocksToArray(); }
If by regenerating land you mean restoring the chunk to its original state, then http://jd.bukkit.org/apidocs/org/bukkit/World.html#regenerateChunk(int, int) just like IDragonFire said.
From what I have seen, you don't want to "regenerate" the blocks (with the world generator), but restore them from a set of saved blocks. Without actually scanning for mistakes in your code, I can tell you: Your concept won't work out. Block objects are real representations of the block they are assigned to. If you store them and try to get their id/type later, it will return the current value and not (as you probably intended) the one at a specific time. That's why there is the concept with BlockStates. Those are actually snapshots of the current state of the block as the BlockState was created (you can do that with block.getState()). It won't ever change, and you can set the block back to what it was using blockState.update(true). An example of the usage of BlockStates is applied in dinnerbone's small youtube tutorial series: http://www.youtube.com/user/dinnerbone