icbm/src/main/java/icbm/zhapin/daodan/DAntiBallistic.java

99 lines
3.1 KiB
Java

package icbm.zhapin.daodan;
import icbm.api.IMissileLockable;
import icbm.api.explosion.ExplosionEvent;
import net.minecraft.entity.Entity;
import net.minecraft.util.AxisAlignedBB;
import net.minecraftforge.common.MinecraftForge;
import universalelectricity.core.vector.Vector3;
public class DAntiBallistic extends MissileBase {
public static final int ABMRange = 30;
protected DAntiBallistic(final String name, final int ID, final int tier) {
super(name, ID, tier);
}
@Override
public void update(final EMissile missileObj) {
if (missileObj.lockedTarget == null) {
final AxisAlignedBB bounds = AxisAlignedBB.getBoundingBox(
missileObj.posX - 30.0,
missileObj.posY - 30.0,
missileObj.posZ - 30.0,
missileObj.posX + 30.0,
missileObj.posY + 30.0,
missileObj.posZ + 30.0
);
final Entity nearestEntity = missileObj.worldObj.findNearestEntityWithinAABB(
IMissileLockable.class, bounds, (Entity) missileObj
);
if (nearestEntity instanceof IMissileLockable) {
if (((IMissileLockable) nearestEntity).canLock(missileObj)) {
missileObj.lockedTarget = nearestEntity;
missileObj.didTargetLockBefore = true;
missileObj.worldObj.playSoundAtEntity(
(Entity) missileObj, "icbm:targetlocked", 5.0f, 0.9f
);
}
} else {
missileObj.motionX = missileObj.xDiff / missileObj.flightDuration;
missileObj.motionZ = missileObj.zDiff / missileObj.flightDuration;
if (missileObj.didTargetLockBefore) {
missileObj.explode();
}
}
return;
}
Vector3 guJiDiDian = new Vector3(missileObj.lockedTarget);
if (missileObj.lockedTarget.isDead) {
missileObj.explode();
return;
}
if (missileObj.lockedTarget instanceof IMissileLockable) {
guJiDiDian
= ((IMissileLockable) missileObj.lockedTarget).getPredictedPosition(4);
}
missileObj.motionX = (guJiDiDian.x - missileObj.posX) * 0.30000001192092896;
missileObj.motionY = (guJiDiDian.y - missileObj.posY) * 0.30000001192092896;
missileObj.motionZ = (guJiDiDian.z - missileObj.posZ) * 0.30000001192092896;
}
@Override
public void onExplode(final EMissile missileObj) {
missileObj.worldObj.createExplosion(
(Entity) missileObj,
missileObj.posX,
missileObj.posY,
missileObj.posZ,
6.0f,
true
);
MinecraftForge.EVENT_BUS.post(new ExplosionEvent.PostExplosionEvent(
missileObj.worldObj, missileObj.posX, missileObj.posY, missileObj.posZ, this
));
}
@Override
public float getRadius() {
return 6.0f;
}
@Override
public double getEnergy() {
return 100.0;
}
@Override
public boolean isCruise() {
return true;
}
}