v5.5.4 Beta #9

*Better pumping code, tested and I'm unable to trick it anymore.
*Gave the Electric Pump an active state, lights up now when it's
pumping.
*Sounds now are removed and disabled whenever their chunk is unloaded.
*Added some missing javadocs.
*Cleanups.
This commit is contained in:
Aidan Brady 2013-04-06 23:09:25 -04:00
parent daafd937c2
commit 2028030963
5 changed files with 153 additions and 26 deletions

View file

@ -8,6 +8,9 @@ import java.util.Random;
import mekanism.common.IActiveState;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.ForgeSubscribe;
import net.minecraftforge.event.world.ChunkEvent;
import paulscode.sound.SoundSystem;
import cpw.mods.fml.client.FMLClientHandler;
@ -34,6 +37,7 @@ public class SoundHandler
if(soundSystem == null)
{
soundSystem = FMLClientHandler.instance().instance().getClient().sndManager.sndSystem;
MinecraftForge.EVENT_BUS.register(this);
System.out.println("[Mekanism] Successfully set up SoundHandler.");
}
}
@ -84,7 +88,6 @@ public class SoundHandler
for(Sound sound : soundsToRemove)
{
System.out.println("[Mekanism] Removed dead sound '" + sound.identifier + ".'");
sound.remove();
TileEntity tileEntity = FMLClientHandler.instance().getClient().theWorld.getBlockTileEntity(sound.xCoord, sound.yCoord, sound.zCoord);
@ -130,4 +133,29 @@ public class SoundHandler
return "Mekanism_" + sounds.size() + "_" + new Random().nextInt(10000);
}
}
@ForgeSubscribe
public void onChunkUnload(ChunkEvent.Unload event)
{
if(event.getChunk() != null)
{
for(Object obj : event.getChunk().chunkTileEntityMap.values())
{
if(obj instanceof TileEntity)
{
TileEntity tileEntity = (TileEntity)obj;
if(tileEntity instanceof IHasSound)
{
if(sounds.contains(((IHasSound)tileEntity).getSound()))
{
sounds.remove(((IHasSound)tileEntity).getSound());
}
((IHasSound)tileEntity).removeSound();
}
}
}
}
}
}

View file

