diff --git a/src/main/java/mekanism/client/ClientProxy.java b/src/main/java/mekanism/client/ClientProxy.java index 59014400d..e5e3f533a 100644 --- a/src/main/java/mekanism/client/ClientProxy.java +++ b/src/main/java/mekanism/client/ClientProxy.java @@ -6,6 +6,7 @@ import mekanism.api.Coord4D; import mekanism.api.MekanismConfig.client; import mekanism.api.MekanismConfig.general; import mekanism.api.Pos3D; +import mekanism.client.ThreadSparkle.INodeChecker; import mekanism.client.entity.EntityLaser; import mekanism.client.gui.GuiAmbientAccumulator; import mekanism.client.gui.GuiChemicalCrystallizer; @@ -112,6 +113,7 @@ import mekanism.common.entity.EntityRobit; import mekanism.common.inventory.InventoryElectricChest; import mekanism.common.item.ItemPortableTeleporter; import mekanism.common.item.ItemSeismicReader; +import mekanism.common.multiblock.MultiblockManager; import mekanism.common.tile.TileEntityAdvancedElectricMachine; import mekanism.common.tile.TileEntityAdvancedFactory; import mekanism.common.tile.TileEntityAmbientAccumulator; @@ -164,6 +166,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; import net.minecraftforge.client.MinecraftForgeClient; import net.minecraftforge.common.util.ForgeDirection; @@ -492,11 +495,32 @@ public class ClientProxy extends CommonProxy return null; } + + @Override + public void addHitEffects(Coord4D coord, MovingObjectPosition mop) + { + if(Minecraft.getMinecraft().theWorld != null) + { + Minecraft.getMinecraft().effectRenderer.addBlockHitEffects(coord.xCoord, coord.yCoord, coord.zCoord, mop); + } + } + + @Override + public void doGenericSparkle(TileEntity tileEntity, INodeChecker checker) + { + new ThreadSparkle(tileEntity, checker).start(); + } @Override - public void doAnimation(TileEntityMultiblock tileEntity) + public void doMultiblockSparkle(TileEntityMultiblock tileEntity) { - new ThreadMultiblockSparkle(tileEntity).start(); + new ThreadSparkle(tileEntity, new INodeChecker() { + @Override + public boolean isNode(TileEntity tile) + { + return MultiblockManager.areEqual(tile, tileEntity); + } + }).start(); } @Override diff --git a/src/main/java/mekanism/client/ThreadMultiblockSparkle.java b/src/main/java/mekanism/client/ThreadSparkle.java similarity index 83% rename from src/main/java/mekanism/client/ThreadMultiblockSparkle.java rename to src/main/java/mekanism/client/ThreadSparkle.java index b35aadeba..27fa9d251 100644 --- a/src/main/java/mekanism/client/ThreadMultiblockSparkle.java +++ b/src/main/java/mekanism/client/ThreadSparkle.java @@ -6,9 +6,6 @@ import java.util.Set; import mekanism.api.Coord4D; import mekanism.api.MekanismConfig.general; -import mekanism.common.multiblock.MultiblockManager; -import mekanism.common.tile.TileEntityMultiblock; - import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; @@ -16,17 +13,20 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @SideOnly(Side.CLIENT) -public class ThreadMultiblockSparkle extends Thread +public class ThreadSparkle extends Thread { - public TileEntityMultiblock pointer; + public TileEntity pointer; public Random random = new Random(); public Set iteratedNodes = new HashSet(); + + public INodeChecker nodeChecker; - public ThreadMultiblockSparkle(TileEntityMultiblock tileEntity) + public ThreadSparkle(TileEntity tileEntity, INodeChecker checker) { pointer = tileEntity; + nodeChecker = checker; } @Override @@ -42,7 +42,7 @@ public class ThreadMultiblockSparkle extends Thread } catch(Exception e) {} } - public void loop(TileEntityMultiblock tileEntity) + public void loop(TileEntity tileEntity) { World world = pointer.getWorldObj(); @@ -85,10 +85,20 @@ public class ThreadMultiblockSparkle extends Thread { TileEntity tile = Coord4D.get(tileEntity).getFromSide(side).getTileEntity(pointer.getWorldObj()); - if(MultiblockManager.areEqual(tile, pointer) && !iteratedNodes.contains(tile)) + if(tile != null && isNode(tile) && !iteratedNodes.contains(tile)) { - loop((TileEntityMultiblock)tile); + loop(tile); } } } + + public boolean isNode(TileEntity tile) + { + return nodeChecker.isNode(tile); + } + + public static interface INodeChecker + { + public boolean isNode(TileEntity tile); + } } diff --git a/src/main/java/mekanism/common/CommonProxy.java b/src/main/java/mekanism/common/CommonProxy.java index c21762b42..6ecc293b9 100644 --- a/src/main/java/mekanism/common/CommonProxy.java +++ b/src/main/java/mekanism/common/CommonProxy.java @@ -2,12 +2,14 @@ package mekanism.common; import java.io.File; +import mekanism.api.Coord4D; import mekanism.api.MekanismAPI; import mekanism.api.MekanismConfig.general; import mekanism.api.MekanismConfig.usage; import mekanism.api.Pos3D; import mekanism.api.util.UnitDisplayUtils.EnergyType; import mekanism.api.util.UnitDisplayUtils.TempType; +import mekanism.client.ThreadSparkle.INodeChecker; import mekanism.common.base.IUpgradeTile; import mekanism.common.block.BlockMachine.MachineType; import mekanism.common.entity.EntityRobit; @@ -97,6 +99,7 @@ import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.init.Blocks; import net.minecraft.inventory.Container; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; import net.minecraftforge.common.config.Configuration; import net.minecraftforge.common.util.ForgeDirection; @@ -320,11 +323,21 @@ public class CommonProxy { return false; } + + /** + * Adds block hit effects on the client side. + */ + public void addHitEffects(Coord4D coord, MovingObjectPosition mop) {} + + /** + * Does a generic creation animation, starting from the rendering block. + */ + public void doGenericSparkle(TileEntity tileEntity, INodeChecker checker) {} /** * Does the multiblock creation animation, starting from the rendering block. */ - public void doAnimation(TileEntityMultiblock tileEntity) {} + public void doMultiblockSparkle(TileEntityMultiblock tileEntity) {} /** * Get the actual interface for a GUI. Client-only. diff --git a/src/main/java/mekanism/common/tile/TileEntityLaserAmplifier.java b/src/main/java/mekanism/common/tile/TileEntityLaserAmplifier.java index 11553e09a..7fb870869 100644 --- a/src/main/java/mekanism/common/tile/TileEntityLaserAmplifier.java +++ b/src/main/java/mekanism/common/tile/TileEntityLaserAmplifier.java @@ -13,7 +13,6 @@ import mekanism.common.base.IRedstoneControl; import mekanism.common.network.PacketTileEntity.TileEntityMessage; import mekanism.common.util.MekanismUtils; import net.minecraft.block.Block; -import net.minecraft.client.Minecraft; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.MovingObjectPosition; @@ -99,6 +98,7 @@ public class TileEntityLaserAmplifier extends TileEntityContainerBlock implement Block blockHit = hitCoord.getBlock(worldObj); TileEntity tileHit = hitCoord.getTileEntity(worldObj); float hardness = blockHit.getBlockHardness(worldObj, hitCoord.xCoord, hitCoord.yCoord, hitCoord.zCoord); + if(!(hardness < 0 || (tileHit instanceof ILaserReceptor && !((ILaserReceptor)tileHit).canLasersDig()))) { diggingProgress += firing; @@ -109,7 +109,7 @@ public class TileEntityLaserAmplifier extends TileEntityContainerBlock implement diggingProgress = 0; } else { - Minecraft.getMinecraft().effectRenderer.addBlockHitEffects(hitCoord.xCoord, hitCoord.yCoord, hitCoord.zCoord, mop); + Mekanism.proxy.addHitEffects(hitCoord, mop); } } } diff --git a/src/main/java/mekanism/common/tile/TileEntityMultiblock.java b/src/main/java/mekanism/common/tile/TileEntityMultiblock.java index 12ba3e5a2..27db3b4c3 100644 --- a/src/main/java/mekanism/common/tile/TileEntityMultiblock.java +++ b/src/main/java/mekanism/common/tile/TileEntityMultiblock.java @@ -56,7 +56,7 @@ public abstract class TileEntityMultiblock> extend { if(!prevStructure) { - Mekanism.proxy.doAnimation(this); + Mekanism.proxy.doMultiblockSparkle(this); } } diff --git a/src/main/java/mekanism/common/tile/TileEntitySolarEvaporationController.java b/src/main/java/mekanism/common/tile/TileEntitySolarEvaporationController.java index 10f52a53e..89118b92a 100644 --- a/src/main/java/mekanism/common/tile/TileEntitySolarEvaporationController.java +++ b/src/main/java/mekanism/common/tile/TileEntitySolarEvaporationController.java @@ -9,6 +9,7 @@ import java.util.Set; import mekanism.api.Coord4D; import mekanism.api.ISalinationSolar; import mekanism.api.Range4D; +import mekanism.client.ThreadSparkle.INodeChecker; import mekanism.common.Mekanism; import mekanism.common.base.IActiveState; import mekanism.common.base.IDropperHandler; @@ -686,6 +687,17 @@ public class TileEntitySolarEvaporationController extends TileEntitySolarEvapora { inputTank.setCapacity(getMaxWater()); worldObj.func_147479_m(xCoord, yCoord, zCoord); + + if(structured) + { + Mekanism.proxy.doGenericSparkle(this, new INodeChecker() { + @Override + public boolean isNode(TileEntity tile) + { + return tile instanceof TileEntitySolarEvaporationBlock; + } + }); + } } MekanismUtils.updateBlock(worldObj, xCoord, yCoord, zCoord); diff --git a/src/main/java/mekanism/generators/common/FusionReactor.java b/src/main/java/mekanism/generators/common/FusionReactor.java index ff4040c19..13cc1fda5 100644 --- a/src/main/java/mekanism/generators/common/FusionReactor.java +++ b/src/main/java/mekanism/generators/common/FusionReactor.java @@ -82,7 +82,7 @@ public class FusionReactor implements IFusionReactor @Override public void addTemperatureFromEnergyInput(double energyAdded) { - plasmaTemperature += energyAdded / plasmaHeatCapacity * (isBurning() ? 1 : 10); + plasmaTemperature += energyAdded / plasmaHeatCapacity * (isBurning() ? 1 : 100); } public boolean hasHohlraum() diff --git a/src/main/java/mekanism/generators/common/tile/reactor/TileEntityReactorController.java b/src/main/java/mekanism/generators/common/tile/reactor/TileEntityReactorController.java index e8ac11525..da4e21a1f 100644 --- a/src/main/java/mekanism/generators/common/tile/reactor/TileEntityReactorController.java +++ b/src/main/java/mekanism/generators/common/tile/reactor/TileEntityReactorController.java @@ -1,20 +1,32 @@ package mekanism.generators.common.tile.reactor; +import io.netty.buffer.ByteBuf; + import java.util.ArrayList; import mekanism.api.Coord4D; +import mekanism.api.MekanismConfig.client; +import mekanism.api.Pos3D; import mekanism.api.gas.GasRegistry; import mekanism.api.gas.GasStack; import mekanism.api.gas.GasTank; +import mekanism.client.ThreadSparkle.INodeChecker; +import mekanism.client.sound.IHasSound; +import mekanism.client.sound.IResettableSound; +import mekanism.client.sound.ISoundSource; +import mekanism.client.sound.SoundHandler; +import mekanism.client.sound.TileSound; import mekanism.common.Mekanism; import mekanism.common.base.IActiveState; import mekanism.common.network.PacketTileEntity.TileEntityMessage; import mekanism.common.util.MekanismUtils; import mekanism.generators.common.FusionReactor; - +import net.minecraft.client.audio.ISound.AttenuationType; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.ResourceLocation; import net.minecraftforge.fluids.FluidContainerRegistry; import net.minecraftforge.fluids.FluidRegistry; import net.minecraftforge.fluids.FluidStack; @@ -22,9 +34,7 @@ import net.minecraftforge.fluids.FluidTank; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -import io.netty.buffer.ByteBuf; - -public class TileEntityReactorController extends TileEntityReactorBlock implements IActiveState +public class TileEntityReactorController extends TileEntityReactorBlock implements IActiveState, IHasSound, ISoundSource { public static final int MAX_WATER = 100 * FluidContainerRegistry.BUCKET_VOLUME; @@ -39,6 +49,10 @@ public class TileEntityReactorController extends TileEntityReactorBlock implemen public GasTank fuelTank = new GasTank(MAX_FUEL); public AxisAlignedBB box; + + public ResourceLocation soundURL = new ResourceLocation("mekanism", "tile.machine.fusionreactor"); + + public IResettableSound sound; public double clientTemp = 0; public boolean clientBurning = false; @@ -91,6 +105,12 @@ public class TileEntityReactorController extends TileEntityReactorBlock implemen public void onUpdate() { super.onUpdate(); + + if(worldObj.isRemote && shouldPlaySound() && SoundHandler.canRestartSound(getSound()) && client.enableMachineSounds) + { + getSound().reset(); + SoundHandler.playSound(getSound()); + } if(isFormed()) { @@ -219,6 +239,17 @@ public class TileEntityReactorController extends TileEntityReactorBlock implemen if(formed) { + if(getReactor() == null || !((FusionReactor)getReactor()).formed) + { + Mekanism.proxy.doGenericSparkle(this, new INodeChecker() { + @Override + public boolean isNode(TileEntity tile) + { + return tile instanceof TileEntityReactorBlock; + } + }); + } + if(getReactor() == null) { setReactor(new FusionReactor(this)); @@ -291,4 +322,71 @@ public class TileEntityReactorController extends TileEntityReactorBlock implemen return box; } + + @Override + public IResettableSound getSound() + { + return sound; + } + + @Override + public boolean shouldPlaySound() + { + return isBurning() && !isInvalid(); + } + + @Override + public ResourceLocation getSoundLocation() + { + return soundURL; + } + + @Override + public float getVolume() + { + return 2F; + } + + @Override + public float getPitch() + { + return 1F; + } + + @Override + public Pos3D getSoundPosition() + { + return new Pos3D(xCoord+0.5, yCoord+0.5, zCoord+0.5); + } + + @Override + public boolean shouldRepeat() + { + return true; + } + + @Override + public int getRepeatDelay() + { + return 0; + } + + @Override + public AttenuationType getAttenuation() + { + return AttenuationType.LINEAR; + } + + @Override + public void validate() + { + super.validate(); + + initSounds(); + } + + public void initSounds() + { + sound = new TileSound(this, this); + } } diff --git a/src/main/resources/assets/mekanism/sounds.json b/src/main/resources/assets/mekanism/sounds.json index 6c59fbd96..fb9d967a3 100644 --- a/src/main/resources/assets/mekanism/sounds.json +++ b/src/main/resources/assets/mekanism/sounds.json @@ -36,6 +36,7 @@ "tile.machine.purification": {"category": "block", "sounds": [{"name": "PurificationChamber", "stream": false}]}, "tile.machine.smelter": {"category": "block", "sounds": [{"name": "Smelter", "stream": false}]}, "tile.machine.laser": {"category": "block", "sounds": [{"name": "Laser", "stream": false}]}, + "tile.machine.fusionreactor": {"category": "block", "sounds": [{"name": "FusionReactor", "stream": false}]}, "tile.gen.bio": {"category": "block", "sounds": [{"name": "BioGenerator", "stream": false}]}, "tile.gen.gas": {"category": "block", "sounds": [{"name": "GasGenerator", "stream": false}]}, diff --git a/src/main/resources/assets/mekanism/sounds/FusionReactor.ogg b/src/main/resources/assets/mekanism/sounds/FusionReactor.ogg new file mode 100644 index 000000000..013374b35 Binary files /dev/null and b/src/main/resources/assets/mekanism/sounds/FusionReactor.ogg differ