private void DamageVoxel(HitEntity hitEnt, ProInfo info) { var entity = hitEnt.Entity; var destObj = hitEnt.Entity as MyVoxelBase; if (destObj == null || entity == null || !hitEnt.HitPos.HasValue) { return; } var shieldHeal = info.AmmoDef.DamageScales.Shields.Type == ShieldDef.ShieldType.Heal; if (!info.AmmoDef.Const.VoxelDamage || shieldHeal) { info.BaseDamagePool = 0; return; } using (destObj.Pin()) { var detonateOnEnd = info.AmmoDef.Const.AmmoAreaEffect && info.AmmoDef.AreaEffect.Detonation.DetonateOnEnd && info.AmmoDef.AreaEffect.AreaEffect != AreaEffectType.Radiant; info.ObjectsHit++; float damageScale = 1; if (info.AmmoDef.Const.VirtualBeams) { damageScale *= info.WeaponCache.Hits; } var scaledDamage = info.BaseDamagePool * damageScale; var fallOff = info.AmmoDef.Const.FallOffScaling && info.DistanceTraveled > info.AmmoDef.DamageScales.FallOff.Distance; if (fallOff) { var fallOffMultipler = (float)MathHelperD.Clamp(1.0 - ((info.DistanceTraveled - info.AmmoDef.DamageScales.FallOff.Distance) / (info.AmmoDef.Const.MaxTrajectory - info.AmmoDef.DamageScales.FallOff.Distance)), info.AmmoDef.DamageScales.FallOff.MinMultipler, 1); scaledDamage *= fallOffMultipler; } var oRadius = info.AmmoDef.AreaEffect.AreaEffectRadius; var minTestRadius = info.DistanceTraveled - info.PrevDistanceTraveled; var tRadius = oRadius < minTestRadius ? minTestRadius : oRadius; var objHp = (int)MathHelper.Clamp(MathFuncs.VolumeCube(MathFuncs.LargestCubeInSphere(tRadius)), 1, double.MaxValue); var sync = MpActive && IsServer; if (tRadius > 5) { objHp *= 5; } if (scaledDamage < objHp) { var reduceBy = objHp / scaledDamage; oRadius /= reduceBy; if (oRadius < 1) { oRadius = 1; } info.BaseDamagePool = 0; } else { info.BaseDamagePool -= objHp; if (oRadius < minTestRadius) { oRadius = minTestRadius; } } destObj.PerformCutOutSphereFast(hitEnt.HitPos.Value, (float)oRadius, true); if (detonateOnEnd) { var det = info.AmmoDef.AreaEffect.Detonation; var dRadius = det.DetonationRadius; var dObjHp = (int)MathHelper.Clamp(MathFuncs.VolumeCube(MathFuncs.LargestCubeInSphere(dRadius)), 1, double.MaxValue); if (dRadius > 5) { dObjHp *= 5; } dObjHp *= 5; var dDamage = det.DetonationDamage; var reduceBy = dObjHp / dDamage; dRadius /= reduceBy; if (dRadius < 1.5) { dRadius = 1.5f; } if (sync) { destObj.PerformCutOutSphereFast(hitEnt.HitPos.Value, dRadius, true); } } } }
private void DamageVoxel(HitEntity hitEnt, ProInfo info, bool canDamage) { var entity = hitEnt.Entity; var destObj = hitEnt.Entity as MyVoxelBase; if (destObj == null || entity == null || !hitEnt.HitPos.HasValue) { return; } var shieldHeal = info.AmmoDef.DamageScales.Shields.Type == ShieldDef.ShieldType.Heal; if (!info.AmmoDef.Const.VoxelDamage || shieldHeal) { info.BaseDamagePool = 0; return; } using (destObj.Pin()) { var detonateOnEnd = info.AmmoDef.Const.AmmoAreaEffect && info.AmmoDef.AreaEffect.Detonation.DetonateOnEnd && info.AmmoDef.AreaEffect.AreaEffect != AreaEffectType.Radiant; info.ObjectsHit++; float damageScale = 1; if (info.AmmoDef.Const.VirtualBeams) { damageScale *= info.WeaponCache.Hits; } var scaledDamage = info.BaseDamagePool * damageScale; var fallOff = info.AmmoDef.Const.FallOffScaling && info.DistanceTraveled > info.AmmoDef.DamageScales.FallOff.Distance; if (fallOff) { var fallOffMultipler = (float)MathHelperD.Clamp(1.0 - ((info.DistanceTraveled - info.AmmoDef.DamageScales.FallOff.Distance) / (info.AmmoDef.Const.MaxTrajectory - info.AmmoDef.DamageScales.FallOff.Distance)), info.AmmoDef.DamageScales.FallOff.MinMultipler, 1); scaledDamage *= fallOffMultipler; } var oRadius = info.AmmoDef.AreaEffect.AreaEffectRadius; var minTestRadius = info.DistanceTraveled - info.PrevDistanceTraveled; var tRadius = oRadius < minTestRadius ? minTestRadius : oRadius; var objHp = (int)MathHelper.Clamp(MathFuncs.VolumeCube(MathFuncs.LargestCubeInSphere(tRadius)), 5000, double.MaxValue); if (tRadius > 5) { objHp *= 5; } if (scaledDamage < objHp) { var reduceBy = objHp / scaledDamage; oRadius /= reduceBy; if (oRadius < 1) { oRadius = 1; } info.BaseDamagePool = 0; } else { info.BaseDamagePool -= objHp; if (oRadius < minTestRadius) { oRadius = minTestRadius; } } destObj.PerformCutOutSphereFast(hitEnt.HitPos.Value, (float)oRadius, true); //Log.Line($"TestHealth: {objHp} - tRadius:{tRadius} - oRadius:{oRadius} - travel:{minTestRadius} - base:{info.BaseDamagePool} - det:{detonateOnEnd}"); if (detonateOnEnd && info.BaseDamagePool <= 0) { var det = info.AmmoDef.AreaEffect.Detonation; var dRadius = det.DetonationRadius; var dDamage = det.DetonationDamage; //var dObjHp = (int)MathHelper.Clamp(MathFuncs.VolumeCube(MathFuncs.LargestCubeInSphere(dRadius)), 5000, double.MaxValue); //if (dRadius > 5) dObjHp *= 5; //dObjHp *= 5; //var reduceBy = dObjHp / dDamage; //dRadius /= reduceBy; if (dRadius < 1.5) { dRadius = 1.5f; } //Log.Line($"radius: {det.DetonationRadius} - dRadius:{dRadius} - reduceBy:{reduceBy} - dObjHp:{dObjHp}"); if (canDamage) { //destObj.PerformCutOutSphereFast(hitEnt.HitPos.Value, dRadius, true); SUtils.CreateMissileExplosion(this, dDamage, dRadius, hitEnt.HitPos.Value, hitEnt.Intersection.Direction, info.Target.FiringCube, destObj, info.AmmoDef, true); } } } }