/*
         * всегда смотрит на горизонт
         * наводится на цель
         */
        private void findV3()
        {
            //Получаем и нормализуем вектор гравитации. Это наше направление "вниз" на планете.
            Vector3D GravityVector = cockpit.GetNaturalGravity();
            Vector3D GravNorm      = Vector3D.Normalize(GravityVector);

            //вектор на точку
            Vector3D T = Vector3D.Normalize(Target - cockpit.GetPosition());

            //Рысканием прицеливаемся на точку Target.
            double tF       = T.Dot(cockpit.WorldMatrix.Forward);
            double tL       = T.Dot(cockpit.WorldMatrix.Left);
            float  YawInput = -(float)Math.Atan2(tL, tF);

            // lcd.WriteText(YawInput.ToString());

            //Получаем проекции вектора прицеливания на все три оси блока ДУ.
            double gF = GravNorm.Dot(cockpit.WorldMatrix.Forward);
            double gL = GravNorm.Dot(cockpit.WorldMatrix.Left);
            double gU = GravNorm.Dot(cockpit.WorldMatrix.Up);

            //Получаем сигналы по тангажу и крены операцией atan2
            float RollInput  = (float)Math.Atan2(gL, -gU);
            float PitchInput = -(float)Math.Atan2(gF, -gU);

            //для каждого гироскопа устанавливаем текущие значения по тангажу, крену, рысканию.
            setGyro(PitchInput, RollInput, YawInput);

            // это почти один и тот же вектор
            logEcho("G", GravNorm);
            logEcho("D", cockpit.WorldMatrix.Down);
        }
Пример #2
0
        private void Align()
        {
            if (aligning)
            {
                targetDistance = (float)((cockpit.GetPosition() - Target).Length()) / 1000;

                if (targetDistance > 5)
                {
                    foreach (var gyro in gyros)
                    {
                        gyro.GyroOverride = true;
                        SetOrientation(gyro);
                    }
                    distancePercent = ((targetDistance - (float)5.1) / (MaxDistance - 5)) * 100;                                     //Convert the desired distance to a percentage of the max distance, taking into account that 0% = 5km
                    jumper.SetValueFloat("JumpDistance", distancePercent);
                    numJumps   = (int)Math.Ceiling(targetDistance / MaxDistance);
                    targetInfo = "\n\nDestination: " + waypoints[selection].Name + "\n\nDistance: " + targetDistance + " KM" + "\nNumber of Jumps: " + numJumps + "\n\n-Coordinates-\n"
                                 + waypoints[selection].Coords.ToString().Split(' ')[0] + "\n" + waypoints[selection].Coords.ToString().Split(' ')[1] + "\n" + waypoints[selection].Coords.ToString().Split(' ')[2] + "\n";

                    float sum = 0;
                    foreach (var gyro in gyros)
                    {
                        sum += Math.Abs(gyro.Yaw) + Math.Abs(gyro.Pitch) + Math.Abs(gyro.Roll);
                    }
                    if (sum < 0.005)
                    {
                        aligned = true;
                        foreach (var gyro in gyros)
                        {
                            gyro.Yaw   = 0;
                            gyro.Roll  = 0;
                            gyro.Pitch = 0;
                        }
                    }
                }
                else
                {
                    if (!aligned)
                    {
                        close    = true;
                        aligning = false;
                    }
                    else
                    {
                        aligned = false;
                    }
                }
            }
            else
            {
                foreach (var item in gyros)
                {
                    item.GyroOverride = false;
                    item.GyroPower    = gyropower;
                    item.Roll         = 0;
                }
            }
        }
Пример #3
0
        public void Main(string argument, UpdateType updateSource)
        {
            if (updateSource == UpdateType.Update10)
            {
                if (makeWork)
                {
                    CompensateHeight();
                }
                else if (show)
                {
                    Show();
                }
            }
            else
            {
                if (argument == "Up")
                {
                    IncreaseHeversHeight();
                }
                else if (argument == "Down")
                {
                    DecreaseHeversHeight();
                }
                else if (argument == "Start")
                {
                    dCenterHeight      = (myCockpit.GetPosition() - centerOfPlanet).Length();
                    changedHoverHeight = hoverHeight = hovers[0].GetValueFloat("Hover_MinHeight");

                    foreach (IMyThrust thr in hovers)
                    {
                        thr.SetValueBool("Hover_AutoAltitude", true);
                    }

                    makeWork = true;
                }
                else if (argument == "Stop")
                {
                    makeWork = false;
                }
                else if (argument == "Show")
                {
                    show = !show;
                }
                //else if (argument == "StartHorizontal")
                //{

                //}
                //else if (argument == "StopHorizontal")
                //{

                //}
            }
        }
