Integrated new laser damage computation

Fixed CME
Fixed crash when no entity was in sight
Fixed damage level towards entities
This commit is contained in:
LemADEC 2015-09-04 11:04:09 +02:00
parent 564b6d968e
commit 940c803e8a
2 changed files with 40 additions and 38 deletions

View file

@ -223,45 +223,47 @@ public class TileEntityLaser extends TileEntityAbstractInterfaced {
}
// Apply effect to entities
for (Entry<Double, MovingObjectPosition> entityHitEntry : entityHits.entrySet()) {
double entityHitDistance = entityHitEntry.getKey();
// ignore entities behind walls
if (entityHitDistance >= blockHitDistance) {
break;
}
// only hits entities with health
MovingObjectPosition mopEntity = entityHitEntry.getValue();
if (mopEntity != null && mopEntity.entityHit instanceof EntityLivingBase) {
EntityLivingBase entity = (EntityLivingBase) mopEntity.entityHit;
// Consume energy
energy -= WarpDriveConfig.LASER_CANNON_ENTITY_HIT_ENERGY
+ ((blockHitDistance - distanceTravelled) * WarpDriveConfig.LASER_CANNON_ENERGY_LOSS_PER_BLOCK);
distanceTravelled = blockHitDistance;
vHitPoint = new Vector3(mopEntity.hitVec);
if (energy <= 0) {
if (entityHits != null) {
for (Entry<Double, MovingObjectPosition> entityHitEntry : entityHits.entrySet()) {
double entityHitDistance = entityHitEntry.getKey();
// ignore entities behind walls
if (entityHitDistance >= blockHitDistance) {
break;
}
// apply effects
entity.setFire(WarpDriveConfig.LASER_CANNON_ENTITY_HIT_SET_ON_FIRE_SECONDS);
float damage = (float)clamp(0.0D, WarpDriveConfig.LASER_CANNON_ENTITY_HIT_MAX_DAMAGE,
WarpDriveConfig.LASER_CANNON_ENTITY_HIT_BASE_DAMAGE + energy / WarpDriveConfig.LASER_CANNON_ENTITY_HIT_ENERGY_PER_DAMAGE);
entity.attackEntityFrom(DamageSource.inFire, damage);
if (energy > WarpDriveConfig.LASER_CANNON_ENTITY_HIT_ENERGY_THRESHOLD_FOR_EXPLOSION) {
float strength = (float)clamp(0.0D, WarpDriveConfig.LASER_CANNON_ENTITY_HIT_EXPLOSION_MAX_STRENGTH,
WarpDriveConfig.LASER_CANNON_ENTITY_HIT_EXPLOSION_BASE_STRENGTH + energy / WarpDriveConfig.LASER_CANNON_ENTITY_HIT_EXPLOSION_ENERGY_PER_STRENGTH);
worldObj.newExplosion(null, entity.posX, entity.posY, entity.posZ, strength, true, true);
// only hits entities with health
MovingObjectPosition mopEntity = entityHitEntry.getValue();
if (mopEntity != null && mopEntity.entityHit instanceof EntityLivingBase) {
EntityLivingBase entity = (EntityLivingBase) mopEntity.entityHit;
// Consume energy
energy -= WarpDriveConfig.LASER_CANNON_ENTITY_HIT_ENERGY
+ ((blockHitDistance - distanceTravelled) * WarpDriveConfig.LASER_CANNON_ENERGY_LOSS_PER_BLOCK);
distanceTravelled = blockHitDistance;
vHitPoint = new Vector3(mopEntity.hitVec);
if (energy <= 0) {
break;
}
// apply effects
entity.setFire(WarpDriveConfig.LASER_CANNON_ENTITY_HIT_SET_ON_FIRE_SECONDS);
float damage = (float)clamp(0.0D, WarpDriveConfig.LASER_CANNON_ENTITY_HIT_MAX_DAMAGE,
WarpDriveConfig.LASER_CANNON_ENTITY_HIT_BASE_DAMAGE + energy / WarpDriveConfig.LASER_CANNON_ENTITY_HIT_ENERGY_PER_DAMAGE);
entity.attackEntityFrom(DamageSource.inFire, damage);
if (energy > WarpDriveConfig.LASER_CANNON_ENTITY_HIT_ENERGY_THRESHOLD_FOR_EXPLOSION) {
float strength = (float)clamp(0.0D, WarpDriveConfig.LASER_CANNON_ENTITY_HIT_EXPLOSION_MAX_STRENGTH,
WarpDriveConfig.LASER_CANNON_ENTITY_HIT_EXPLOSION_BASE_STRENGTH + energy / WarpDriveConfig.LASER_CANNON_ENTITY_HIT_EXPLOSION_ENERGY_PER_STRENGTH);
worldObj.newExplosion(null, entity.posX, entity.posY, entity.posZ, strength, true, true);
}
// remove entity from hit list
entityHits.put(entityHitDistance, null);
}
// remove entity from hit list
entityHits.remove(entityHitDistance);
}
}
if (energy <= 0) {
break;
if (energy <= 0) {
break;
}
}
// Laser went too far or no block hit

View file

@ -196,9 +196,9 @@ public class WarpDriveConfig {
public static int LASER_CANNON_ENERGY_LOSS_PER_BLOCK = 500;
public static int LASER_CANNON_ENTITY_HIT_SET_ON_FIRE_SECONDS = 100;
public static int LASER_CANNON_ENTITY_HIT_ENERGY = 0;
public static int LASER_CANNON_ENTITY_HIT_BASE_DAMAGE = 1;
public static int LASER_CANNON_ENTITY_HIT_ENERGY_PER_DAMAGE = 10000;
public static int LASER_CANNON_ENTITY_HIT_ENERGY = 15000;
public static int LASER_CANNON_ENTITY_HIT_BASE_DAMAGE = 3;
public static int LASER_CANNON_ENTITY_HIT_ENERGY_PER_DAMAGE = 30000;
public static int LASER_CANNON_ENTITY_HIT_MAX_DAMAGE = 100;
public static int LASER_CANNON_ENTITY_HIT_ENERGY_THRESHOLD_FOR_EXPLOSION = 1000000;
@ -670,7 +670,7 @@ public class WarpDriveConfig {
LASER_CANNON_ENTITY_HIT_ENERGY = clamp(0, LASER_CANNON_MAX_LASER_ENERGY,
config.get("laser_cannon", "entity_hit_energy", LASER_CANNON_ENTITY_HIT_ENERGY, "Base energy consumed from hitting an entity").getInt());
LASER_CANNON_ENTITY_HIT_BASE_DAMAGE = clamp(0, LASER_CANNON_MAX_LASER_ENERGY,
config.get("laser_cannon", "entity_hit_base_damage", LASER_CANNON_ENTITY_HIT_BASE_DAMAGE, "Minimum damage to entity hit").getInt());
config.get("laser_cannon", "entity_hit_base_damage", LASER_CANNON_ENTITY_HIT_BASE_DAMAGE, "Minimum damage to entity hit (measured in half hearts)").getInt());
LASER_CANNON_ENTITY_HIT_ENERGY_PER_DAMAGE = clamp(0, LASER_CANNON_MAX_LASER_ENERGY,
config.get("laser_cannon", "entity_hit_energy_per_damage", LASER_CANNON_ENTITY_HIT_ENERGY_PER_DAMAGE, "Energy required by additional hit point (won't be consummed)").getInt());
LASER_CANNON_ENTITY_HIT_MAX_DAMAGE = clamp(0, Integer.MAX_VALUE,