icbm/src/main/java/icbm/zhapin/zhapin/ZhaPin.java

514 lines
18 KiB
Java

package icbm.zhapin.zhapin;
import java.util.List;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import icbm.api.explosion.ExplosionEvent;
import icbm.api.explosion.IExplosive;
import icbm.core.HaoMa;
import icbm.core.MainBase;
import icbm.zhapin.ICBMExplosion;
import icbm.zhapin.daodan.EMissile;
import icbm.zhapin.daodan.MissileBase;
import icbm.zhapin.zhapin.ex.ExAntiGravitational;
import icbm.zhapin.zhapin.ex.ExAntimatter;
import icbm.zhapin.zhapin.ex.ExBreaching;
import icbm.zhapin.zhapin.ex.ExChemical;
import icbm.zhapin.zhapin.ex.ExCondensed;
import icbm.zhapin.zhapin.ex.ExDebilitation;
import icbm.zhapin.zhapin.ex.ExDecayLand;
import icbm.zhapin.zhapin.ex.ExEmp;
import icbm.zhapin.zhapin.ex.ExEmpSignal;
import icbm.zhapin.zhapin.ex.ExEmpWave;
import icbm.zhapin.zhapin.ex.ExEnder;
import icbm.zhapin.zhapin.ex.ExEndothermic;
import icbm.zhapin.zhapin.ex.ExEndothermic2;
import icbm.zhapin.zhapin.ex.ExExothermic;
import icbm.zhapin.zhapin.ex.ExExothermic2;
import icbm.zhapin.zhapin.ex.ExHypersonic;
import icbm.zhapin.zhapin.ex.ExIncendiary;
import icbm.zhapin.zhapin.ex.ExMutateLiving;
import icbm.zhapin.zhapin.ex.ExNuclear;
import icbm.zhapin.zhapin.ex.ExPushPull;
import icbm.zhapin.zhapin.ex.ExRedMatter;
import icbm.zhapin.zhapin.ex.ExRejuvenation;
import icbm.zhapin.zhapin.ex.ExSMine;
import icbm.zhapin.zhapin.ex.ExShrapnel;
import icbm.zhapin.zhapin.ex.ExSonic;
import icbm.zhapin.zhapin.ex.ExThermobaric;
import net.minecraft.entity.Entity;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.item.ItemStack;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.DamageSource;
import net.minecraft.util.MathHelper;
import net.minecraft.util.Vec3;
import net.minecraft.world.Explosion;
import net.minecraft.world.World;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.common.util.ForgeDirection;
import universalelectricity.core.vector.Vector3;
import universalelectricity.prefab.TranslationHelper;
import universalelectricity.prefab.flag.FlagRegistry;
import universalelectricity.prefab.implement.ITier;
public abstract class ZhaPin implements ITier, IExplosive {
public static final ZhaPin condensed;
public static final ZhaPin shrapnel;
public static final ZhaPin indenciary;
public static final ZhaPin debilitation;
public static final ZhaPin chemical;
public static final ZhaPin anvil;
public static final ZhaPin repulsive;
public static final ZhaPin attractive;
public static final int E_YI_ID;
public static final ZhaPin fragmentation;
public static final ZhaPin contagious;
public static final ZhaPin sonic;
public static final ZhaPin breaching;
public static final ZhaPin rejuvenation;
public static final ZhaPin thermobaric;
public static final int E_ER_ID;
public static final ZhaPin nuclear;
public static final ZhaPin emp;
public static final ZhaPin exothermic;
public static final ZhaPin endothermic;
public static final ZhaPin antiGravitational;
public static final ZhaPin ender;
public static final ZhaPin hypersonic;
public static final int E_SAN_ID;
public static final ZhaPin antimatter;
public static final ZhaPin redMatter;
public static final int E_SI_ID;
public static final ZhaPin sMine;
public static final ZhaPin empWave;
public static final ZhaPin empSignal;
public static final ZhaPin exothermic2;
public static final ZhaPin decayLand;
public static final ZhaPin mutateLiving;
public static final ZhaPin endothermic2;
public static ZhaPin[] list;
private String name;
private int ID;
private int tier;
private int yinXin;
public MissileBase daoDan;
public final String qiZi;
protected boolean isDisabled;
protected boolean isMobile;
protected ZhaPin(final String name, final int ID, final int tier) {
this.isMobile = false;
if (ZhaPin.list == null) {
ZhaPin.list = new ZhaPin[32];
}
if (ZhaPin.list[ID] != null) {
throw new IllegalArgumentException(
"Explosive " + ID + " is already occupied by "
+ ZhaPin.list[ID].getClass().getSimpleName() + "!"
);
}
ZhaPin.list[ID] = this;
this.name = name;
this.tier = tier;
this.yinXin = 100;
this.ID = ID;
this.daoDan = new MissileBase(name, ID, tier);
this.qiZi = FlagRegistry.registerFlag("ban_" + this.name);
MainBase.CONFIGURATION.load();
this.isDisabled = MainBase.CONFIGURATION
.get("Disable_Explosives", "Disable " + this.name, false)
.getBoolean(false);
MainBase.CONFIGURATION.save();
}
@Override
public int getID() {
return this.ID;
}
@Override
public String getUnlocalizedName() {
return this.name;
}
@Override
public String getExplosiveName() {
return TranslationHelper.getLocal("icbm.explosive." + this.name + ".name");
}
@Override
public String getGrenadeName() {
return TranslationHelper.getLocal("icbm.grenade." + this.name + ".name");
}
@Override
public String getMissileName() {
return TranslationHelper.getLocal("icbm.missile." + this.name + ".name");
}
@Override
public String getMinecartName() {
return TranslationHelper.getLocal("icbm.minecart." + this.name + ".name");
}
@Override
public int getTier() {
return this.tier;
}
@Override
public void setTier(final int tier) {
this.tier = tier;
}
public void setFuse(final int fuse) {
this.yinXin = fuse;
}
public int getYinXin() {
return this.yinXin;
}
public void yinZhaQian(final World worldObj, final Entity entity) {
worldObj.playSoundAtEntity(entity, "random.fuse", 1.0f, 1.0f);
}
public void
onYinZha(final World worldObj, final Vector3 position, final int fuseTicks) {
worldObj.spawnParticle(
"smoke", position.x, position.y + 0.5, position.z, 0.0, 0.0, 0.0
);
}
public int onBeiZha() {
return (int) (this.yinXin / 2 + Math.random() * this.yinXin / 4.0);
}
protected int proceduralInterval() {
return -1;
}
public int proceduralInterval(final World worldObj, final int callCounts) {
return this.proceduralInterval();
}
public void baoZhaQian(
final World worldObj, final Vector3 position, final Entity explosionSource
) {
MinecraftForge.EVENT_BUS.post(new ExplosionEvent.PreExplosionEvent(
worldObj, position.x, position.y, position.z, this
));
}
@SideOnly(Side.CLIENT)
public Object[] getRenderData() {
return null;
}
public void
doBaoZha(final World worldObj, final Vector3 position, final Entity explosionSource) {
}
public boolean doBaoZha(
final World worldObj,
final Vector3 position,
final Entity explosionSource,
final int callCount
) {
this.doBaoZha(worldObj, position, explosionSource);
return false;
}
public boolean doBaoZha(
final World worldObj,
final Vector3 position,
final Entity explosionSource,
final int metadata,
final int callCount
) {
return this.doBaoZha(worldObj, position, explosionSource, callCount);
}
public void
gengXin(final World worldObj, final Vector3 position, final int ticksExisted) {}
public void baoZhaHou(
final World worldObj, final Vector3 position, final Entity explosionSource
) {
MinecraftForge.EVENT_BUS.post(new ExplosionEvent.PostExplosionEvent(
worldObj, position.x, position.y, position.z, this
));
}
public int countIncrement() {
return 1;
}
public void spawnZhaDan(
final World worldObj,
final Vector3 position,
final ForgeDirection orientation,
final byte cause
) {
if (!this.isDisabled) {
position.add(0.5);
final EExplosive eZhaDan = new EExplosive(
worldObj, position, (byte) orientation.ordinal(), this.getID()
);
switch (cause) {
case 1: {
eZhaDan.destroyedByExplosion();
break;
}
case 2: {
eZhaDan.setFire(10);
break;
}
}
worldObj.spawnEntityInWorld((Entity) eZhaDan);
}
}
public void
spawnZhaDan(final World worldObj, final Vector3 position, final byte orientation) {
this.spawnZhaDan(
worldObj, position, ForgeDirection.getOrientation((int) orientation), (byte) 0
);
}
public void init() {}
public ItemStack getItemStack() {
return new ItemStack(ICBMExplosion.bExplosives, 1, this.getID());
}
public ItemStack getItemStack(final int amount) {
return new ItemStack(ICBMExplosion.bExplosives, amount, this.getID());
}
public static IExplosive getExplosiveByName(final String name) {
for (final IExplosive explosive : ZhaPin.list) {
if (explosive.getUnlocalizedName().equalsIgnoreCase(name)) {
return explosive;
}
}
return null;
}
public static void createExplosion(
final World worldObj,
final Double x,
final Double y,
final Double z,
final Entity entity,
final Integer explosiveID
) {
createExplosion(worldObj, new Vector3(x, y, z), entity, explosiveID);
}
public static void createExplosion(
final World worldObj,
final Vector3 position,
final Entity entity,
final int explosiveID
) {
if (!ZhaPin.list[explosiveID].isDisabled) {
if (ZhaPin.list[explosiveID].proceduralInterval(worldObj, -1) > 0) {
if (!worldObj.isRemote) {
worldObj.spawnEntityInWorld((Entity) new EExplosion(
worldObj,
position.clone(),
explosiveID,
ZhaPin.list[explosiveID].isMobile
));
}
} else {
ZhaPin.list[explosiveID].baoZhaQian(worldObj, position.clone(), entity);
ZhaPin.list[explosiveID].doBaoZha(
worldObj, position.clone(), entity, explosiveID, -1
);
ZhaPin.list[explosiveID].baoZhaHou(worldObj, position.clone(), entity);
}
}
}
public void doDamageEntities(
final World worldObj,
final Vector3 position,
final float radius,
final float power
) {
this.doDamageEntities(worldObj, position, radius, power, true);
}
public void doDamageEntities(
final World worldObj,
final Vector3 position,
float radius,
final float power,
final boolean destroyItem
) {
radius *= 2.0f;
final Vector3 minCoord = position.clone();
minCoord.add(-radius - 1.0f);
final Vector3 maxCoord = position.clone();
maxCoord.add(radius + 1.0f);
final List<Entity> allEntities = worldObj.getEntitiesWithinAABB(
Entity.class,
AxisAlignedBB.getBoundingBox(
(double) minCoord.intX(),
(double) minCoord.intY(),
(double) minCoord.intZ(),
(double) maxCoord.intX(),
(double) maxCoord.intY(),
(double) maxCoord.intZ()
)
);
final Vec3 var31 = Vec3.createVectorHelper(position.x, position.y, position.z);
for (int i = 0; i < allEntities.size(); ++i) {
final Entity entity = allEntities.get(i);
if (!this.onDamageEntity(entity)) {
if (entity instanceof EMissile) {
((EMissile) entity).setExplode();
} else if (!(entity instanceof EntityItem) || destroyItem) {
final double distance
= entity.getDistance(position.x, position.y, position.z) / radius;
if (distance <= 1.0) {
double xDifference = entity.posX - position.x;
double yDifference = entity.posY - position.y;
double zDifference = entity.posZ - position.z;
final double var32 = MathHelper.sqrt_double(
xDifference * xDifference + yDifference * yDifference
+ zDifference * zDifference
);
xDifference /= var32;
yDifference /= var32;
zDifference /= var32;
final double var33
= worldObj.getBlockDensity(var31, entity.boundingBox);
final double var34 = (1.0 - distance) * var33;
int damage = 0;
damage
= (int) ((var34 * var34 + var34) / 2.0 * 8.0 * power + 1.0);
entity.attackEntityFrom(
DamageSource.setExplosionSource((Explosion) null), damage
);
final Entity entity2 = entity;
entity2.motionX += xDifference * var34;
final Entity entity3 = entity;
entity3.motionY += yDifference * var34;
final Entity entity4 = entity;
entity4.motionZ += zDifference * var34;
}
}
}
}
}
protected boolean onDamageEntity(final Entity entity) {
return false;
}
static {
condensed
= new ExCondensed("condensed", HaoMa.getID(ZhaPin.class.getSimpleName()), 1);
shrapnel
= new ExShrapnel("shrapnel", HaoMa.getID(ZhaPin.class.getSimpleName()), 1);
indenciary = new ExIncendiary(
"incendiary", HaoMa.getID(ZhaPin.class.getSimpleName()), 1
);
debilitation = new ExDebilitation(
"debilitation", HaoMa.getID(ZhaPin.class.getSimpleName()), 1
);
chemical
= new ExChemical("chemical", HaoMa.getID(ZhaPin.class.getSimpleName()), 1);
anvil = new ExShrapnel("anvil", HaoMa.getID(ZhaPin.class.getSimpleName()), 1);
repulsive
= new ExPushPull("repulsive", HaoMa.getID(ZhaPin.class.getSimpleName()), 1);
attractive
= new ExPushPull("attractive", HaoMa.getID(ZhaPin.class.getSimpleName()), 1);
E_YI_ID = ZhaPin.attractive.getID() + 1;
fragmentation = new ExShrapnel(
"fragmentation", HaoMa.getID(ZhaPin.class.getSimpleName()), 2
);
contagious
= new ExChemical("contagious", HaoMa.getID(ZhaPin.class.getSimpleName()), 2);
sonic = new ExSonic("sonic", HaoMa.getID(ZhaPin.class.getSimpleName()), 2);
breaching
= new ExBreaching("breaching", HaoMa.getID(ZhaPin.class.getSimpleName()), 2);
rejuvenation = new ExRejuvenation(
"rejuvenation", HaoMa.getID(ZhaPin.class.getSimpleName()), 2
);
thermobaric = new ExThermobaric(
"thermobaric", HaoMa.getID(ZhaPin.class.getSimpleName()), 2
);
E_ER_ID = ZhaPin.thermobaric.getID() + 1;
nuclear = new ExNuclear("nuclear", HaoMa.getID(ZhaPin.class.getSimpleName()), 3);
emp = new ExEmp("emp", HaoMa.getID(ZhaPin.class.getSimpleName()), 3);
exothermic = new ExExothermic(
"exothermic", HaoMa.getID(ZhaPin.class.getSimpleName()), 3
);
endothermic = new ExEndothermic(
"endothermic", HaoMa.getID(ZhaPin.class.getSimpleName()), 3
);
antiGravitational = new ExAntiGravitational(
"antiGravitational", HaoMa.getID(ZhaPin.class.getSimpleName()), 3
);
ender = new ExEnder("ender", HaoMa.getID(ZhaPin.class.getSimpleName()), 3);
hypersonic = new ExHypersonic(
"hypersonic", HaoMa.getID(ZhaPin.class.getSimpleName()), 3
);
E_SAN_ID = ZhaPin.hypersonic.getID() + 1;
antimatter = new ExAntimatter(
"antimatter", HaoMa.getID(ZhaPin.class.getSimpleName()), 4
);
redMatter
= new ExRedMatter("redMatter", HaoMa.getID(ZhaPin.class.getSimpleName()), 4);
E_SI_ID = ZhaPin.redMatter.getID() + 1;
sMine = new ExSMine("sMine", HaoMa.getID(ZhaPin.class.getSimpleName()), 2);
empWave = new ExEmpWave("emp", HaoMa.getID(ZhaPin.class.getSimpleName()), 3);
empSignal = new ExEmpSignal("emp", HaoMa.getID(ZhaPin.class.getSimpleName()), 3);
exothermic2 = new ExExothermic2(
"exothermic", HaoMa.getID(ZhaPin.class.getSimpleName()), 3
);
decayLand
= new ExDecayLand("decayLand", HaoMa.getID(ZhaPin.class.getSimpleName()), 3);
mutateLiving = new ExMutateLiving(
"mutateLiving", HaoMa.getID(ZhaPin.class.getSimpleName()), 3
);
endothermic2 = new ExEndothermic2(
"endothermic", HaoMa.getID(ZhaPin.class.getSimpleName()), 3
);
}
public enum ZhaPinType {
QUAN_BU("QUAN_BU", 0),
ZHA_DAN("ZHA_DAN", 1),
SHOU_LIU_DAN("SHOU_LIU_DAN", 2),
DAO_DAN("DAO_DAN", 3),
CHE("CHE", 4);
private ZhaPinType(final String name, final int ordinal) {}
public static ZhaPinType get(final int id) {
if (id >= 0 && id < values().length) {
return values()[id];
}
return null;
}
}
}