Пример #4
0
        public void Main(string argument, UpdateType updateSource)
        {
            // скорость
            Vector3D currentPosition = cockpit.GetPosition();
            double   speed           = ((currentPosition - position) * 60).Length();

            position = currentPosition;

            stringBuilder.Clear();
            stringBuilder.Append(string.Format("speed: {0:0.#}", speed))
            .Append("\nposition: " + position.Length())
            .Append("\n  X: " + position.X)
            .Append("\n  Y: " + position.Y)
            .Append("\n  Z: " + position.Z);

            // высота над землей
            double elevation;

            cockpit.TryGetPlanetElevation(MyPlanetElevation.Surface, out elevation);
            stringBuilder.Append("\nelevation: ").Append(elevation);

            // единичный вектор вперёд
            var forward2 = cockpit.WorldMatrix.GetOrientation().Forward;
            var forward  = cockpit.WorldMatrix.Forward;

            stringBuilder.Append("\nforvard: ").Append(forward.Length())
            .Append("\n  X: ").Append(forward.X)
            .Append("\n  Y:").Append(forward.Y)
            .Append("\n  Z:").Append(forward.Z);
            stringBuilder.Append("\n").Append(forward == forward2); // true

            lcd.WriteText(stringBuilder.ToString());
        }
Пример #5
0
        void UpdateTreadmill()
        {
            if (!IsControlled)
            {
                return;
            }

            MatrixD matrix = cockpit.WorldMatrix;

            matrix *= MatrixD.CreateFromAxisAngle(matrix.Right, MathHelper.ToRadians(5));

            treadmillCounter += treadmillUVOffset;

            if (treadmillCounter > 1)
            {
                treadmillCounter = 0;
            }

            Vector2 offset = new Vector2(treadmillCounter, 0);

            MyTransparentGeometry.AddBillboardOriented(
                MyStringId.GetOrCompute("Treadmill"),
                Color.White.ToVector4(),
                cockpit.GetPosition() + (cockpit.WorldMatrix.Up * -0.948f) + (cockpit.WorldMatrix.Forward * -0.2f),
                matrix.Backward,
                matrix.Right,
                0.6f,
                0.25f,
                Vector2.Zero + offset);
        }
Пример #6
0
 private void UpdateScanInfo()
 {
     ScanInfo.Clear();
     if (!ScanResult.IsEmpty())
     {
         ScanInfo.Append(ScanResult.Name);
         ScanInfo.Append(": ");
         ScanInfo.Append(ScanResult.Type.ToString());
         ScanInfo.Append('\n');
         ScanInfo.Append(ScanResult.Relationship.ToString());
         ScanInfo.Append('\n');
         ScanInfo.Append($"Distance: {(ScanResult.Position - Cockpit.GetPosition()).Length()}m\n");
         ScanInfo.Append($"Speed: {ScanResult.Velocity.Length():F1}m/s\n");
         ScanInfo.Append($"GPS:{ScanResult.Name}:{ScanResult.Position.X:F1}:{ScanResult.Position.Y:F1}:{ScanResult.Position.Z:F1}:\n");
     }
     Right.WriteText(ScanInfo);
 }
Пример #7
0
            //GPS:Large Grid:157759.727203728:231485.308988417:5714590.54597619:
            //GPS:Thorium Lake:-249471.93:-166022.37:11030192.43:
            public void Aim900(string GPSToAimAt)
            {
                var targetVector = new Vector3D();

                if (TryParseVector3D(GPSToAimAt, out targetVector))
                {
                    _program.Echo($"{targetVector}");
                }
                else
                {
                    throw new Exception("Invalid GPS data");
                }

                _turret900.SetTarget(targetVector);

                var cockpitVector = _cockpit.GetPosition();

                _program.Echo($"{cockpitVector}");
            }
