public void BombardFire() { var numRockets = 4; var angleOffset = 0.3f; if (FlightShip.HasUpgrade <BombardOverload>()) { numRockets = 8; angleOffset = 1.1f; } if (_bombardCooldown.Completed) { var guns = FlightShip.Topology.AllSections .Where(x => x.Module is BombardModule); var shipTransform = Transform; foreach (var gun in guns) { if (!FlightShip.TryTakeEnergy(1)) { return; } for (var i = 0; i < numRockets; i++) { var flightNode = FlightShip.GetNodeForSection(gun.GridLocation); var rotation = (float)((-gun.Rotation - 2) * Math.PI / 3 + angleOffset * Random.NextDouble() - angleOffset / 2f); var rotationQuat = Quaternion.CreateFromYawPitchRoll(rotation, 0, 0); var nodeTransform = flightNode.Entity.Get <Transform>(); var location = Vector3.Transform(Vector3.Zero, nodeTransform.WorldTransform * shipTransform.WorldTransform); var shell = Entity.EntityManager.Create(); shell.Add(new Transform { Location = location + new Vector3((float)Random.NextDouble() * 0.3f, 0, (float)Random.NextDouble() * 0.3f) }); var rotationMatrix = Matrix.CreateFromYawPitchRoll(rotation, 0, 0) * Matrix.CreateFromQuaternion(shipTransform.Rotation); shell.Add( new RocketProjectile( FlightShip.ShipGuid, FlightShip.Velocity, Vector3.Transform(Vector3.Transform(Vector3.Forward, rotationQuat), shipTransform.Rotation), rotationMatrix ) ); } } _bombardCooldown.Restart(); } }
public void ShieldDeploy() { if (_bubbleShieldCooldown.Completed) { var guns = FlightShip.Topology.AllSections .Where(x => x.Module is ShieldBubbleGeneratorModule); var shipTransform = Transform; foreach (var gun in guns) { if (!FlightShip.TryTakeEnergy(1)) { return; } var flightNode = FlightShip.GetNodeForSection(gun.GridLocation); var rotation = (float)((-gun.Rotation - 2) * Math.PI / 3); var rotationQuat = Quaternion.CreateFromYawPitchRoll(rotation, 0, 0); //var nodeTransform = flightNode.Entity.Get<Transform>(); var location = flightNode.GlobalLocation; var shell = Entity.EntityManager.Create(); shell.Add(new Transform { Location = location }); shell.Add( new BubbleShieldProjectile( FlightShip.ShipGuid, FlightShip.GetNodeForSection(gun.GridLocation), FlightShip.Velocity, Vector3.Transform(Vector3.Transform(Vector3.Forward, rotationQuat), shipTransform.Rotation), FlightShip.HasUpgrade <ShieldAmplification>(), FlightShip.HasUpgrade <ShieldFortification>() ) ); } _bubbleShieldCooldown.Restart(); } }
public void HeavyFire() { if (_heavyweightCooldown.Completed) { var guns = FlightShip.Topology.AllSections .Where(x => x.Module is BlasterModule); var shipTransform = Transform; foreach (var gun in guns) { if (!FlightShip.TryTakeEnergy(1)) { return; } var flightNode = FlightShip.GetNodeForSection(gun.GridLocation); var rotation = (float)((-gun.Rotation - 2) * Math.PI / 3); var rotationQuat = Quaternion.CreateFromYawPitchRoll(rotation, 0, 0); //var nodeTransform = flightNode.Entity.Get<Transform>(); var location = flightNode.GlobalLocation; var shell = Entity.EntityManager.Create(); shell.Add(new Transform { Location = location }); shell.Add( new HeavyBlasterProjectile( FlightShip.ShipGuid, FlightShip.Velocity, Vector3.Transform(Vector3.Transform(Vector3.Forward, rotationQuat), shipTransform.Rotation), false ) ); } SoundEffects.Get("HeavyShot")?.Play(); _heavyweightCooldown.Restart(); } }