@ -131,7 +131,7 @@ public class BlockMachine extends BlockContainer implements IDismantleable
public void randomDisplayTick(World world, int x, int y, int z, Random random)
{
TileEntityElectricBlock tileEntity = (TileEntityElectricBlock)world.getBlockTileEntity(x, y, z);
if(MekanismUtils.isActive(world, x, y, z))
if(MekanismUtils.isActive(world, x, y, z) && !(tileEntity instanceof TileEntityElectricPump))
{
float xRandom = (float)x + 0.5F;
float yRandom = (float)y + 0.0F + random.nextFloat() * 6.0F / 16.0F;
@ -747,11 +747,8 @@ public class BlockMachine extends BlockContainer implements IDismantleable
public TileEntity create()
{
TileEntity tileEntity;
try {
tileEntity = tileEntityClass.newInstance();
return tileEntity;
return tileEntityClass.newInstance();
} catch(Exception e) {
System.err.println("[Mekanism] Unable to indirectly create tile entity.");
e.printStackTrace();

View file

@ -658,6 +658,50 @@ public final class MekanismUtils
return null;
}
/**
* Gets the liquid ID at a certain location, 0 if there isn't one
* @param world - world the block is in
* @param x - x coordinate
* @param y - y coordinate
* @param z - z coordinate
* @return liquid ID
*/
public static int getLiquidId(World world, int x, int y, int z)
{
int id = world.getBlockId(x, y, z);
int meta = world.getBlockMetadata(x, y, z);
if(id == 0)
{
return 0;
}
if(id == Block.waterStill.blockID || id == Block.waterMoving.blockID)
{
return Block.waterStill.blockID;
}
else if(id == Block.lavaStill.blockID || id == Block.lavaMoving.blockID)
{
return Block.lavaStill.blockID;
}
else if(Block.blocksList[id] instanceof ILiquid)
{
ILiquid liquid = (ILiquid)Block.blocksList[id];
return liquid.stillLiquidId();
}
return 0;
}
/**
* Whether or not a block is a dead liquid.
* @param world - world the block is in
* @param x - x coordinate
* @param y - y coordinate
* @param z - z coordinate
* @return if the block is a dead liquid
*/
public static boolean isDeadLiquid(World world, int x, int y, int z)
{
int id = world.getBlockId(x, y, z);

View file

@ -32,7 +32,7 @@ import net.minecraftforge.liquids.LiquidContainerRegistry;
import net.minecraftforge.liquids.LiquidStack;
import net.minecraftforge.liquids.LiquidTank;
public class TileEntityElectricPump extends TileEntityElectricBlock implements ITankContainer, ISustainedTank
public class TileEntityElectricPump extends TileEntityElectricBlock implements ITankContainer, ISustainedTank, IActiveState
{
/** This pump's tank */
public LiquidTank liquidTank;
@ -43,6 +43,12 @@ public class TileEntityElectricPump extends TileEntityElectricBlock implements I
/** The nodes that have already been sucked up, but are held on to in order to remove dead blocks */
public Set<BlockWrapper> cleaningNodes = new HashSet<BlockWrapper>();
/** Whether or not this block is in it's active state. */
public boolean isActive;
/** The previous active state for this block. */
public boolean prevActive;
/** Random for this pump */
public Random random = new Random();
@ -123,11 +129,24 @@ public class TileEntityElectricPump extends TileEntityElectricBlock implements I
}
}
if(!suck(true) && !clean(true))
if(!suck(true))
{
cleaningNodes.clear();
if(!clean(true) && !cleaningNodes.isEmpty())
{
if(!worldObj.isRemote)
{
setActive(false);
}
cleaningNodes.clear();
}
}
else {
if(!worldObj.isRemote)
{
setActive(true);
}
clean(true);
}
@ -195,9 +214,12 @@ public class TileEntityElectricPump extends TileEntityElectricBlock implements I
}
else if(MekanismUtils.isDeadLiquid(worldObj, wrapper.x, wrapper.y, wrapper.z))
{
if(take)
if(liquidTank.getLiquid() != null && MekanismUtils.getLiquidId(worldObj, wrapper.x, wrapper.y, wrapper.z) == liquidTank.getLiquid().itemID)
{
worldObj.setBlockToAir(wrapper.x, wrapper.y, wrapper.z);
if(take)
{
worldObj.setBlockToAir(wrapper.x, wrapper.y, wrapper.z);
}
}
}
@ -207,7 +229,7 @@ public class TileEntityElectricPump extends TileEntityElectricBlock implements I
int y = MekanismUtils.getCoords(wrapper, orientation)[1];
int z = MekanismUtils.getCoords(wrapper, orientation)[2];
if(MekanismUtils.getDistance(BlockWrapper.get(this), new BlockWrapper(x, y, z)) <= 2340)
if(MekanismUtils.getDistance(BlockWrapper.get(this), new BlockWrapper(x, y, z)) <= 80)
{
if(MekanismUtils.isLiquid(worldObj, x, y, z))
{
@ -226,9 +248,12 @@ public class TileEntityElectricPump extends TileEntityElectricBlock implements I
}
else if(MekanismUtils.isDeadLiquid(worldObj, x, y, z))
{
if(take)
if(liquidTank.getLiquid() != null && MekanismUtils.getLiquidId(worldObj, x, y, z) == liquidTank.getLiquid().itemID)
{
worldObj.setBlockToAir(x, y, z);
if(take)
{
worldObj.setBlockToAir(x, y, z);
}
}
}
}
@ -263,9 +288,12 @@ public class TileEntityElectricPump extends TileEntityElectricBlock implements I
}
else if(MekanismUtils.isDeadLiquid(worldObj, x, y, z))
{
if(take)
if(liquidTank.getLiquid() != null && MekanismUtils.getLiquidId(worldObj, x, y, z) == liquidTank.getLiquid().itemID)
{
worldObj.setBlockToAir(x, y, z);
if(take)
{
worldObj.setBlockToAir(x, y, z);
}
}
}
}
@ -285,10 +313,13 @@ public class TileEntityElectricPump extends TileEntityElectricBlock implements I
{
if(MekanismUtils.isDeadLiquid(worldObj, wrapper.x, wrapper.y, wrapper.z))
{
took = true;
if(take)
if(liquidTank.getLiquid() != null && MekanismUtils.getLiquidId(worldObj, wrapper.x, wrapper.y, wrapper.z) == liquidTank.getLiquid().itemID)
{
worldObj.setBlockToAir(wrapper.x, wrapper.y, wrapper.z);
took = true;
if(take)
{
worldObj.setBlockToAir(wrapper.x, wrapper.y, wrapper.z);
}
}
}
}
@ -297,10 +328,13 @@ public class TileEntityElectricPump extends TileEntityElectricBlock implements I
{
if(MekanismUtils.isDeadLiquid(worldObj, wrapper.x, wrapper.y, wrapper.z))
{
took = true;
if(take)
if(liquidTank.getLiquid() != null && MekanismUtils.getLiquidId(worldObj, wrapper.x, wrapper.y, wrapper.z) == liquidTank.getLiquid().itemID)
{
worldObj.setBlockToAir(wrapper.x, wrapper.y, wrapper.z);
took = true;
if(take)
{
worldObj.setBlockToAir(wrapper.x, wrapper.y, wrapper.z);
}
}
}
}
@ -314,6 +348,8 @@ public class TileEntityElectricPump extends TileEntityElectricBlock implements I
{
super.handlePacketData(dataStream);
isActive = dataStream.readBoolean();
try {
int amount = dataStream.readInt();
int itemID = dataStream.readInt();
@ -331,6 +367,8 @@ public class TileEntityElectricPump extends TileEntityElectricBlock implements I
{
super.getNetworkedData(data);
data.add(isActive);
if(liquidTank.getLiquid() != null)
{
data.add(liquidTank.getLiquid().amount);
@ -356,6 +394,8 @@ public class TileEntityElectricPump extends TileEntityElectricBlock implements I
{
super.writeToNBT(nbtTags);
nbtTags.setBoolean("isActive", isActive);
if(liquidTank.getLiquid() != null)
{
nbtTags.setTag("liquidTank", liquidTank.writeToNBT(new NBTTagCompound()));
@ -395,6 +435,8 @@ public class TileEntityElectricPump extends TileEntityElectricBlock implements I
{
super.readFromNBT(nbtTags);
isActive = nbtTags.getBoolean("isActive");
if(nbtTags.hasKey("liquidTank"))
{
liquidTank.readFromNBT(nbtTags.getCompoundTag("liquidTank"));
@ -533,4 +575,23 @@ public class TileEntityElectricPump extends TileEntityElectricBlock implements I
{
return true;
}
@Override
public void setActive(boolean active)
{
isActive = active;
if(prevActive != active)
{
PacketHandler.sendTileEntityPacketToClients(this, 0, getNetworkedData(new ArrayList()));
}
prevActive = active;
}
@Override
public boolean getActive()
{
return isActive;
}
}

View file

@ -593,11 +593,8 @@ public class BlockGenerator extends BlockContainer implements IDismantleable
public TileEntity create()
{
TileEntity tileEntity;
try {
tileEntity = tileEntityClass.newInstance();
return tileEntity;
return tileEntityClass.newInstance();
} catch(Exception e) {
System.err.println("[Mekanism] Unable to indirectly create tile entity.");
e.printStackTrace();