Пример #8
0
        public void Main(string argument, UpdateType updateSource)
        {
            subsystemManager.UpdateTime();

            if (argument == "descend")
            {
                Mode       = 1;
                lockMatrix = Drive.Controller.WorldMatrix;
            }
            else if (argument == "ascend")
            {
                Mode       = 2;
                lockMatrix = Drive.Controller.WorldMatrix;
            }
            else if (argument == "stop")
            {
                Mode       = 0;
                lockMatrix = MatrixD.Zero;
                Drive.Clear();
            }
            else if (commandLine.TryParse(argument))
            {
                subsystemManager.Command(commandLine.Argument(0), commandLine.Argument(1), commandLine.ArgumentCount > 2 ? commandLine.Argument(2) : null);
            }
            else
            {
                try
                {
                    subsystemManager.Update(updateSource);

                    runs++;
                    if (runs % 5 == 0)
                    {
                        OutputBuilder.Clear();

                        OutputBuilder.Append($"STATUS: ").AppendLine(Mode == 0 ? "STOP" : (Mode == 1 ? "DESC" : "ASCE"));

                        foreach (var screen in Displays)
                        {
                            screen.ContentType = ContentType.TEXT_AND_IMAGE;
                            screen.WriteText(OutputBuilder.ToString());
                        }

                        var destination = new Waypoint();

                        if (Mode == 0)
                        {
                            Drive.Clear();
                        }
                        else if (Mode == 1)
                        {
                            destination.MaxSpeed = DescendSpeed;
                            var gravdir = Cockpit.GetNaturalGravity();
                            if (gravdir == Vector3D.Zero)
                            {
                                gravdir.Normalize();

                                destination.Position = gravdir * 10 + Cockpit.GetPosition();

                                var flatForward = Cockpit.WorldMatrix.Forward - VectorHelpers.VectorProjection(Cockpit.WorldMatrix.Forward, gravdir);
                                flatForward.Normalize();
                                var flatLeft = Cockpit.WorldMatrix.Left - VectorHelpers.VectorProjection(Cockpit.WorldMatrix.Forward, gravdir);
                                flatLeft.Normalize();

                                destination.Direction = flatForward * TrigHelpers.FastCos(0.02 * RotateSpeed) + flatLeft * TrigHelpers.FastSin(0.02 * RotateSpeed);
                            }
                            else
                            {
                                destination.Position    = lockMatrix.Down * 10 + Cockpit.GetPosition();
                                destination.DirectionUp = lockMatrix.Up;

                                var flatForward = Cockpit.WorldMatrix.Forward - VectorHelpers.VectorProjection(Cockpit.WorldMatrix.Forward, lockMatrix.Down);
                                flatForward.Normalize();
                                var flatLeft = Cockpit.WorldMatrix.Left - VectorHelpers.VectorProjection(Cockpit.WorldMatrix.Forward, lockMatrix.Down);
                                flatLeft.Normalize();

                                destination.Direction = flatForward * TrigHelpers.FastCos(0.02 * RotateSpeed) + flatLeft * TrigHelpers.FastSin(0.02 * RotateSpeed);
                            }
                        }
                        else if (Mode == 2)
                        {
                            destination.MaxSpeed = AscendSpeed;
                            if (Drive.Controller == Cockpit)
                            {
                                var gravdir = Cockpit.GetNaturalGravity();
                                gravdir.Normalize();

                                destination.Position = -gravdir * 10 + Cockpit.GetPosition();
                            }
                            else
                            {
                                destination.Position  = lockMatrix.Down * 10 + Cockpit.GetPosition();
                                destination.Direction = lockMatrix.Forward;
                            }
                        }

                        Drive.Move(destination.Position);
                        Drive.Turn(destination.Direction);
                        Drive.Spin(destination.DirectionUp);
                        Drive.SetMaxSpeed(destination.MaxSpeed);
                    }
                }
                catch (Exception e)
                {
                    Me.GetSurface(0).WriteText(e.Message);
                    Me.GetSurface(0).WriteText("\n", true);
                    Me.GetSurface(0).WriteText(e.StackTrace);
                    Me.GetSurface(0).WriteText("\n", true);
                    Me.GetSurface(0).WriteText(e.ToString());
                }
                var s = subsystemManager.GetStatus();
                if (!string.IsNullOrEmpty(s))
                {
                    Echo(s);
                }
                else
                {
                    Echo(((int)subsystemManager.OutputMode).ToString());
                }
            }
        }
Пример #9
0
            public void Update(MyDetectedEntityInfo target, Vector3D T, Vector3D PointerPos, Vector3D PointerDir)
            {
                if (!Launched)
                {
                    foreach (IMyThrust thr in thrusters)
                    {
                        thr.Enabled = true;
                        thr.ThrustOverridePercentage = 1;
                    }
                    Launched = true;
                }
                else
                {
                    counter++;
                    if (remcon.IsFunctional && (counter > VerticalDelay))
                    {
                        double   currentVelocity = remcon.GetShipVelocities().LinearVelocity.Length();
                        Vector3D targetvector    = new Vector3D();
                        if (LASER_GUIDED)
                        {
                            targetvector = ((remcon.GetPosition() - PointerPos).Dot(PointerDir) + 700) * PointerDir + PointerPos - remcon.GetPosition();
                        }
                        else
                        {
                            targetvector = FindInterceptVector(remcon.GetPosition(),
                                                               currentVelocity * INTERCEPT_COURSE,
                                                               T,
                                                               target.Velocity);
                        }

                        Vector3D trgNorm = Vector3D.Normalize(targetvector);

                        if ((target.Position - remcon.GetPosition()).Length() < WH_ARM_DIST)
                        {
                            if (currentVelocity - MyVelocity < -ACCEL_DET)
                            {
                                foreach (IMyWarhead wh in warheads)
                                {
                                    wh.Detonate();
                                }
                            }

                            MyVelocity = currentVelocity;
                        }

                        Vector3D velNorm          = Vector3D.Normalize(remcon.GetShipVelocities().LinearVelocity);
                        Vector3D CorrectionVector = Math.Max(ReflectK * trgNorm.Dot(velNorm), 1) * trgNorm - velNorm;
                        Vector3D G = remcon.GetNaturalGravity();

                        if (G.LengthSquared() == 0)
                        {
                            CorrectionVector = Math.Max(ReflectK * trgNorm.Dot(velNorm), 1) * trgNorm - velNorm;
                        }
                        else
                        {
                            if (JAVELIN)
                            {
                                //trgNorm = Vector3D.Normalize(Vector3D.Reflect(-G, trgNorm));
                                trgNorm = Vector3D.Normalize(G.Dot(trgNorm) * trgNorm * JAVELIN_CURVE - G);
                            }
                            CorrectionVector = Math.Max(ReflectK * trgNorm.Dot(velNorm), 1) * trgNorm - velNorm;
                            double A = 0;
                            foreach (IMyThrust thr in thrusters)
                            {
                                A += thr.MaxEffectiveThrust;
                            }
                            A /= remcon.CalculateShipMass().PhysicalMass;

                            Vector3D CorrectionNorm = Vector3D.Normalize(CorrectionVector);
                            //CorrectionVector = CorrectionNorm * A - G;
                            Vector3D gr = Vector3D.Reject(remcon.GetNaturalGravity(), CorrectionNorm);
                            CorrectionVector = CorrectionNorm * Math.Sqrt(A * A + gr.LengthSquared()) - gr;
                        }


                        Vector3D Axis = Vector3D.Normalize(CorrectionVector).Cross(remcon.WorldMatrix.Forward);
                        if (Axis.LengthSquared() < 0.1)
                        {
                            Axis += remcon.WorldMatrix.Backward * ROLL;
                        }
                        Axis *= GyroMult;
                        foreach (IMyGyro gyro in gyros)
                        {
                            gyro.Pitch = (float)Axis.Dot(gyro.WorldMatrix.Right);
                            gyro.Yaw   = (float)Axis.Dot(gyro.WorldMatrix.Up);
                            gyro.Roll  = (float)Axis.Dot(gyro.WorldMatrix.Backward);
                        }
                    }
                    else
                    {
                        foreach (IMyGyro gyro in gyros)
                        {
                            gyro.Pitch = 0;
                            gyro.Yaw   = 0;
                            gyro.Roll  = 0;
                        }
                    }
                }
            }
