Added DefenseTech EMP effects

Fixed force field degradation (tiers, rendering and recovering)
This commit is contained in:
LemADEC 2016-07-16 16:41:00 +02:00
parent 6b8bb4ebbd
commit 6332758aa5
5 changed files with 91 additions and 34 deletions

View file

@ -1,5 +1,9 @@
package cr0s.warpdrive.block;
import cpw.mods.fml.common.Optional;
import cr0s.warpdrive.config.WarpDriveConfig;
import defense.api.IEMPBlock;
import defense.api.IExplosion;
import net.minecraft.block.Block;
import net.minecraft.block.BlockContainer;
import net.minecraft.block.material.Material;
@ -14,7 +18,10 @@ import cr0s.warpdrive.WarpDrive;
import cr0s.warpdrive.api.IBlockUpdateDetector;
import net.minecraftforge.common.util.ForgeDirection;
public abstract class BlockAbstractContainer extends BlockContainer {
@Optional.InterfaceList({
@Optional.Interface(iface = "defense.api.IEMPBlock", modid = "DefenseTech")
})
public abstract class BlockAbstractContainer extends BlockContainer implements IEMPBlock {
protected boolean isRotating = false;
protected BlockAbstractContainer(Material material) {
@ -160,4 +167,24 @@ public abstract class BlockAbstractContainer extends BlockContainer {
((IBlockUpdateDetector) tileEntity).updatedNeighbours();
}
}
@Optional.Method(modid = "DefenseTech")
public void onEMP(World world, int x, int y, int z, IExplosion explosiveEMP) {
if (WarpDriveConfig.LOGGING_WEAPON) {
WarpDrive.logger.info("EMP received at " + x + " " + y + " " + z + " from " + explosiveEMP + " with energy " + explosiveEMP.getEnergy() + " and radius " + explosiveEMP.getRadius());
}
// EMP tower = 3k Energy, 60 radius
// EMP explosive = 3k Energy, 50 radius
onEMP(world, x, y, z, explosiveEMP.getRadius() / 100.0F);
}
public void onEMP(World world, final int x, final int y, final int z, final float efficiency) {
TileEntity tileEntity = world.getTileEntity(x, y, z);
if (tileEntity instanceof TileEntityAbstractEnergy) {
TileEntityAbstractEnergy tileEntityAbstractEnergy = (TileEntityAbstractEnergy) tileEntity;
if (tileEntityAbstractEnergy.getMaxEnergyStored() > 0) {
tileEntityAbstractEnergy.consumeEnergy(Math.round(tileEntityAbstractEnergy.getEnergyStored() * efficiency), false);
}
}
}
}

View file

@ -3,6 +3,7 @@ package cr0s.warpdrive.block.forcefield;
import cr0s.warpdrive.block.BlockAbstractContainer;
import cr0s.warpdrive.config.WarpDriveConfig;
import net.minecraft.block.material.Material;
import net.minecraft.world.World;
public abstract class BlockAbstractForceField extends BlockAbstractContainer {
protected byte tier;
@ -23,4 +24,9 @@ public abstract class BlockAbstractForceField extends BlockAbstractContainer {
protected boolean canSilkHarvest() {
return false;
}
@Override
public void onEMP(World world, final int x, final int y, final int z, final float efficiency) {
super.onEMP(world, x, y, z, efficiency * (1.0F - 0.2F * (tier - 1)));
}
}

View file

@ -9,6 +9,7 @@ import cr0s.warpdrive.config.WarpDriveConfig;
import cr0s.warpdrive.data.ForceFieldSetup;
import cr0s.warpdrive.data.EnumPermissionNode;
import cr0s.warpdrive.data.Vector3;
import cr0s.warpdrive.data.VectorI;
import cr0s.warpdrive.render.RenderBlockForceField;
import net.minecraft.block.Block;
import net.minecraft.block.BlockGlass;
@ -221,6 +222,20 @@ public class BlockForceField extends BlockAbstractForceField implements IDamageR
return 0;
}
private void downgrade(World world, final int x, final int y, final int z) {
if (tier > 1) {
TileEntityForceFieldProjector tileEntityForceFieldProjector = getProjector(world, x, y, z);
world.setBlock(x, y, z, WarpDrive.blockForceFields[tier - 2], (world.getBlockMetadata(x, y, z) + 1) % 16, 2);
TileEntity tileEntity = world.getTileEntity(x, y, z);
if (tileEntity instanceof TileEntityForceField) {
((TileEntityForceField) tileEntity).setProjector(new VectorI(tileEntityForceFieldProjector));
}
} else {
world.setBlockToAir(x, y, z);
}
}
private double log_explosionX;
private double log_explosionY = -1;
private double log_explosionZ;
@ -306,22 +321,21 @@ public class BlockForceField extends BlockAbstractForceField implements IDamageR
@Override
public void onBlockExploded(World world, int x, int y, int z, Explosion explosion) {
if (tier > 0) {
world.setBlock(x, y, z, WarpDrive.blockForceFields[tier - 1], (world.getBlockMetadata(x, y, z) + 1) % 16, 2);
super.onBlockDestroyedByExplosion(world, x, y, z, explosion);
return;
}
downgrade(world, x, y, z);
super.onBlockExploded(world, x, y, z, explosion);
}
public void onEMP(World world, final int x, final int y, final int z, final float efficiency) {
if (efficiency > 0.0F) {
downgrade(world, x, y, z);
}
// already handled => no ancestor call
}
@Override
public void onBlockDestroyedByExplosion(World world, int x, int y, int z, Explosion explosion) {
// (block is already set to air by caller, see IC2 iTNT for example)
if (tier > 1) {
world.setBlock(x, y, z, WarpDrive.blockForceFields[tier - 2], (world.getBlockMetadata(x, y, z) + 1) % 16, 2);
super.onBlockDestroyedByExplosion(world, x, y, z, explosion);
return;
}
downgrade(world, x, y, z);
super.onBlockDestroyedByExplosion(world, x, y, z, explosion);
}

View file

@ -102,10 +102,12 @@ public class TileEntityForceField extends TileEntityAbstractBase {
ForceFieldSetup forceFieldSetup = getForceFieldSetup();
if (forceFieldSetup != null) {
cache_beamFrequency = forceFieldSetup.beamFrequency;
cache_blockCamouflage = forceFieldSetup.getCamouflageBlock();
cache_metadataCamouflage = forceFieldSetup.getCamouflageMetadata();
cache_colorMultiplierCamouflage = forceFieldSetup.getCamouflageColorMultiplier();
cache_lightCamouflage = forceFieldSetup.getCamouflageLight();
if (getBlockMetadata() == forceFieldSetup.getCamouflageMetadata()) {
cache_blockCamouflage = forceFieldSetup.getCamouflageBlock();
cache_metadataCamouflage = forceFieldSetup.getCamouflageMetadata();
cache_colorMultiplierCamouflage = forceFieldSetup.getCamouflageColorMultiplier();
cache_lightCamouflage = forceFieldSetup.getCamouflageLight();
}
}
worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
}
@ -119,16 +121,16 @@ public class TileEntityForceField extends TileEntityAbstractBase {
return tileEntityForceFieldProjector;
} else if (tileEntityForceFieldProjector.isPartOfForceField(new VectorI(this))) {
if (tileEntityForceFieldProjector.isOn()) {
return tileEntityForceFieldProjector;
} else {
// projector is disabled or out of power
worldObj.setBlockToAir(xCoord, yCoord, zCoord);
if (WarpDriveConfig.LOGGING_FORCEFIELD) {
WarpDrive.logger.info("Removed a force field from an offline projector at "
+ (worldObj == null ? "~NULL~" : worldObj.getWorldInfo().getWorldName()) + " " + xCoord + " " + yCoord + " " + zCoord);
}
}
if (tileEntityForceFieldProjector.isOn()) {
return tileEntityForceFieldProjector;
} else {
// projector is disabled or out of power
worldObj.setBlockToAir(xCoord, yCoord, zCoord);
if (WarpDriveConfig.LOGGING_FORCEFIELD) {
WarpDrive.logger.info("Removed a force field from an offline projector at "
+ (worldObj == null ? "~NULL~" : worldObj.getWorldInfo().getWorldName()) + " " + xCoord + " " + yCoord + " " + zCoord);
}
}
}
}
}

