public override void Update(float dt) { float vVel = 0; float hVel = 0; float Thrust = Data.Thrust * throttle; if (Controls.Up) { vVel += Data.StrafeVelocity; } if (Controls.Down) { vVel -= Data.StrafeVelocity; } if (Controls.Left) { hVel -= Data.StrafeVelocity; } if (Controls.Right) { hVel += Data.StrafeVelocity; } if (Controls.ThrottleUp && throttle <= 1.0f) { throttle += 0.01f; } if (Controls.ThrottleDown && throttle >= 0.0f) { throttle -= 0.01f; } float ThrustRatio = (Thrust / Data.Thrust); Thrusters.Settings.VelocityMotor.Softness = 0.002f + (1 - ThrustRatio) * 0.5f; Thrusters.Settings.VelocityMotor.GoalVelocity = Vector3.Transform(new Vector3(hVel, vVel, -Thrust), Orientation); float minAoA = MathHelper.PiOver2; foreach (ShipObj ship in Sector.Redria.Ships.table) { float AoA = AngleOfAttack(ship.Position, Position, Entity.WorldTransform.Forward); if (AoA < minAoA) { Target = ship; minAoA = AoA; } } foreach (KeyValuePair <Vector3, WeaponData> kvp in Data.Weapons) { WeaponData weapon = kvp.Value; if (weapon.Cooldown > 0) { weapon.Cooldown -= dt; } else if (weapon.CurrentAmmo <= 0) { weapon.CurrentAmmo = weapon.MaxAmmo; } if (weapon.UseLockon) { if (weapon.CurrentAmmo > 0 && Target != null && minAoA < weapon.LockonRadius) { if (Target != prevTarget) { weapon.CurrentLockonTime = 0; } if (weapon.CurrentLockonTime <= 0) { Locked = false; SendMissileLockon(LockonStatus.Locking); } weapon.CurrentLockonTime += dt; if (weapon.CurrentLockonTime >= weapon.LockonTime && !Locked) { Locked = true; SendMissileLockon(LockonStatus.Locked); } } else if (weapon.CurrentLockonTime > 0) { weapon.CurrentLockonTime = 0; Locked = false; SendMissileLockon(LockonStatus.NotLocked); } } if (weapon.CurrentAmmo > 0 && weapon.Cooldown <= 0) { if ((Controls.leftMouse && weapon.fireGroup == 0) || (Controls.rightMouse && weapon.fireGroup == 1)) { if (weapon.UseLockon) { if (weapon.CurrentLockonTime >= weapon.LockonTime) { weapon.CurrentAmmo--; if (weapon.CurrentAmmo > 0) { weapon.Cooldown = weapon.InverseRoF; } else { weapon.Cooldown = weapon.ReloadTime; } Vector3 firePos = Vector3.Transform(kvp.Key + Vector3.Forward * weapon.Projectile.ForwardOffset, Entity.Orientation) + Entity.Position; Vector3 fireVel; weapon.Projectile.Create(firePos, Entity.Orientation, Entity.LinearVelocity, out fireVel, Target); MessageWriter.MissileLockonMessage(Target.Client.Owner, 0, LockonStatus.EnemyMissile); } } else { weapon.CurrentAmmo--; if (weapon.CurrentAmmo > 0) { weapon.Cooldown = weapon.InverseRoF; } else { weapon.Cooldown = weapon.ReloadTime; } Vector3 firePos = Vector3.Transform(kvp.Key + Vector3.Forward * weapon.Projectile.ForwardOffset, Entity.Orientation) + Entity.Position; Vector3 fireVel; weapon.Projectile.Create(firePos, Entity.Orientation, Entity.LinearVelocity, out fireVel); if (fireVel != Vector3.Zero) { MessageWriter.FireBulletMessage(weapon.ProjectileID, firePos, Entity.Orientation, fireVel); } } } } } prevTarget = Target; Quaternion target = Quaternion.CreateFromRotationMatrix(Matrix.CreateFromYawPitchRoll(Controls.Yaw, Controls.Pitch, Controls.Roll)); ControlSurfaces.Settings.Servo.Goal = target; //ControlSurfaces.Settings.Servo.MaxCorrectiveVelocity = Data.Turn * ThrustRatio; }