Пример #10
0
        void Main(string arg, UpdateType uType)
        {
            if (uType == UpdateType.Update1)
            {
                Tick++;

                /*   if (radio.Listen())
                 * {
                 *         radar.correctedTargetLocation = radio.targetpos;
                 *         radar.Lock();
                 *         (gts.GetBlockWithName("Cockpit") as IMyCockpit).GetSurface(0).WriteText("radio", false);
                 *         if (radar.Locked)
                 *         {
                 *                 sound.Play();
                 *                 sound.Play();
                 *                 LASER_GUIDED = false;
                 *         }
                 * }*/
                radar.Update();
                lcd.WriteText("LOCKED: " + radar.Locked, false);
                lcd.WriteText("\nTarget: " + radar.CurrentTarget.Name + ", tick: " + radar.LastLockTick, true);
                lcd.WriteText("\nDistance: " + Math.Round(radar.TargetDistance), true);
                lcd.WriteText("\nVelocity: " + Math.Round(radar.CurrentTarget.Velocity.Length()), true);
                if (radar.Locked)
                {
                    arta.AimCannons(radar.correctedTargetLocation, radar.CurrentTarget.Velocity);
                }
                foreach (Torpedo t in Torpedos)
                {
                    if (t.status == 2)
                    {
                        t.Update(radar.CurrentTarget, CENTER_SHOT ? radar.CurrentTarget.Position : radar.T, cockpit.GetPosition(), cockpit.WorldMatrix.Forward);
                    }
                }
                if (WolfPack)
                {
                    if ((Tick - WolfPackStart + 1) % WOLF_PACK_WELDING_TIME == 0)
                    {
                        CleanGarbage();
                        InitializeTorpedos();
                    }
                    if ((radar.Locked) && ((Tick - WolfPackStart - 1) % WOLF_PACK_WELDING_TIME == 0))
                    {
                        foreach (Torpedo t in Torpedos)
                        {
                            Echo("\nTry Launch: ");
                            Echo("\nWPI: " + WolfPackIndex);
                            if (t.status == 1)
                            {
                                WolfPackIndex--;
                                t.Launch(WolfPackDelays[WolfPackIndex]);
                                break;
                            }
                        }
                        if (WolfPackIndex <= 0)
                        {
                            WolfPack = false;
                        }
                    }
                }
                Echo("Runtime: " + Runtime.LastRunTimeMs);
            }
            else
            {
                switch (arg)
                {
                case "Lock":
                    radar.Lock(true, 20000);
                    if (radar.Locked)
                    {
                        arta.AimPoint = radar.CurrentTarget.Position;
                        sound.Play();
                        sound.Play();
                        LASER_GUIDED            = false;
                        Runtime.UpdateFrequency = UpdateFrequency.Update1;
                    }
                    else
                    {
                        lcd.WriteText("NO TARGET", false);
                        Runtime.UpdateFrequency = UpdateFrequency.None;
                    }
                    break;

                case "RadioON":
                    radio.TurnON();
                    Runtime.UpdateFrequency = UpdateFrequency.Update1;
                    break;

                case "Laser":
                    LASER_GUIDED            = true;
                    Runtime.UpdateFrequency = UpdateFrequency.Update1;
                    break;

                case "CenterShot":
                    CENTER_SHOT = !CENTER_SHOT;
                    break;

                case "Init":
                    CleanGarbage();
                    InitializeTorpedos();
                    break;

                case "SpotterCam":
                    SpotterCam = gts.GetBlockWithName("SpotterCam") as IMyCameraBlock;
                    if (SpotterCam != null)
                    {
                        SpotterCam.EnableRaycast = true;
                        Echo("SpotterCam detected");
                    }
                    break;

                case "Spot":
                    if (SpotterCam != null)
                    {
                        Echo("Spotting");
                        MyDetectedEntityInfo spotterInfo = SpotterCam.Raycast(15000, 0, 0);
                        if (!spotterInfo.IsEmpty())
                        {
                            Echo("Target Spotted");
                            radar.correctedTargetLocation = spotterInfo.Position;
                            radar.Lock();
                            if (radar.Locked)
                            {
                                Echo("Target Locked");
                                Runtime.UpdateFrequency = UpdateFrequency.Update1;
                                sound.Play();
                                sound.Stop();
                                sound.Play();
                                sound.Stop();
                                LASER_GUIDED = false;
                            }
                        }
                    }
                    break;

                case "Stop":
                    radar.StopLock();
                    Runtime.UpdateFrequency = UpdateFrequency.None;
                    break;

                case "Launch":
                    if ((radar.Locked) || (LASER_GUIDED))
                    {
                        foreach (Torpedo t in Torpedos)
                        {
                            Echo("\nTry Launch: ");
                            if (t.status == 1)
                            {
                                Echo("1 go");
                                t.Launch();
                                break;
                            }
                        }
                    }
                    else
                    {
                        Echo("No Target Lock");
                    }
                    break;

                case "Test":
                    Echo("\n Test:" + VerticalDelay(5000.0f, 1700.0f, 300));
                    break;

                case "CCT":
                    Runtime.UpdateFrequency = UpdateFrequency.Update1;
                    arta.tensor_calculation = true;
                    arta.tensor_calc_step   = 0;
                    break;

                case "Pack":
                    if (radar.Locked)
                    {
                        WolfPackDelays.Clear();
                        WolfPackDelays.Add(LAUNCH_DELAY);
                        for (int x = 0; x < WOLF_PACK_COUNT - 1; x++)
                        {
                            WolfPackDelays.Add(VerticalDelay((float)radar.TargetDistance, (float)(WOLF_PACK_WELDING_TIME - WOLF_PACK_INTERVAL) * 1.666667f, WolfPackDelays[WolfPackDelays.Count - 1]));
                        }
                        WolfPack      = true;
                        WolfPackStart = Tick;
                        WolfPackIndex = WOLF_PACK_COUNT;
                    }
                    break;

                default:
                    break;
                }
            }
        }
