icbm/src/main/java/atomicscience/api/poison/PoisonRadiation.java

67 lines
2.6 KiB
Java

package atomicscience.api.poison;
import atomicscience.api.IAntiPoisonBlock;
import java.util.EnumSet;
import net.minecraft.block.Block;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.init.Blocks;
import net.minecraft.world.World;
import universalelectricity.core.vector.Vector3;
import universalelectricity.prefab.CustomDamageSource;
import universalelectricity.prefab.potion.CustomPotionEffect;
public class PoisonRadiation extends Poison {
public static final Poison INSTANCE = new PoisonRadiation("radiation", 0);
public static final CustomDamageSource damageSource = (CustomDamageSource) (new CustomDamageSource("radiation"))
.setDamageBypassesArmor();
public static boolean disabled = false;
public PoisonRadiation(String name, int id) {
super(name, id);
}
@Override
protected void doPoisonEntity(Vector3 emitPosition, EntityLivingBase entity,
EnumSet<Poison.ArmorType> armorWorn,
int amplifier) {
if (!disabled) {
if (emitPosition == null) {
entity.addPotionEffect(
new CustomPotionEffect(PotionRadiation.INSTANCE.getId(),
300 * (amplifier + 1), amplifier, null));
return;
}
if (this.getAntiRadioactiveCount(entity.worldObj, emitPosition,
new Vector3(entity)) <= amplifier) {
entity.addPotionEffect(
new CustomPotionEffect(PotionRadiation.INSTANCE.getId(),
400 * (amplifier + 1), amplifier, null));
}
}
}
public int getAntiRadioactiveCount(World world, Vector3 startingPosition,
Vector3 endingPosition) {
Vector3 delta = Vector3.subtract(endingPosition, startingPosition).normalize();
Vector3 targetPosition = startingPosition.clone();
double totalDistance = startingPosition.distanceTo(endingPosition);
int count = 0;
if (totalDistance > 1.0D) {
for (; targetPosition.distanceTo(endingPosition) <= totalDistance; targetPosition.add(delta)) {
Block block = targetPosition.getBlock(world);
if (block != Blocks.air && block instanceof IAntiPoisonBlock &&
((IAntiPoisonBlock) block)
.isPoisonPrevention(world, targetPosition.intX(),
targetPosition.intY(),
targetPosition.intZ(), this)) {
++count;
}
}
}
return count;
}
}