From 84cf875356b43cc9f083842ae67c1fff3eb8dcfa Mon Sep 17 00:00:00 2001 From: Raoul Van den Berge Date: Thu, 24 Dec 2015 20:23:39 +0100 Subject: [PATCH] finish the destructor --- src/main/java/storagecraft/StorageCraft.java | 1 + .../storagecraft/block/BlockDestructor.java | 52 +++++++++++++++ .../container/ContainerDestructor.java | 13 ++++ .../java/storagecraft/gui/GuiDestructor.java | 43 ++++++++++++ .../java/storagecraft/gui/GuiHandler.java | 6 ++ .../storagecraft/tile/TileDestructor.java | 27 +++++++- .../storagecraft/util/InventoryUtils.java | 61 +++++++++--------- .../assets/storagecraft/lang/en_US.lang | 2 + .../textures/blocks/destructorConnected.png | Bin 0 -> 353 bytes .../blocks/destructorDisconnected.png | Bin 0 -> 352 bytes .../storagecraft/textures/gui/destructor.png | Bin 0 -> 1788 bytes 11 files changed, 173 insertions(+), 32 deletions(-) create mode 100644 src/main/java/storagecraft/container/ContainerDestructor.java create mode 100644 src/main/java/storagecraft/gui/GuiDestructor.java create mode 100644 src/main/resources/assets/storagecraft/textures/blocks/destructorConnected.png create mode 100644 src/main/resources/assets/storagecraft/textures/blocks/destructorDisconnected.png create mode 100644 src/main/resources/assets/storagecraft/textures/gui/destructor.png diff --git a/src/main/java/storagecraft/StorageCraft.java b/src/main/java/storagecraft/StorageCraft.java index 6a6cb350b..e50763db9 100644 --- a/src/main/java/storagecraft/StorageCraft.java +++ b/src/main/java/storagecraft/StorageCraft.java @@ -29,6 +29,7 @@ public class StorageCraft public static final int DETECTOR = 6; public static final int SOLDERER = 7; public static final int WIRELESS_TRANSMITTER = 8; + public static final int DESTRUCTOR = 9; } public static final String ID = "storagecraft"; diff --git a/src/main/java/storagecraft/block/BlockDestructor.java b/src/main/java/storagecraft/block/BlockDestructor.java index 3112e7cdd..ee6e657f6 100644 --- a/src/main/java/storagecraft/block/BlockDestructor.java +++ b/src/main/java/storagecraft/block/BlockDestructor.java @@ -1,12 +1,21 @@ package storagecraft.block; import net.minecraft.block.ITileEntityProvider; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; +import storagecraft.StorageCraft; import storagecraft.tile.TileDestructor; public class BlockDestructor extends BlockBase implements ITileEntityProvider { + private IIcon sideIcon; + private IIcon connectedIcon; + private IIcon disconnectedIcon; + public BlockDestructor() { super("destructor"); @@ -17,4 +26,47 @@ public class BlockDestructor extends BlockBase implements ITileEntityProvider { return new TileDestructor(); } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) + { + if (!world.isRemote) + { + player.openGui(StorageCraft.INSTANCE, StorageCraft.GUI.DESTRUCTOR, world, x, y, z); + } + + return true; + } + + @Override + public void registerBlockIcons(IIconRegister register) + { + connectedIcon = register.registerIcon("storagecraft:destructorConnected"); + disconnectedIcon = register.registerIcon("storagecraft:destructorDisconnected"); + sideIcon = register.registerIcon("storagecraft:side"); + } + + @Override + public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) + { + TileDestructor tile = (TileDestructor) world.getTileEntity(x, y, z); + + if (side == tile.getDirection().ordinal()) + { + return tile.isConnected() ? connectedIcon : disconnectedIcon; + } + + return sideIcon; + } + + @Override + public IIcon getIcon(int side, int damage) + { + if (side == 3) + { + return disconnectedIcon; + } + + return sideIcon; + } } diff --git a/src/main/java/storagecraft/container/ContainerDestructor.java b/src/main/java/storagecraft/container/ContainerDestructor.java new file mode 100644 index 000000000..cf9e9aad4 --- /dev/null +++ b/src/main/java/storagecraft/container/ContainerDestructor.java @@ -0,0 +1,13 @@ +package storagecraft.container; + +import net.minecraft.entity.player.EntityPlayer; + +public class ContainerDestructor extends ContainerBase +{ + public ContainerDestructor(EntityPlayer player) + { + super(player); + + addPlayerInventory(8, 50); + } +} diff --git a/src/main/java/storagecraft/gui/GuiDestructor.java b/src/main/java/storagecraft/gui/GuiDestructor.java new file mode 100644 index 000000000..0c2b6f8cb --- /dev/null +++ b/src/main/java/storagecraft/gui/GuiDestructor.java @@ -0,0 +1,43 @@ +package storagecraft.gui; + +import storagecraft.container.ContainerDestructor; +import storagecraft.gui.sidebutton.SideButtonRedstoneMode; +import storagecraft.tile.TileDestructor; + +public class GuiDestructor extends GuiBase +{ + private TileDestructor destructor; + + public GuiDestructor(ContainerDestructor container, TileDestructor destructor) + { + super(container, 176, 131); + + this.destructor = destructor; + } + + @Override + public void init(int x, int y) + { + addSideButton(new SideButtonRedstoneMode(destructor)); + } + + @Override + public void update(int x, int y) + { + } + + @Override + public void drawBackground(int x, int y, int mouseX, int mouseY) + { + bindTexture("gui/destructor.png"); + + drawTexturedModalRect(x, y, 0, 0, xSize, ySize); + } + + @Override + public void drawForeground(int mouseX, int mouseY) + { + drawString(7, 7, t("gui.storagecraft:destructor")); + drawString(7, 39, t("container.inventory")); + } +} diff --git a/src/main/java/storagecraft/gui/GuiHandler.java b/src/main/java/storagecraft/gui/GuiHandler.java index 19fa43427..ef9ec09ed 100644 --- a/src/main/java/storagecraft/gui/GuiHandler.java +++ b/src/main/java/storagecraft/gui/GuiHandler.java @@ -7,6 +7,7 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import storagecraft.StorageCraft; import storagecraft.container.ContainerController; +import storagecraft.container.ContainerDestructor; import storagecraft.container.ContainerDetector; import storagecraft.container.ContainerDrive; import storagecraft.container.ContainerExporter; @@ -16,6 +17,7 @@ import storagecraft.container.ContainerSolderer; import storagecraft.container.ContainerExternalStorage; import storagecraft.container.ContainerWirelessTransmitter; import storagecraft.tile.TileController; +import storagecraft.tile.TileDestructor; import storagecraft.tile.TileDetector; import storagecraft.tile.TileDrive; import storagecraft.tile.TileExporter; @@ -49,6 +51,8 @@ public class GuiHandler implements IGuiHandler return new ContainerSolderer(player, (TileSolderer) tile); case StorageCraft.GUI.WIRELESS_TRANSMITTER: return new ContainerWirelessTransmitter(player, (TileWirelessTransmitter) tile); + case StorageCraft.GUI.DESTRUCTOR: + return new ContainerDestructor(player); default: return null; } @@ -85,6 +89,8 @@ public class GuiHandler implements IGuiHandler return new GuiSolderer((ContainerSolderer) getContainer(ID, player, tile), (TileSolderer) tile); case StorageCraft.GUI.WIRELESS_TRANSMITTER: return new GuiWirelessTransmitter((ContainerWirelessTransmitter) getContainer(ID, player, tile), (TileWirelessTransmitter) tile); + case StorageCraft.GUI.DESTRUCTOR: + return new GuiDestructor((ContainerDestructor) getContainer(ID, player, tile), (TileDestructor) tile); default: return null; } diff --git a/src/main/java/storagecraft/tile/TileDestructor.java b/src/main/java/storagecraft/tile/TileDestructor.java index b067a226a..20981524f 100644 --- a/src/main/java/storagecraft/tile/TileDestructor.java +++ b/src/main/java/storagecraft/tile/TileDestructor.java @@ -1,5 +1,11 @@ package storagecraft.tile; +import java.util.List; +import net.minecraft.block.Block; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import storagecraft.util.InventoryUtils; + public class TileDestructor extends TileMachine { @Override @@ -11,6 +17,25 @@ public class TileDestructor extends TileMachine @Override public void updateMachine() { - // @TODO: ... + int frontX = xCoord + getDirection().offsetX; + int frontY = yCoord + getDirection().offsetY; + int frontZ = zCoord + getDirection().offsetZ; + + Block front = worldObj.getBlock(frontX, frontY, frontZ); + + if (front != Blocks.air) + { + List drops = front.getDrops(worldObj, frontX, frontY, frontZ, worldObj.getBlockMetadata(frontX, frontY, frontZ), 0); + + worldObj.setBlockToAir(frontX, frontY, frontZ); + + for (ItemStack drop : drops) + { + if (!getController().push(drop)) + { + InventoryUtils.dropStack(worldObj, drop, frontX, frontY, frontZ); + } + } + } } } diff --git a/src/main/java/storagecraft/util/InventoryUtils.java b/src/main/java/storagecraft/util/InventoryUtils.java index a219389b0..179ff4eaf 100644 --- a/src/main/java/storagecraft/util/InventoryUtils.java +++ b/src/main/java/storagecraft/util/InventoryUtils.java @@ -1,6 +1,5 @@ package storagecraft.util; -import java.util.Random; import net.minecraft.entity.item.EntityItem; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; @@ -56,48 +55,48 @@ public class InventoryUtils } } - // https://github.com/cpw/ironchest/blob/master/src/main/java/cpw/mods/ironchest/BlockIronChest.java#L200 public static void dropInventory(World world, IInventory inventory, int x, int y, int z) { - Random random = world.rand; - for (int i = 0; i < inventory.getSizeInventory(); ++i) { ItemStack stack = inventory.getStackInSlot(i); - if (stack == null) + if (stack != null) { - continue; + dropStack(world, stack, x, y, z); + } + } + } + + public static void dropStack(World world, ItemStack stack, int x, int y, int z) + { + float xo = world.rand.nextFloat() * 0.8F + 0.1F; + float yo = world.rand.nextFloat() * 0.8F + 0.1F; + float zo = world.rand.nextFloat() * 0.8F + 0.1F; + + while (stack.stackSize > 0) + { + int amount = world.rand.nextInt(21) + 10; + + if (amount > stack.stackSize) + { + amount = stack.stackSize; } - float xo = random.nextFloat() * 0.8F + 0.1F; - float yo = random.nextFloat() * 0.8F + 0.1F; - float zo = random.nextFloat() * 0.8F + 0.1F; + stack.stackSize -= amount; - while (stack.stackSize > 0) + EntityItem entity = new EntityItem(world, (float) x + xo, (float) y + yo, (float) z + zo, new ItemStack(stack.getItem(), amount, stack.getItemDamage())); + + entity.motionX = (float) world.rand.nextGaussian() * 0.05F; + entity.motionY = (float) world.rand.nextGaussian() * 0.05F + 0.2F; + entity.motionZ = (float) world.rand.nextGaussian() * 0.05F; + + if (stack.hasTagCompound()) { - int amount = random.nextInt(21) + 10; - - if (amount > stack.stackSize) - { - amount = stack.stackSize; - } - - stack.stackSize -= amount; - - EntityItem entity = new EntityItem(world, (float) x + xo, (float) y + yo, (float) z + zo, new ItemStack(stack.getItem(), amount, stack.getItemDamage())); - - entity.motionX = (float) random.nextGaussian() * 0.05F; - entity.motionY = (float) random.nextGaussian() * 0.05F + 0.2F; - entity.motionZ = (float) random.nextGaussian() * 0.05F; - - if (stack.hasTagCompound()) - { - entity.getEntityItem().setTagCompound((NBTTagCompound) stack.getTagCompound().copy()); - } - - world.spawnEntityInWorld(entity); + entity.getEntityItem().setTagCompound((NBTTagCompound) stack.getTagCompound().copy()); } + + world.spawnEntityInWorld(entity); } } diff --git a/src/main/resources/assets/storagecraft/lang/en_US.lang b/src/main/resources/assets/storagecraft/lang/en_US.lang index e6e78cd71..120aa343e 100644 --- a/src/main/resources/assets/storagecraft/lang/en_US.lang +++ b/src/main/resources/assets/storagecraft/lang/en_US.lang @@ -9,6 +9,7 @@ gui.storagecraft:exporter=Exporter gui.storagecraft:detector=Detector gui.storagecraft:solderer=Solderer gui.storagecraft:wirelessTransmitter=Wireless Transmitter +gui.storagecraft:destructor=Destructor misc.storagecraft:energyStored=%d / %d RF misc.storagecraft:energyUsage=Usage: %d RF/t @@ -67,6 +68,7 @@ block.storagecraft:detector.name=Detector block.storagecraft:machineCasing.name=Machine Casing block.storagecraft:solderer.name=Solderer block.storagecraft:wirelessTransmitter.name=Wireless Transmitter +block.storagecraft:destructor.name=Destructor item.storagecraft:storageCell.0.name=1k Storage Cell item.storagecraft:storageCell.1.name=4k Storage Cell diff --git a/src/main/resources/assets/storagecraft/textures/blocks/destructorConnected.png b/src/main/resources/assets/storagecraft/textures/blocks/destructorConnected.png new file mode 100644 index 0000000000000000000000000000000000000000..4de221c51d5a4ee25b30de5e3f174196ac58d33f GIT binary patch literal 353 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ+nVO$@hV3E_u2*hFJJ7J!2`< zT(vG>S^=ZZpKbAb7FqZ^#(rOX?(m^itE4Y>H?%S(vvsa_eC_ypUgE+7J9lr5ui?FR u@4yUBF|Jw9G(VbJe4nr(z`%J=6|+l0+lTJ$0+WHhWAJqKb6Mw<&;$TPhlO(h literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/storagecraft/textures/blocks/destructorDisconnected.png b/src/main/resources/assets/storagecraft/textures/blocks/destructorDisconnected.png new file mode 100644 index 0000000000000000000000000000000000000000..afe0981c0f27286377676c44cbed40c5991c18e0 GIT binary patch literal 352 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ+nVO$@hV3E_%8+hFJJ7J!2`<-A`? z-sd3y*I(rL>PU@%Q(m8nCrNN}vqn{WTo#OXp0&$Cv#GV|?6S!}q_*U#>WDn~`EK#~ zP4m_>*4tYhaB_^4>tg!GIIUEKv96^xUZ$CIj-Hq|$Jrw#T=~TxZvT;O;8C03uxyvz z;WBRZ1Bde4RadNfEMaoCw19KNhF$x3Ubr4`YTRnxx&Gjc*@oe5txWIb&((f3wJ2xL sc8}1=xIO*I^#^~04>=v=`S^-Ad}gD926OIlpywDoUHx3vIVCg!0Hjfaf&c&j literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/storagecraft/textures/gui/destructor.png b/src/main/resources/assets/storagecraft/textures/gui/destructor.png new file mode 100644 index 0000000000000000000000000000000000000000..c0c97a66ec2dc4b9a32b246d39f270a9ea63f774 GIT binary patch literal 1788 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K58911MRQ8&P5D>38$lZxy-8q?;Kn_c~qpu?a z!^VE@KZ&di49pAxJ|V6^adUI?(9qEC?(Sp9j{X1tA1E>kMnhnPgh10{aTQRmDGBlm z1}6TI3>bpHv#SE5owL9rvY3H^?=T269?xHq0u+=eag8Vm&QB{TPb^AhC`ioAE78kK zEm1JhGte{p)02Fkfq^O1)5S5QBJS<&i&?iFBw7Nm_TB$K@$RmfQHtTm-uQ1m^OJ+; zP3sLA7DmUu-+yl`|NX1)cj4{jjE%|5@Bja{G46r>f#Z6ydZ$_C7%G3U0ShyQ?{Q+F zWccKzGz$Ym!=36#5O2crd;uU;^gb0--Z{+M2Q1SVPVAiyEYcWoYh?QHy88N?oAq`x z*>=>u{&v|9q#6Wve%}OP0LgXp|1bEzbbgr;&xH4S>CN}cHl^#&^6}jb3Xje`}St(