Пример #11
0
        public void GyroControl()
        {
            var vector = cockpit.GetNaturalGravity();

            //var cockpitmatrix = Matrix.CreateFromDir(cockpit.WorldMatrix.Down);
            var cockpitmatrix = MatrixD.CreateWorld(cockpit.GetPosition(), cockpit.WorldMatrix.Forward, cockpit.WorldMatrix.Down);
            //cockpitmatrix.Forward = cockpitmatrix.Down;

            Vector3D direction = Vector3D.TransformNormal(vector, Matrix.Transpose(cockpitmatrix));

            var diffangle = MathHelperD.ToDegrees(Math.Atan2(direction.Z, direction.Y));

            if (diffangle < Math.Abs(oldAngle - diffangle))
            {
            }

            float pitch = 0f;


            WriteText("Gyro diffangle: " + diffangle.ToString() + " -\n");
            WriteText("Gyro pitch1: " + ((pitch1)).ToString() + " -\n");
            WriteText("Gyro pitch60: " + ((pitch60)).ToString() + " -\n");
            WriteText("Gyro pitch: " + ((float)(pitch1 * diffangle)).ToString() + " -\n");


            if (diffangle > 5)
            {
                if (diffangle > 20)
                {
                    pitch = (float)(0.8 * Math.PI);
                }
                else
                {
                    pitch = (float)(pitch1 * 10);
                }

                foreach (var item in gyros)
                {
                    var gyro = item as IMyGyro;
                    gyro.CustomData = gyro.Pitch.ToString() + " ::::" + ((float)2 * Math.PI).ToString() + " cheack " + gyro.Pitch.Equals((float)(2 * Math.PI));
                    if (!gyro.Pitch.Equals(pitch))
                    {
                        gyro.Pitch = pitch;
                    }
                }
            }
            else if (diffangle < -5)
            {
                if (diffangle < -20)
                {
                    pitch = (float)(-0.8 * Math.PI);
                }
                else
                {
                    pitch = (float)(pitch1 * -10);
                }

                foreach (var item in gyros)
                {
                    var gyro = item as IMyGyro;
                    if (!gyro.Pitch.Equals(pitch))
                    {
                        gyro.Pitch = pitch;
                    }
                }
            }
            else
            {
                foreach (var item in gyros)
                {
                    var gyro = item as IMyGyro;
                    gyro.Pitch = (float)(pitch1 * diffangle);
                }
            }


            oldAngle = diffangle;



            //diffangle = MathHelperD.ToDegrees(Math.Atan2(direction.X, direction.Y));

            //float roll = 0f;


            //if (diffangle > 5)
            //{
            //    if (diffangle > 5)
            //    {
            //        roll = (float)(1 * Math.PI);
            //    }


            //    foreach (var item in gyrorolls)
            //    {
            //        var gyro = item as IMyGyro;
            //        gyro.CustomData = gyro.Roll.ToString() + " ::::" + ((float)2 * Math.PI).ToString() + " cheack " + gyro.Roll.Equals((float)(2 * Math.PI));
            //        if (!gyro.Roll.Equals(roll))
            //        {
            //            gyro.Roll = roll;
            //        }
            //    }
            //}
            //else if (diffangle < -5)
            //{
            //    if (diffangle < -5)
            //    {
            //        roll = (float)(-1 * Math.PI);
            //    }


            //    foreach (var item in gyrorolls)
            //    {
            //        var gyro = item as IMyGyro;
            //        if (!gyro.Roll.Equals(roll))
            //        {
            //            gyro.Roll = roll;
            //        }
            //    }
            //}
            //else
            //{
            //    foreach (var item in gyrorolls)
            //    {
            //        var gyro = item as IMyGyro;
            //        if (!gyro.Roll.Equals(0))
            //        {
            //            gyro.Roll = 0;
            //        }
            //    }
            //}
        }
