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:
parent
daafd937c2
commit
2028030963
5 changed files with 153 additions and 26 deletions
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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))
|
||||
{
|
||||
if(!clean(true) && !cleaningNodes.isEmpty())
|
||||
{
|
||||
if(!worldObj.isRemote)
|
||||
{
|
||||
setActive(false);
|
||||
}
|
||||
|
||||
cleaningNodes.clear();
|
||||
}
|
||||
}
|
||||
else {
|
||||
if(!worldObj.isRemote)
|
||||
{
|
||||
setActive(true);
|
||||
}
|
||||
|
||||
clean(true);
|
||||
}
|
||||
|
||||
|
@ -194,12 +213,15 @@ public class TileEntityElectricPump extends TileEntityElectricBlock implements I
|
|||
}
|
||||
}
|
||||
else if(MekanismUtils.isDeadLiquid(worldObj, wrapper.x, wrapper.y, wrapper.z))
|
||||
{
|
||||
if(liquidTank.getLiquid() != null && MekanismUtils.getLiquidId(worldObj, wrapper.x, wrapper.y, wrapper.z) == liquidTank.getLiquid().itemID)
|
||||
{
|
||||
if(take)
|
||||
{
|
||||
worldObj.setBlockToAir(wrapper.x, wrapper.y, wrapper.z);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for(ForgeDirection orientation : ForgeDirection.VALID_DIRECTIONS)
|
||||
{
|
||||
|
@ -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))
|
||||
{
|
||||
|
@ -225,6 +247,8 @@ public class TileEntityElectricPump extends TileEntityElectricBlock implements I
|
|||
}
|
||||
}
|
||||
else if(MekanismUtils.isDeadLiquid(worldObj, x, y, z))
|
||||
{
|
||||
if(liquidTank.getLiquid() != null && MekanismUtils.getLiquidId(worldObj, x, y, z) == liquidTank.getLiquid().itemID)
|
||||
{
|
||||
if(take)
|
||||
{
|
||||
|
@ -233,6 +257,7 @@ public class TileEntityElectricPump extends TileEntityElectricBlock implements I
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
cleaningNodes.add(wrapper);
|
||||
recurringNodes.remove(wrapper);
|
||||
|
@ -262,6 +287,8 @@ public class TileEntityElectricPump extends TileEntityElectricBlock implements I
|
|||
}
|
||||
}
|
||||
else if(MekanismUtils.isDeadLiquid(worldObj, x, y, z))
|
||||
{
|
||||
if(liquidTank.getLiquid() != null && MekanismUtils.getLiquidId(worldObj, x, y, z) == liquidTank.getLiquid().itemID)
|
||||
{
|
||||
if(take)
|
||||
{
|
||||
|
@ -272,6 +299,7 @@ public class TileEntityElectricPump extends TileEntityElectricBlock implements I
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
@ -284,6 +312,8 @@ public class TileEntityElectricPump extends TileEntityElectricBlock implements I
|
|||
for(BlockWrapper wrapper : cleaningNodes)
|
||||
{
|
||||
if(MekanismUtils.isDeadLiquid(worldObj, wrapper.x, wrapper.y, wrapper.z))
|
||||
{
|
||||
if(liquidTank.getLiquid() != null && MekanismUtils.getLiquidId(worldObj, wrapper.x, wrapper.y, wrapper.z) == liquidTank.getLiquid().itemID)
|
||||
{
|
||||
took = true;
|
||||
if(take)
|
||||
|
@ -292,10 +322,13 @@ public class TileEntityElectricPump extends TileEntityElectricBlock implements I
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for(BlockWrapper wrapper : recurringNodes)
|
||||
{
|
||||
if(MekanismUtils.isDeadLiquid(worldObj, wrapper.x, wrapper.y, wrapper.z))
|
||||
{
|
||||
if(liquidTank.getLiquid() != null && MekanismUtils.getLiquidId(worldObj, wrapper.x, wrapper.y, wrapper.z) == liquidTank.getLiquid().itemID)
|
||||
{
|
||||
took = true;
|
||||
if(take)
|
||||
|
@ -305,6 +338,7 @@ public class TileEntityElectricPump extends TileEntityElectricBlock implements I
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return took;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Reference in a new issue