icbm/src/main/java/icbm/zhapin/zhapin/ex/ExThermobaric.java

172 lines
5.6 KiB
Java

package icbm.zhapin.zhapin.ex;
import icbm.core.MainBase;
import icbm.zhapin.ICBMExplosion;
import icbm.zhapin.zhapin.EExplosion;
import icbm.zhapin.zhapin.ZhaPin;
import net.minecraft.block.Block;
import net.minecraft.entity.Entity;
import net.minecraft.init.Blocks;
import net.minecraft.item.crafting.IRecipe;
import net.minecraft.util.MathHelper;
import net.minecraft.world.Explosion;
import net.minecraft.world.World;
import net.minecraftforge.oredict.ShapedOreRecipe;
import universalelectricity.core.vector.Vector3;
import universalelectricity.prefab.RecipeHelper;
public class ExThermobaric extends ExThr {
public static final int BAN_JING = 20;
public static final int NENG_LIANG = 150;
public static final int CALC_SPEED = 800;
public ExThermobaric(final String name, final int ID, final int tier) {
super(name, ID, tier);
this.setFuse(120);
}
@Override
public void baoZhaQian(
final World worldObj, final Vector3 position, final Entity explosionSource
) {
super.baoZhaQian(worldObj, position, explosionSource);
if (!worldObj.isRemote) {
final ThrSheXian thread
= new ThrSheXian(worldObj, position, 20, 150, explosionSource);
thread.run();
((EExplosion) explosionSource).dataList1.add(thread);
}
this.doDamageEntities(worldObj, position, 20.0f, 150000.0f);
worldObj.playSoundEffect(
position.x,
position.y,
position.z,
"icbm:explosion",
7.0f,
(1.0f + (worldObj.rand.nextFloat() - worldObj.rand.nextFloat()) * 0.2f) * 0.7f
);
}
@Override
public boolean doBaoZha(
final World worldObj,
final Vector3 position,
final Entity explosionSource,
final int callCount
) {
final int r = callCount;
if (worldObj.isRemote && ICBMExplosion.proxy.isGaoQing()) {
for (int x = -r; x < r; ++x) {
for (int z = -r; z < r; ++z) {
final double distance
= MathHelper.sqrt_double((double) (x * x + z * z));
if (distance < r && distance > r - 1) {
final Vector3 targetPosition
= Vector3.add(position, new Vector3(x, 0.0, z));
if (worldObj.rand.nextFloat() < Math.max(0.001 * r, 0.05)) {
ICBMExplosion.proxy.spawnParticle(
"smoke", worldObj, targetPosition, 5.0f, 1.0
);
}
}
}
}
}
return super.doBaoZha(worldObj, position, explosionSource, callCount);
}
@Override
public void baoZhaHou(
final World worldObj, final Vector3 position, final Entity explosionSource
) {
super.baoZhaHou(worldObj, position, explosionSource);
final EExplosion source = (EExplosion) explosionSource;
if (!worldObj.isRemote && source.dataList1.size() > 0
&& source.dataList1.get(0) instanceof ThrSheXian) {
final ThrSheXian thread = (ThrSheXian) source.dataList1.get(0);
for (final Object obj : thread.destroyed) {
final Vector3 targetPosition = (Vector3) obj;
final Block block = worldObj.getBlock(
targetPosition.intX(), targetPosition.intY(), targetPosition.intZ()
);
if (block != Blocks.air) {
try {
worldObj.setBlock(
targetPosition.intX(),
targetPosition.intY(),
targetPosition.intZ(),
Blocks.air,
0,
3
);
block.onBlockDestroyedByExplosion(
worldObj,
targetPosition.intX(),
targetPosition.intY(),
targetPosition.intZ(),
(Explosion) null
);
} catch (final Exception e) {
MainBase.LOGGER.severe("Detonation Failed!");
e.printStackTrace();
}
}
}
}
this.doDamageEntities(worldObj, position, 20.0f, 150000.0f);
worldObj.playSoundEffect(
position.x,
position.y,
position.z,
"icbm:explosion",
10.0f,
(1.0f + (worldObj.rand.nextFloat() - worldObj.rand.nextFloat()) * 0.2f) * 0.7f
);
}
public int proceduralInterval() {
return 1;
}
@Override
public void init() {
RecipeHelper.addRecipe(
(IRecipe) new ShapedOreRecipe(
this.getItemStack(),
new Object[] { "CIC",
"IRI",
"CIC",
'R',
ZhaPin.repulsive.getItemStack(),
'C',
ZhaPin.chemical.getItemStack(),
'I',
ZhaPin.indenciary.getItemStack() }
),
this.getUnlocalizedName(),
MainBase.CONFIGURATION,
true
);
}
@Override
public float getRadius() {
return 20.0f;
}
@Override
public double getEnergy() {
return 80000.0;
}
}