generated from tilera/1710mod
111 lines
3.9 KiB
Java
111 lines
3.9 KiB
Java
package icbm.zhapin.zhapin.ex;
|
|
|
|
import java.util.HashSet;
|
|
|
|
import net.minecraft.block.Block;
|
|
import net.minecraft.block.BlockLiquid;
|
|
import net.minecraft.entity.Entity;
|
|
import net.minecraft.init.Blocks;
|
|
import net.minecraft.world.World;
|
|
import universalelectricity.core.vector.Vector3;
|
|
|
|
public class ThrSheXian extends Thread {
|
|
public World world;
|
|
public Vector3 position;
|
|
public int radius;
|
|
public int energyStored;
|
|
public Entity source;
|
|
public boolean isComplete;
|
|
public final HashSet<Vector3> destroyed;
|
|
|
|
public ThrSheXian(
|
|
final World world,
|
|
final Vector3 position,
|
|
final int banJing,
|
|
final int nengLiang,
|
|
final Entity source
|
|
) {
|
|
this.isComplete = false;
|
|
this.destroyed = new HashSet<>();
|
|
this.world = world;
|
|
this.position = position;
|
|
this.radius = banJing;
|
|
this.energyStored = nengLiang;
|
|
this.source = source;
|
|
this.setPriority(4);
|
|
}
|
|
|
|
@Override
|
|
public void run() {
|
|
for (int steps
|
|
= (int) Math.ceil(3.141592653589793 / Math.atan(1.0 / this.radius)),
|
|
phi_n = 0;
|
|
phi_n < 2 * steps;
|
|
++phi_n) {
|
|
for (int theta_n = 0; theta_n < steps; ++theta_n) {
|
|
final double phi = 6.283185307179586 / steps * phi_n;
|
|
final double theta = 3.141592653589793 / steps * theta_n;
|
|
final Vector3 delta = new Vector3(
|
|
Math.sin(theta) * Math.cos(phi),
|
|
Math.cos(theta),
|
|
Math.sin(theta) * Math.sin(phi)
|
|
);
|
|
float power = this.energyStored
|
|
- this.energyStored * this.world.rand.nextFloat() / 2.0f;
|
|
final Vector3 targetPosition = this.position.clone();
|
|
|
|
for (float var21 = 0.3f; power > 0.0f; power -= var21 * 0.75f * 10.0f) {
|
|
if (targetPosition.distanceTo(this.position) > this.radius) {
|
|
break;
|
|
}
|
|
|
|
final Block block = this.world.getBlock(
|
|
targetPosition.intX(),
|
|
targetPosition.intY(),
|
|
targetPosition.intZ()
|
|
);
|
|
|
|
if (block != Blocks.air) {
|
|
float resistance = 0.0f;
|
|
|
|
if (block == Blocks.bedrock) {
|
|
break;
|
|
}
|
|
|
|
if (block instanceof BlockLiquid) {
|
|
resistance = 1.0f;
|
|
} else {
|
|
resistance = block.getExplosionResistance(
|
|
this.source,
|
|
this.world,
|
|
targetPosition.intX(),
|
|
targetPosition.intY(),
|
|
targetPosition.intZ(),
|
|
(double) this.position.intX(),
|
|
(double) this.position.intY(),
|
|
(double) this.position.intZ()
|
|
)
|
|
* 4.0f;
|
|
}
|
|
|
|
power -= resistance;
|
|
|
|
if (power > 0.0f && !this.destroyed.contains(targetPosition)) {
|
|
this.destroyed.add(targetPosition.clone());
|
|
}
|
|
}
|
|
|
|
final Vector3 vector3 = targetPosition;
|
|
vector3.x += delta.x;
|
|
final Vector3 vector4 = targetPosition;
|
|
vector4.y += delta.y;
|
|
final Vector3 vector5 = targetPosition;
|
|
vector5.z += delta.z;
|
|
}
|
|
}
|
|
}
|
|
|
|
this.isComplete = true;
|
|
}
|
|
}
|