From b81fec1776a191fd0f4b8c15f4db0eb307a23d49 Mon Sep 17 00:00:00 2001 From: Zhuowei Zhang Date: Sun, 29 Jul 2012 21:51:54 -0700 Subject: [PATCH] Various Spout fixes: switched to VanillaMaterials from MaterialRegistry use the Minecraft ID instead of the Spout ID use the block coordinates from a Point to fix blocks' coordinates being off by 1 added a very rudimentary implementation of the tree generator; only standard small trees are generated fixed some variables' names --- .../sk89q/worldedit/spout/SpoutPlayer.java | 7 +++-- .../worldedit/spout/SpoutPlayerBlockBag.java | 28 +++++++++---------- .../worldedit/spout/SpoutServerInterface.java | 3 +- .../com/sk89q/worldedit/spout/SpoutWorld.java | 27 ++++++++++++------ .../worldedit/spout/WorldEditListener.java | 8 +++--- 5 files changed, 42 insertions(+), 31 deletions(-) diff --git a/src/main/java/com/sk89q/worldedit/spout/SpoutPlayer.java b/src/main/java/com/sk89q/worldedit/spout/SpoutPlayer.java index 6d89c25f6..5ed3e114e 100644 --- a/src/main/java/com/sk89q/worldedit/spout/SpoutPlayer.java +++ b/src/main/java/com/sk89q/worldedit/spout/SpoutPlayer.java @@ -34,8 +34,9 @@ import org.spout.api.entity.Entity; import org.spout.api.geo.discrete.Point; import org.spout.api.inventory.ItemStack; -import org.spout.api.material.MaterialRegistry; import org.spout.api.player.Player; +import org.spout.vanilla.material.VanillaMaterial; +import org.spout.vanilla.material.VanillaMaterials; import org.spout.vanilla.controller.living.player.VanillaPlayer; public class SpoutPlayer extends LocalPlayer { @@ -53,7 +54,7 @@ public SpoutPlayer(WorldEditPlugin plugin, ServerInterface server, Player player public int getItemInHand() { VanillaPlayer vanillaPlayer = (VanillaPlayer) player.getEntity().getController(); ItemStack itemStack = vanillaPlayer.getInventory().getQuickbar().getCurrentItem(); - return itemStack != null ? itemStack.getMaterial().getId() : 0; + return itemStack != null ? ((VanillaMaterial) itemStack.getMaterial()).getMinecraftId() : 0; } @Override @@ -81,7 +82,7 @@ public double getYaw() { @Override public void giveItem(int type, int amt) { VanillaPlayer vanillaPlayer = (VanillaPlayer) player.getEntity().getController(); - vanillaPlayer.getInventory().addItem(new ItemStack(MaterialRegistry.get((short) type), amt), false); + vanillaPlayer.getInventory().addItem(new ItemStack(VanillaMaterials.getMaterial((short) type), amt), false); } @Override diff --git a/src/main/java/com/sk89q/worldedit/spout/SpoutPlayerBlockBag.java b/src/main/java/com/sk89q/worldedit/spout/SpoutPlayerBlockBag.java index 7f3880ad6..ac4efbcc4 100644 --- a/src/main/java/com/sk89q/worldedit/spout/SpoutPlayerBlockBag.java +++ b/src/main/java/com/sk89q/worldedit/spout/SpoutPlayerBlockBag.java @@ -32,8 +32,8 @@ import org.spout.api.inventory.InventoryBase; import org.spout.api.inventory.ItemStack; import org.spout.api.material.Material; -import org.spout.api.material.MaterialRegistry; import org.spout.api.player.Player; +import org.spout.vanilla.material.VanillaMaterials; import org.spout.vanilla.util.VanillaPlayerUtil; public class SpoutPlayerBlockBag extends BlockBag { @@ -84,7 +84,7 @@ public void fetchItem(BaseItem item) throws BlockBagException { final short damage = item.getDamage(); int amount = (item instanceof BaseItemStack) ? ((BaseItemStack) item).getAmount() : 1; assert(amount == 1); - Material mat = MaterialRegistry.get(id); + Material mat = VanillaMaterials.getMaterial(id); if (mat.hasSubMaterials()) { mat = mat.getSubMaterial(damage); } @@ -98,25 +98,25 @@ public void fetchItem(BaseItem item) throws BlockBagException { boolean found = false; for (int slot = 0; slot < items.length; ++slot) { - ItemStack bukkitItem = items[slot]; + ItemStack spoutItem = items[slot]; - if (bukkitItem == null) { + if (spoutItem == null) { continue; } - if (!bukkitItem.getMaterial().equals(mat)) { + if (!spoutItem.getMaterial().equals(mat)) { // Type id or damage value doesn't fit continue; } - int currentAmount = bukkitItem.getAmount(); + int currentAmount = spoutItem.getAmount(); if (currentAmount < 0) { // Unlimited return; } if (currentAmount > 1) { - bukkitItem.setAmount(currentAmount - 1); + spoutItem.setAmount(currentAmount - 1); found = true; } else { items[slot] = null; @@ -140,7 +140,7 @@ public void fetchItem(BaseItem item) throws BlockBagException { public void storeItem(BaseItem item) throws BlockBagException { final short id = (short) item.getType(); final short damage = item.getDamage(); - Material mat = MaterialRegistry.get(id); + Material mat = VanillaMaterials.getMaterial(id); if (mat.hasSubMaterials()) { mat = mat.getSubMaterial(damage); } @@ -156,9 +156,9 @@ public void storeItem(BaseItem item) throws BlockBagException { int freeSlot = -1; for (int slot = 0; slot < items.length; ++slot) { - ItemStack bukkitItem = items[slot]; + ItemStack spoutItem = items[slot]; - if (bukkitItem == null) { + if (spoutItem == null) { // Delay using up a free slot until we know there are no stacks // of this item to merge into @@ -168,12 +168,12 @@ public void storeItem(BaseItem item) throws BlockBagException { continue; } - if (!bukkitItem.getMaterial().equals(mat)) { + if (!spoutItem.getMaterial().equals(mat)) { // Type id or damage value doesn't fit continue; } - int currentAmount = bukkitItem.getAmount(); + int currentAmount = spoutItem.getAmount(); if (currentAmount < 0) { // Unlimited return; @@ -185,11 +185,11 @@ public void storeItem(BaseItem item) throws BlockBagException { int spaceLeft = mat.getMaxStackSize() - currentAmount; if (spaceLeft >= amount) { - bukkitItem.setAmount(currentAmount + amount); + spoutItem.setAmount(currentAmount + amount); return; } - bukkitItem.setAmount(mat.getMaxStackSize()); + spoutItem.setAmount(mat.getMaxStackSize()); amount -= spaceLeft; } diff --git a/src/main/java/com/sk89q/worldedit/spout/SpoutServerInterface.java b/src/main/java/com/sk89q/worldedit/spout/SpoutServerInterface.java index b865ada52..3527ca252 100644 --- a/src/main/java/com/sk89q/worldedit/spout/SpoutServerInterface.java +++ b/src/main/java/com/sk89q/worldedit/spout/SpoutServerInterface.java @@ -32,6 +32,7 @@ import org.spout.api.material.Material; import org.spout.api.material.MaterialRegistry; import org.spout.api.scheduler.TaskPriority; +import org.spout.vanilla.material.VanillaMaterial; import java.lang.reflect.Method; import java.util.ArrayList; @@ -54,7 +55,7 @@ public SpoutServerInterface(WorldEditPlugin plugin, Engine game) { @Override public int resolveItem(String name) { Material mat = MaterialRegistry.get(name); - return mat == null ? 0 : mat.getId(); + return mat == null || !(mat instanceof VanillaMaterial) ? 0 : ((VanillaMaterial) mat).getMinecraftId(); } @Override diff --git a/src/main/java/com/sk89q/worldedit/spout/SpoutWorld.java b/src/main/java/com/sk89q/worldedit/spout/SpoutWorld.java index 46e5e2abf..c8f1bc33d 100644 --- a/src/main/java/com/sk89q/worldedit/spout/SpoutWorld.java +++ b/src/main/java/com/sk89q/worldedit/spout/SpoutWorld.java @@ -43,13 +43,16 @@ import org.spout.api.inventory.ItemStack; import org.spout.api.material.BlockMaterial; import org.spout.api.material.Material; -import org.spout.api.material.MaterialRegistry; import org.spout.api.math.Vector3; import org.spout.vanilla.controller.object.moving.Item; import org.spout.vanilla.controller.object.moving.PrimedTnt; import org.spout.vanilla.controller.object.projectile.Arrow; import org.spout.vanilla.controller.object.vehicle.Boat; import org.spout.vanilla.controller.object.vehicle.Minecart; +import org.spout.vanilla.material.VanillaMaterial; +import org.spout.vanilla.material.VanillaMaterials; +import org.spout.vanilla.world.generator.normal.object.tree.TreeObject; +import org.spout.vanilla.world.generator.normal.object.tree.SmallTreeObject; import java.util.ArrayList; import java.util.List; @@ -93,7 +96,7 @@ public String getName() { */ @Override public boolean setBlockType(Vector pt, int type) { - Material mat = MaterialRegistry.get((short) type); + Material mat = VanillaMaterials.getMaterial((short) type); if (mat != null && mat instanceof BlockMaterial) { return world.setBlockMaterial(pt.getBlockX(), pt.getBlockY(), pt.getBlockZ(), (BlockMaterial) mat, (short)0, WorldEditPlugin.getInstance()); } @@ -121,7 +124,7 @@ public boolean setBlockTypeFast(Vector pt, int type) { */ @Override public boolean setTypeIdAndData(Vector pt, int type, int data) { - Material mat = MaterialRegistry.get((short) type); + Material mat = VanillaMaterials.getMaterial((short) type); if (mat != null && mat instanceof BlockMaterial) { return world.setBlockMaterial(pt.getBlockX(), pt.getBlockY(), pt.getBlockZ(), (BlockMaterial) mat, (short)data, WorldEditPlugin.getInstance()); } @@ -149,7 +152,8 @@ public boolean setTypeIdAndDataFast(Vector pt, int type, int data) { */ @Override public int getBlockType(Vector pt) { - return world.getBlockMaterial(pt.getBlockX(), pt.getBlockY(), pt.getBlockZ()).getId(); + Material mat = world.getBlockMaterial(pt.getBlockX(), pt.getBlockY(), pt.getBlockZ()); + return mat instanceof VanillaMaterial? ((VanillaMaterial) mat).getMinecraftId() : 0; } /** @@ -422,7 +426,12 @@ public boolean clearContainerBlockContents(Vector pt) { @Override public boolean generateTree(TreeGenerator.TreeType type, EditSession editSession, Vector pt) throws MaxChangedBlocksException { - throw new UnsupportedOperationException("Not supported yet."); + TreeObject tree = new SmallTreeObject(); //TODO: properly check for tree type + if (!tree.canPlaceObject(world, pt.getBlockX(), pt.getBlockY(), pt.getBlockZ())) { + return false; + } + tree.placeObject(world, pt.getBlockX(), pt.getBlockY(), pt.getBlockZ()); + return true; } /** @@ -433,12 +442,12 @@ public boolean generateTree(TreeGenerator.TreeType type, EditSession editSession */ @Override public void dropItem(Vector pt, BaseItemStack item) { - Material mat = MaterialRegistry.get((short) item.getType()); + Material mat = VanillaMaterials.getMaterial((short) item.getType()); if (mat.hasSubMaterials()) { mat = mat.getSubMaterial(item.getDamage()); } - ItemStack bukkitItem = new ItemStack(mat, item.getDamage(), item.getAmount()); - world.createAndSpawnEntity(SpoutUtil.toPoint(world, pt), new Item(bukkitItem, new Vector3(pt.getX(), pt.getY(), pt.getZ()))); + ItemStack spoutItem = new ItemStack(mat, item.getDamage(), item.getAmount()); + world.createAndSpawnEntity(SpoutUtil.toPoint(world, pt), new Item(spoutItem, new Vector3(pt.getX(), pt.getY(), pt.getZ()))); } /** @@ -685,7 +694,7 @@ public int removeEntities(EntityType type, Vector origin, int radius) { */ @Override public boolean isValidBlockType(int type) { - return MaterialRegistry.get((short)type) instanceof BlockMaterial; + return VanillaMaterials.getMaterial((short)type) instanceof BlockMaterial; } @Override diff --git a/src/main/java/com/sk89q/worldedit/spout/WorldEditListener.java b/src/main/java/com/sk89q/worldedit/spout/WorldEditListener.java index c53f088fa..21ff18914 100644 --- a/src/main/java/com/sk89q/worldedit/spout/WorldEditListener.java +++ b/src/main/java/com/sk89q/worldedit/spout/WorldEditListener.java @@ -138,8 +138,8 @@ public void onPlayerInteract(PlayerInteractEvent event) { if (!event.isAir()) { final Point clickedBlock = event.getInteractedPoint(); - final WorldVector pos = new WorldVector(world, clickedBlock.getX(), - clickedBlock.getY(), clickedBlock.getZ()); + final WorldVector pos = new WorldVector(world, clickedBlock.getBlockX(), + clickedBlock.getBlockY(), clickedBlock.getBlockZ()); if (we.handleBlockLeftClick(player, pos)) { @@ -165,8 +165,8 @@ public void run() { } else if (action == Action.RIGHT_CLICK) { if (!event.isAir()) { final Point clickedBlock = event.getInteractedPoint(); - final WorldVector pos = new WorldVector(world, clickedBlock.getX(), - clickedBlock.getY(), clickedBlock.getZ()); + final WorldVector pos = new WorldVector(world, clickedBlock.getBlockX(), + clickedBlock.getBlockY(), clickedBlock.getBlockZ()); if (we.handleBlockRightClick(player, pos)) { event.setCancelled(true);