package mcjty.deepresonance.boom;
import elec332.core.explosion.Elexplosion;
import elec332.core.world.WorldHelper;
import net.minecraft.block.Block;
import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLiving;
import net.minecraft.util.DamageSource;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World;
import java.util.List;
/**
* Created by Elec332 on 13-8-2015.
*/
public class TestExplosion extends Elexplosion{
public TestExplosion(World world, Entity entity, double x, double y, double z, float size) {
super(world, entity, x, y, z, size);
}
@Override
protected void preExplode() {
damageEntities(getRadius(), 4.0f);
}
@Override
public void explode() {
if(!this.getWorld().isRemote) {
for(int x = (int)(-this.getRadius()); (float)x < this.getRadius(); ++x) {
for(int y = (int)(-this.getRadius()); (float)y < this.getRadius(); ++y) {
for(int z = (int)(-this.getRadius()); (float)z < this.getRadius(); ++z) {
BlockPos targetPosition = this.getLocation().add(x, y, z);
double dist = Math.sqrt(getLocation().distanceSq(targetPosition));
if(dist < this.getRadius()) {
Block block = WorldHelper.getBlockAt(this.getWorld(), targetPosition);
IBlockState state = this.getWorld().getBlockState(targetPosition);
if(block != null && !block.isAir(state, this.getWorld(), targetPosition) && block.getBlockHardness(state, getWorld(), targetPosition) > 0 && (dist < (double)(this.getRadius() - 1.0F) || (double)this.getWorld().rand.nextFloat() > 0.7D)) {
block.onBlockExploded(getWorld(), targetPosition, this);
}
}
}
}
}
}
}
@Override
protected void damageEntities(float radius, float power) {
if(!this.getWorld().isRemote) {
radius *= 2.0F;
final float minRadius = -radius - 1.0F, maxRadius = radius + 1.0F;
BlockPos minCoord = this.getLocation();
minCoord.add(minRadius, minRadius, minRadius);
BlockPos maxCoord = this.getLocation();
maxCoord.add(maxRadius, maxRadius, maxRadius);
List allEntities = this.getWorld().getEntitiesWithinAABB(EntityLiving.class, new AxisAlignedBB((double) minCoord.getX(), (double) minCoord.getY(), (double) minCoord.getZ(), (double) maxCoord.getX(), (double) maxCoord.getY(), (double) maxCoord.getZ()));
for (Object allEntity : allEntities) {
Entity entity = (Entity) allEntity;
double distance = entity.getDistance((double) this.getLocation().getX(), (double) this.getLocation().getY(), (double) this.getLocation().getZ()) / (double) radius;
if (distance <= 1.0D) {
double xDifference = entity.posX - (double) this.getLocation().getX();
double yDifference = entity.posY - (double) this.getLocation().getY();
double zDifference = entity.posZ - (double) this.getLocation().getZ();
double d1 = (double) MathHelper.sqrt_double(xDifference * xDifference + yDifference * yDifference + zDifference * zDifference);
xDifference /= d1;
yDifference /= d1;
zDifference /= d1;
double density = (double) this.getWorld().getBlockDensity(new Vec3d((double) this.getLocation().getX(), (double) this.getLocation().getY(), (double) this.getLocation().getZ()), entity.getEntityBoundingBox());
double d2 = (1.0D - distance) * density;
int damage = (int) ((d2 * d2 + d2) / 2.0D * 8.0D * (double) power + 1.0D);
//@todo
// entity.attackEntityFrom(DamageSource.setExplosionSource(this), (float) damage);
entity.motionX += xDifference * d2;
entity.motionY += yDifference * d2;
entity.motionZ += zDifference * d2;
}
}
}
}
}