From 4ba78dd9b7b51b00deaac49d72dff24d9c33587e Mon Sep 17 00:00:00 2001 From: Cricket Date: Mon, 1 Jun 2015 14:15:05 -0400 Subject: [PATCH] pushing broken code, its fun to look at though --- .../com/cricketcraft/chisel/Features.java | 8 + .../chisel/block/BlockDeChisel.java | 25 +++ .../block/tileentity/TileEntityDeChisel.java | 169 +++++++++++++++++ .../client/render/model/ModelDeChisel.java | 79 ++++++++ .../client/render/tile/RenderDeChisel.java | 15 ++ .../chisel/init/ChiselBlocks.java | 1 + .../chisel/inventory/ContainerDeChisel.java | 174 ++++++++++++++++++ .../chisel/proxy/ClientProxy.java | 4 + .../chisel/proxy/CommonProxy.java | 2 + .../chisel/textures/blocks/DeChisel.png | Bin 0 -> 2699 bytes 10 files changed, 477 insertions(+) create mode 100644 src/main/java/com/cricketcraft/chisel/block/BlockDeChisel.java create mode 100644 src/main/java/com/cricketcraft/chisel/block/tileentity/TileEntityDeChisel.java create mode 100644 src/main/java/com/cricketcraft/chisel/client/render/model/ModelDeChisel.java create mode 100644 src/main/java/com/cricketcraft/chisel/client/render/tile/RenderDeChisel.java create mode 100644 src/main/java/com/cricketcraft/chisel/inventory/ContainerDeChisel.java create mode 100644 src/main/resources/assets/chisel/textures/blocks/DeChisel.png diff --git a/src/main/java/com/cricketcraft/chisel/Features.java b/src/main/java/com/cricketcraft/chisel/Features.java index 1ad42e13..66b045cb 100644 --- a/src/main/java/com/cricketcraft/chisel/Features.java +++ b/src/main/java/com/cricketcraft/chisel/Features.java @@ -573,6 +573,14 @@ public enum Features { } }, + DECHISEL{ + @Override + void addBlocks(){ + BlockDeChisel deChisel = new BlockDeChisel(); + GameRegistry.registerBlock(deChisel, deChisel.getUnlocalizedName()); + } + }, + DIAMOND_BLOCK { @Override diff --git a/src/main/java/com/cricketcraft/chisel/block/BlockDeChisel.java b/src/main/java/com/cricketcraft/chisel/block/BlockDeChisel.java new file mode 100644 index 00000000..109d4cd0 --- /dev/null +++ b/src/main/java/com/cricketcraft/chisel/block/BlockDeChisel.java @@ -0,0 +1,25 @@ +package com.cricketcraft.chisel.block; + +import com.cricketcraft.chisel.Chisel; +import com.cricketcraft.chisel.block.tileentity.TileEntityDeChisel; +import com.cricketcraft.chisel.init.ChiselTabs; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +public class BlockDeChisel extends BlockContainer { + public BlockDeChisel() { + super(Material.iron); + setCreativeTab(ChiselTabs.tabChisel); + setHardness(2.0F); + setResistance(10.0F); + setBlockName("dechisel"); + setBlockTextureName(Chisel.MOD_ID + ":DeChisel"); + } + + @Override + public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) { + return new TileEntityDeChisel(); + } +} diff --git a/src/main/java/com/cricketcraft/chisel/block/tileentity/TileEntityDeChisel.java b/src/main/java/com/cricketcraft/chisel/block/tileentity/TileEntityDeChisel.java new file mode 100644 index 00000000..d1cba2ae --- /dev/null +++ b/src/main/java/com/cricketcraft/chisel/block/tileentity/TileEntityDeChisel.java @@ -0,0 +1,169 @@ +package com.cricketcraft.chisel.block.tileentity; + +import com.cricketcraft.chisel.api.IChiselItem; +import com.cricketcraft.chisel.carving.Carving; +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.ISidedInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; + +public class TileEntityDeChisel extends TileEntity implements ISidedInventory{ + + private final int CHISEL = 0, INPUT = 1; + private ItemStack[] inventory = new ItemStack[2]; + + private String name = "deChisel"; + + @Override + public void updateEntity(){ + if(worldObj.getWorldTime() % 20 == 0){ + if(inventory[CHISEL] != null && inventory[INPUT] != null){ + ItemStack target = inventory[INPUT]; + ItemStack output = new ItemStack(Carving.chisel.getGroupVariations(Block.getBlockFromItem(target.getItem()), target.getItemDamage()).get(0).getBlock(), target.stackSize); + if(worldObj.getTileEntity(xCoord, yCoord - 1, zCoord) instanceof IInventory) { + IInventory inventory = (IInventory) worldObj.getTileEntity(xCoord, yCoord - 1, zCoord); + pushToThisInventory(inventory, output); + } + } + } + } + + private void pushToThisInventory(IInventory inv, ItemStack output){ + for(int slot = 0; slot < inv.getSizeInventory(); slot++){ + if(inv.getStackInSlot(slot) == null){ + setInventorySlotContents(slot, output); + } + } + } + + public ItemStack[] getInventory() { + return inventory; + } + + @Override + public int getSizeInventory() { + return inventory.length; + } + + @Override + public ItemStack getStackInSlot(int slot) { + return inventory[slot]; + } + + @Override + public ItemStack decrStackSize(int slot, int size) { + if (inventory[slot] != null) { + ItemStack is; + if (inventory[slot].stackSize <= size) { + is = inventory[slot]; + inventory[slot] = null; + return is; + } else { + is = inventory[slot].splitStack(size); + if (inventory[slot].stackSize == 0) + inventory[slot] = null; + return is; + } + } else + return null; + } + + @Override + public ItemStack getStackInSlotOnClosing(int slot) { + if (inventory[slot] != null) { + ItemStack is = inventory[slot]; + inventory[slot] = null; + return is; + } else + return null; + } + + @Override + public void setInventorySlotContents(int slot, ItemStack stack) { + inventory[slot] = stack; + + if (stack != null && stack.stackSize > getInventoryStackLimit()) { + stack.stackSize = getInventoryStackLimit(); + } + } + + @Override + public String getInventoryName(){ + return name; + } + + @Override + public boolean canUpdate(){ + return true; + } + + @Override + public void readFromNBT(NBTTagCompound tagCompound){ + + } + + @Override + public void writeToNBT(NBTTagCompound tagCompound){ + + } + + @Override + public boolean canExtractItem(int slot, ItemStack stack, int side){ + return (side == 0 && slot == 1) ? true : false; + } + + @Override + public int[] getAccessibleSlotsFromSide(int side) { + if(side == 0) return new int[] {INPUT}; + if(side == 1) return new int[] {CHISEL, INPUT}; + return new int[0]; + } + + @Override + public boolean canInsertItem(int slot, ItemStack stack, int side){ + return side == 1 ? true : false; + } + + @Override + public void openInventory(){ + + } + + @Override + public void closeInventory(){ + + } + + @Override + public boolean isItemValidForSlot(int slot, ItemStack stack) { + if(stack == null){ + return false; + } + switch (slot){ + case INPUT: + return !Carving.chisel.getItemsForChiseling(stack).isEmpty(); + case CHISEL: + return stack.getItem() instanceof IChiselItem; + default: + return false; + } + } + + @Override + public int getInventoryStackLimit(){ + return 64; + } + + @Override + public boolean isUseableByPlayer(EntityPlayer player) { + return true; + } + + @Override + public boolean hasCustomInventoryName(){ + return false; + } +} diff --git a/src/main/java/com/cricketcraft/chisel/client/render/model/ModelDeChisel.java b/src/main/java/com/cricketcraft/chisel/client/render/model/ModelDeChisel.java new file mode 100644 index 00000000..58096c26 --- /dev/null +++ b/src/main/java/com/cricketcraft/chisel/client/render/model/ModelDeChisel.java @@ -0,0 +1,79 @@ +// Date: 6/1/2015 1:45:59 PM +// Template version 1.1 +// Java generated by Techne +// Keep in mind that you still need to fill in some blanks +// - ZeuX + + + + + + +package com.cricketcraft.chisel.client.render.model; + +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; + +public class ModelDeChisel extends ModelBase +{ + //fields + ModelRenderer Shape1; + ModelRenderer Shape2; + ModelRenderer Shape3; + ModelRenderer Shape4; + + public ModelDeChisel() + { + textureWidth = 128; + textureHeight = 32; + + Shape1 = new ModelRenderer(this, 50, 0); + Shape1.addBox(0F, 0F, 0F, 16, 3, 16); + Shape1.setRotationPoint(-8F, 12F, -8F); + Shape1.setTextureSize(128, 32); + Shape1.mirror = true; + setRotation(Shape1, 0F, 0F, 0F); + Shape2 = new ModelRenderer(this, 0, 0); + Shape2.addBox(0F, 0F, 0F, 12, 3, 12); + Shape2.setRotationPoint(-6F, 15F, -6F); + Shape2.setTextureSize(128, 32); + Shape2.mirror = true; + setRotation(Shape2, 0F, 0F, 0F); + Shape3 = new ModelRenderer(this, 0, 18); + Shape3.addBox(0F, 0F, 0F, 8, 3, 8); + Shape3.setRotationPoint(-4F, 18F, -4F); + Shape3.setTextureSize(128, 32); + Shape3.mirror = true; + setRotation(Shape3, 0F, 0F, 0F); + Shape4 = new ModelRenderer(this, 67, 20); + Shape4.addBox(0F, 0F, 0F, 4, 3, 4); + Shape4.setRotationPoint(-2F, 21F, -2F); + Shape4.setTextureSize(128, 32); + Shape4.mirror = true; + setRotation(Shape4, 0F, 0F, 0F); + } + + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) + { + super.render(entity, f, f1, f2, f3, f4, f5); + setRotationAngles(f, f1, f2, f3, f4, f5, entity); + Shape1.render(f5); + Shape2.render(f5); + Shape3.render(f5); + Shape4.render(f5); + } + + private void setRotation(ModelRenderer model, float x, float y, float z) + { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } + + public void setRotationAngles(float f, float f1, float f2, float f3, float f4, float f5, Entity entity) + { + super.setRotationAngles(f, f1, f2, f3, f4, f5, entity); + } + +} diff --git a/src/main/java/com/cricketcraft/chisel/client/render/tile/RenderDeChisel.java b/src/main/java/com/cricketcraft/chisel/client/render/tile/RenderDeChisel.java new file mode 100644 index 00000000..39d36e7d --- /dev/null +++ b/src/main/java/com/cricketcraft/chisel/client/render/tile/RenderDeChisel.java @@ -0,0 +1,15 @@ +package com.cricketcraft.chisel.client.render.tile; + +import com.cricketcraft.chisel.client.render.model.ModelDeChisel; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.entity.Entity; +import net.minecraft.tileentity.TileEntity; + +public class RenderDeChisel extends TileEntitySpecialRenderer{ + private ModelDeChisel deChisel = new ModelDeChisel(); + + @Override + public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float partialTicks) { + deChisel.render((Entity) null, 0.0F, 0.0F, -0.1F, 0.0F, 0.0F, 0.0625F); + } +} diff --git a/src/main/java/com/cricketcraft/chisel/init/ChiselBlocks.java b/src/main/java/com/cricketcraft/chisel/init/ChiselBlocks.java index b6cf5459..871c9eb1 100644 --- a/src/main/java/com/cricketcraft/chisel/init/ChiselBlocks.java +++ b/src/main/java/com/cricketcraft/chisel/init/ChiselBlocks.java @@ -11,6 +11,7 @@ import cpw.mods.fml.common.registry.GameRegistry.ObjectHolder; public final class ChiselBlocks { public static final Block autoChisel = null; + public static final BlockDeChisel deChisel = null; public static final BlockCarvable antiBlock = null; public static final BlockCarvable marble = null; public static final BlockCarvable marble_pillar = null; diff --git a/src/main/java/com/cricketcraft/chisel/inventory/ContainerDeChisel.java b/src/main/java/com/cricketcraft/chisel/inventory/ContainerDeChisel.java new file mode 100644 index 00000000..d1ad0934 --- /dev/null +++ b/src/main/java/com/cricketcraft/chisel/inventory/ContainerDeChisel.java @@ -0,0 +1,174 @@ +package com.cricketcraft.chisel.inventory; + +import com.cricketcraft.chisel.block.tileentity.TileEntityDeChisel; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +public class ContainerDeChisel extends Container{ + + public EntityPlayer player; + public TileEntityDeChisel deChisel; + + public ContainerDeChisel(InventoryPlayer player, TileEntityDeChisel deChisel){ + this.player = player.player; + this.deChisel = deChisel; + + addSlot(deChisel, 0, 53, 15); + addSlot(deChisel, 1, 103, 15); + + bindPlayerInventory(player); + } + + private void addSlot(IInventory inv, final int id, int x, int y) { + addSlotToContainer(new Slot(inv, id, x, y) { + + @Override + public boolean isItemValid(ItemStack arg0) { + return inventory.isItemValidForSlot(id, arg0); + } + }); + } + + protected void bindPlayerInventory(InventoryPlayer invPlayer) { + for (int row = 0; row < 3; row++) { + for (int column = 0; column < 9; column++) { + addSlotToContainer(new Slot(invPlayer, column + row * 9 + 9, 8 + column * 18, 84 + row * 18)); + } + } + + for (int slotNumber = 0; slotNumber < 9; slotNumber++) { + addSlotToContainer(new Slot(invPlayer, slotNumber, 8 + slotNumber * 18, 142)); + } + } + + @Override + public boolean canInteractWith(EntityPlayer player) { + return deChisel.isUseableByPlayer(player); + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int slotNumber) { + ItemStack itemStack = null; + Slot slot = (Slot) this.inventorySlots.get(slotNumber); + + if (slot != null && slot.getHasStack()) { + ItemStack itemStack1 = slot.getStack(); + itemStack = itemStack1.copy(); + + // if we are in the auto chisel + if (slotNumber <= 6) { + if (!this.mergeItemStack(itemStack1, 7, 42, false)) { + return null; + } + // otherwise just put it in one of the machine slots + } else if (!this.mergeItemStack(itemStack1, 0, 7, false)) { + return null; + } + + if (itemStack1.stackSize == 0) { + slot.putStack(null); + } else { + slot.onSlotChanged(); + } + + if (itemStack1.stackSize == itemStack.stackSize) { + return null; + } + + slot.onPickupFromSlot(player, itemStack1); + } + + return itemStack; + } + + /** + * Added validation of slot input + * + * @author CrazyPants + */ + @Override + protected boolean mergeItemStack(ItemStack par1ItemStack, int fromIndex, int toIndex, boolean reversOrder) { + + boolean result = false; + int checkIndex = fromIndex; + + if (reversOrder) { + checkIndex = toIndex - 1; + } + + Slot slot; + ItemStack itemstack1; + + if (par1ItemStack.isStackable()) { + + while (par1ItemStack.stackSize > 0 && (!reversOrder && checkIndex < toIndex || reversOrder && checkIndex >= fromIndex)) { + slot = (Slot) this.inventorySlots.get(checkIndex); + itemstack1 = slot.getStack(); + + if (itemstack1 != null && itemstack1.getItem() == par1ItemStack.getItem() && (!par1ItemStack.getHasSubtypes() || par1ItemStack.getItemDamage() == itemstack1.getItemDamage()) + && ItemStack.areItemStackTagsEqual(par1ItemStack, itemstack1) && slot.isItemValid(par1ItemStack)) { + + int mergedSize = itemstack1.stackSize + par1ItemStack.stackSize; + int maxStackSize = Math.min(par1ItemStack.getMaxStackSize(), slot.getSlotStackLimit()); + if (mergedSize <= maxStackSize) { + par1ItemStack.stackSize = 0; + itemstack1.stackSize = mergedSize; + slot.onSlotChanged(); + result = true; + } else if (itemstack1.stackSize < maxStackSize) { + par1ItemStack.stackSize -= maxStackSize - itemstack1.stackSize; + itemstack1.stackSize = maxStackSize; + slot.onSlotChanged(); + result = true; + } + } + + if (reversOrder) { + --checkIndex; + } else { + ++checkIndex; + } + } + } + + if (par1ItemStack.stackSize > 0) { + if (reversOrder) { + checkIndex = toIndex - 1; + } else { + checkIndex = fromIndex; + } + + while (!reversOrder && checkIndex < toIndex || reversOrder && checkIndex >= fromIndex) { + slot = (Slot) this.inventorySlots.get(checkIndex); + itemstack1 = slot.getStack(); + + if (itemstack1 == null && slot.isItemValid(par1ItemStack)) { + ItemStack in = par1ItemStack.copy(); + in.stackSize = Math.min(in.stackSize, slot.getSlotStackLimit()); + + slot.putStack(in); + slot.onSlotChanged(); + if (in.stackSize >= par1ItemStack.stackSize) { + par1ItemStack.stackSize = 0; + } else { + par1ItemStack.stackSize -= in.stackSize; + } + result = true; + break; + } + + if (reversOrder) { + --checkIndex; + } else { + ++checkIndex; + } + } + } + + return result; + } +} diff --git a/src/main/java/com/cricketcraft/chisel/proxy/ClientProxy.java b/src/main/java/com/cricketcraft/chisel/proxy/ClientProxy.java index eac8eb45..e89477ea 100644 --- a/src/main/java/com/cricketcraft/chisel/proxy/ClientProxy.java +++ b/src/main/java/com/cricketcraft/chisel/proxy/ClientProxy.java @@ -1,11 +1,13 @@ package com.cricketcraft.chisel.proxy; import com.cricketcraft.chisel.block.tileentity.TileEntityAutoChisel; +import com.cricketcraft.chisel.block.tileentity.TileEntityDeChisel; import com.cricketcraft.chisel.block.tileentity.TileEntityPresent; import com.cricketcraft.chisel.client.player.PlayerSpecials; import com.cricketcraft.chisel.client.render.*; import com.cricketcraft.chisel.client.render.item.ItemChiselRenderer; import com.cricketcraft.chisel.client.render.tile.RenderAutoChisel; +import com.cricketcraft.chisel.client.render.tile.RenderDeChisel; import com.cricketcraft.chisel.client.render.tile.RenderPresent; import com.cricketcraft.chisel.entity.EntityBallOMoss; import com.cricketcraft.chisel.entity.EntityChiselSnowman; @@ -44,9 +46,11 @@ public class ClientProxy extends CommonProxy { RenderingRegistry.registerBlockHandler(new RendererMultiLayer()); RenderAutoChisel rac = new RenderAutoChisel(); + RenderDeChisel deChisel = new RenderDeChisel(); RenderingRegistry.registerBlockHandler(rac); MinecraftForgeClient.registerItemRenderer(Item.getItemFromBlock(ChiselBlocks.autoChisel), rac); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityAutoChisel.class, rac); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityDeChisel.class, deChisel); RenderPresent rp = new RenderPresent(); MinecraftForgeClient.registerItemRenderer(Item.getItemFromBlock(ChiselBlocks.present), rp); diff --git a/src/main/java/com/cricketcraft/chisel/proxy/CommonProxy.java b/src/main/java/com/cricketcraft/chisel/proxy/CommonProxy.java index 620ac259..a46959e7 100644 --- a/src/main/java/com/cricketcraft/chisel/proxy/CommonProxy.java +++ b/src/main/java/com/cricketcraft/chisel/proxy/CommonProxy.java @@ -1,5 +1,6 @@ package com.cricketcraft.chisel.proxy; +import com.cricketcraft.chisel.block.tileentity.TileEntityDeChisel; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.world.World; @@ -13,6 +14,7 @@ public class CommonProxy { public void registerTileEntities() { GameRegistry.registerTileEntity(TileEntityAutoChisel.class, "autoChisel"); GameRegistry.registerTileEntity(TileEntityPresent.class, "tile.chisel.present"); + GameRegistry.registerTileEntity(TileEntityDeChisel.class, "deChisel"); } public void preInit() { diff --git a/src/main/resources/assets/chisel/textures/blocks/DeChisel.png b/src/main/resources/assets/chisel/textures/blocks/DeChisel.png new file mode 100644 index 0000000000000000000000000000000000000000..56868b5e81e683b603dcd4549fc3dd038d9de6b8 GIT binary patch literal 2699 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 FV1n=aSFQj6 literal 0 HcmV?d00001