diff --git a/archaic/src/main/java/resonantinduction/archaic/Archaic.java b/archaic/src/main/java/resonantinduction/archaic/Archaic.java index 80825f367..38a004d4d 100644 --- a/archaic/src/main/java/resonantinduction/archaic/Archaic.java +++ b/archaic/src/main/java/resonantinduction/archaic/Archaic.java @@ -8,7 +8,6 @@ import resonantinduction.archaic.blocks.BlockTurntable; import resonantinduction.archaic.crate.BlockCrate; import resonantinduction.archaic.crate.ItemBlockCrate; import resonantinduction.archaic.crate.TileCrate; -import resonantinduction.archaic.engineering.BlockEngineeringTable; import resonantinduction.archaic.engineering.ItemHammer; import resonantinduction.archaic.engineering.TileEngineeringTable; import resonantinduction.archaic.filter.BlockFilter; @@ -37,7 +36,6 @@ import calclavia.lib.content.ContentRegistry; import calclavia.lib.network.PacketAnnotation; import calclavia.lib.network.PacketHandler; import calclavia.lib.prefab.item.ItemBlockMetadata; -import calclavia.lib.prefab.item.ItemBlockSaved; import calclavia.lib.recipe.UniversalRecipe; import cpw.mods.fml.common.Mod; import cpw.mods.fml.common.Mod.EventHandler; @@ -100,7 +98,7 @@ public class Archaic { Settings.load(); NetworkRegistry.instance().registerGuiHandler(this, proxy); - blockEngineeringTable = contentRegistry.createBlock(BlockEngineeringTable.class, ItemBlockSaved.class, TileEngineeringTable.class); + blockEngineeringTable = contentRegistry.newBlock(TileEngineeringTable.class); blockCrate = contentRegistry.createBlock(BlockCrate.class, ItemBlockCrate.class, TileCrate.class); blockImprinter = contentRegistry.createTile(BlockImprinter.class, TileImprinter.class); blockTurntable = contentRegistry.createBlock(BlockTurntable.class); diff --git a/archaic/src/main/java/resonantinduction/archaic/engineering/BlockEngineeringTable.java b/archaic/src/main/java/resonantinduction/archaic/engineering/BlockEngineeringTable.java deleted file mode 100644 index a6afbe71e..000000000 --- a/archaic/src/main/java/resonantinduction/archaic/engineering/BlockEngineeringTable.java +++ /dev/null @@ -1,281 +0,0 @@ -package resonantinduction.archaic.engineering; - -import java.util.Random; - -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IconRegister; -import net.minecraft.entity.item.EntityItem; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.IInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Icon; -import net.minecraft.world.World; -import universalelectricity.api.vector.Vector2; -import universalelectricity.api.vector.Vector3; -import calclavia.lib.prefab.block.BlockRotatable; -import calclavia.lib.prefab.item.ItemBlockSaved; -import calclavia.lib.utility.WorldUtility; -import calclavia.lib.utility.inventory.InventoryUtility; -import codechicken.multipart.ControlKeyModifer; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -/** - * A world-based crafting table. - * - * TODO: Filter support, inventory seek support. - * - * @author Calclavia - */ -public class BlockEngineeringTable extends BlockRotatable -{ - @SideOnly(Side.CLIENT) - private Icon iconTop; - @SideOnly(Side.CLIENT) - private Icon iconFront; - - public BlockEngineeringTable(int id) - { - super(id, Material.wood); - setBlockBounds(0, 0, 0, 1, 0.9f, 1); - } - - @Override - public void onBlockClicked(World world, int x, int y, int z, EntityPlayer player) - { - if (!world.isRemote && isControlDown(player)) - { - dropInventory(world, x, y, z, 0, 0); - } - } - - @Override - public void dropEntireInventory(World world, int x, int y, int z, int par5, int par6) - { - - } - - public void dropInventory(World world, int x, int y, int z, int par5, int par6) - { - TileEntity tileEntity = world.getBlockTileEntity(x, y, z); - - if (tileEntity != null) - { - if (tileEntity instanceof IInventory) - { - IInventory inventory = (IInventory) tileEntity; - - // Don't drop the output, so subtract by one. - for (int i = 0; i < inventory.getSizeInventory() - 1; ++i) - { - ItemStack var7 = inventory.getStackInSlot(i); - - if (var7 != null) - { - Random random = new Random(); - float var8 = random.nextFloat() * 0.8F + 0.1F; - float var9 = random.nextFloat() * 0.8F + 0.1F; - float var10 = random.nextFloat() * 0.8F + 0.1F; - - while (var7.stackSize > 0) - { - int var11 = random.nextInt(21) + 10; - - if (var11 > var7.stackSize) - { - var11 = var7.stackSize; - } - - var7.stackSize -= var11; - EntityItem var12 = new EntityItem(world, (x + var8), (y + var9), (z + var10), new ItemStack(var7.itemID, var11, var7.getItemDamage())); - - if (var7.hasTagCompound()) - { - var12.getEntityItem().setTagCompound((NBTTagCompound) var7.getTagCompound().copy()); - } - - float var13 = 0.05F; - var12.motionX = ((float) random.nextGaussian() * var13); - var12.motionY = ((float) random.nextGaussian() * var13 + 0.2F); - var12.motionZ = ((float) random.nextGaussian() * var13); - world.spawnEntityInWorld(var12); - - if (var7.stackSize <= 0) - { - inventory.setInventorySlotContents(i, null); - } - } - } - - inventory.setInventorySlotContents(i, null); - } - - inventory.onInventoryChanged(); - } - } - } - - @Override - public boolean onMachineActivated(World world, int x, int y, int z, EntityPlayer player, int hitSide, float hitX, float hitY, float hitZ) - { - if (player.getCurrentEquippedItem() != null && player.getCurrentEquippedItem().getItem() instanceof ItemHammer) - { - return false; - } - - TileEntity te = world.getBlockTileEntity(x, y, z); - - if (te instanceof TileEngineeringTable) - { - TileEngineeringTable tile = (TileEngineeringTable) te; - - if (hitSide == 1) - { - if (!world.isRemote) - { - Vector3 hitVector = new Vector3(hitX, 0, hitZ); - final double regionLength = 1d / 3d; - - // Rotate the hit vector baed on direction of the tile. - hitVector.translate(new Vector3(-0.5, 0, -0.5)); - hitVector.rotate(WorldUtility.getAngleFromForgeDirection(tile.getDirection()), Vector3.UP()); - hitVector.translate(new Vector3(0.5, 0, 0.5)); - - /** - * Crafting Matrix - */ - matrix: - for (int j = 0; j < 3; j++) - { - for (int k = 0; k < 3; k++) - { - Vector2 check = new Vector2(j, k).scale(regionLength); - - if (check.distance(hitVector.toVector2()) < regionLength) - { - int slotID = j * 3 + k; - interactCurrentItem(tile, slotID, player); - break matrix; - } - } - } - - tile.onInventoryChanged(); - } - - return true; - } - else if (hitSide != 0) - { - /** - * Take out of engineering table. - */ - if (!world.isRemote) - { - tile.setPlayerInventory(player.inventory); - - ItemStack output = tile.getStackInSlot(9); - boolean firstLoop = true; - - while (output != null && (firstLoop || ControlKeyModifer.isControlDown(player))) - { - tile.onPickUpFromSlot(player, 9, output); - - if (output.stackSize > 0) - { - InventoryUtility.dropItemStack(world, new Vector3(player), output, 0); - } - - tile.setInventorySlotContents(9, null); - tile.onInventoryChanged(); - - output = tile.getStackInSlot(9); - firstLoop = false; - } - - tile.setPlayerInventory(null); - } - - return true; - } - } - - return false; - } - - @Override - public boolean onUseWrench(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) - { - TileEntity tileEntity = world.getBlockTileEntity(x, y, z); - - if (tileEntity instanceof TileEngineeringTable) - { - TileEngineeringTable tile = (TileEngineeringTable) tileEntity; - tile.searchInventories = !tile.searchInventories; - - if (!world.isRemote) - { - if (tile.searchInventories) - player.addChatMessage("Engineering table will now search for nearby inventories for resources."); - else - player.addChatMessage("Engineering table will not search for nearby inventories for resources."); - } - - world.markBlockForUpdate(x, y, z); - - return true; - } - - return false; - } - - @Override - @SideOnly(Side.CLIENT) - public Icon getIcon(int side, int meta) - { - return side == 1 ? this.iconTop : (side == meta ? this.iconFront : this.blockIcon); - } - - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IconRegister par1IconRegister) - { - this.iconTop = par1IconRegister.registerIcon(this.getTextureName() + "_top"); - this.iconFront = par1IconRegister.registerIcon(this.getTextureName() + "_front"); - this.blockIcon = par1IconRegister.registerIcon(this.getTextureName() + "_side"); - } - - @Override - public TileEntity createNewTileEntity(World world) - { - return new TileEngineeringTable(); - } - - @Override - public boolean renderAsNormalBlock() - { - return false; - } - - @Override - public boolean isOpaqueCube() - { - return false; - } - - @Override - public void breakBlock(World world, int x, int y, int z, int par5, int par6) - { - ItemBlockSaved.dropBlockWithNBT(this, world, x, y, z); - super.breakBlock(world, x, y, z, par5, par6); - } - - /** To cancel the vanilla method of dropping the itemEntity */ - @Override - protected void dropBlockAsItem_do(World world, int x, int y, int z, ItemStack stack) - { - - } -} diff --git a/archaic/src/main/java/resonantinduction/archaic/engineering/TileEngineeringTable.java b/archaic/src/main/java/resonantinduction/archaic/engineering/TileEngineeringTable.java index 8e3db3c0b..73265481a 100644 --- a/archaic/src/main/java/resonantinduction/archaic/engineering/TileEngineeringTable.java +++ b/archaic/src/main/java/resonantinduction/archaic/engineering/TileEngineeringTable.java @@ -1,7 +1,10 @@ package resonantinduction.archaic.engineering; +import java.util.Random; import java.util.Set; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IconRegister; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.entity.player.InventoryPlayer; @@ -14,26 +17,39 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.network.packet.Packet; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Icon; +import net.minecraft.world.World; import net.minecraftforge.common.ForgeDirection; import org.apache.commons.lang3.ArrayUtils; import resonantinduction.core.ResonantInduction; +import resonantinduction.core.Settings; import resonantinduction.core.prefab.imprint.ItemImprint; +import universalelectricity.api.vector.Vector2; import universalelectricity.api.vector.Vector3; +import calclavia.lib.content.module.TileBlock; +import calclavia.lib.content.module.prefab.TileInventory; import calclavia.lib.gui.ContainerDummy; import calclavia.lib.network.IPacketReceiver; import calclavia.lib.network.PacketHandler; +import calclavia.lib.prefab.item.ItemBlockSaved; import calclavia.lib.prefab.slot.ISlotPickResult; import calclavia.lib.prefab.tile.IRotatable; -import calclavia.lib.prefab.tile.TileAdvanced; +import calclavia.lib.prefab.vector.Cuboid; +import calclavia.lib.utility.WorldUtility; import calclavia.lib.utility.inventory.AutoCraftingManager; +import calclavia.lib.utility.inventory.InventoryUtility; import calclavia.lib.utility.inventory.AutoCraftingManager.IAutoCrafter; +import codechicken.multipart.ControlKeyModifer; import com.builtbroken.common.Pair; import com.google.common.io.ByteArrayDataInput; -public class TileEngineeringTable extends TileAdvanced implements IPacketReceiver, IRotatable, ISidedInventory, ISlotPickResult, IAutoCrafter +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class TileEngineeringTable extends TileInventory implements IPacketReceiver, IRotatable, ISidedInventory, ISlotPickResult, IAutoCrafter { public static final int CRAFTING_MATRIX_END = 9; public static final int CRAFTING_OUTPUT_END = CRAFTING_MATRIX_END + 1; @@ -47,11 +63,11 @@ public class TileEngineeringTable extends TileAdvanced implements IPacketReceive private AutoCraftingManager craftManager; /** 9 slots for crafting, 1 slot for a output. */ - public static final int CRAFTING_MATRIX_SIZE=9; + public static final int CRAFTING_MATRIX_SIZE = 9; public ItemStack[] craftingMatrix = new ItemStack[CRAFTING_MATRIX_SIZE]; public static final int[] craftingSlots = { 0, 1, 2, 3, 4, 5, 6, 7, 8 }; - /** The output inventory containing slots.*/ + /** The output inventory containing slots. */ public ItemStack[] outputInventory = new ItemStack[1]; /** The ability for the engineering table to search nearby inventories. */ @@ -63,6 +79,181 @@ public class TileEngineeringTable extends TileAdvanced implements IPacketReceive private InventoryPlayer invPlayer = null; private int[] playerSlots; + @SideOnly(Side.CLIENT) + private Icon iconTop; + @SideOnly(Side.CLIENT) + private Icon iconFront; + + public TileEngineeringTable() + { + super(Material.wood); + bounds = new Cuboid(0, 0, 0, 1, 0.9f, 1); + isOpaqueCube = false; + normalRender = false; + itemBlock = ItemBlockSaved.class; + } + + @Override + @SideOnly(Side.CLIENT) + public Icon getIcon(int side, int meta) + { + return side == 1 ? iconTop : (side == meta ? iconFront : icon); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IconRegister iconRegister) + { + iconTop = iconRegister.registerIcon(this.getTextureName() + "_top"); + iconFront = iconRegister.registerIcon(this.getTextureName() + "_front"); + icon = iconRegister.registerIcon(this.getTextureName() + "_side"); + } + + @Override + public void click(EntityPlayer player) + { + if (!world().isRemote && ControlKeyModifer.isControlDown(player)) + { + if (this instanceof IInventory) + { + IInventory inventory = (IInventory) this; + + // Don't drop the output, so subtract by one. + for (int i = 0; i < inventory.getSizeInventory() - 1; ++i) + { + ItemStack dropStack = inventory.getStackInSlot(i); + + if (dropStack != null) + { + int var11 = dropStack.stackSize; + dropStack.stackSize -= var11; + InventoryUtility.dropItemStack(world(), center(), dropStack); + + if (dropStack.stackSize <= 0) + inventory.setInventorySlotContents(i, null); + } + } + + inventory.onInventoryChanged(); + } + } + } + + @Override + protected boolean use(EntityPlayer player, int hitSide, Vector3 hit) + { + if (player.getCurrentEquippedItem() != null && player.getCurrentEquippedItem().getItem() instanceof ItemHammer) + { + return false; + } + + if (hitSide == 1) + { + if (!world().isRemote) + { + Vector3 hitVector = new Vector3(hit.x, 0, hit.z); + final double regionLength = 1d / 3d; + + // Rotate the hit vector baed on direction of the tile. + hitVector.translate(new Vector3(-0.5, 0, -0.5)); + hitVector.rotate(WorldUtility.getAngleFromForgeDirection(getDirection()), Vector3.UP()); + hitVector.translate(new Vector3(0.5, 0, 0.5)); + + /** + * Crafting Matrix + */ + matrix: + for (int j = 0; j < 3; j++) + { + for (int k = 0; k < 3; k++) + { + Vector2 check = new Vector2(j, k).scale(regionLength); + + if (check.distance(hitVector.toVector2()) < regionLength) + { + int slotID = j * 3 + k; + interactCurrentItem(this, slotID, player); + break matrix; + } + } + } + + onInventoryChanged(); + } + + return true; + } + else if (hitSide != 0) + { + /** + * Take out of engineering table. + */ + if (!world().isRemote) + { + setPlayerInventory(player.inventory); + + ItemStack output = getStackInSlot(9); + boolean firstLoop = true; + + while (output != null && (firstLoop || ControlKeyModifer.isControlDown(player))) + { + onPickUpFromSlot(player, 9, output); + + if (output.stackSize > 0) + { + InventoryUtility.dropItemStack(world(), new Vector3(player), output, 0); + } + + setInventorySlotContents(9, null); + onInventoryChanged(); + + output = getStackInSlot(9); + firstLoop = false; + } + + setPlayerInventory(null); + } + + return true; + + } + return false; + } + + @Override + protected boolean configure(EntityPlayer player, int hitSide, Vector3 hit) + { + searchInventories = !searchInventories; + + if (!world().isRemote) + { + if (searchInventories) + player.addChatMessage("Engineering table will now search for nearby inventories for resources."); + else + player.addChatMessage("Engineering table will not search for nearby inventories for resources."); + } + + markUpdate(); + return true; + } + + @Override + public void onRemove(int par5, int par6) + { + ItemBlockSaved.dropBlockWithNBT(getBlockType(), world(), x(), y(), z()); + } + + @Override + public int quantityDropped(int meta, int fortune) + { + return 0; + } + + @Override + public void dropEntireInventory(int par5, int par6) + { + } + /** * Creates a "fake inventory" and hook the player up to the crafter to use the player's items. */ @@ -470,7 +661,10 @@ public class TileEngineeringTable extends TileAdvanced implements IPacketReceive @Override public int[] getAccessibleSlotsFromSide(int side) { - return new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; + if (Settings.ALLOW_ENGINEERING_AUTOCRAFT) + return new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; + + return new int[0]; } /** diff --git a/src/main/java/resonantinduction/core/Settings.java b/src/main/java/resonantinduction/core/Settings.java index 1746259c8..40fd19f86 100644 --- a/src/main/java/resonantinduction/core/Settings.java +++ b/src/main/java/resonantinduction/core/Settings.java @@ -50,7 +50,7 @@ public class Settings /** Settings */ private static boolean didLoad = false; - public static int FURNACE_WATTAGE = 50000; + public static boolean ALLOW_ENGINEERING_AUTOCRAFT = true; public static boolean SOUND_FXS = true; public static boolean SHINY_SILVER = true; public static int MAX_CONTRACTOR_DISTANCE = 200; @@ -65,7 +65,7 @@ public class Settings if (!didLoad) { // Config - FURNACE_WATTAGE = CONFIGURATION.get(Configuration.CATEGORY_GENERAL, "Furnace Wattage Per Tick", FURNACE_WATTAGE).getInt(FURNACE_WATTAGE); + ALLOW_ENGINEERING_AUTOCRAFT = CONFIGURATION.get(Configuration.CATEGORY_GENERAL, "Engineering Table Autocraft", ALLOW_ENGINEERING_AUTOCRAFT).getBoolean(ALLOW_ENGINEERING_AUTOCRAFT); SOUND_FXS = CONFIGURATION.get(Configuration.CATEGORY_GENERAL, "Tesla Sound FXs", SOUND_FXS).getBoolean(SOUND_FXS); SHINY_SILVER = CONFIGURATION.get(Configuration.CATEGORY_GENERAL, "Shiny silver wires", SHINY_SILVER).getBoolean(SHINY_SILVER); MAX_CONTRACTOR_DISTANCE = CONFIGURATION.get(Configuration.CATEGORY_GENERAL, "Max EM Contractor Path", MAX_CONTRACTOR_DISTANCE).getInt(MAX_CONTRACTOR_DISTANCE);