diff --git a/src/HMPlayer.java b/src/HMPlayer.java index 4c3df8dce..a7dcbfd03 100644 --- a/src/HMPlayer.java +++ b/src/HMPlayer.java @@ -34,15 +34,20 @@ public class HMPlayer extends LocalPlayer { * Stores the player. */ private Player player; + /** + * World. + */ + private HMWorld world; /** * Construct the object. * * @param player */ - public HMPlayer(ServerInterface server, Player player) { + public HMPlayer(ServerInterface server, HMWorld world, Player player) { super(server); this.player = player; + this.world = world; } /** @@ -123,7 +128,7 @@ public class HMPlayer extends LocalPlayer { * @return point */ public WorldVector getPosition() { - return new WorldVector(null, player.getX(), player.getY(), player.getZ()); + return new WorldVector(world, player.getX(), player.getY(), player.getZ()); } /** @@ -132,7 +137,7 @@ public class HMPlayer extends LocalPlayer { * @return point */ public LocalWorld getWorld() { - return null; + return world; } /** @@ -163,7 +168,7 @@ public class HMPlayer extends LocalPlayer { public boolean passThroughForwardWall(int range) { boolean foundNext = false; int searchDist = 0; - HitBlox hitBlox = new HitBlox(player,range, 0.2); + HitBlox hitBlox = new HitBlox(player, range, 0.2); LocalWorld world = getPosition().getWorld(); Block block; while ((block = hitBlox.getNextBlock()) != null) { @@ -174,7 +179,7 @@ public class HMPlayer extends LocalPlayer { if (block.getType() == 0) { if (foundNext) { Vector v = new Vector(block.getX(), block.getY() - 1, block.getZ()); - if (server.getBlockType(world, v) == 0) { + if (world.getBlockType(v) == 0) { setPosition(v.add(0.5, 0, 0.5)); return true; } diff --git a/src/HMServerInterface.java b/src/HMServerInterface.java index c10ded3d7..d2fd5a7ad 100644 --- a/src/HMServerInterface.java +++ b/src/HMServerInterface.java @@ -18,380 +18,12 @@ */ import com.sk89q.worldedit.*; -import com.sk89q.worldedit.blocks.BaseItemStack; -import java.util.logging.Logger; -import java.util.Random; /** * * @author sk89q */ public class HMServerInterface extends ServerInterface { - /** - * Logger. - */ - private final Logger logger = Logger.getLogger("Minecraft.WorldEdit"); - /** - * Random generator. - */ - private Random random = new Random(); - - /** - * Set block type. - * - * @param pt - * @param type - * @return - */ - public boolean setBlockType(LocalWorld world, Vector pt, int type) { - // Can't set colored cloth or crash - if ((type >= 21 && type <= 34) || type == 36) { - return false; - } - return etc.getServer().setBlockAt(type, pt.getBlockX(), pt.getBlockY(), - pt.getBlockZ()); - } - - /** - * Get block type. - * - * @param pt - * @return - */ - public int getBlockType(LocalWorld world, Vector pt) { - return etc.getServer().getBlockIdAt(pt.getBlockX(), pt.getBlockY(), - pt.getBlockZ()); - } - - /** - * Set block data. - * - * @param pt - * @param data - * @return - */ - public void setBlockData(LocalWorld world, Vector pt, int data) { - etc.getServer().setBlockData(pt.getBlockX(), pt.getBlockY(), - pt.getBlockZ(), data); - } - - /** - * Get block data. - * - * @param pt - * @return - */ - public int getBlockData(LocalWorld world, Vector pt) { - return etc.getServer().getBlockData(pt.getBlockX(), pt.getBlockY(), - pt.getBlockZ()); - } - - /** - * Set sign text. - * - * @param pt - * @param text - */ - public void setSignText(LocalWorld world, Vector pt, String[] text) { - Sign signData = (Sign)etc.getServer().getComplexBlock( - pt.getBlockX(), pt.getBlockY(), pt.getBlockZ()); - if (signData == null) { - return; - } - for (byte i = 0; i < 4; i++) { - signData.setText(i, text[i]); - } - signData.update(); - } - - /** - * Get sign text. - * - * @param pt - * @return - */ - public String[] getSignText(LocalWorld world, Vector pt) { - Sign signData = (Sign)etc.getServer().getComplexBlock( - pt.getBlockX(), pt.getBlockY(), pt.getBlockZ()); - if (signData == null) { - return new String[]{"", "", "", ""}; - } - String[] text = new String[4]; - for (byte i = 0; i < 4; i++) { - text[i] = signData.getText(i); - } - return text; - } - - /** - * Gets the contents of chests. Will return null if the chest does not - * really exist or it is the second block for a double chest. - * - * @param pt - * @return - */ - public BaseItemStack[] getChestContents(LocalWorld world, Vector pt) { - ComplexBlock cblock = etc.getServer().getOnlyComplexBlock( - pt.getBlockX(), pt.getBlockY(), pt.getBlockZ()); - - BaseItemStack[] items; - Item[] nativeItems; - - if (cblock instanceof Chest) { - Chest chest = (Chest)cblock; - nativeItems = chest.getContents(); - } else { - return null; - } - - items = new BaseItemStack[nativeItems.length]; - - for (byte i = 0; i < nativeItems.length; i++) { - Item item = nativeItems[i]; - - if (item != null) { - items[i] = new BaseItemStack((short)item.getItemId(), - item.getAmount(), (short)item.getDamage()); - } - } - - return items; - } - - /** - * Sets a chest slot. - * - * @param pt - * @param contents - * @return - */ - public boolean setChestContents(LocalWorld world, Vector pt, - BaseItemStack[] contents) { - - ComplexBlock cblock = etc.getServer().getOnlyComplexBlock( - pt.getBlockX(), pt.getBlockY(), pt.getBlockZ()); - - if (cblock instanceof Chest) { - Chest chest = (Chest)cblock; - Item[] nativeItems = new Item[contents.length]; - - for (int i = 0; i < contents.length; i++) { - BaseItemStack item = contents[i]; - - if (item != null) { - Item nativeItem = - new Item(item.getID(), item.getAmount()); - nativeItem.setDamage(item.getDamage()); - nativeItems[i] = nativeItem; - } - } - - setContents(chest, nativeItems); - } - - return false; - } - - /** - * Clear a chest's contents. - * - * @param pt - */ - public boolean clearChest(LocalWorld world, Vector pt) { - ComplexBlock cblock = etc.getServer().getOnlyComplexBlock( - pt.getBlockX(), pt.getBlockY(), pt.getBlockZ()); - - if (cblock instanceof Chest) { - Chest chest = (Chest)cblock; - chest.clearContents(); - chest.update(); - return true; - } - - - return false; - } - - /** - * Set the contents of an ItemArray. - * - * @param itemArray - * @param contents - */ - private void setContents(ItemArray itemArray, Item[] contents) { - int size = contents.length; - - for (int i = 0; i < size; i++) { - if (contents[i] == null) { - itemArray.removeItem(i); - } else { - itemArray.setSlot(contents[i].getItemId(), - contents[i].getAmount(), contents[i].getDamage(), i); - } - } - } - - /** - * Checks if a mob type is valid. - * - * @param type - * @return - */ - public boolean isValidMobType(String type) { - return Mob.isValid(type); - } - - /** - * Set mob spawner mob type. - * - * @param pt - * @param mobType - */ - public void setMobSpawnerType(LocalWorld world, Vector pt, String mobType) { - ComplexBlock cblock = etc.getServer().getComplexBlock( - pt.getBlockX(), pt.getBlockY(), pt.getBlockZ()); - - if (!(cblock instanceof MobSpawner)) { - return; - } - - MobSpawner mobSpawner = (MobSpawner)cblock; - mobSpawner.setSpawn(mobType); - mobSpawner.update(); - } - - /** - * Get mob spawner mob type. May return an empty string. - * - * @param pt - * @param mobType - */ - public String getMobSpawnerType(LocalWorld world, Vector pt) { - try { - return MinecraftServerInterface.getMobSpawnerType(pt); - } catch (Throwable t) { - logger.severe("Failed to get mob spawner type (do you need to update WorldEdit due to a Minecraft update?): " - + t.getMessage()); - return ""; - } - } - - /** - * Generate a tree at a location. - * - * @param pt - * @return - */ - public boolean generateTree(EditSession editSession, LocalWorld world, Vector pt) { - try { - return MinecraftServerInterface.generateTree(editSession, pt); - } catch (Throwable t) { - logger.severe("Failed to create tree (do you need to update WorldEdit due to a Minecraft update?): " - + t.getMessage()); - return false; - } - } - - /** - * Drop an item. - * - * @param pt - * @param type - * @param count - * @param times - */ - public void dropItem(LocalWorld world, Vector pt, int type, int count, int times) { - for (int i = 0; i < times; i++) { - etc.getServer().dropItem(pt.getBlockX(), pt.getBlockY(), pt.getBlockZ(), - type, count); - } - } - - /** - * Drop an item. - * - * @param pt - * @param type - * @param count - * @param times - */ - public void dropItem(LocalWorld world, Vector pt, int type, int count) { - etc.getServer().dropItem(pt.getBlockX(), pt.getBlockY(), pt.getBlockZ(), - type, count); - } - - /** - * Drop an item. - * - * @param pt - * @param type - * @param count - * @param times - */ - public void dropItem(LocalWorld world, Vector pt, int type) { - etc.getServer().dropItem(pt.getBlockX(), pt.getBlockY(), pt.getBlockZ(), - type, 1); - } - - /** - * Simulate a block being mined. - * - * @param pt - */ - public void simulateBlockMine(LocalWorld world, Vector pt) { - int type = getBlockType(world, pt); - //setBlockType(world, pt, 0); - - if (type == 1) { dropItem(world, pt, 4); } // Stone - else if (type == 2) { dropItem(world, pt, 3); } // Grass - else if (type == 7) { } // Bedrock - else if (type == 8) { } // Water - else if (type == 9) { } // Water - else if (type == 10) { } // Lava - else if (type == 11) { } // Lava - else if (type == 13) { // Gravel - dropItem(world, pt, type); - - if (random.nextDouble() >= 0.9) { - dropItem(world, pt, 318); - } - } - else if (type == 16) { dropItem(world, pt, 263); } // Coal ore - else if (type == 18) { // Leaves - if (random.nextDouble() > 0.95) { - dropItem(world, pt, 6); - } - } - else if (type == 20) { } // Glass - else if (type == 43) { dropItem(world, pt, 44); } // Double step - else if (type == 47) { } // Bookshelves - else if (type == 51) { } // Fire - else if (type == 52) { } // Mob spawner - else if (type == 53) { dropItem(world, pt, 5); } // Wooden stairs - else if (type == 55) { dropItem(world, pt, 331); } // Redstone wire - else if (type == 56) { dropItem(world, pt, 264); } // Diamond ore - else if (type == 59) { dropItem(world, pt, 295); } // Crops - else if (type == 60) { dropItem(world, pt, 3); } // Soil - else if (type == 62) { dropItem(world, pt, 61); } // Furnace - else if (type == 63) { dropItem(world, pt, 323); } // Sign post - else if (type == 64) { dropItem(world, pt, 324); } // Wood door - else if (type == 67) { dropItem(world, pt, 4); } // Cobblestone stairs - else if (type == 68) { dropItem(world, pt, 323); } // Wall sign - else if (type == 71) { dropItem(world, pt, 330); } // Iron door - else if (type == 73) { dropItem(world, pt, 331, 1, 4); } // Redstone ore - else if (type == 74) { dropItem(world, pt, 331, 1, 4); } // Glowing redstone ore - else if (type == 75) { dropItem(world, pt, 76); } // Redstone torch - else if (type == 78) { } // Snow - else if (type == 79) { } // Ice - else if (type == 82) { dropItem(world, pt, 337, 1, 4); } // Clay - else if (type == 83) { dropItem(world, pt, 338); } // Reed - else if (type == 89) { dropItem(world, pt, 348); } // Lightstone - else if (type == 90) { } // Portal - else if (type != 0) { - dropItem(world, pt, type); - } - } - /** * Resolves an item name to its ID. * @@ -403,24 +35,12 @@ public class HMServerInterface extends ServerInterface { } /** - * Kill mobs in an area. + * Checks if a mob type is valid. * - * @param origin - * @param radius + * @param type * @return */ - public int killMobs(LocalWorld world, Vector origin, int radius) { - int killed = 0; - - for (Mob mob : etc.getServer().getMobList()) { - Vector mobPos = new Vector(mob.getX(), mob.getY(), mob.getZ()); - if (mob.getHealth() > 0 - && (radius == -1 || mobPos.distance(origin) <= radius)) { - mob.setHealth(0); - killed++; - } - } - - return killed; + public boolean isValidMobType(String type) { + return Mob.isValid(type); } } diff --git a/src/HMWorld.java b/src/HMWorld.java new file mode 100644 index 000000000..3c0d3be96 --- /dev/null +++ b/src/HMWorld.java @@ -0,0 +1,419 @@ +// $Id$ +/* + * WorldEdit + * Copyright (C) 2010 sk89q + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +import java.util.Random; +import java.util.logging.Logger; +import com.sk89q.worldedit.EditSession; +import com.sk89q.worldedit.LocalWorld; +import com.sk89q.worldedit.Vector; +import com.sk89q.worldedit.blocks.BaseItemStack; + +/** + * World for hMod. + * + * @author sk89q + */ +public class HMWorld extends LocalWorld { + /** + * Logger. + */ + private final Logger logger = Logger.getLogger("Minecraft.WorldEdit"); + /** + * Random generator. + */ + private Random random = new Random(); + + /** + * Set block type. + * + * @param pt + * @param type + * @return + */ + public boolean setBlockType(Vector pt, int type) { + // Can't set colored cloth or crash + if ((type >= 21 && type <= 34) || type == 36) { + return false; + } + return etc.getServer().setBlockAt(type, pt.getBlockX(), pt.getBlockY(), + pt.getBlockZ()); + } + + /** + * Get block type. + * + * @param pt + * @return + */ + public int getBlockType(Vector pt) { + return etc.getServer().getBlockIdAt(pt.getBlockX(), pt.getBlockY(), + pt.getBlockZ()); + } + + /** + * Set block data. + * + * @param pt + * @param data + * @return + */ + public void setBlockData(Vector pt, int data) { + etc.getServer().setBlockData(pt.getBlockX(), pt.getBlockY(), + pt.getBlockZ(), data); + } + + /** + * Get block data. + * + * @param pt + * @return + */ + public int getBlockData(Vector pt) { + return etc.getServer().getBlockData(pt.getBlockX(), pt.getBlockY(), + pt.getBlockZ()); + } + + /** + * Set sign text. + * + * @param pt + * @param text + */ + public void setSignText(Vector pt, String[] text) { + Sign signData = (Sign)etc.getServer().getComplexBlock( + pt.getBlockX(), pt.getBlockY(), pt.getBlockZ()); + if (signData == null) { + return; + } + for (byte i = 0; i < 4; i++) { + signData.setText(i, text[i]); + } + signData.update(); + } + + /** + * Get sign text. + * + * @param pt + * @return + */ + public String[] getSignText(Vector pt) { + Sign signData = (Sign)etc.getServer().getComplexBlock( + pt.getBlockX(), pt.getBlockY(), pt.getBlockZ()); + if (signData == null) { + return new String[]{"", "", "", ""}; + } + String[] text = new String[4]; + for (byte i = 0; i < 4; i++) { + text[i] = signData.getText(i); + } + return text; + } + + /** + * Gets the contents of chests. Will return null if the chest does not + * really exist or it is the second block for a double chest. + * + * @param pt + * @return + */ + public BaseItemStack[] getChestContents(Vector pt) { + ComplexBlock cblock = etc.getServer().getOnlyComplexBlock( + pt.getBlockX(), pt.getBlockY(), pt.getBlockZ()); + + BaseItemStack[] items; + Item[] nativeItems; + + if (cblock instanceof Chest) { + Chest chest = (Chest)cblock; + nativeItems = chest.getContents(); + } else { + return null; + } + + items = new BaseItemStack[nativeItems.length]; + + for (byte i = 0; i < nativeItems.length; i++) { + Item item = nativeItems[i]; + + if (item != null) { + items[i] = new BaseItemStack((short)item.getItemId(), + item.getAmount(), (short)item.getDamage()); + } + } + + return items; + } + + /** + * Sets a chest slot. + * + * @param pt + * @param contents + * @return + */ + public boolean setChestContents(Vector pt, + BaseItemStack[] contents) { + + ComplexBlock cblock = etc.getServer().getOnlyComplexBlock( + pt.getBlockX(), pt.getBlockY(), pt.getBlockZ()); + + if (cblock instanceof Chest) { + Chest chest = (Chest)cblock; + Item[] nativeItems = new Item[contents.length]; + + for (int i = 0; i < contents.length; i++) { + BaseItemStack item = contents[i]; + + if (item != null) { + Item nativeItem = + new Item(item.getID(), item.getAmount()); + nativeItem.setDamage(item.getDamage()); + nativeItems[i] = nativeItem; + } + } + + setContents(chest, nativeItems); + } + + return false; + } + + /** + * Clear a chest's contents. + * + * @param pt + */ + public boolean clearChest(Vector pt) { + ComplexBlock cblock = etc.getServer().getOnlyComplexBlock( + pt.getBlockX(), pt.getBlockY(), pt.getBlockZ()); + + if (cblock instanceof Chest) { + Chest chest = (Chest)cblock; + chest.clearContents(); + chest.update(); + return true; + } + + + return false; + } + + /** + * Set the contents of an ItemArray. + * + * @param itemArray + * @param contents + */ + private void setContents(ItemArray itemArray, Item[] contents) { + int size = contents.length; + + for (int i = 0; i < size; i++) { + if (contents[i] == null) { + itemArray.removeItem(i); + } else { + itemArray.setSlot(contents[i].getItemId(), + contents[i].getAmount(), contents[i].getDamage(), i); + } + } + } + + /** + * Set mob spawner mob type. + * + * @param pt + * @param mobType + */ + public void setMobSpawnerType(Vector pt, String mobType) { + ComplexBlock cblock = etc.getServer().getComplexBlock( + pt.getBlockX(), pt.getBlockY(), pt.getBlockZ()); + + if (!(cblock instanceof MobSpawner)) { + return; + } + + MobSpawner mobSpawner = (MobSpawner)cblock; + mobSpawner.setSpawn(mobType); + mobSpawner.update(); + } + + /** + * Get mob spawner mob type. May return an empty string. + * + * @param pt + * @param mobType + */ + public String getMobSpawnerType(Vector pt) { + try { + return MinecraftServerInterface.getMobSpawnerType(pt); + } catch (Throwable t) { + logger.severe("Failed to get mob spawner type (do you need to update WorldEdit due to a Minecraft update?): " + + t.getMessage()); + return ""; + } + } + + /** + * Generate a tree at a location. + * + * @param pt + * @return + */ + public boolean generateTree(EditSession editSession, Vector pt) { + try { + return MinecraftServerInterface.generateTree(editSession, pt); + } catch (Throwable t) { + logger.severe("Failed to create tree (do you need to update WorldEdit due to a Minecraft update?): " + + t.getMessage()); + return false; + } + } + + /** + * Drop an item. + * + * @param pt + * @param type + * @param count + * @param times + */ + public void dropItem(Vector pt, int type, int count, int times) { + for (int i = 0; i < times; i++) { + etc.getServer().dropItem(pt.getBlockX(), pt.getBlockY(), pt.getBlockZ(), + type, count); + } + } + + /** + * Drop an item. + * + * @param pt + * @param type + * @param count + * @param times + */ + public void dropItem(Vector pt, int type, int count) { + etc.getServer().dropItem(pt.getBlockX(), pt.getBlockY(), pt.getBlockZ(), + type, count); + } + + /** + * Drop an item. + * + * @param pt + * @param type + * @param count + * @param times + */ + public void dropItem(Vector pt, int type) { + etc.getServer().dropItem(pt.getBlockX(), pt.getBlockY(), pt.getBlockZ(), + type, 1); + } + + /** + * Simulate a block being mined. + * + * @param pt + */ + public void simulateBlockMine(Vector pt) { + int type = getBlockType(pt); + //setBlockType(pt, 0); + + if (type == 1) { dropItem(pt, 4); } // Stone + else if (type == 2) { dropItem(pt, 3); } // Grass + else if (type == 7) { } // Bedrock + else if (type == 8) { } // Water + else if (type == 9) { } // Water + else if (type == 10) { } // Lava + else if (type == 11) { } // Lava + else if (type == 13) { // Gravel + dropItem(pt, type); + + if (random.nextDouble() >= 0.9) { + dropItem(pt, 318); + } + } + else if (type == 16) { dropItem(pt, 263); } // Coal ore + else if (type == 18) { // Leaves + if (random.nextDouble() > 0.95) { + dropItem(pt, 6); + } + } + else if (type == 20) { } // Glass + else if (type == 43) { dropItem(pt, 44); } // Double step + else if (type == 47) { } // Bookshelves + else if (type == 51) { } // Fire + else if (type == 52) { } // Mob spawner + else if (type == 53) { dropItem(pt, 5); } // Wooden stairs + else if (type == 55) { dropItem(pt, 331); } // Redstone wire + else if (type == 56) { dropItem(pt, 264); } // Diamond ore + else if (type == 59) { dropItem(pt, 295); } // Crops + else if (type == 60) { dropItem(pt, 3); } // Soil + else if (type == 62) { dropItem(pt, 61); } // Furnace + else if (type == 63) { dropItem(pt, 323); } // Sign post + else if (type == 64) { dropItem(pt, 324); } // Wood door + else if (type == 67) { dropItem(pt, 4); } // Cobblestone stairs + else if (type == 68) { dropItem(pt, 323); } // Wall sign + else if (type == 71) { dropItem(pt, 330); } // Iron door + else if (type == 73) { dropItem(pt, 331, 1, 4); } // Redstone ore + else if (type == 74) { dropItem(pt, 331, 1, 4); } // Glowing redstone ore + else if (type == 75) { dropItem(pt, 76); } // Redstone torch + else if (type == 78) { } // Snow + else if (type == 79) { } // Ice + else if (type == 82) { dropItem(pt, 337, 1, 4); } // Clay + else if (type == 83) { dropItem(pt, 338); } // Reed + else if (type == 89) { dropItem(pt, 348); } // Lightstone + else if (type == 90) { } // Portal + else if (type != 0) { + dropItem(pt, type); + } + } + + /** + * Kill mobs in an area. + * + * @param origin + * @param radius + * @return + */ + public int killMobs(Vector origin, int radius) { + int killed = 0; + + for (Mob mob : etc.getServer().getMobList()) { + Vector mobPos = new Vector(mob.getX(), mob.getY(), mob.getZ()); + if (mob.getHealth() > 0 + && (radius == -1 || mobPos.distance(origin) <= radius)) { + mob.setHealth(0); + killed++; + } + } + + return killed; + } + + @Override + public boolean equals(Object other) { + return other instanceof HMWorld; + } + + @Override + public int hashCode() { + return 1; + } +} diff --git a/src/HMWorldEditListener.java b/src/HMWorldEditListener.java index 91a9f57a1..e997b166f 100755 --- a/src/HMWorldEditListener.java +++ b/src/HMWorldEditListener.java @@ -39,6 +39,10 @@ public class HMWorldEditListener extends PluginListener { * will go through. */ private ServerInterface server; + /** + * A copy of a world, not that hMod/MC supports multiple worlds. + */ + private HMWorld world; /** * Constructs an instance. @@ -50,6 +54,7 @@ public class HMWorldEditListener extends PluginListener { config = new HMConfiguration(); controller = new WorldEditController(server, config); + world = new HMWorld(); } /** @@ -83,10 +88,9 @@ public class HMWorldEditListener extends PluginListener { @SuppressWarnings("deprecation") public boolean onBlockCreate(Player player, Block blockPlaced, Block blockClicked, int itemInHand) { - Vector pos = new Vector(blockClicked.getX(), - blockClicked.getY(), - blockClicked.getZ()); - return controller.handleBlockRightClick(wrapPlayer(player), null, pos); + WorldVector pos = new WorldVector(world, blockClicked.getX(), + blockClicked.getY(), blockClicked.getZ()); + return controller.handleBlockRightClick(wrapPlayer(player), pos); } /** @@ -99,10 +103,9 @@ public class HMWorldEditListener extends PluginListener { */ @Override public boolean onBlockDestroy(Player player, Block blockClicked) { - Vector pos = new Vector(blockClicked.getX(), - blockClicked.getY(), - blockClicked.getZ()); - return controller.handleBlockLeftClick(wrapPlayer(player), null, pos); + WorldVector pos = new WorldVector(world, blockClicked.getX(), + blockClicked.getY(), blockClicked.getZ()); + return controller.handleBlockLeftClick(wrapPlayer(player), pos); } /** @@ -167,6 +170,6 @@ public class HMWorldEditListener extends PluginListener { * @return */ private LocalPlayer wrapPlayer(Player player) { - return new HMPlayer(server, player); + return new HMPlayer(server, world, player); } } diff --git a/src/com/sk89q/worldedit/EditSession.java b/src/com/sk89q/worldedit/EditSession.java index 1d2f4c6a0..39d9f143f 100755 --- a/src/com/sk89q/worldedit/EditSession.java +++ b/src/com/sk89q/worldedit/EditSession.java @@ -50,10 +50,6 @@ public class EditSession { */ private static Random prng = new Random(); - /** - * Server interface. - */ - private ServerInterface server; /** * World. */ @@ -62,23 +58,28 @@ public class EditSession { /** * Stores the original blocks before modification. */ - private DoubleArrayList original = new DoubleArrayList( + private DoubleArrayList original = + new DoubleArrayList( true); /** * Stores the current blocks. */ - private DoubleArrayList current = new DoubleArrayList( + private DoubleArrayList current = + new DoubleArrayList( false); /** * Blocks that should be placed before last. */ - private DoubleArrayList queueAfter = new DoubleArrayList( + private DoubleArrayList queueAfter = + new DoubleArrayList( false); /** * Blocks that should be placed last. */ - private DoubleArrayList queueLast = new DoubleArrayList( + private DoubleArrayList queueLast = + new DoubleArrayList( false); + /** * The maximum number of blocks to change at a time. If this number is * exceeded, a MaxChangedBlocksException exception will be raised. -1 @@ -112,7 +113,6 @@ public class EditSession { } this.maxBlocks = maxBlocks; - this.server = server; this.world = world; } @@ -131,7 +131,6 @@ public class EditSession { this.maxBlocks = maxBlocks; this.blockBag = blockBag; - this.server = server; this.world = world; } @@ -149,14 +148,14 @@ public class EditSession { } // Clear the chest so that it doesn't drop items - if (server.getBlockType(world, pt) == 54 && blockBag == null) { - server.clearChest(world, pt); + if (world.getBlockType(pt) == 54 && blockBag == null) { + world.clearChest(pt); } int id = block.getID(); if (blockBag != null) { - int existing = server.getBlockType(world, pt); + int existing = world.getBlockType(pt); if (id > 0) { try { @@ -177,25 +176,25 @@ public class EditSession { } } - boolean result = server.setBlockType(world, pt, id); + boolean result = world.setBlockType(pt, id); if (id != 0) { if (BlockType.usesData(id)) { - server.setBlockData(world, pt, block.getData()); + world.setBlockData(pt, block.getData()); } // Signs if (block instanceof SignBlock) { SignBlock signBlock = (SignBlock) block; String[] text = signBlock.getText(); - server.setSignText(world, pt, text); + world.setSignText(pt, text); // Chests } else if (block instanceof ChestBlock && blockBag == null) { ChestBlock chestBlock = (ChestBlock) block; - server.setChestContents(world, pt, chestBlock.getItems()); + world.setChestContents(pt, chestBlock.getItems()); // Mob spawners } else if (block instanceof MobSpawnerBlock) { MobSpawnerBlock mobSpawnerblock = (MobSpawnerBlock) block; - server.setMobSpawnerType(world, pt, mobSpawnerblock.getMobType()); + world.setMobSpawnerType(pt, mobSpawnerblock.getMobType()); } } @@ -298,21 +297,20 @@ public class EditSession { * @return BaseBlock */ public BaseBlock rawGetBlock(Vector pt) { - int type = server.getBlockType(world, pt); - int data = server.getBlockData(world, pt); + int type = world.getBlockType(pt); + int data = world.getBlockData(pt); // Sign if (type == 63 || type == 68) { - String[] text = server.getSignText(world, pt); + String[] text = world.getSignText(pt); return new SignBlock(type, data, text); // Chest } else if (type == 54) { - BaseItemStack[] items = server.getChestContents(world, pt); + BaseItemStack[] items = world.getChestContents(pt); return new ChestBlock(data, items); // Mob spawner } else if (type == 52) { - return new MobSpawnerBlock(data, - server.getMobSpawnerType(world, pt)); + return new MobSpawnerBlock(data, world.getMobSpawnerType(pt)); } else { return new BaseBlock(type, data); } @@ -1813,8 +1811,7 @@ public class EditSession { if (pineTree) { makePineTree(new Vector(x, y + 1, z)); } else { - server.generateTree(this, world, - new Vector(x, y + 1, z)); + world.generateTree(this, new Vector(x, y + 1, z)); } affected++; break; diff --git a/src/com/sk89q/worldedit/LocalPlayer.java b/src/com/sk89q/worldedit/LocalPlayer.java index d776c43a4..e1fb89cea 100644 --- a/src/com/sk89q/worldedit/LocalPlayer.java +++ b/src/com/sk89q/worldedit/LocalPlayer.java @@ -83,8 +83,7 @@ public abstract class LocalPlayer { byte free = 0; while (y <= 129) { - if (BlockType.canPassThrough(server.getBlockType(world, - new Vector(x, y, z)))) { + if (BlockType.canPassThrough(world.getBlockType(new Vector(x, y, z)))) { free++; } else { free = 0; @@ -128,7 +127,7 @@ public abstract class LocalPlayer { byte spots = 0; while (y <= 129) { - if (BlockType.canPassThrough(server.getBlockType(world, new Vector(x, y, z)))) { + if (BlockType.canPassThrough(world.getBlockType(new Vector(x, y, z)))) { free++; } else { free = 0; @@ -137,7 +136,7 @@ public abstract class LocalPlayer { if (free == 2) { spots++; if (spots == 2) { - int type = server.getBlockType(world, new Vector(x, y - 2, z)); + int type = world.getBlockType(new Vector(x, y - 2, z)); // Don't get put in lava! if (type == 10 || type == 11) { @@ -170,7 +169,7 @@ public abstract class LocalPlayer { byte free = 0; while (y >= 1) { - if (BlockType.canPassThrough(server.getBlockType(world, new Vector(x, y, z)))) { + if (BlockType.canPassThrough(world.getBlockType(new Vector(x, y, z)))) { free++; } else { free = 0; @@ -181,7 +180,7 @@ public abstract class LocalPlayer { // lightly and also check to see if there's something to // stand upon while (y >= 0) { - int type = server.getBlockType(world, new Vector(x, y, z)); + int type = world.getBlockType(new Vector(x, y, z)); // Don't want to end up in lava if (type != 0 && type != 10 && type != 11) { @@ -217,15 +216,15 @@ public abstract class LocalPlayer { LocalWorld world = getPosition().getWorld(); // No free space above - if (server.getBlockType(world, new Vector(x, y, z)) != 0) { + if (world.getBlockType(new Vector(x, y, z)) != 0) { return false; } while (y <= 127) { // Found a ceiling! - if (!BlockType.canPassThrough(server.getBlockType(world, new Vector(x, y, z)))) { + if (!BlockType.canPassThrough(world.getBlockType(new Vector(x, y, z)))) { int platformY = Math.max(initialY, y - 3 - clearance); - server.setBlockType(world, new Vector(x, platformY, z), + world.setBlockType(new Vector(x, platformY, z), BlockType.GLASS.getID()); setPosition(new Vector(x + 0.5, platformY + 1, z + 0.5)); return true; @@ -253,12 +252,12 @@ public abstract class LocalPlayer { LocalWorld world = getPosition().getWorld(); while (y <= 129) { - if (!BlockType.canPassThrough(server.getBlockType(world, new Vector(x, y, z)))) { + if (!BlockType.canPassThrough(world.getBlockType(new Vector(x, y, z)))) { break; // Hit something } else if (y > maxY + 1) { break; } else if (y == maxY + 1) { - server.setBlockType(world, new Vector(x, y - 2, z), + world.setBlockType(new Vector(x, y - 2, z), BlockType.GLASS.getID()); setPosition(new Vector(x + 0.5, y - 1, z + 0.5)); return true; diff --git a/src/com/sk89q/worldedit/LocalWorld.java b/src/com/sk89q/worldedit/LocalWorld.java index 74bda7fef..59c4956a5 100644 --- a/src/com/sk89q/worldedit/LocalWorld.java +++ b/src/com/sk89q/worldedit/LocalWorld.java @@ -19,12 +19,163 @@ package com.sk89q.worldedit; +import com.sk89q.worldedit.blocks.BaseItemStack; + /** * Represents a world. * * @author sk89q */ public abstract class LocalWorld { + /** + * Set block type. + * + * @param pt + * @param type + * @return + */ + public abstract boolean setBlockType(Vector pt, int type); + + /** + * Get block type. + * + * @param pt + * @return + */ + public abstract int getBlockType(Vector pt); + + /** + * Set block data. + * + * @param pt + * @param data + * @return + */ + public abstract void setBlockData(Vector pt, int data); + + /** + * Get block data. + * + * @param pt + * @return + */ + public abstract int getBlockData(Vector pt); + + /** + * Set sign text. + * + * @param pt + * @param text + */ + public abstract void setSignText(Vector pt, String[] text); + + /** + * Get sign text. + * + * @param pt + * @return + */ + public abstract String[] getSignText(Vector pt); + + /** + * Gets the contents of chests. Will return null if the chest does not + * really exist or it is the second block for a double chest. + * + * @param pt + * @return + */ + public abstract BaseItemStack[] getChestContents(Vector pt); + + /** + * Sets a chest slot. + * + * @param pt + * @param contents + * @return + */ + public abstract boolean setChestContents(Vector pt, + BaseItemStack[] contents); + + /** + * Clear a chest's contents. + * + * @param pt + */ + public abstract boolean clearChest(Vector pt); + + /** + * Set mob spawner mob type. + * + * @param pt + * @param mobType + */ + public abstract void setMobSpawnerType(Vector pt, + String mobType); + + /** + * Get mob spawner mob type. May return an empty string. + * + * @param pt + * @param mobType + */ + public abstract String getMobSpawnerType(Vector pt); + + /** + * Generate a tree at a location. + * + * @param pt + * @return + */ + public abstract boolean generateTree(EditSession editSession, Vector pt); + + /** + * Drop an item. + * + * @param pt + * @param type + * @param count + * @param times + */ + public abstract void dropItem(Vector pt, int type, + int count, int times); + + /** + * Drop an item. + * + * @param pt + * @param type + * @param count + * @param times + */ + public abstract void dropItem(Vector pt, int type, + int count); + + /** + * Drop an item. + * + * @param pt + * @param type + * @param count + * @param times + */ + public abstract void dropItem(Vector pt, int type); + + /** + * Simulate a block being mined. + * + * @param pt + */ + public abstract void simulateBlockMine(Vector pt); + + /** + * Kill mobs in an area. + * + * @param origin + * @param radius + * @return + */ + public abstract int killMobs(Vector origin, int radius); + /** * Compare if the other world is equal. * diff --git a/src/com/sk89q/worldedit/ServerInterface.java b/src/com/sk89q/worldedit/ServerInterface.java index 9934e69bc..44121cbd8 100644 --- a/src/com/sk89q/worldedit/ServerInterface.java +++ b/src/com/sk89q/worldedit/ServerInterface.java @@ -19,162 +19,11 @@ package com.sk89q.worldedit; -import com.sk89q.worldedit.blocks.BaseItemStack; - /** * * @author sk89q */ public abstract class ServerInterface { - /** - * Set block type. - * - * @param pt - * @param type - * @return - */ - public abstract boolean setBlockType(LocalWorld world, Vector pt, int type); - - /** - * Get block type. - * - * @param pt - * @return - */ - public abstract int getBlockType(LocalWorld world, Vector pt); - - /** - * Set block data. - * - * @param pt - * @param data - * @return - */ - public abstract void setBlockData(LocalWorld world, Vector pt, int data); - - /** - * Get block data. - * - * @param pt - * @return - */ - public abstract int getBlockData(LocalWorld world, Vector pt); - - /** - * Set sign text. - * - * @param pt - * @param text - */ - public abstract void setSignText(LocalWorld world, Vector pt, String[] text); - - /** - * Get sign text. - * - * @param pt - * @return - */ - public abstract String[] getSignText(LocalWorld world, Vector pt); - - /** - * Gets the contents of chests. Will return null if the chest does not - * really exist or it is the second block for a double chest. - * - * @param pt - * @return - */ - public abstract BaseItemStack[] getChestContents(LocalWorld world, Vector pt); - - /** - * Sets a chest slot. - * - * @param pt - * @param contents - * @return - */ - public abstract boolean setChestContents(LocalWorld world, Vector pt, - BaseItemStack[] contents); - - /** - * Clear a chest's contents. - * - * @param pt - */ - public abstract boolean clearChest(LocalWorld world, Vector pt); - - /** - * Checks if a mob type is valid. - * - * @param type - * @return - */ - public abstract boolean isValidMobType(String type); - - /** - * Set mob spawner mob type. - * - * @param pt - * @param mobType - */ - public abstract void setMobSpawnerType(LocalWorld world, Vector pt, - String mobType); - - /** - * Get mob spawner mob type. May return an empty string. - * - * @param pt - * @param mobType - */ - public abstract String getMobSpawnerType(LocalWorld world, Vector pt); - - /** - * Generate a tree at a location. - * - * @param pt - * @return - */ - public abstract boolean generateTree(EditSession editSession, - LocalWorld world, Vector pt); - - /** - * Drop an item. - * - * @param pt - * @param type - * @param count - * @param times - */ - public abstract void dropItem(LocalWorld world, Vector pt, int type, - int count, int times); - - /** - * Drop an item. - * - * @param pt - * @param type - * @param count - * @param times - */ - public abstract void dropItem(LocalWorld world, Vector pt, int type, - int count); - - /** - * Drop an item. - * - * @param pt - * @param type - * @param count - * @param times - */ - public abstract void dropItem(LocalWorld world, Vector pt, int type); - - /** - * Simulate a block being mined. - * - * @param pt - */ - public abstract void simulateBlockMine(LocalWorld world, Vector pt); - /** * Resolves an item name to its ID. * @@ -182,13 +31,12 @@ public abstract class ServerInterface { * @return */ public abstract int resolveItem(String name); - + /** - * Kill mobs in an area. + * Checks if a mob type is valid. * - * @param origin - * @param radius + * @param type * @return */ - public abstract int killMobs(LocalWorld world, Vector origin, int radius); + public abstract boolean isValidMobType(String type); } diff --git a/src/com/sk89q/worldedit/WorldEditController.java b/src/com/sk89q/worldedit/WorldEditController.java index d08902ac5..a0744a711 100644 --- a/src/com/sk89q/worldedit/WorldEditController.java +++ b/src/com/sk89q/worldedit/WorldEditController.java @@ -436,6 +436,8 @@ public class WorldEditController { logger.log(Level.INFO, "WorldEdit: " + player.getName() + ": " + joinString(split, " ")); } + + LocalWorld world = player.getPosition().getWorld(); // Jump to the first free position if (split[0].equalsIgnoreCase("/unstuck")) { @@ -1359,7 +1361,7 @@ public class WorldEditController { Math.max(1, Integer.parseInt(split[1])) : -1; Vector origin = session.getPlacementPosition(player); - int killed = server.killMobs(player.getWorld(), origin, radius); + int killed = world.killMobs(origin, radius); player.print("Killed " + killed + " mobs."); return true; @@ -1741,12 +1743,10 @@ public class WorldEditController { * Called on right click. * * @param player - * @param world * @param clicked * @return false if you want the action to go through */ - public boolean handleBlockRightClick(LocalPlayer player, LocalWorld world, - Vector clicked) { + public boolean handleBlockRightClick(LocalPlayer player, WorldVector clicked) { int itemInHand = player.getItemInHand(); // This prevents needless sessions from being created @@ -1767,8 +1767,7 @@ public class WorldEditController { return true; } else if (player.isHoldingPickAxe() && session.getTool() != null) { - return session.getTool().act(server, config, player, session, - world, clicked); + return session.getTool().act(server, config, player, session, clicked); } return false; @@ -1778,12 +1777,10 @@ public class WorldEditController { * Called on left click. * * @param player - * @param world * @param clicked * @return false if you want the action to go through */ - public boolean handleBlockLeftClick(LocalPlayer player, - LocalWorld world, Vector clicked) { + public boolean handleBlockLeftClick(LocalPlayer player, WorldVector clicked) { if (!canUseCommand(player, "/pos1") && !canUseCommand(player, "/")) { return false; } @@ -1818,7 +1815,7 @@ public class WorldEditController { } else if (player.isHoldingPickAxe() && session.hasSuperPickAxe()) { if (session.getSuperPickaxeMode() != null) { return session.getSuperPickaxeMode().act(server, config, - player, session, world, clicked); + player, session, clicked); } } diff --git a/src/com/sk89q/worldedit/superpickaxe/AreaPickaxe.java b/src/com/sk89q/worldedit/superpickaxe/AreaPickaxe.java index 7f3d6fbec..fa5af2980 100644 --- a/src/com/sk89q/worldedit/superpickaxe/AreaPickaxe.java +++ b/src/com/sk89q/worldedit/superpickaxe/AreaPickaxe.java @@ -38,12 +38,12 @@ public class AreaPickaxe implements SuperPickaxeMode { @Override public boolean act(ServerInterface server, LocalConfiguration config, - LocalPlayer player, LocalSession session, LocalWorld world, - Vector clicked) { + LocalPlayer player, LocalSession session, WorldVector clicked) { + LocalWorld world = clicked.getWorld(); int ox = clicked.getBlockX(); int oy = clicked.getBlockY(); int oz = clicked.getBlockZ(); - int initialType = server.getBlockType(world, clicked); + int initialType = world.getBlockType(clicked); if (initialType == 0) { return true; @@ -61,9 +61,9 @@ public class AreaPickaxe implements SuperPickaxeMode { for (int y = oy - range; y <= oy + range; y++) { for (int z = oz - range; z <= oz + range; z++) { Vector pos = new Vector(x, y, z); - if (server.getBlockType(world, pos) == initialType) { + if (world.getBlockType(pos) == initialType) { if (config.superPickaxeManyDrop) { - server.simulateBlockMine(world, pos); + world.simulateBlockMine(pos); } editSession.setBlock(pos, air); diff --git a/src/com/sk89q/worldedit/superpickaxe/BlockReplacer.java b/src/com/sk89q/worldedit/superpickaxe/BlockReplacer.java index d803ffac7..10c017480 100644 --- a/src/com/sk89q/worldedit/superpickaxe/BlockReplacer.java +++ b/src/com/sk89q/worldedit/superpickaxe/BlockReplacer.java @@ -36,9 +36,9 @@ public class BlockReplacer implements SuperPickaxeMode { @Override public boolean act(ServerInterface server, LocalConfiguration config, - LocalPlayer player, LocalSession session, LocalWorld world, - Vector clicked) { + LocalPlayer player, LocalSession session, WorldVector clicked) { + LocalWorld world = clicked.getWorld(); EditSession editSession = new EditSession(server, world, -1); try { diff --git a/src/com/sk89q/worldedit/superpickaxe/QueryTool.java b/src/com/sk89q/worldedit/superpickaxe/QueryTool.java index 524c4695f..d960e2bd3 100644 --- a/src/com/sk89q/worldedit/superpickaxe/QueryTool.java +++ b/src/com/sk89q/worldedit/superpickaxe/QueryTool.java @@ -31,8 +31,9 @@ public class QueryTool implements SuperPickaxeMode { @Override public boolean act(ServerInterface server, LocalConfiguration config, - LocalPlayer player, LocalSession session, LocalWorld world, - Vector clicked) { + LocalPlayer player, LocalSession session, WorldVector clicked) { + + LocalWorld world = clicked.getWorld(); BaseBlock block = (new EditSession(server, world, 0)).rawGetBlock(clicked); player.print("\u00A79@" + clicked + ": " + "\u00A7e" diff --git a/src/com/sk89q/worldedit/superpickaxe/RecursivePickaxe.java b/src/com/sk89q/worldedit/superpickaxe/RecursivePickaxe.java index 077050c68..baaef70cb 100644 --- a/src/com/sk89q/worldedit/superpickaxe/RecursivePickaxe.java +++ b/src/com/sk89q/worldedit/superpickaxe/RecursivePickaxe.java @@ -41,9 +41,10 @@ public class RecursivePickaxe implements SuperPickaxeMode { @Override public boolean act(ServerInterface server, LocalConfiguration config, - LocalPlayer player, LocalSession session, LocalWorld world, - Vector clicked) { - int initialType = server.getBlockType(world, clicked); + LocalPlayer player, LocalSession session, WorldVector clicked) { + LocalWorld world = clicked.getWorld(); + + int initialType = world.getBlockType(clicked); if (initialType == 0) { return true; @@ -95,7 +96,7 @@ public class RecursivePickaxe implements SuperPickaxeMode { if (editSession.getBlock(pos).getID() == initialType) { if (drop) { - server.simulateBlockMine(world, pos); + world.simulateBlockMine(pos); } editSession.setBlock(pos, air); } else { diff --git a/src/com/sk89q/worldedit/superpickaxe/SinglePickaxe.java b/src/com/sk89q/worldedit/superpickaxe/SinglePickaxe.java index fe85aa562..1d15ef531 100644 --- a/src/com/sk89q/worldedit/superpickaxe/SinglePickaxe.java +++ b/src/com/sk89q/worldedit/superpickaxe/SinglePickaxe.java @@ -30,21 +30,21 @@ import com.sk89q.worldedit.blocks.BlockID; public class SinglePickaxe implements SuperPickaxeMode { @Override public boolean act(ServerInterface server, LocalConfiguration config, - LocalPlayer player, LocalSession session, LocalWorld world, - Vector clicked) { + LocalPlayer player, LocalSession session, WorldVector clicked) { + LocalWorld world = clicked.getWorld(); - if (server.getBlockType(world, clicked) == BlockID.BEDROCK + if (world.getBlockType(clicked) == BlockID.BEDROCK && !player.canDestroyBedrock()) { return true; - } else if (server.getBlockType(world, clicked) == BlockID.TNT) { + } else if (world.getBlockType(clicked) == BlockID.TNT) { return false; } if (config.superPickaxeDrop) { - server.simulateBlockMine(world, clicked); + world.simulateBlockMine(clicked); } - server.setBlockType(world, clicked, 0); + world.setBlockType(clicked, 0); return true; } diff --git a/src/com/sk89q/worldedit/superpickaxe/SuperPickaxeMode.java b/src/com/sk89q/worldedit/superpickaxe/SuperPickaxeMode.java index f8835c549..7919022b3 100644 --- a/src/com/sk89q/worldedit/superpickaxe/SuperPickaxeMode.java +++ b/src/com/sk89q/worldedit/superpickaxe/SuperPickaxeMode.java @@ -37,6 +37,5 @@ public interface SuperPickaxeMode { * @return true to deny */ public boolean act(ServerInterface server, LocalConfiguration config, - LocalPlayer player, LocalSession session, LocalWorld world, - Vector clicked); + LocalPlayer player, LocalSession session, WorldVector clicked); } diff --git a/src/com/sk89q/worldedit/superpickaxe/TreePlanter.java b/src/com/sk89q/worldedit/superpickaxe/TreePlanter.java index 67a40ce4b..4f9b1a1af 100644 --- a/src/com/sk89q/worldedit/superpickaxe/TreePlanter.java +++ b/src/com/sk89q/worldedit/superpickaxe/TreePlanter.java @@ -30,13 +30,14 @@ public class TreePlanter implements SuperPickaxeMode { @Override public boolean act(ServerInterface server, LocalConfiguration config, - LocalPlayer player, LocalSession session, LocalWorld world, - Vector clicked) { + LocalPlayer player, LocalSession session, WorldVector clicked) { + + LocalWorld world = clicked.getWorld(); EditSession editSession = new EditSession(server, world, session.getBlockChangeLimit()); try { - if (!server.generateTree(editSession, player.getWorld(), clicked)) { + if (!world.generateTree(editSession, clicked)) { player.printError("Notch won't let you put a tree there."); } } finally {