Esempio n. 1
0
        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;
 }