Engineering table can be configured to not autocraft

This commit is contained in:
Calclavia 2014-03-08 10:55:31 -08:00
parent c029993500
commit 5888877b0d
4 changed files with 202 additions and 291 deletions

View file

@ -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);

View file

@ -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)
{
}
}

View file

@ -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];
}
/**

View file

@ -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);