Пример #12
0
            public Vector3D GetShipCoordinates(IMyTerminalBlock block)
            {
                MatrixD cockpitOrient = MatrixD.Invert(MatrixD.CreateFromDir(g2w.getForward(cockpit), g2w.getUp(cockpit)));

                return(Vector3D.TransformNormal(block.GetPosition() - cockpit.GetPosition(), cockpitOrient));
            }
Пример #13
0
        private void Message(byte[] obj)
        {
            if (!MyAPIGateway.Session.IsServer)
            {
                return;
            }
            try
            {
                ShowMessageInGameAndLog("Message", "start.");


                short messageType = BitConverter.ToInt16(obj, 0);
                long  entityId    = BitConverter.ToInt64(obj, 2);

                if (Entity.EntityId != entityId)
                {
                    return;
                }

                if (messageType == MSG_CHANGEOWNERREQ)
                {
                    m_block      = (IMyAdvancedDoor)Entity;
                    m_mycubegrid = m_block.CubeGrid as MyCubeGrid;



                    long playerId = BitConverter.ToInt64(obj, 10);
                    ShowMessageInGameAndLog("Message", "got message from " + playerId.ToString());
                    bool   add      = BitConverter.ToBoolean(obj, 18);
                    string shipname = Encoding.ASCII.GetString(obj, 19, obj.Length - 19);

                    //ShowMessageInGameAndLog("Message", " 1");

                    IMyPlayer           player = GetPlayerById(playerId);
                    List <IMySlimBlock> blocks = new List <IMySlimBlock>();

                    (m_mycubegrid as IMyCubeGrid).GetBlocks(blocks);

                    if (blocks.Count < 40)
                    {
                        return;
                    }
                    Vector3           forvarddirection    = new Vector3(0f, 0f, 0f);
                    IMyCockpit        FoundCockpit        = null;
                    IMyShipMergeBlock FoundMerge          = null;
                    IMyShipMergeBlock FoundBaseMergeBlock = null;
                    IMyProjector      FoundBaseProjector  = null;
                    IMyCargoContainer FoundCargoCont      = null;
                    IMyCargoContainer FoundBaseCargoCont  = null;
                    IMyCargoContainer FoundBaseCargoCont2 = null;
                    IMyParachute      FoundParachute      = null;
                    IMyParachute      FoundParachute2     = null;
                    IMyParachute      FoundParachute3     = null;
                    IMyParachute      FoundParachute4     = null;


                    ShowMessageInGameAndLog("Message", " blocks.Count: " + blocks.Count);



                    foreach (IMySlimBlock blok in blocks)
                    {
                        if (blok.FatBlock == null)
                        {
                            continue;
                        }
                        ShowMessageInGameAndLog("Message", " Block: " + blok.FatBlock.Name + "display nametext: " + blok.FatBlock.DisplayNameText);

                        if (blok.FatBlock.DisplayNameText == "MyMergeBlock")
                        {
                            FoundMerge = (IMyShipMergeBlock)blok.FatBlock;
                            ShowMessageInGameAndLog("Message", " found MyMergeBlock");
                            continue;
                        }

                        if (blok.FatBlock.DisplayNameText == "MyParachute")
                        {
                            FoundParachute = (IMyParachute)blok.FatBlock;
                            ShowMessageInGameAndLog("Message", " found FoundParachute");
                            continue;
                        }

                        if (blok.FatBlock.DisplayNameText == "MyParachute2")
                        {
                            FoundParachute2 = (IMyParachute)blok.FatBlock;
                            ShowMessageInGameAndLog("Message", " found FoundParachute");
                            continue;
                        }
                        if (blok.FatBlock.DisplayNameText == "MyParachute3")
                        {
                            FoundParachute3 = (IMyParachute)blok.FatBlock;
                            ShowMessageInGameAndLog("Message", " found FoundParachute3");
                            continue;
                        }
                        if (blok.FatBlock.DisplayNameText == "MyParachute4")
                        {
                            FoundParachute4 = (IMyParachute)blok.FatBlock;
                            ShowMessageInGameAndLog("Message", " found FoundParachute4");
                            continue;
                        }

                        if (blok.FatBlock.DisplayNameText == "MyCockpit")
                        {
                            FoundCockpit = (IMyCockpit)blok.FatBlock;
                            ShowMessageInGameAndLog("Message", " found MyCockpit");
                            continue;
                        }



                        if (blok.FatBlock.DisplayNameText == "BaseMergeBlock")
                        {
                            FoundBaseMergeBlock = (IMyShipMergeBlock)blok.FatBlock;
                            ShowMessageInGameAndLog("Message", " found BaseMergeBlock");
                            continue;
                        }



                        if (blok.FatBlock.DisplayNameText == "BaseProjector")
                        {
                            FoundBaseProjector = (IMyProjector)blok.FatBlock;
                            ShowMessageInGameAndLog("Message", " found BaseProjector");
                            continue;
                        }

                        if (blok.FatBlock.DisplayNameText == "MyCargo")
                        {
                            FoundCargoCont = (IMyCargoContainer)blok.FatBlock;
                            ShowMessageInGameAndLog("Message", " found MyCargo");
                            continue;
                        }
                    }



                    ShowMessageInGameAndLog("Message", " fFoundCockpit" + (FoundCockpit != null) + (FoundMerge != null) + (FoundCargoCont != null) + (m_block.CubeGrid.CustomName == shipname));

                    if (FoundCargoCont != null && FoundCockpit != null && FoundMerge != null &&
                        FoundParachute != null && FoundParachute2 != null && FoundParachute3 != null && FoundParachute4 != null &&
                        m_block.CubeGrid.CustomName == shipname)
                    {
                        (m_block as IMyAdvancedDoor).OpenDoor();
                        (m_block as IMyAdvancedDoor).CustomData = "";
                        // (m_block as IMyAdvancedDoor).CustomName = "Use me.";
                        // (m_block as IMyAdvancedDoor).ShowOnHUD = true;

                        forvarddirection = FoundMerge.WorldMatrix.Backward;
                        //ShowMessageInGameAndLog("Message", " findedthrust vector");

                        List <IMySlimBlock> blocks2        = new List <IMySlimBlock>();
                        BoundingSphereD     boundingSphere = new BoundingSphereD(FoundMerge.GetPosition(), 300);
                        var entity = MyAPIGateway.Entities.GetEntitiesInSphere(ref boundingSphere);

                        foreach (IMyEntity ent in entity)
                        {
                            if (ent.DisplayName != "GNR_Spawn")
                            {
                                continue;
                            }

                            (ent as IMyCubeGrid).GetBlocks(blocks2);
                            foreach (IMySlimBlock blok in blocks2)
                            {
                                if (blok.FatBlock == null)
                                {
                                    continue;
                                }
                                if (blok.FatBlock as IMyCargoContainer == null)
                                {
                                    continue;
                                }

                                if (blok.FatBlock.DisplayNameText == "BaseCargo")
                                {
                                    FoundBaseCargoCont = (IMyCargoContainer)blok.FatBlock;
                                    ShowMessageInGameAndLog("Message", " found BaseCargo");
                                    continue;
                                }
                                if (blok.FatBlock.DisplayNameText == "BaseCargo2")
                                {
                                    FoundBaseCargoCont2 = (IMyCargoContainer)blok.FatBlock;
                                    ShowMessageInGameAndLog("Message", " found BaseCargo2");
                                    continue;
                                }
                            }
                        }


                        //res for welders start

                        addtoContainer(FoundBaseCargoCont, new SerializableDefinitionId(typeof(MyObjectBuilder_Component), "SteelPlate"), 752);
                        addtoContainer(FoundBaseCargoCont, new SerializableDefinitionId(typeof(MyObjectBuilder_Component), "Construction"), 286);
                        addtoContainer(FoundBaseCargoCont, new SerializableDefinitionId(typeof(MyObjectBuilder_Component), "InteriorPlate"), 113);
                        addtoContainer(FoundBaseCargoCont, new SerializableDefinitionId(typeof(MyObjectBuilder_Component), "MetalGrid"), 8);

                        addtoContainer(FoundBaseCargoCont, new SerializableDefinitionId(typeof(MyObjectBuilder_Component), "Computer"), 144);
                        addtoContainer(FoundBaseCargoCont2, new SerializableDefinitionId(typeof(MyObjectBuilder_Component), "LargeTube"), 6);
                        addtoContainer(FoundBaseCargoCont2, new SerializableDefinitionId(typeof(MyObjectBuilder_Component), "Motor"), 31);
                        addtoContainer(FoundBaseCargoCont2, new SerializableDefinitionId(typeof(MyObjectBuilder_Component), "Display"), 15);

                        addtoContainer(FoundBaseCargoCont2, new SerializableDefinitionId(typeof(MyObjectBuilder_Component), "SmallTube"), 84);
                        addtoContainer(FoundBaseCargoCont2, new SerializableDefinitionId(typeof(MyObjectBuilder_Component), "PowerCell"), 120);

                        //res for welders end



                        ////Started resourses

                        SerializableDefinitionId Item_Hatch = new SerializableDefinitionId(typeof(MyObjectBuilder_Component), "Canvas");
                        ShowMessageInGameAndLog("Message", " before add to conteiner");
                        addtoContainer2(FoundCargoCont, new MyObjectBuilder_AmmoMagazine {
                            SubtypeName = "NATO_5p56x45mm", ProjectilesCount = 50
                        }, 2);

                        addtoContainer2(FoundCargoCont, this.CreateGunContent("AutomaticRifleItem"), 1);
                        addtoContainer2(FoundCargoCont, this.CreateGunContent("WelderItem"), 2);
                        addtoContainer2(FoundCargoCont, this.CreateGunContent("AngleGrinderItem"), 1);
                        addtoContainer2(FoundCargoCont, this.CreateGunContent("HandDrillItem"), 1);

                        //00 addtoContainer2(FoundCargoCont, this.CreateGunContent("HydrogenBottle"), 1);



                        addtoContainer(FoundCargoCont, new SerializableDefinitionId(typeof(MyObjectBuilder_Ore), "Ice"), 1000);
                        addtoContainer(FoundCargoCont, new SerializableDefinitionId(typeof(MyObjectBuilder_Component), "SteelPlate"), 1339);
                        addtoContainer(FoundCargoCont, new SerializableDefinitionId(typeof(MyObjectBuilder_Component), "Construction"), 150);
                        addtoContainer(FoundCargoCont, new SerializableDefinitionId(typeof(MyObjectBuilder_Component), "InteriorPlate"), 240);
                        addtoContainer(FoundCargoCont, new SerializableDefinitionId(typeof(MyObjectBuilder_Component), "MetalGrid"), 73);
                        addtoContainer(FoundCargoCont, new SerializableDefinitionId(typeof(MyObjectBuilder_Component), "RadioCommunication"), 2);
                        addtoContainer(FoundCargoCont, new SerializableDefinitionId(typeof(MyObjectBuilder_Component), "Computer"), 25);
                        addtoContainer(FoundCargoCont, new SerializableDefinitionId(typeof(MyObjectBuilder_Component), "LargeTube"), 35);
                        addtoContainer(FoundCargoCont, new SerializableDefinitionId(typeof(MyObjectBuilder_Component), "Motor"), 28);
                        addtoContainer(FoundCargoCont, new SerializableDefinitionId(typeof(MyObjectBuilder_Component), "Display"), 15);
                        addtoContainer(FoundCargoCont, new SerializableDefinitionId(typeof(MyObjectBuilder_Component), "Medical"), 15);
                        addtoContainer(FoundCargoCont, new SerializableDefinitionId(typeof(MyObjectBuilder_Component), "SmallTube"), 100);
                        addtoContainer(FoundCargoCont, new SerializableDefinitionId(typeof(MyObjectBuilder_Component), "PowerCell"), 150);

                        addtoContainer2(FoundCargoCont, new MyObjectBuilder_GasContainerObject {
                            SubtypeName = "HydrogenBottle", GasLevel = 1
                        }, 1);
                        addtoContainer2(FoundCargoCont, new MyObjectBuilder_GasContainerObject {
                            SubtypeName = "HydrogenBottle", GasLevel = 1
                        }, 1);


                        for (int g = 0; g <= 10; g++)
                        {
                            addtoParachute(FoundParachute, Item_Hatch, 1);
                            addtoParachute(FoundParachute2, Item_Hatch, 1);
                            addtoParachute(FoundParachute3, Item_Hatch, 1);
                            addtoParachute(FoundParachute4, Item_Hatch, 1);
                        }

                        //


                        //FoundBaseMergeBlock.CubeGrid.Physics.Deactivate();
                        ReplaceOwner(playerId);


                        (FoundBaseMergeBlock as MyCubeBlock)?.ChangeOwner(144115188075855876, MyOwnershipShareModeEnum.None); //TODO: change it to nps ID
                        (FoundBaseProjector as MyCubeBlock)?.ChangeOwner(144115188075855876, MyOwnershipShareModeEnum.None);  // not working



                        player.Character.SetPosition(FoundCockpit.GetPosition());
                        FoundCockpit.AttachPilot(player.Character);


                        ShowMessageInGameAndLog("Message", " before impulse");
                        (m_mycubegrid as IMyEntity).Physics.LinearVelocity = forvarddirection * 25;
                        var timer = new Timer(1000);
                        timer.AutoReset = false;
                        timer.Elapsed  += (a, b) => MyAPIGateway.Utilities.InvokeOnGameThread(() => {
                            ShowMessageInGameAndLog("Message", " timer");


                            FoundMerge.Enabled = false;
                            FoundMerge.Physics.Deactivate();



                            var timer2       = new Timer(5000);
                            timer2.AutoReset = false;
                            timer2.Elapsed  += (a1, b1) => MyAPIGateway.Utilities.InvokeOnGameThread(() => {
                                // (m_mycubegrid as IMyEntity).Physics.Activate();
                                FoundMerge.Physics.Activate();
                                (m_mycubegrid as IMyEntity).Physics.LinearVelocity = (m_mycubegrid as IMyEntity).Physics.LinearVelocity + (forvarddirection * 200);

                                ShowMessageInGameAndLog("Message", " timer2");
                                busy = false;

                                Destuctscript();
                            });
                            timer2.Start();
                        });
                        timer.Start();
                    }
                    ShowMessageInGameAndLog("Message", " end");
                    // NeedsUpdate = MyEntityUpdateEnum.NONE;
                    //ShowMessageInGameAndLog("Message", "end.");
                    //Destuctscript();
                }
            }
            catch { ShowMessageInGameAndLog("Message", "EXEPTION! "); }
        }