mirror of
https://github.com/HbmMods/Hbm-s-Nuclear-Tech-GIT.git
synced 2026-01-25 10:32:49 +00:00
made nukes more destructive in close proximity, concrete cracker now...
...works as advertised (changes untested, ugh)
This commit is contained in:
parent
1a65245f72
commit
816db93991
@ -4,6 +4,8 @@ import java.util.ArrayList;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import com.hbm.explosion.ExplosionLarge;
|
import com.hbm.explosion.ExplosionLarge;
|
||||||
|
import com.hbm.explosion.ExplosionNT;
|
||||||
|
import com.hbm.explosion.ExplosionNT.ExAttrib;
|
||||||
import com.hbm.items.ModItems;
|
import com.hbm.items.ModItems;
|
||||||
|
|
||||||
import api.hbm.entity.IRadarDetectable.RadarTargetType;
|
import api.hbm.entity.IRadarDetectable.RadarTargetType;
|
||||||
@ -24,11 +26,13 @@ public class EntityMissileDrill extends EntityMissileBaseAdvanced {
|
|||||||
public void onImpact() {
|
public void onImpact() {
|
||||||
for(int i = 0; i < 30; i++)
|
for(int i = 0; i < 30; i++)
|
||||||
{
|
{
|
||||||
this.worldObj.createExplosion(this, this.posX, this.posY - i, this.posZ, 10F, true);
|
ExplosionNT explosion = new ExplosionNT(worldObj, this, this.posX, this.posY - 1, this.posZ, 10F);
|
||||||
|
explosion.addAllAttrib(ExAttrib.ERRODE);
|
||||||
|
explosion.explode(); //an explosion exploded!
|
||||||
}
|
}
|
||||||
ExplosionLarge.spawnParticles(worldObj, this.posX, this.posY, this.posZ, 25);
|
ExplosionLarge.spawnParticles(worldObj, this.posX, this.posY, this.posZ, 25);
|
||||||
ExplosionLarge.spawnShrapnels(worldObj, this.posX, this.posY, this.posZ, 12);
|
ExplosionLarge.spawnShrapnels(worldObj, this.posX, this.posY, this.posZ, 12);
|
||||||
ExplosionLarge.spawnRubble(worldObj, this.posX, this.posY, this.posZ, 12);
|
ExplosionLarge.jolt(worldObj, this.posX, this.posY, this.posZ, 10, 50, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@ -33,7 +33,7 @@ public class ExplosionNT extends Explosion {
|
|||||||
|
|
||||||
private Random explosionRNG = new Random();
|
private Random explosionRNG = new Random();
|
||||||
private World worldObj;
|
private World worldObj;
|
||||||
protected int field_77289_h = 16;
|
protected int resolution = 16;
|
||||||
protected Map affectedEntities = new HashMap();
|
protected Map affectedEntities = new HashMap();
|
||||||
|
|
||||||
public static final List<ExAttrib> nukeAttribs = Arrays.asList(new ExAttrib[] { ExAttrib.FIRE, ExAttrib.NOPARTICLE, ExAttrib.NOSOUND, ExAttrib.NODROP, ExAttrib.NOHURT });
|
public static final List<ExAttrib> nukeAttribs = Arrays.asList(new ExAttrib[] { ExAttrib.FIRE, ExAttrib.NOPARTICLE, ExAttrib.NOSOUND, ExAttrib.NODROP, ExAttrib.NOHURT });
|
||||||
@ -53,8 +53,13 @@ public class ExplosionNT extends Explosion {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ExplosionNT addAllAttrib(ExAttrib... attrib) {
|
||||||
|
for(ExAttrib a : attrib) atttributes.add(a);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
public ExplosionNT overrideResolution(int res) {
|
public ExplosionNT overrideResolution(int res) {
|
||||||
field_77289_h = res;
|
resolution = res;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -69,44 +74,51 @@ public class ExplosionNT extends Explosion {
|
|||||||
int i;
|
int i;
|
||||||
int j;
|
int j;
|
||||||
int k;
|
int k;
|
||||||
double d5;
|
double currentX;
|
||||||
double d6;
|
double currentY;
|
||||||
double d7;
|
double currentZ;
|
||||||
|
|
||||||
for(i = 0; i < this.field_77289_h; ++i) {
|
for(i = 0; i < this.resolution; ++i) {
|
||||||
for(j = 0; j < this.field_77289_h; ++j) {
|
for(j = 0; j < this.resolution; ++j) {
|
||||||
for(k = 0; k < this.field_77289_h; ++k) {
|
for(k = 0; k < this.resolution; ++k) {
|
||||||
if(i == 0 || i == this.field_77289_h - 1 || j == 0 || j == this.field_77289_h - 1 || k == 0 || k == this.field_77289_h - 1) {
|
|
||||||
double d0 = (double) ((float) i / ((float) this.field_77289_h - 1.0F) * 2.0F - 1.0F);
|
|
||||||
double d1 = (double) ((float) j / ((float) this.field_77289_h - 1.0F) * 2.0F - 1.0F);
|
|
||||||
double d2 = (double) ((float) k / ((float) this.field_77289_h - 1.0F) * 2.0F - 1.0F);
|
|
||||||
double d3 = Math.sqrt(d0 * d0 + d1 * d1 + d2 * d2);
|
|
||||||
d0 /= d3;
|
|
||||||
d1 /= d3;
|
|
||||||
d2 /= d3;
|
|
||||||
float f1 = this.explosionSize * (0.7F + this.worldObj.rand.nextFloat() * 0.6F);
|
|
||||||
d5 = this.explosionX;
|
|
||||||
d6 = this.explosionY;
|
|
||||||
d7 = this.explosionZ;
|
|
||||||
|
|
||||||
for(float f2 = 0.3F; f1 > 0.0F; f1 -= f2 * 0.75F) {
|
if(i == 0 || i == this.resolution - 1 || j == 0 || j == this.resolution - 1 || k == 0 || k == this.resolution - 1) {
|
||||||
int j1 = MathHelper.floor_double(d5);
|
|
||||||
int k1 = MathHelper.floor_double(d6);
|
double d0 = (double) ((float) i / ((float) this.resolution - 1.0F) * 2.0F - 1.0F);
|
||||||
int l1 = MathHelper.floor_double(d7);
|
double d1 = (double) ((float) j / ((float) this.resolution - 1.0F) * 2.0F - 1.0F);
|
||||||
Block block = this.worldObj.getBlock(j1, k1, l1);
|
double d2 = (double) ((float) k / ((float) this.resolution - 1.0F) * 2.0F - 1.0F);
|
||||||
|
|
||||||
|
double dist = Math.sqrt(d0 * d0 + d1 * d1 + d2 * d2);
|
||||||
|
d0 /= dist;
|
||||||
|
d1 /= dist;
|
||||||
|
d2 /= dist;
|
||||||
|
|
||||||
|
float remainingPower = this.explosionSize * (0.7F + this.worldObj.rand.nextFloat() * 0.6F);
|
||||||
|
currentX = this.explosionX;
|
||||||
|
currentY = this.explosionY;
|
||||||
|
currentZ = this.explosionZ;
|
||||||
|
|
||||||
|
for(float step = 0.3F; remainingPower > 0.0F; remainingPower -= step * 0.75F) {
|
||||||
|
int xPos = MathHelper.floor_double(currentX);
|
||||||
|
int yPos = MathHelper.floor_double(currentY);
|
||||||
|
int zPos = MathHelper.floor_double(currentZ);
|
||||||
|
Block block = this.worldObj.getBlock(xPos, yPos, zPos);
|
||||||
|
|
||||||
if(block.getMaterial() != Material.air) {
|
if(block.getMaterial() != Material.air) {
|
||||||
float f3 = this.exploder != null ? this.exploder.func_145772_a(this, this.worldObj, j1, k1, l1, block) : block.getExplosionResistance(this.exploder, worldObj, j1, k1, l1, explosionX, explosionY, explosionZ);
|
float resistance = this.exploder != null ? this.exploder.func_145772_a(this, this.worldObj, xPos, yPos, zPos, block) : block.getExplosionResistance(this.exploder, worldObj, xPos, yPos, zPos, explosionX, explosionY, explosionZ);
|
||||||
f1 -= (f3 + 0.3F) * f2;
|
remainingPower -= (resistance + 0.3F) * step;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(block != Blocks.air && f1 > 0.0F && (this.exploder == null || this.exploder.func_145774_a(this, this.worldObj, j1, k1, l1, block, f1))) {
|
if(block != Blocks.air && remainingPower > 0.0F && (this.exploder == null || this.exploder.func_145774_a(this, this.worldObj, xPos, yPos, zPos, block, remainingPower))) {
|
||||||
hashset.add(new ChunkPosition(j1, k1, l1));
|
hashset.add(new ChunkPosition(xPos, yPos, zPos));
|
||||||
|
|
||||||
|
} else if(this.has(ExAttrib.ERRODE) && errosion.containsKey(block)) {
|
||||||
|
hashset.add(new ChunkPosition(xPos, yPos, zPos));
|
||||||
}
|
}
|
||||||
|
|
||||||
d5 += d0 * (double) f2;
|
currentX += d0 * (double) step;
|
||||||
d6 += d1 * (double) f2;
|
currentY += d1 * (double) step;
|
||||||
d7 += d2 * (double) f2;
|
currentZ += d2 * (double) step;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -133,25 +145,25 @@ public class ExplosionNT extends Explosion {
|
|||||||
double d4 = entity.getDistance(this.explosionX, this.explosionY, this.explosionZ) / (double) this.explosionSize;
|
double d4 = entity.getDistance(this.explosionX, this.explosionY, this.explosionZ) / (double) this.explosionSize;
|
||||||
|
|
||||||
if(d4 <= 1.0D) {
|
if(d4 <= 1.0D) {
|
||||||
d5 = entity.posX - this.explosionX;
|
currentX = entity.posX - this.explosionX;
|
||||||
d6 = entity.posY + (double) entity.getEyeHeight() - this.explosionY;
|
currentY = entity.posY + (double) entity.getEyeHeight() - this.explosionY;
|
||||||
d7 = entity.posZ - this.explosionZ;
|
currentZ = entity.posZ - this.explosionZ;
|
||||||
double d9 = (double) MathHelper.sqrt_double(d5 * d5 + d6 * d6 + d7 * d7);
|
double d9 = (double) MathHelper.sqrt_double(currentX * currentX + currentY * currentY + currentZ * currentZ);
|
||||||
|
|
||||||
if(d9 != 0.0D) {
|
if(d9 != 0.0D) {
|
||||||
d5 /= d9;
|
currentX /= d9;
|
||||||
d6 /= d9;
|
currentY /= d9;
|
||||||
d7 /= d9;
|
currentZ /= d9;
|
||||||
double d10 = (double) this.worldObj.getBlockDensity(vec3, entity.boundingBox);
|
double d10 = (double) this.worldObj.getBlockDensity(vec3, entity.boundingBox);
|
||||||
double d11 = (1.0D - d4) * d10;
|
double d11 = (1.0D - d4) * d10;
|
||||||
entity.attackEntityFrom(DamageSource.setExplosionSource(this), (float) ((int) ((d11 * d11 + d11) / 2.0D * 8.0D * (double) this.explosionSize + 1.0D)));
|
entity.attackEntityFrom(DamageSource.setExplosionSource(this), (float) ((int) ((d11 * d11 + d11) / 2.0D * 8.0D * (double) this.explosionSize + 1.0D)));
|
||||||
double d8 = EnchantmentProtection.func_92092_a(entity, d11);
|
double d8 = EnchantmentProtection.func_92092_a(entity, d11);
|
||||||
entity.motionX += d5 * d8;
|
entity.motionX += currentX * d8;
|
||||||
entity.motionY += d6 * d8;
|
entity.motionY += currentY * d8;
|
||||||
entity.motionZ += d7 * d8;
|
entity.motionZ += currentZ * d8;
|
||||||
|
|
||||||
if(entity instanceof EntityPlayer) {
|
if(entity instanceof EntityPlayer) {
|
||||||
this.affectedEntities.put((EntityPlayer) entity, Vec3.createVectorHelper(d5 * d11, d6 * d11, d7 * d11));
|
this.affectedEntities.put((EntityPlayer) entity, Vec3.createVectorHelper(currentX * d11, currentY * d11, currentZ * d11));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -212,7 +224,19 @@ public class ExplosionNT extends Explosion {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(block.getMaterial() != Material.air) {
|
if(block.getMaterial() != Material.air) {
|
||||||
if(block.canDropFromExplosion(this) && !has(ExAttrib.NODROP)) {
|
|
||||||
|
boolean doesErrode = false;
|
||||||
|
Block errodesInto = Blocks.air;
|
||||||
|
|
||||||
|
if(this.has(ExAttrib.ERRODE) && this.explosionRNG.nextFloat() < 0.6F) { //errosion has a 60% chance to occour
|
||||||
|
|
||||||
|
if(errosion.containsKey(block)) {
|
||||||
|
doesErrode = true;
|
||||||
|
errodesInto = errosion.get(block);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(block.canDropFromExplosion(this) && !has(ExAttrib.NODROP) && !doesErrode) {
|
||||||
float chance = 1.0F;
|
float chance = 1.0F;
|
||||||
|
|
||||||
if(!has(ExAttrib.ALLDROP))
|
if(!has(ExAttrib.ALLDROP))
|
||||||
@ -225,6 +249,10 @@ public class ExplosionNT extends Explosion {
|
|||||||
|
|
||||||
if(block.isNormalCube()) {
|
if(block.isNormalCube()) {
|
||||||
|
|
||||||
|
if(doesErrode) {
|
||||||
|
this.worldObj.setBlock(i, j, k, errodesInto);
|
||||||
|
}
|
||||||
|
|
||||||
if(has(ExAttrib.DIGAMMA)) {
|
if(has(ExAttrib.DIGAMMA)) {
|
||||||
this.worldObj.setBlock(i, j, k, ModBlocks.ash_digamma);
|
this.worldObj.setBlock(i, j, k, ModBlocks.ash_digamma);
|
||||||
|
|
||||||
@ -300,6 +328,7 @@ public class ExplosionNT extends Explosion {
|
|||||||
DIGAMMA_CIRCUIT,
|
DIGAMMA_CIRCUIT,
|
||||||
LAVA, //again the same thing but lava
|
LAVA, //again the same thing but lava
|
||||||
LAVA_V, //again the same thing but volcaniclava
|
LAVA_V, //again the same thing but volcaniclava
|
||||||
|
ERRODE, //will turn select blocks into gravel or sand
|
||||||
ALLMOD, //block placer attributes like fire are applied for all destroyed blocks
|
ALLMOD, //block placer attributes like fire are applied for all destroyed blocks
|
||||||
ALLDROP, //miner TNT!
|
ALLDROP, //miner TNT!
|
||||||
NODROP, //the opposite
|
NODROP, //the opposite
|
||||||
@ -308,4 +337,13 @@ public class ExplosionNT extends Explosion {
|
|||||||
NOHURT
|
NOHURT
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static final HashMap<Block, Block> errosion = new HashMap();
|
||||||
|
|
||||||
|
static {
|
||||||
|
errosion.put(ModBlocks.concrete, Blocks.gravel);
|
||||||
|
errosion.put(ModBlocks.concrete_smooth, Blocks.gravel);
|
||||||
|
errosion.put(ModBlocks.brick_concrete, ModBlocks.brick_concrete_broken);
|
||||||
|
errosion.put(ModBlocks.brick_concrete_broken, Blocks.gravel);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,6 +4,8 @@ import java.util.ArrayList;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
|
import com.hbm.interfaces.Untested;
|
||||||
|
|
||||||
import net.minecraft.init.Blocks;
|
import net.minecraft.init.Blocks;
|
||||||
import net.minecraft.util.Vec3;
|
import net.minecraft.util.Vec3;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
@ -25,6 +27,8 @@ public class ExplosionNukeRay {
|
|||||||
int startCir;
|
int startCir;
|
||||||
public boolean isAusf3Complete = false;
|
public boolean isAusf3Complete = false;
|
||||||
|
|
||||||
|
private double overrideRange = 0;
|
||||||
|
|
||||||
public ExplosionNukeRay(World world, int x, int y, int z, int strength, int count, int speed, int length) {
|
public ExplosionNukeRay(World world, int x, int y, int z, int strength, int count, int speed, int length) {
|
||||||
this.world = world;
|
this.world = world;
|
||||||
this.posX = x;
|
this.posX = x;
|
||||||
@ -39,6 +43,9 @@ public class ExplosionNukeRay {
|
|||||||
//Mk 4.5, must be int32
|
//Mk 4.5, must be int32
|
||||||
this.startY = 0;
|
this.startY = 0;
|
||||||
this.startCir = 0;
|
this.startCir = 0;
|
||||||
|
|
||||||
|
//starts at around 80, becomes 8 at length 500
|
||||||
|
this.overrideRange = Math.max((Math.log(length) * 4 - 2.5D) * 10, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*public void processBunch(int count) {
|
/*public void processBunch(int count) {
|
||||||
@ -147,6 +154,7 @@ public class ExplosionNukeRay {
|
|||||||
processed += count;
|
processed += count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Untested //override range
|
||||||
public void collectTip(int count) {
|
public void collectTip(int count) {
|
||||||
|
|
||||||
for(int k = 0; k < count; k++) {
|
for(int k = 0; k < count; k++) {
|
||||||
@ -178,11 +186,21 @@ public class ExplosionNukeRay {
|
|||||||
else
|
else
|
||||||
res -= Math.pow(Blocks.air.getExplosionResistance(null), 1.25);
|
res -= Math.pow(Blocks.air.getExplosionResistance(null), 1.25);
|
||||||
|
|
||||||
if(res > 0 && world.getBlock((int)x0, (int)y0, (int)z0) != Blocks.air) {
|
/*
|
||||||
|
* Blast resistance calculations are still done to preserve the general shape,
|
||||||
|
* but if the blast were to be stopped within this range we go through with it anyway.
|
||||||
|
* There is currently no blast resistance limit on this, could change in the future.
|
||||||
|
*/
|
||||||
|
boolean inOverrideRange = this.overrideRange >= length;
|
||||||
|
|
||||||
|
if((res > 0 || inOverrideRange) && world.getBlock((int)x0, (int)y0, (int)z0) != Blocks.air) {
|
||||||
lastPos = new FloatTriplet(x0, y0, z0);
|
lastPos = new FloatTriplet(x0, y0, z0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(res <= 0 || i + 1 >= this.length) {
|
/*
|
||||||
|
* Only stop if we are either out of range or if the remaining strength is 0 while being outside the override range
|
||||||
|
*/
|
||||||
|
if((res <= 0 && !inOverrideRange) || i + 1 >= this.length) {
|
||||||
if(affectedBlocks.size() < Integer.MAX_VALUE - 100 && lastPos != null)
|
if(affectedBlocks.size() < Integer.MAX_VALUE - 100 && lastPos != null)
|
||||||
affectedBlocks.add(new FloatTriplet(lastPos.xCoord, lastPos.yCoord, lastPos.zCoord));
|
affectedBlocks.add(new FloatTriplet(lastPos.xCoord, lastPos.yCoord, lastPos.zCoord));
|
||||||
break;
|
break;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user