示例#1
0
        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;
        }