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 mekanism.common.IActiveState;
|
||||||
import net.minecraft.tileentity.TileEntity;
|
import net.minecraft.tileentity.TileEntity;
|
||||||
import net.minecraft.world.World;
|
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 paulscode.sound.SoundSystem;
|
||||||
import cpw.mods.fml.client.FMLClientHandler;
|
import cpw.mods.fml.client.FMLClientHandler;
|
||||||
|
|
||||||
|
@ -34,6 +37,7 @@ public class SoundHandler
|
||||||
if(soundSystem == null)
|
if(soundSystem == null)
|
||||||
{
|
{
|
||||||
soundSystem = FMLClientHandler.instance().instance().getClient().sndManager.sndSystem;
|
soundSystem = FMLClientHandler.instance().instance().getClient().sndManager.sndSystem;
|
||||||
|
MinecraftForge.EVENT_BUS.register(this);
|
||||||
System.out.println("[Mekanism] Successfully set up SoundHandler.");
|
System.out.println("[Mekanism] Successfully set up SoundHandler.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -84,7 +88,6 @@ public class SoundHandler
|
||||||
|
|
||||||
for(Sound sound : soundsToRemove)
|
for(Sound sound : soundsToRemove)
|
||||||
{
|
{
|
||||||
System.out.println("[Mekanism] Removed dead sound '" + sound.identifier + ".'");
|
|
||||||
sound.remove();
|
sound.remove();
|
||||||
|
|
||||||
TileEntity tileEntity = FMLClientHandler.instance().getClient().theWorld.getBlockTileEntity(sound.xCoord, sound.yCoord, sound.zCoord);
|
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);
|
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)
|
public void randomDisplayTick(World world, int x, int y, int z, Random random)
|
||||||
{
|
{
|
||||||
TileEntityElectricBlock tileEntity = (TileEntityElectricBlock)world.getBlockTileEntity(x, y, z);
|
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 xRandom = (float)x + 0.5F;
|
||||||
float yRandom = (float)y + 0.0F + random.nextFloat() * 6.0F / 16.0F;
|
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()
|
public TileEntity create()
|
||||||
{
|
{
|
||||||
TileEntity tileEntity;
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
tileEntity = tileEntityClass.newInstance();
|
return tileEntityClass.newInstance();
|
||||||
return tileEntity;
|
|
||||||
} catch(Exception e) {
|
} catch(Exception e) {
|
||||||
System.err.println("[Mekanism] Unable to indirectly create tile entity.");
|
System.err.println("[Mekanism] Unable to indirectly create tile entity.");
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
|
|
@ -658,6 +658,50 @@ public final class MekanismUtils
|
||||||
return null;
|
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)
|
public static boolean isDeadLiquid(World world, int x, int y, int z)
|
||||||
{
|
{
|
||||||
int id = world.getBlockId(x, y, 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.LiquidStack;
|
||||||
import net.minecraftforge.liquids.LiquidTank;
|
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 */
|
/** This pump's tank */
|
||||||
public LiquidTank liquidTank;
|
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 */
|
/** 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>();
|
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 */
|
/** Random for this pump */
|
||||||
public Random random = new Random();
|
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 {
|
else {
|
||||||
|
if(!worldObj.isRemote)
|
||||||
|
{
|
||||||
|
setActive(true);
|
||||||
|
}
|
||||||
|
|
||||||
clean(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))
|
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 y = MekanismUtils.getCoords(wrapper, orientation)[1];
|
||||||
int z = MekanismUtils.getCoords(wrapper, orientation)[2];
|
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))
|
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))
|
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))
|
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))
|
if(MekanismUtils.isDeadLiquid(worldObj, wrapper.x, wrapper.y, wrapper.z))
|
||||||
{
|
{
|
||||||
took = true;
|
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);
|
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))
|
if(MekanismUtils.isDeadLiquid(worldObj, wrapper.x, wrapper.y, wrapper.z))
|
||||||
{
|
{
|
||||||
took = true;
|
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);
|
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);
|
super.handlePacketData(dataStream);
|
||||||
|
|
||||||
|
isActive = dataStream.readBoolean();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
int amount = dataStream.readInt();
|
int amount = dataStream.readInt();
|
||||||
int itemID = dataStream.readInt();
|
int itemID = dataStream.readInt();
|
||||||
|
@ -331,6 +367,8 @@ public class TileEntityElectricPump extends TileEntityElectricBlock implements I
|
||||||
{
|
{
|
||||||
super.getNetworkedData(data);
|
super.getNetworkedData(data);
|
||||||
|
|
||||||
|
data.add(isActive);
|
||||||
|
|
||||||
if(liquidTank.getLiquid() != null)
|
if(liquidTank.getLiquid() != null)
|
||||||
{
|
{
|
||||||
data.add(liquidTank.getLiquid().amount);
|
data.add(liquidTank.getLiquid().amount);
|
||||||
|
@ -356,6 +394,8 @@ public class TileEntityElectricPump extends TileEntityElectricBlock implements I
|
||||||
{
|
{
|
||||||
super.writeToNBT(nbtTags);
|
super.writeToNBT(nbtTags);
|
||||||
|
|
||||||
|
nbtTags.setBoolean("isActive", isActive);
|
||||||
|
|
||||||
if(liquidTank.getLiquid() != null)
|
if(liquidTank.getLiquid() != null)
|
||||||
{
|
{
|
||||||
nbtTags.setTag("liquidTank", liquidTank.writeToNBT(new NBTTagCompound()));
|
nbtTags.setTag("liquidTank", liquidTank.writeToNBT(new NBTTagCompound()));
|
||||||
|
@ -395,6 +435,8 @@ public class TileEntityElectricPump extends TileEntityElectricBlock implements I
|
||||||
{
|
{
|
||||||
super.readFromNBT(nbtTags);
|
super.readFromNBT(nbtTags);
|
||||||
|
|
||||||
|
isActive = nbtTags.getBoolean("isActive");
|
||||||
|
|
||||||
if(nbtTags.hasKey("liquidTank"))
|
if(nbtTags.hasKey("liquidTank"))
|
||||||
{
|
{
|
||||||
liquidTank.readFromNBT(nbtTags.getCompoundTag("liquidTank"));
|
liquidTank.readFromNBT(nbtTags.getCompoundTag("liquidTank"));
|
||||||
|
@ -533,4 +575,23 @@ public class TileEntityElectricPump extends TileEntityElectricBlock implements I
|
||||||
{
|
{
|
||||||
return true;
|
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()
|
public TileEntity create()
|
||||||
{
|
{
|
||||||
TileEntity tileEntity;
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
tileEntity = tileEntityClass.newInstance();
|
return tileEntityClass.newInstance();
|
||||||
return tileEntity;
|
|
||||||
} catch(Exception e) {
|
} catch(Exception e) {
|
||||||
System.err.println("[Mekanism] Unable to indirectly create tile entity.");
|
System.err.println("[Mekanism] Unable to indirectly create tile entity.");
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
|
Loading…
Reference in a new issue