Item ejecting! Still have a minor bug to fix.

This commit is contained in:
Aidan Brady 2013-08-05 03:10:13 -04:00
parent ab262c9b54
commit a00acf06b5
3 changed files with 51 additions and 12 deletions

View file

@ -11,7 +11,7 @@ public class ListUtil
{ {
List<V> toReturn = new ArrayList<V>(); List<V> toReturn = new ArrayList<V>();
for(int i = list.size(); i >= 0; i--) for(int i = list.size()-1; i >= 0; i--)
{ {
toReturn.add((V)list.get(i)); toReturn.add((V)list.get(i));
} }

View file

@ -5,6 +5,7 @@ import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World; import net.minecraft.world.World;
@ -28,11 +29,7 @@ public class BatteryUpdateProtocol
pointer = tileEntity; pointer = tileEntity;
} }
/** private void loopThrough(TileEntity tile)
* Recursively loops through each node connected to the given TileEntity.
* @param tile - the TileEntity to loop over
*/
public void loopThrough(TileEntity tile)
{ {
if(structureFound == null) if(structureFound == null)
{ {
@ -202,7 +199,7 @@ public class BatteryUpdateProtocol
return false; return false;
} }
public void disperseCells() private void disperseCells()
{ {
SynchronizedBatteryData oldStructure = null; SynchronizedBatteryData oldStructure = null;
@ -219,8 +216,8 @@ public class BatteryUpdateProtocol
{ {
int maxCells = iteratedNodes.size()*BatteryManager.CELLS_PER_BATTERY; int maxCells = iteratedNodes.size()*BatteryManager.CELLS_PER_BATTERY;
//TODO eject these
List<ItemStack> rejected = ListUtil.capRemains(oldStructure.inventory, maxCells); List<ItemStack> rejected = ListUtil.capRemains(oldStructure.inventory, maxCells);
ejectItems(rejected, new Vector3(pointer));
ArrayList<List<ItemStack>> inventories = ListUtil.split(ListUtil.cap(oldStructure.inventory, maxCells), iteratedNodes.size()); ArrayList<List<ItemStack>> inventories = ListUtil.split(ListUtil.cap(oldStructure.inventory, maxCells), iteratedNodes.size());
List<TileEntityBattery> iterList = ListUtil.asList(iteratedNodes); List<TileEntityBattery> iterList = ListUtil.asList(iteratedNodes);
@ -241,9 +238,21 @@ public class BatteryUpdateProtocol
} }
} }
/** private void ejectItems(List<ItemStack> items, Vector3 vec)
* Runs the protocol and updates all batteries that make a part of the multiblock battery. {
*/ for(ItemStack itemStack : items)
{
float motion = 0.7F;
double motionX = (pointer.worldObj.rand.nextFloat() * motion) + (1.0F - motion) * 0.5D;
double motionY = (pointer.worldObj.rand.nextFloat() * motion) + (1.0F - motion) * 0.5D;
double motionZ = (pointer.worldObj.rand.nextFloat() * motion) + (1.0F - motion) * 0.5D;
EntityItem entityItem = new EntityItem(pointer.worldObj, vec.x + motionX, vec.y + motionY, vec.z + motionZ, itemStack);
pointer.worldObj.spawnEntityInWorld(entityItem);
}
}
public void updateBatteries() public void updateBatteries()
{ {
loopThrough(pointer); loopThrough(pointer);
@ -274,6 +283,9 @@ public class BatteryUpdateProtocol
tileEntity.structure = structureFound; tileEntity.structure = structureFound;
} }
List<ItemStack> rejected = ListUtil.capRemains(structureFound.inventory, structureFound.getMaxCells());
ejectItems(rejected, new Vector3(pointer));
structureFound.inventory = ListUtil.cap(structureFound.inventory, structureFound.getMaxCells()); structureFound.inventory = ListUtil.cap(structureFound.inventory, structureFound.getMaxCells());
} }
else { else {

View file

@ -5,6 +5,7 @@ package resonantinduction.battery;
import net.minecraft.block.ITileEntityProvider; import net.minecraft.block.ITileEntityProvider;
import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
@ -142,6 +143,32 @@ public class BlockBattery extends BlockBase implements ITileEntityProvider
return false; return false;
} }
@Override
public boolean removeBlockByPlayer(World world, EntityPlayer player, int x, int y, int z)
{
if(!world.isRemote && canHarvestBlock(player, world.getBlockMetadata(x, y, z)))
{
TileEntityBattery tileEntity = (TileEntityBattery)world.getBlockTileEntity(x, y, z);
if(!tileEntity.structure.isMultiblock)
{
for(ItemStack itemStack : tileEntity.structure.inventory)
{
float motion = 0.7F;
double motionX = (world.rand.nextFloat() * motion) + (1.0F - motion) * 0.5D;
double motionY = (world.rand.nextFloat() * motion) + (1.0F - motion) * 0.5D;
double motionZ = (world.rand.nextFloat() * motion) + (1.0F - motion) * 0.5D;
EntityItem entityItem = new EntityItem(world, x + motionX, y + motionY, z + motionZ, itemStack);
world.spawnEntityInWorld(entityItem);
}
}
}
return super.removeBlockByPlayer(world, player, x, y, z);
}
@Override @Override
@SideOnly(Side.CLIENT) @SideOnly(Side.CLIENT)
public int getRenderType() public int getRenderType()