View file

@ -343,7 +343,8 @@ public class TileEntityForceFieldProjector extends TileEntityAbstractForceField
Block block;
boolean doProjectThisBlock;
while (countScanned < countMaxScanned && countPlaced < countMaxPlaced
while ( countScanned < countMaxScanned
&& countPlaced < countMaxPlaced
&& consumeEnergy(Math.max(forceFieldSetup.scanEnergyCost, forceFieldSetup.placeEnergyCost), true)) {
if (iteratorForcefield == null || !iteratorForcefield.hasNext()) {
iteratorForcefield = calculated_forceField.iterator();
@ -388,9 +389,10 @@ public class TileEntityForceFieldProjector extends TileEntityAbstractForceField
// recover force field blocks
if (block instanceof BlockForceField) {
// remove block if its missing a valid tile entity
TileEntity tileEntity = vector.getTileEntity(worldObj);
if (!(tileEntity instanceof TileEntityForceField)) {
// missing a valid tile entity
// => force a new placement
worldObj.setBlockToAir(vector.x, vector.y, vector.z);
block = Blocks.air;
@ -398,18 +400,24 @@ public class TileEntityForceFieldProjector extends TileEntityAbstractForceField
TileEntityForceField tileEntityForceField = ((TileEntityForceField)tileEntity);
TileEntityForceFieldProjector tileEntityForceFieldProjector = tileEntityForceField.getProjector();
if (tileEntityForceFieldProjector == null) {
// orphan force field, probably from an explosion => recover it
// orphan force field, probably from an explosion
// => recover it
tileEntityForceField.setProjector(new VectorI(this));
tileEntityForceField.cache_blockCamouflage = forceFieldSetup.getCamouflageBlock();
tileEntityForceField.cache_metadataCamouflage = forceFieldSetup.getCamouflageMetadata();
worldObj.setBlockMetadataWithNotify(vector.x, vector.y, vector.z, tileEntityForceField.cache_metadataCamouflage, 2);
} else if ( tileEntityForceFieldProjector == this
&& ( tileEntityForceField.cache_blockCamouflage != forceFieldSetup.getCamouflageBlock()
|| tileEntityForceField.cache_metadataCamouflage != forceFieldSetup.getCamouflageMetadata() ) ) {
// camouflage changed while chunk was loaded or de-synchronisation => force a new placement
worldObj.setBlockToAir(vector.x, vector.y, vector.z);
block = Blocks.air;
} else if (tileEntityForceFieldProjector == this) {// this is ours
if ( tileEntityForceField.cache_blockCamouflage != forceFieldSetup.getCamouflageBlock()
|| tileEntityForceField.cache_metadataCamouflage != forceFieldSetup.getCamouflageMetadata()
|| block != WarpDrive.blockForceFields[tier - 1]
|| vector.getBlockMetadata(worldObj) != metadataForceField ) {
// camouflage changed while chunk wasn't loaded or de-synchronisation
// force field downgraded during explosion
// => force a new placement
worldObj.setBlockToAir(vector.x, vector.y, vector.z);
block = Blocks.air;
}
}
}
}