mirror of
https://github.com/HbmMods/Hbm-s-Nuclear-Tech-GIT.git
synced 2026-01-25 10:32:49 +00:00
Merge branch 'pr605'
This commit is contained in:
commit
aad0ee5a87
@ -2,50 +2,197 @@ package com.hbm.explosion;
|
|||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
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;
|
||||||
|
|
||||||
public class ExplosionNukeRay {
|
public class ExplosionNukeRay {
|
||||||
|
|
||||||
List<FloatTriplet> affectedBlocks = new ArrayList();
|
List<FloatTriplet> affectedBlocks = new ArrayList<>();
|
||||||
int posX;
|
int posX;
|
||||||
int posY;
|
int posY;
|
||||||
int posZ;
|
int posZ;
|
||||||
Random rand = new Random();
|
|
||||||
World world;
|
World world;
|
||||||
|
|
||||||
int strength;
|
int strength;
|
||||||
|
int length;
|
||||||
|
int processed;
|
||||||
|
|
||||||
|
int gspNumMax;
|
||||||
|
int gspNum;
|
||||||
|
double gspX;
|
||||||
|
double gspY;
|
||||||
|
|
||||||
|
public boolean isAusf3Complete = false;
|
||||||
|
|
||||||
|
/*[[unused]]
|
||||||
int count;
|
int count;
|
||||||
int speed;
|
int speed;
|
||||||
int processed;
|
|
||||||
int length;
|
|
||||||
int startY;
|
int startY;
|
||||||
int startCir;
|
int startCir;
|
||||||
public boolean isAusf3Complete = false;
|
Random rand = new Random();
|
||||||
|
|
||||||
private double overrideRange = 0;
|
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;
|
||||||
this.posY = y;
|
this.posY = y;
|
||||||
this.posZ = z;
|
this.posZ = z;
|
||||||
this.strength = strength;
|
this.strength = strength;
|
||||||
this.count = count;
|
|
||||||
this.speed = speed;
|
|
||||||
this.length = length;
|
this.length = length;
|
||||||
//Ausf3, must be double
|
//Ausf3, must be double
|
||||||
//this.startY = strength;
|
|
||||||
//Mk 4.5, must be int32
|
//Mk 4.5, must be int32
|
||||||
|
|
||||||
|
// Total number of points
|
||||||
|
this.gspNumMax = (int)(2.5 * Math.PI * Math.pow(this.strength,2));
|
||||||
|
this.gspNum = 1;
|
||||||
|
|
||||||
|
// The beginning of the generalized spiral points
|
||||||
|
this.gspX = Math.PI;
|
||||||
|
this.gspY = 0.0;
|
||||||
|
|
||||||
|
|
||||||
|
/*[[unused]]
|
||||||
|
// this.startY = strength;
|
||||||
this.startY = 0;
|
this.startY = 0;
|
||||||
this.startCir = 0;
|
this.startCir = 0;
|
||||||
|
|
||||||
|
this.count = count;
|
||||||
|
this.speed = speed;
|
||||||
|
|
||||||
//starts at around 80, becomes 8 at length 500
|
//starts at around 80, becomes 8 at length 500
|
||||||
this.overrideRange = Math.max((Math.log(length) * 4 - 2.5D) * 10, 0);
|
this.overrideRange = Math.max((Math.log(length) * 4 - 2.5D) * 10, 0);
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
// Raise one generalized spiral points
|
||||||
|
private void generateGspUp(){
|
||||||
|
if (this.gspNum < this.gspNumMax) {
|
||||||
|
int k = this.gspNum + 1;
|
||||||
|
double hk = -1.0 + 2.0 * (k - 1.0) / (this.gspNumMax - 1.0);
|
||||||
|
this.gspX = Math.acos(hk);
|
||||||
|
|
||||||
|
double prev_lon = this.gspY;
|
||||||
|
double lon = prev_lon + 3.6 / Math.sqrt(this.gspNumMax) / Math.sqrt(1.0 - hk * hk);
|
||||||
|
this.gspY = lon % (Math.PI * 2);
|
||||||
|
} else {
|
||||||
|
this.gspX = 0.0;
|
||||||
|
this.gspY = 0.0;
|
||||||
|
}
|
||||||
|
this.gspNum++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get Cartesian coordinates for spherical coordinates
|
||||||
|
private Vec3 getSpherical2cartesian(){
|
||||||
|
double dx = Math.sin(this.gspX) * Math.cos(this.gspY);
|
||||||
|
double dz = Math.sin(this.gspX) * Math.sin(this.gspY);
|
||||||
|
double dy = Math.cos(this.gspX);
|
||||||
|
return Vec3.createVectorHelper(dx, dy, dz);
|
||||||
|
}
|
||||||
|
|
||||||
|
//currently used by mk4
|
||||||
|
public void collectTipMk4_5(int count) {
|
||||||
|
|
||||||
|
int amountProcessed = 0;
|
||||||
|
|
||||||
|
while (this.gspNumMax >= this.gspNum){
|
||||||
|
// Get Cartesian coordinates for spherical coordinates
|
||||||
|
Vec3 vec = this.getSpherical2cartesian();
|
||||||
|
|
||||||
|
int length = (int)Math.ceil(strength);
|
||||||
|
float res = strength;
|
||||||
|
FloatTriplet lastPos = null;
|
||||||
|
|
||||||
|
for(int i = 0; i < length; i ++) {
|
||||||
|
|
||||||
|
if(i > this.length)
|
||||||
|
break;
|
||||||
|
|
||||||
|
float x0 = (float) (posX + (vec.xCoord * i));
|
||||||
|
float y0 = (float) (posY + (vec.yCoord * i));
|
||||||
|
float z0 = (float) (posZ + (vec.zCoord * i));
|
||||||
|
|
||||||
|
double fac = 100 - ((double) i) / ((double) length) * 100;
|
||||||
|
fac *= 0.07D;
|
||||||
|
|
||||||
|
if(!world.getBlock((int)x0, (int)y0, (int)z0).getMaterial().isLiquid())
|
||||||
|
res -= Math.pow(world.getBlock((int)x0, (int)y0, (int)z0).getExplosionResistance(null), 7.5D - fac);
|
||||||
|
else
|
||||||
|
res -= Math.pow(Blocks.air.getExplosionResistance(null), 7.5D - fac);
|
||||||
|
|
||||||
|
if(res > 0 && world.getBlock((int)x0, (int)y0, (int)z0) != Blocks.air) {
|
||||||
|
lastPos = new FloatTriplet(x0, y0, z0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(res <= 0 || i + 1 >= this.length) {
|
||||||
|
if(affectedBlocks.size() < Integer.MAX_VALUE - 100 && lastPos != null) {
|
||||||
|
affectedBlocks.add(lastPos);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Raise one generalized spiral points
|
||||||
|
this.generateGspUp();
|
||||||
|
|
||||||
|
amountProcessed++;
|
||||||
|
if(amountProcessed >= count) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
isAusf3Complete = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void processTip(int count) {
|
||||||
|
|
||||||
|
int processedBlocks = 0;
|
||||||
|
int braker = 0;
|
||||||
|
|
||||||
|
for(int l = 0; l < Integer.MAX_VALUE; l++) {
|
||||||
|
|
||||||
|
if(processedBlocks >= count)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if(braker >= count * 50)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if(l > affectedBlocks.size() - 1)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if(affectedBlocks.isEmpty())
|
||||||
|
return;
|
||||||
|
|
||||||
|
int in = affectedBlocks.size() - 1;
|
||||||
|
|
||||||
|
float x = affectedBlocks.get(in).xCoord;
|
||||||
|
float y = affectedBlocks.get(in).yCoord;
|
||||||
|
float z = affectedBlocks.get(in).zCoord;
|
||||||
|
|
||||||
|
world.setBlock((int)x, (int)y, (int)z, Blocks.air);
|
||||||
|
|
||||||
|
Vec3 vec = Vec3.createVectorHelper(x - this.posX, y - this.posY, z - this.posZ);
|
||||||
|
double pX = vec.xCoord / vec.lengthVector();
|
||||||
|
double pY = vec.yCoord / vec.lengthVector();
|
||||||
|
double pZ = vec.zCoord / vec.lengthVector();
|
||||||
|
|
||||||
|
for(int i = 0; i < vec.lengthVector(); i ++) {
|
||||||
|
int x0 = (int)(posX + pX * i);
|
||||||
|
int y0 = (int)(posY + pY * i);
|
||||||
|
int z0 = (int)(posZ + pZ * i);
|
||||||
|
|
||||||
|
if(!world.isAirBlock(x0, y0, z0)) {
|
||||||
|
world.setBlock(x0, y0, z0, Blocks.air);
|
||||||
|
processedBlocks++;
|
||||||
|
}
|
||||||
|
|
||||||
|
braker++;
|
||||||
|
}
|
||||||
|
|
||||||
|
affectedBlocks.remove(in);
|
||||||
|
}
|
||||||
|
|
||||||
|
processed += count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*public void processBunch(int count) {
|
/*public void processBunch(int count) {
|
||||||
@ -102,58 +249,7 @@ public class ExplosionNukeRay {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}*/
|
}*/
|
||||||
|
/*
|
||||||
public void processTip(int count) {
|
|
||||||
|
|
||||||
int processedBlocks = 0;
|
|
||||||
int braker = 0;
|
|
||||||
|
|
||||||
for(int l = 0; l < Integer.MAX_VALUE; l++) {
|
|
||||||
|
|
||||||
if(processedBlocks >= count)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if(braker >= count * 50)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if(l > affectedBlocks.size() - 1)
|
|
||||||
break;
|
|
||||||
|
|
||||||
if(affectedBlocks.isEmpty())
|
|
||||||
return;
|
|
||||||
|
|
||||||
int in = affectedBlocks.size() - 1;
|
|
||||||
|
|
||||||
float x = affectedBlocks.get(in).xCoord;
|
|
||||||
float y = affectedBlocks.get(in).yCoord;
|
|
||||||
float z = affectedBlocks.get(in).zCoord;
|
|
||||||
|
|
||||||
world.setBlock((int)x, (int)y, (int)z, Blocks.air);
|
|
||||||
|
|
||||||
Vec3 vec = Vec3.createVectorHelper(x - this.posX, y - this.posY, z - this.posZ);
|
|
||||||
double pX = vec.xCoord / vec.lengthVector();
|
|
||||||
double pY = vec.yCoord / vec.lengthVector();
|
|
||||||
double pZ = vec.zCoord / vec.lengthVector();
|
|
||||||
|
|
||||||
for(int i = 0; i < vec.lengthVector(); i ++) {
|
|
||||||
int x0 = (int)(posX + pX * i);
|
|
||||||
int y0 = (int)(posY + pY * i);
|
|
||||||
int z0 = (int)(posZ + pZ * i);
|
|
||||||
|
|
||||||
if(!world.isAirBlock(x0, y0, z0)) {
|
|
||||||
world.setBlock(x0, y0, z0, Blocks.air);
|
|
||||||
processedBlocks++;
|
|
||||||
}
|
|
||||||
|
|
||||||
braker++;
|
|
||||||
}
|
|
||||||
|
|
||||||
affectedBlocks.remove(in);
|
|
||||||
}
|
|
||||||
|
|
||||||
processed += count;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Untested //override range
|
@Untested //override range
|
||||||
public void collectTip(int count) {
|
public void collectTip(int count) {
|
||||||
|
|
||||||
@ -169,7 +265,7 @@ public class ExplosionNukeRay {
|
|||||||
int length = (int)Math.ceil(strength);
|
int length = (int)Math.ceil(strength);
|
||||||
|
|
||||||
float res = strength;
|
float res = strength;
|
||||||
|
|
||||||
FloatTriplet lastPos = null;
|
FloatTriplet lastPos = null;
|
||||||
|
|
||||||
for(int i = 0; i < length; i ++) {
|
for(int i = 0; i < length; i ++) {
|
||||||
@ -185,21 +281,19 @@ public class ExplosionNukeRay {
|
|||||||
res -= Math.pow(world.getBlock((int)x0, (int)y0, (int)z0).getExplosionResistance(null), 1.25);
|
res -= Math.pow(world.getBlock((int)x0, (int)y0, (int)z0).getExplosionResistance(null), 1.25);
|
||||||
else
|
else
|
||||||
res -= Math.pow(Blocks.air.getExplosionResistance(null), 1.25);
|
res -= Math.pow(Blocks.air.getExplosionResistance(null), 1.25);
|
||||||
|
|
||||||
/*
|
//Blast resistance calculations are still done to preserve the general shape,
|
||||||
* 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.
|
||||||
* 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.
|
||||||
* There is currently no blast resistance limit on this, could change in the future.
|
|
||||||
*/
|
|
||||||
boolean inOverrideRange = this.overrideRange >= length;
|
boolean inOverrideRange = this.overrideRange >= length;
|
||||||
|
|
||||||
if((res > 0 || inOverrideRange) && world.getBlock((int)x0, (int)y0, (int)z0) != Blocks.air) {
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Only stop if we are either out of range or if the remaining strength is 0 while being outside the override range
|
// 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((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));
|
||||||
@ -208,7 +302,8 @@ public class ExplosionNukeRay {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
/*
|
||||||
public void collectTipExperimental(int count) {
|
public void collectTipExperimental(int count) {
|
||||||
|
|
||||||
for(int k = 0; k < count; k++) {
|
for(int k = 0; k < count; k++) {
|
||||||
@ -223,7 +318,7 @@ public class ExplosionNukeRay {
|
|||||||
int length = (int)Math.ceil(strength);
|
int length = (int)Math.ceil(strength);
|
||||||
|
|
||||||
float res = strength;
|
float res = strength;
|
||||||
|
|
||||||
FloatTriplet lastPos = null;
|
FloatTriplet lastPos = null;
|
||||||
|
|
||||||
for(int i = 0; i < length; i ++) {
|
for(int i = 0; i < length; i ++) {
|
||||||
@ -246,7 +341,7 @@ public class ExplosionNukeRay {
|
|||||||
if(res > 0 && world.getBlock((int)x0, (int)y0, (int)z0) != Blocks.air) {
|
if(res > 0 && 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) {
|
if(res <= 0 || 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));
|
||||||
@ -255,7 +350,7 @@ public class ExplosionNukeRay {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
/*public void collectTipAusf3(int count) {
|
/*public void collectTipAusf3(int count) {
|
||||||
|
|
||||||
int amountProcessed = 0;
|
int amountProcessed = 0;
|
||||||
@ -328,94 +423,6 @@ public class ExplosionNukeRay {
|
|||||||
|
|
||||||
isAusf3Complete = true;
|
isAusf3Complete = true;
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
//currently used by mk4
|
|
||||||
public void collectTipMk4_5(int count) {
|
|
||||||
|
|
||||||
int amountProcessed = 0;
|
|
||||||
|
|
||||||
double bow = Math.PI * this.strength;
|
|
||||||
double bowCount = Math.ceil(bow);
|
|
||||||
|
|
||||||
//Axial
|
|
||||||
//StartY starts at this.length
|
|
||||||
for(int v = startY; v <= bowCount; v++) {
|
|
||||||
|
|
||||||
float part = (float) (Math.PI/bow);
|
|
||||||
float rot = part * -v;
|
|
||||||
|
|
||||||
Vec3 heightVec = Vec3.createVectorHelper(0, -strength, 0);
|
|
||||||
heightVec.rotateAroundZ(rot);
|
|
||||||
|
|
||||||
double y = heightVec.yCoord;
|
|
||||||
|
|
||||||
double sectionRad = Math.sqrt(Math.pow(strength, 2) - Math.pow(y, 2));
|
|
||||||
double circumference = 2 * Math.PI * sectionRad;
|
|
||||||
|
|
||||||
//if(y < 2 && y > -2)
|
|
||||||
// circumference *= 1.25D;
|
|
||||||
|
|
||||||
//circumference = Math.ceil(circumference);
|
|
||||||
|
|
||||||
//Radial
|
|
||||||
//StartCir starts at circumference
|
|
||||||
for(int r = startCir; r < circumference; r ++) {
|
|
||||||
|
|
||||||
Vec3 vec = Vec3.createVectorHelper(sectionRad, y, 0);
|
|
||||||
vec = vec.normalize();
|
|
||||||
/*if(y > 0)
|
|
||||||
vec.rotateAroundZ((float) (y / sectionRad) * 0.15F);*/
|
|
||||||
/*if(y < 0)
|
|
||||||
vec.rotateAroundZ((float) (y / sectionRad) * 0.15F);*/
|
|
||||||
vec.rotateAroundY((float) (360 / circumference * r));
|
|
||||||
|
|
||||||
int length = (int)Math.ceil(strength);
|
|
||||||
|
|
||||||
float res = strength;
|
|
||||||
|
|
||||||
FloatTriplet lastPos = null;
|
|
||||||
|
|
||||||
for(int i = 0; i < length; i ++) {
|
|
||||||
|
|
||||||
if(i > this.length)
|
|
||||||
break;
|
|
||||||
|
|
||||||
float x0 = (float) (posX + (vec.xCoord * i));
|
|
||||||
float y0 = (float) (posY + (vec.yCoord * i));
|
|
||||||
float z0 = (float) (posZ + (vec.zCoord * i));
|
|
||||||
|
|
||||||
double fac = 100 - ((double) i) / ((double) length) * 100;
|
|
||||||
fac *= 0.07D;
|
|
||||||
|
|
||||||
if(!world.getBlock((int)x0, (int)y0, (int)z0).getMaterial().isLiquid())
|
|
||||||
res -= Math.pow(world.getBlock((int)x0, (int)y0, (int)z0).getExplosionResistance(null), 7.5D - fac);
|
|
||||||
else
|
|
||||||
res -= Math.pow(Blocks.air.getExplosionResistance(null), 7.5D - fac);
|
|
||||||
|
|
||||||
if(res > 0 && world.getBlock((int)x0, (int)y0, (int)z0) != Blocks.air) {
|
|
||||||
lastPos = new FloatTriplet(x0, y0, z0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(res <= 0 || i + 1 >= this.length) {
|
|
||||||
if(affectedBlocks.size() < Integer.MAX_VALUE - 100 && lastPos != null) {
|
|
||||||
affectedBlocks.add(new FloatTriplet(lastPos.xCoord, lastPos.yCoord, lastPos.zCoord));
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
amountProcessed++;
|
|
||||||
|
|
||||||
if(amountProcessed >= count) {
|
|
||||||
startY = v;
|
|
||||||
startCir = startCir + 1;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
isAusf3Complete = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Dysfunctional, punches hole into ground
|
//Dysfunctional, punches hole into ground
|
||||||
/*public void collectTipAusf3(int count) {
|
/*public void collectTipAusf3(int count) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user