Hbm-s-Nuclear-Tech-GIT/src/main/java/com/hbm/explosion/ExplosionNukeAdvanced.java
2024-02-13 16:53:25 +01:00

122 lines
4.3 KiB
Java

package com.hbm.explosion;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.world.World;
public class ExplosionNukeAdvanced {
public int posX;
public int posY;
public int posZ;
public int lastposX = 0;
public int lastposZ = 0;
public int radius;
public int radius2;
public World worldObj;
private int n = 1;
private int nlimit;
private int shell;
private int leg;
private int element;
public float explosionCoefficient = 1.0F;
public int type = 0;
public void saveToNbt(NBTTagCompound nbt, String name) {
nbt.setInteger(name + "posX", posX);
nbt.setInteger(name + "posY", posY);
nbt.setInteger(name + "posZ", posZ);
nbt.setInteger(name + "lastposX", lastposX);
nbt.setInteger(name + "lastposZ", lastposZ);
nbt.setInteger(name + "radius", radius);
nbt.setInteger(name + "radius2", radius2);
nbt.setInteger(name + "n", n);
nbt.setInteger(name + "nlimit", nlimit);
nbt.setInteger(name + "shell", shell);
nbt.setInteger(name + "leg", leg);
nbt.setInteger(name + "element", element);
nbt.setFloat(name + "explosionCoefficient", explosionCoefficient);
nbt.setInteger(name + "type", type);
}
public void readFromNbt(NBTTagCompound nbt, String name) {
posX = nbt.getInteger(name + "posX");
posY = nbt.getInteger(name + "posY");
posZ = nbt.getInteger(name + "posZ");
lastposX = nbt.getInteger(name + "lastposX");
lastposZ = nbt.getInteger(name + "lastposZ");
radius = nbt.getInteger(name + "radius");
radius2 = nbt.getInteger(name + "radius2");
n = nbt.getInteger(name + "n");
nlimit = nbt.getInteger(name + "nlimit");
shell = nbt.getInteger(name + "shell");
leg = nbt.getInteger(name + "leg");
element = nbt.getInteger(name + "element");
explosionCoefficient = nbt.getFloat(name + "explosionCoefficient");
type = nbt.getInteger(name + "type");
}
public ExplosionNukeAdvanced(int x, int y, int z, World world, int rad, float coefficient, int typ) {
this.posX = x;
this.posY = y;
this.posZ = z;
this.worldObj = world;
this.radius = rad;
this.radius2 = this.radius * this.radius;
this.explosionCoefficient = Math.min(Math.max((rad + coefficient * (y - 60)) / (coefficient * rad), 1 / coefficient), 1.0f);
this.type = typ;
this.nlimit = this.radius2 * 4;
}
public boolean update() {
switch(this.type) {
case 0: breakColumn(this.lastposX, this.lastposZ); break;
case 1: vapor(this.lastposX, this.lastposZ); break;
case 2: waste(this.lastposX, this.lastposZ); break;
}
this.shell = (int) Math.floor((Math.sqrt(n) + 1) / 2);
int shell2 = this.shell * 2;
this.leg = (int) Math.floor((this.n - (shell2 - 1) * (shell2 - 1)) / shell2);
this.element = (this.n - (shell2 - 1) * (shell2 - 1)) - shell2 * this.leg - this.shell + 1;
this.lastposX = this.leg == 0 ? this.shell : this.leg == 1 ? -this.element : this.leg == 2 ? -this.shell : this.element;
this.lastposZ = this.leg == 0 ? this.element : this.leg == 1 ? this.shell : this.leg == 2 ? -this.element : -this.shell;
this.n++;
return this.n > this.nlimit;
}
private void breakColumn(int x, int z) {
int dist = this.radius2 - (x * x + z * z);
if(dist > 0) {
dist = (int) Math.sqrt(dist);
for(int y = dist; y > -dist * this.explosionCoefficient; y--) {
if(y < 8) {
y -= ExplosionNukeGeneric.destruction(this.worldObj, this.posX + x, this.posY + y, this.posZ + z);
} else {
ExplosionNukeGeneric.destruction(this.worldObj, this.posX + x, this.posY + y, this.posZ + z);
}
}
}
}
private void vapor(int x, int z) {
int dist = this.radius2 - (x * x + z * z);
if(dist > 0) {
dist = (int) Math.sqrt(dist);
for(int y = dist; y > -dist * this.explosionCoefficient; y--) {
y -= ExplosionNukeGeneric.vaporDest(this.worldObj, this.posX + x, this.posY + y, this.posZ + z);
}
}
}
private void waste(int x, int z) {
int dist = this.radius2 - (x * x + z * z);
if(dist > 0) {
dist = (int) Math.sqrt(dist);
for(int y = dist; y > -dist * this.explosionCoefficient; y--) {
if(radius >= 95)
ExplosionNukeGeneric.wasteDest(this.worldObj, this.posX + x, this.posY + y, this.posZ + z);
else
ExplosionNukeGeneric.wasteDestNoSchrab(this.worldObj, this.posX + x, this.posY + y, this.posZ + z);
}
}
}
}