public static void FireBeamWeapons(StarSystem starSys, Entity beamWeapon) { WeaponStateDB stateInfo = beamWeapon.GetDataBlob <WeaponStateDB>(); FireControlInstanceAbilityDB fireControl = stateInfo.FireControl.GetDataBlob <FireControlInstanceAbilityDB>(); // only fire if the beam weapon is finished with its cooldown if (stateInfo.CoolDown <= TimeSpan.FromSeconds(0) && stateInfo.FireControl != null && fireControl.IsEngaging) { //TODO chance to hit //int damageAmount = 10;//TODO damageAmount calc int damageAmount = beamWeapon.GetDataBlob <BeamWeaponAtbDB>().BaseDamage; // TODO: Better damage calculation double range = fireControl.Target.GetDataBlob <PositionDB>().GetDistanceTo(beamWeapon.GetDataBlob <ComponentInstanceInfoDB>().ParentEntity.GetDataBlob <PositionDB>()); // only fire if target is in range if (range <= Math.Min(beamWeapon.GetDataBlob <BeamWeaponAtbDB>().MaxRange, stateInfo.FireControl.GetDataBlob <BeamFireControlAtbDB>().Range)) { DamageProcessor.OnTakingDamage(stateInfo.FireControl, damageAmount); stateInfo.CoolDown = TimeSpan.FromSeconds(beamWeapon.GetDataBlob <BeamWeaponAtbDB>().PowerRechargeRate); starSys.SystemManager.ManagerSubpulses.AddEntityInterupt(starSys.SystemManager.ManagerSubpulses.SystemLocalDateTime + stateInfo.CoolDown, PulseActionEnum.SomeOtherProcessor, beamWeapon); } } }
public FireControlInstanceAbilityDB(FireControlInstanceAbilityDB db) { Target = db.Target; AssignedWeapons = new List <Entity>(db.AssignedWeapons); IsEngaging = db.IsEngaging; }