Ejemplo n.º 1
0
        public static void StopVehiclePed(Ped target)
        {
            if (target == null)
            {
                throw new ArgumentNullException();
            }
            if (!Game.Exists(target))
            {
                throw new NonExistingObjectException();
            }
            if (!target.isInVehicle())
            {
                throw new InvalidOperationException("The target is on foot.");
            }
            if (!Game.Exists(target.CurrentVehicle))
            {
                throw new NonExistingObjectException("The vehicle of the ped not exist.");
            }

            TaskSequence pullOver = new TaskSequence();

            pullOver.AddTask.DriveTo(target.Position.Around(10.5f), 10, true);
            pullOver.AddTask.LeaveVehicle(target.CurrentVehicle, false);
            pullOver.AddTask.HandsUp(1000);
            pullOver.AddTask.RunTo(Game.LocalPlayer.Character.Position, true);
            pullOver.AddTask.StandStill(-1);
            pullOver.Perform(target);
        }
Ejemplo n.º 2
0
 public void PerformSequence(TaskSequence sequence)
 {
     if (sequence != null)
     {
         sequence.Perform(Ped);
     }
 }
Ejemplo n.º 3
0
        /// <summary>
        /// Processes the ability to rearm player when driving an Enforcer.
        /// </summary>
        private void ProcessEnforcerAbility()
        {
            if (LPlayer.LocalPlayer.IsOnDuty && GetEnforcerArmoryState() &&
                (LPlayer.LocalPlayer.Skin.Model == new Model("M_Y_SWAT") | LPlayer.LocalPlayer.Skin.Model == new Model("M_Y_NHELIPILOT")))
            {
                // Fixed the state where you cannot get back into the Enforcer - used the customized method of the original NooseMod
                if (!LPlayer.LocalPlayer.Ped.IsInVehicle() && GetEnforcerArmoryState())
                {
                    Functions.PrintHelp("Press ~KEY_OPEN_TRUNK~ to rearm your weapon or ~INPUT_ENTER~ to get in the Enforcer.");
                    if (Functions.IsKeyDown(SettingsFile.Open("LCPDFR\\LCPDFR.ini").GetValueKey("OpenTrunk", "Keybindings", Keys.E)))
                    {
                        TaskSequence mytask = new TaskSequence();
                        mytask.AddTask.StandStill(-1);
                        mytask.AddTask.PlayAnimation(new AnimationSet("playidles_std"), "gun_cock_weapon", 8f, AnimationFlags.Unknown05);
                        mytask.Perform(LPlayer.LocalPlayer.Ped);
                        Functions.PrintText("Rearming...", 5000);
                        Game.WaitInCurrentScript(3000);

                        Rearm();

                        Game.WaitInCurrentScript(1500);
                        LPlayer.LocalPlayer.Ped.Task.ClearAllImmediately();
                        Game.WaitInCurrentScript(500);
                        Functions.PrintText("Complete", 5000);
                        Function.Call("TRIGGER_MISSION_COMPLETE_AUDIO", new Parameter[] { 27 });
                        Game.WaitInCurrentScript(10000);
                    }
                }
            }
            // If return is active, this method will loop around, making others not be processed
            //else return;
        }
Ejemplo n.º 4
0
        void Time_Tick(object sender, EventArgs e)
        {
            switch (state)
            {
            case ENormalUnitState.Start:
                officerSequence.AddTask.DriveTo(Game.LocalPlayer.Character.Position.Around(10.0f), 25, false);
                officerSequence.AddTask.LeaveVehicle();
                officerSequence.Perform(officer.GTAPed);
                goto case ENormalUnitState.Arrived;

            case ENormalUnitState.Arrived:
                CopCar.SirenActive = false;
                secOfficer.GTAPed.Task.LeaveVehicle();
                officer.Tasks.ClearAll();
                secOfficer.Tasks.ClearAll();
                break;
            }
        }
Ejemplo n.º 5
0
 void Time_Tick(object sender, EventArgs e)
 {
     if (target.Exists() == false || target == null)
     {
         Kill();
     }
     if (Ntarget.IsArrested)
     {
         NGame.PrintSubtitle("Suspect Apprehended!");
         Kill();
     }
     foreach (Ped officer in officers)
     {
         if (officer.isInVehicle() && target.isInVehicle())
         {
             officer.Task.DriveTo(target, 30, false);
         }
         if (officer.isInVehicle() && !target.isInVehicle())
         {
             TaskSequence pursue = new TaskSequence();
             pursue.AddTask.LeaveVehicle(officer.CurrentVehicle, false);
             pursue.AddTask.RunTo(target.Position);
         }
         if (!officer.isInVehicle() && target.isInVehicle())
         {
             officer.Task.EnterVehicle();
         }
         if (!officer.isInVehicle() && !target.isInVehicle())
         {
             TaskSequence pursue = new TaskSequence();
             pursue.AddTask.RunTo(target.Position);
             pursue.AddTask.AimAt(target, -1);
             pursue.Perform(officer);
             if (officer.Position.DistanceTo(target.Position) < 4.0f)
             {
                 officer.Task.ClearAllImmediately();
                 PedOpreation.FootOfficerNPCArrestPed(officer, target);
             }
         }
     }
 }
Ejemplo n.º 6
0
        public static void FootOfficerNPCArrestPed(Ped officer, Ped target)
        {
            if (officer == null || target == null || !Game.Exists(officer) || !Game.Exists(target) || officer.isInVehicle() || target.isInVehicle())
            {
                throw new ArgumentException();
            }
            Vehicle PoliceCar       = World.CreateVehicle(Model.BasicPoliceCarModel, officer.Position.Around(35.0f));
            Ped     TransportDriver = World.CreatePed(Model.BasicCopModel, officer.Position.Around(35.0f));

            TransportDriver.WarpIntoVehicle(PoliceCar, VehicleSeat.Driver);
            TransportDriver.Task.DriveTo(officer, 20, false);
            PoliceCar.SirenActive          = true;
            PoliceCar.isRequiredForMission = true;

            officer.Task.ClearAllImmediately();
            target.Task.ClearAllImmediately();
            officer.Task.AlwaysKeepTask = true;
            target.Task.AlwaysKeepTask  = true;
            TaskSequence officerTask = new TaskSequence();
            TaskSequence targetTask  = new TaskSequence();

            officerTask.AddTask.AimAt(target, 1000);
            officerTask.AddTask.RunTo(target.Position, true);
            officerTask.AddTask.AimAt(target, 15000);
            officerTask.AddTask.EnterVehicle(PoliceCar, VehicleSeat.RightFront);

            targetTask.AddTask.HandsUp(17000);
            targetTask.AddTask.EnterVehicle(PoliceCar, VehicleSeat.RightRear);
            officerTask.Perform(officer);
            targetTask.Perform(target);
            Game.WaitInCurrentScript(18000);
            TransportDriver.Task.CruiseWithVehicle(PoliceCar, 15, true);
            TransportDriver.NoLongerNeeded();
            PoliceCar.isRequiredForMission = false;
            PoliceCar.NoLongerNeeded();
            target.NoLongerNeeded();
            officer.NoLongerNeeded();
        }
Ejemplo n.º 7
0
        /*
         * void ArrestSuspectRange()
         * {
         *  Ped target = World.GetClosestPed(Player.Character.Position,5);
         *  try
         *  {
         *      logger.Log("Starting Arrest");
         *      if (target == null)
         *      {
         *          logger.Log("Arrest Failed: Suspect is null", "Arrest", Logger.LogLevel.Error);
         *          return;
         *      }
         *      if (!Exists(target))
         *      {
         *          logger.Log("Arrest Failed: Suspect does not exist, or not targetting a ped.", "Arrest", Engine.API.Logger.LogLevel.Error);
         *          return;
         *      }
         *      if (target == suspect.GTAPed)
         *      {
         *          logger.Log("Arrest Failed: Suspect aleardy apprehended", "Arrest", Engine.API.Logger.LogLevel.Error);
         *          NGame.PrintSubtitle("~r~This suspect is aleardy apprehended.");
         *      }
         *      if (OnArrest == true)
         *      {
         *          logger.Log("Arrest Failed: Alerady arresting", "Arrest", Engine.API.Logger.LogLevel.Error);
         *          NGame.PrintSubtitle("~r~You cannot arrest multiple suspect at once.");
         *          return;
         *      }
         *      if (OnDuty == false)
         *      {
         *          return;
         *      }
         *  }
         *  catch (Exception ex)
         *  {
         *      NGame.PrintSubtitle(NLanguage.GetLangStr("ArrestException"));
         *      logger.Log("Exception During Arrest Check: \n" + ex.ToString(), "Arrest", Logger.LogLevel.Error);
         *      return;
         *  }
         *  try
         *  {
         *      logger.Log("Arrest Check Passed, starting arrest", "Arrest");
         *      Random random = new Random();
         *      int randomed = random.Next(0, 4);
         *      if (randomed == 1)
         *      {
         *          suspect.GTAPed.Weapons.Glock.Ammo = 5000;
         *          suspect.GTAPed.Task.SwapWeapon(Weapon.Handgun_Glock);
         *          suspect.GTAPed.Task.FightAgainst(Player.Character, -1);
         *      }
         *      suspect = new NPed(target);
         *      OnArrest = true;
         *      if (target.isInVehicle())
         *      {
         *          target.Task.LeaveVehicle();
         *      }
         *  }
         *  catch (Exception ex)
         *  {
         *      NGame.PrintSubtitle(NLanguage.GetLangStr("ArrestException"));
         *      logger.Log("Exception During Arrest Init: \n" + ex.ToString(), "Arrest", Logger.LogLevel.Error);
         *      return;
         *  }
         *  if (Exists(Player.LastVehicle))
         *  {
         *      try
         *      {
         *          AnimationSet anim = new AnimationSet("busted");
         *          AnimationSet anim2 = new AnimationSet("car_bomb");
         *          TaskSequence tasks = new TaskSequence();
         *          if (anim != null && anim2 != null)
         *          {
         *              tasks.AddTask.PlayAnimation(anim, "idle_2_hands_up", 1f);
         *              tasks.AddTask.PlayAnimation(anim2, "set_car_bomb", 1f);
         *              tasks.AddTask.EnterVehicle(World.GetClosestVehicle(Player.Character.Position, 10), VehicleSeat.RightRear);
         *              tasks.Perform(target);
         *              ReadyToProceed = true;
         *              return;
         *          }
         *          else
         *          {
         *              tasks.AddTask.HandsUp(5000);
         *              tasks.AddTask.EnterVehicle(World.GetClosestVehicle(Player.Character.Position, 10), VehicleSeat.RightRear);
         *              tasks.Perform(target);
         *              ReadyToProceed = true;
         *              return;
         *          }
         *      }
         *      catch (Exception ex)
         *      {
         *          NGame.PrintSubtitle("FATAL Error during arrest");
         *          logger.Log("Arrest suspect error: " + Environment.NewLine + ex.Message + ex.ToString(), "Arrest", Logger.LogLevel.Fatal);
         *      }
         *  }
         * }
         */
        #endregion
        void ArrestSuspect()
        {
            Ped target = Player.GetTargetedPed();

            try
            {
                logger.Log("Starting Arrest");
                target = Player.GetTargetedPed();
                if (!OnDuty)
                {
                    return;
                }
                if (target == null)
                {
                    logger.Log("Arrest Failed: Null Argument");
                    return;
                }
            }
            catch (NullReferenceException)
            {
                logger.Log("NullReferenceException during Arrest Check");
                target = World.GetClosestPed(Game.LocalPlayer.Character.Position, 5.0f);
            }
            catch (Exception ex)
            {
                NGame.PrintSubtitle(NLanguage.GetLangStr("ArrestException"));
                logger.Log("Exception During Arrest Check - Checking Null: \n" + ex.ToString(), "Arrest", Logger.LogLevel.Error);
                return;
            }
            try
            {
                if (!Exists(target))
                {
                    logger.Log("Arrest Failed: Suspect does not exist, or not targetting a ped.", "Arrest", Engine.API.Logger.LogLevel.Error);
                    return;
                }
                if (suspect != null && target == suspect.GTAPed)
                {
                    logger.Log("Arrest Failed: Suspect aleardy apprehended", "Arrest", Engine.API.Logger.LogLevel.Error);
                    NGame.PrintSubtitle("~r~This suspect is aleardy apprehended.");
                    return;
                }
            }
            catch (Exception ex)
            {
                NGame.PrintSubtitle(NLanguage.GetLangStr("ArrestException"));
                logger.Log("Exception During Arrest Check - Checking Exists: \n" + ex.ToString(), "Arrest", Logger.LogLevel.Error);
                return;
            }
            try
            {
                if (OnDuty == false)
                {
                    return;
                }
            }
            catch (Exception ex)
            {
                NGame.PrintSubtitle(NLanguage.GetLangStr("ArrestException"));
                logger.Log("Exception During Arrest Check - Checking Status: \n" + ex.ToString(), "Arrest", Logger.LogLevel.Error);
                return;
            }

            Random random   = new Random();
            int    randomed = random.Next(0, 4);

            logger.Log("Arrest Check Passed, starting arrest", "Arrest");



            try
            {
                if (randomed == 1)
                {
                    suspect.GTAPed.Weapons.Glock.Ammo = 5000;
                    suspect.GTAPed.Task.SwapWeapon(Weapon.Handgun_Glock);
                    suspect.GTAPed.Task.FightAgainst(Player.Character, -1);
                    return;
                }
                suspect  = new NPed(target);
                OnArrest = true;
                if (target.isInVehicle())
                {
                    Game.LocalPlayer.Character.SayAmbientSpeech("DRAW_GUN");
                    target.Task.LeaveVehicle();
                }
            }
            catch (Exception ex)
            {
                NGame.PrintSubtitle(NLanguage.GetLangStr("ArrestException"));
                logger.Log("Exception During Arrest Init: \n" + ex.ToString(), "Arrest", Logger.LogLevel.Error);
                return;
            }
            target = Player.GetTargetedPed();

            if (Exists(Player.LastVehicle))
            {
                try
                {
                    Game.LocalPlayer.Character.SayAmbientSpeech("ARREST_PLAYER");
                    AnimationSet anim  = new AnimationSet("busted");
                    AnimationSet anim2 = new AnimationSet("car_bomb");


                    TaskSequence tasks = new TaskSequence();
                    if (anim != null && anim2 != null)
                    {
                        tasks.AddTask.PlayAnimation(anim, "idle_2_hands_up", 1f);
                        tasks.AddTask.PlayAnimation(anim2, "set_car_bomb", 1f);
                        tasks.AddTask.Die();
                        tasks.Perform(target);
                        PlayAnim = true;
                    }
                    else
                    {
                        tasks.AddTask.HandsUp(5000);
                        tasks.AddTask.EnterVehicle(Programming.TransferInfo.CopCar, VehicleSeat.RightRear);
                        tasks.AddTask.Die();
                        tasks.Perform(target);
                    }

                    Model model = Model.BasicPoliceCarModel;
                    NGame.RequestModel(model.Hash);
                    Vector3 vector       = World.GetNextPositionOnStreet(Player.Character.Position.Around(50f));
                    Vehicle vehicle      = World.CreateVehicle(model, vector);
                    Ped     pedInstance1 = World.CreatePed(Model.CurrentCopModel, vector.Around(5.0f));
                    Ped     pedInstance2 = World.CreatePed(Model.CurrentCopModel, vector.Around(5.0f));

                    vehicle.isRequiredForMission      = true;
                    pedInstance1.isRequiredForMission = true;
                    pedInstance2.isRequiredForMission = true;

                    if (vehicle == null || pedInstance1 == null || pedInstance2 == null)
                    {
                        logger.Log("Ped will be killed because prisoner transport is not available");
                        return;
                    }

                    vehicle.SirenActive = true;
                    Blip blip = vehicle.AttachBlip();
                    blip.Color    = BlipColor.Cyan;
                    blip.Friendly = true;
                    blip.Name     = "Prisoner Transport";

                    TaskSequence driverTasks = new TaskSequence();
                    driverTasks.AddTask.DriveTo(target, 30, false);
                    driverTasks.AddTask.LeaveVehicle();
                    driverTasks.AddTask.AimAt(target, -1);
                    driverTasks.Perform(pedInstance1);


                    while (!pedInstance1.isSittingInVehicle(vehicle) && !preformed)
                    {
                        preformed = true;
                        Function.Call("REVIVE_INJURED_PED", target);
                        target.Task.EnterVehicle(vehicle, VehicleSeat.LeftRear);
                    }

                    while (target.isSittingInVehicle(vehicle) && settingInVehicle == false)
                    {
                        settingInVehicle = true;
                        pedInstance1.Task.EnterVehicle(vehicle, VehicleSeat.Driver);
                    }

                    while (target.isSittingInVehicle(vehicle) && settingInVehicle && pedInstance1.isSittingInVehicle(vehicle) && !proceeded)
                    {
                        proceeded           = true;
                        vehicle.SirenActive = false;
                        pedInstance1.Task.CruiseWithVehicle(vehicle, 15, true);
                        vehicle.DoorLock = DoorLock.ImpossibleToOpen;
                        vehicle.NoLongerNeeded();
                        target.NoLongerNeeded();
                        pedInstance1.NoLongerNeeded();
                        pedInstance2.NoLongerNeeded();
                        blip.Delete();
                        vehicle      = null;
                        target       = null;
                        pedInstance1 = null;
                        pedInstance2 = null;
                    }
                }
                catch (Exception ex)
                {
                    NGame.PrintSubtitle("FATAL Error during arrest");
                    logger.Log("Arrest suspect error: " + Environment.NewLine + ex.Message + ex.ToString(), "Arrest", Logger.LogLevel.Fatal);
                }
            }
        }
Ejemplo n.º 8
0
        /// <summary>
        /// Processes difficulty change when inside the Chief of Police's Office Room.
        /// </summary>
        private void ChiefOfPolice_DifficultySelection()
        {
            // If player enters any police station, enters the Chief of Police's office room, and enters a marker, set difficulty
            // Wait 10 seconds in script to prevent stuck at the restart point

            //Blip selectDifficultyBlip = Blip.AddBlip(ChiefOfPoliceRoom);
            bool isHardcoreModeActive = controller.HardcoreModeIsActive();
            int  waitTime             = 10000; // 10 seconds refresh

            if (isHardcoreModeActive == false)
            {
                if (LPlayer.LocalPlayer.IsInPoliceDepartment && LPlayer.LocalPlayer.Ped.Position.DistanceTo(ChiefOfPoliceRoom) < 1f &&
                    (LPlayer.LocalPlayer.Skin.Model == new Model("M_Y_SWAT") | LPlayer.LocalPlayer.Skin.Model == new Model("M_Y_NHELIPILOT")))
                {
                    this.isSelectingDifficulty = true;
                    int[] tempDiff = { 1, 2, 3 };
                    int   keyPress = 0;
                    //AnimationSet difficultyPlayAnim = new AnimationSet("cellphone");
                    Functions.PrintHelp("Use left and right arrows to select a difficulty. When done, press ~KEY_ACCEPT_CALLOUT~ to confirm. Otherwise press ~KEY_ARREST_CALL_TRANSPORTER~ to quit.");
                    TaskSequence mytask = new TaskSequence();
                    mytask.AddTask.StandStill(-1);
                    mytask.AddTask.UseMobilePhone(-1);
                    mytask.Perform(LPlayer.LocalPlayer.Ped);
                    //LPlayer.LocalPlayer.CanControlCharacter = false;
                    while (this.isSelectingDifficulty)
                    {
                        if (Functions.IsKeyDown(Keys.Left))
                        {
                            keyPress--;
                            if (keyPress < 0)
                            {
                                keyPress = 2;
                            }
                        }
                        else if (Functions.IsKeyDown(Keys.Right))
                        {
                            keyPress++;
                            if (keyPress > 2)
                            {
                                keyPress = 0;
                            }
                        }
                        if (keyPress == 0)
                        {
                            Game.DisplayText("Difficulty: Easy", 1000);
                        }
                        else if (keyPress == 1)
                        {
                            Game.DisplayText("Difficulty: Medium", 1000);
                        }
                        else if (keyPress == 2)
                        {
                            Game.DisplayText("Difficulty: Hard", 1000);
                        }

                        if (Functions.IsKeyDown(SettingsFile.Open("LCPDFR\\LCPDFR.ini").GetValueKey("AcceptCallout", "Keybindings", Keys.Y)))
                        {
                            SettingsIni.SetValue("Difficulty", "GlobalSettings", tempDiff[keyPress]);
                            SettingsIni.Save();
                            Functions.PrintText("Difficulty has been set", 5000);
                            LPlayer.LocalPlayer.CanControlCharacter = true;
                            LPlayer.LocalPlayer.Ped.Task.ClearAll();
                            this.isSelectingDifficulty = false;
                            Function.Call("TRIGGER_MISSION_COMPLETE_AUDIO", new Parameter[] { 1 });
                            Game.WaitInCurrentScript(waitTime);
                        }
                        else if (Functions.IsKeyDown(SettingsFile.Open("LCPDFR\\LCPDFR.ini").GetValueKey("ArrestCallTransporter", "Keybindings", Keys.N)))
                        {
                            //LPlayer.LocalPlayer.CanControlCharacter = true;
                            LPlayer.LocalPlayer.Ped.Task.ClearAll();
                            this.isSelectingDifficulty = false;
                            Game.WaitInCurrentScript(waitTime);
                        }
                        Game.WaitInCurrentScript(0); // yield
                    }
                }
            }
        }
Ejemplo n.º 9
0
        //Tow truck tick
        private void TowTruck_Tick(object sender, EventArgs e)
        {
            switch (TTStatus)
            {
            case State.Responding:
                if (GTA.Native.Function.Call <bool>("IS_CAR_STUCK", new GTA.Native.Parameter[] { (Vehicle)truck }) || truck.IsUpsideDown)
                {
                    truck.Position = World.GetNextPositionOnStreet(truck.Position.Around(10f));
                    //truck.PlaceOnNextStreetProperly();
                }
                if (truck.Position.DistanceTo2D(LPlayer.LocalPlayer.Ped.Position) <= 35)
                {
                    towTruckCanCancel = false;
                    truckDriver.Task.DriveTo(towedCar.Position, 8f, false, true);
                    if (truck.Position.DistanceTo2D(towedCar.Position) <= 15f)
                    {
                        truck.AttachBlip().Delete();
                        truck.HazardLightsOn = true;
                        truck.SoundHorn(2000);
                        truck.Extras(5).Enabled = true;
                        truckDriver.Task.LeaveVehicle(truck, true);
                        DelayedCaller.Call(delegate
                        {
                            TTStatus = State.RunToObject;
                        }, this, 2000);
                    }
                }
                break;

            case State.RunToObject:
                if (TTTaskSeq == null)
                {
                    TTTaskSeq = new TaskSequence();
                    TTTaskSeq.AddTask.RunTo(towedCar.Position);
                    TTTaskSeq.AddTask.UseMobilePhone(5000);
                    TTTaskSeq.Perform(truckDriver);
                }
                if (truckDriver.Position.DistanceTo2D(towedCar.Position) <= 5f)
                {
                    TTTaskSeq.Dispose();
                    TTTaskSeq = null;
                    truckDriver.DrawTextAboveHead("Sure, I'll remove this " + towedCar.Name + ", just gonna go ahead and load up", 5000);
                    TTStatus = State.PerformDuty;
                }
                break;

            case State.PerformDuty:
                if (towedCar != null && towedCar.Exists())
                {
                    towedCar.EngineRunning = false;
                    towedCar.CloseAllDoors();

                    float num1 = 0.0f;
                    float num2;
                    float dimension = -towedCar.Model.GetDimensions().Y + towedCar.Model.GetDimensions().Y;
                    if (towedCar.Model.Hash == 1171614426 || towedCar.Model.Hash == -1987130134 || towedCar.Model.Hash == 583100975 || towedCar.Model.Hash == 1638119866)
                    {
                        num2 = towedCar.Model.GetDimensions().Y;
                    }
                    else
                    {
                        num1 = (float)Math.PI;
                        num2 = towedCar.Model.GetDimensions().Y - 0.150000005960464f;
                    }
                    if ((double)dimension < (double)4.34)
                    {
                        num2 = (float)4.34 / 2f;
                    }
                    int num3 = (int)byte.MaxValue;
                    while (num3 > 0)
                    {
                        GTA.Native.Function.Call("SET_VEHICLE_ALPHA", new GTA.Native.Parameter[] { towedCar, num3 });
                        num3 -= 12;
                    }

                    float num4 = 0.0f;
                    for (int i = 0; i < 50; ++i)
                    {
                        Vehicle veh    = towedCar;
                        Vector3 pos    = LPlayer.LocalPlayer.Ped.Position;
                        Vector3 street = World.GetNextPositionOnStreet(((Vector3)pos.Around((float)(180.0 + (double)i * 1.0))));
                        veh.Position = street;
                        towedCar.PlaceOnNextStreetProperly();
                        towedCar.PlaceOnGroundProperly();

                        num4 = (float)towedCar.Position.Z - World.GetGroundZ(towedCar.Position);
                        if (towedCar.Rotation.X < 2.0 && towedCar.Rotation.X > -2.0 && towedCar.Rotation.X != 0.0)
                        {
                            break;
                        }
                    }
                    Vehicle truckv = truck;
                    GTA.Native.Function.Call("ATTACH_CAR_TO_CAR", new GTA.Native.Parameter[] { towedCar, truckv, 0, 0.0f, 1.2 - num2, 0.11 + num4, 0.0f, 0.0f, num1 });
                    //truck.Extras(5).Enabled = false;
                    truckv.Extras(5).Enabled = false;
                    truckv.HazardLightsOn    = false;
                    TTStatus = State.Leave;
                    break;
                }
                break;

            case State.Leave:
                truckDriver.Task.CruiseWithVehicle(truck, 20f, true);
                truckDriver.Task.AlwaysKeepTask = true;
                if (truckDriver.IsInVehicle(truck))
                {
                    TTStatus = State.None;
                    break;
                }
                break;

            case State.None:
                truckDriver.NoLongerNeeded();
                truck.NoLongerNeeded();
                towedCar.NoLongerNeeded();
                towTruckTimer.Stop();
                towTruckCalledOut = false;
                break;
            }
        }
Ejemplo n.º 10
0
        //Paramedic tick
        private void paramedic_Tick(object sender, EventArgs e)
        {
            switch (EMSStatus)
            {
            case State.Responding:
                if (GTA.Native.Function.Call <bool>("IS_CAR_STUCK", new GTA.Native.Parameter[] { (Vehicle)ambulance }) || ambulance.IsUpsideDown)
                {
                    ambulance.Position = World.GetNextPositionOnStreet(ambulance.Position.Around(10f));
                    ambulance.PlaceOnNextStreetProperly();
                }
                if (para1.Position.DistanceTo2D(LPlayer.LocalPlayer.Ped.Position) <= 35f)
                {
                    paramedicCanCancel = false;
                    para1.Task.DriveTo(LPlayer.LocalPlayer.Ped.Position, 10f, false, true);
                    if (para1.Position.DistanceTo2D(LPlayer.LocalPlayer.Ped.Position) <= 15f)
                    {
                        ambulance.AttachBlip().Delete();
                        para1.Task.LeaveVehicle(ambulance, true);

                        Ped[] peds = World.GetAllPeds();
                        foreach (Ped p in peds)
                        {
                            if (p.Exists())
                            {
                                if (!p.isAliveAndWell || p.isDead || p.isInjured || p.Health < main.ParamedicPlayerHealthBelow)
                                {
                                    victims.Add(p);
                                }
                            }
                        }

                        EMSStatus = State.OnScene;
                    }
                }
                break;

            case State.OnScene:
                currentVictim = victims.FirstOrDefault();
                //Functions.PrintText("Victims: " + victims.Count, 4000);
                if (currentVictim == null)
                {
                    //Log.Warning("No elements were found in the array so the script could not continue. The ambulance was set to no longer needed and will return to a normal ped.", this);
                    Functions.PrintHelp("There was no victim in the area, the ambulance will be detached.");
                    para1.Task.CruiseWithVehicle(ambulance, 20f, true);
                    ambulance.SirenActive = false;
                    EMSStatus             = State.Leave;
                    break;
                }
                else
                {
                    EMSStatus = State.RunToObject;
                    break;
                }

            case State.RunToObject:
                if (currentVictim.Exists() == false)
                {
                    Functions.PrintText("There is no injured ped here", 4000);
                    para1.Task.CruiseWithVehicle(ambulance, 20f, true);
                    EMSStatus = State.Leave;
                    break;
                }
                else     //they must exist
                {
                    if (EMSTaskSeq == null)
                    {
                        currentVictim.AttachBlip();
                        EMSTaskSeq = new TaskSequence();
                        EMSTaskSeq.AddTask.RunTo(currentVictim.Position);
                        EMSTaskSeq.Perform(para1);
                    }

                    if (para1.Position.DistanceTo2D(currentVictim.Position) <= 5f)
                    {
                        EMSTaskSeq.Dispose();
                        EMSTaskSeq = null;
                        EMSStatus  = State.PerformDuty;
                        break;
                    }
                    break;
                }

            case State.PerformDuty:
                if (EMSTaskSeq == null)
                {
                    EMSTaskSeq = new TaskSequence();
                    EMSTaskSeq.AddTask.TurnTo(currentVictim);
                    EMSTaskSeq.AddTask.PlayAnimation(medic, "medic_cpr_in", 2f);
                    EMSTaskSeq.AddTask.PlayAnimation(medic, "medic_cpr_loop", 2f);
                    EMSTaskSeq.AddTask.PlayAnimation(medic, "medic_cpr_out", 2f);
                    EMSTaskSeq.Perform(para1);
                }
                if (para1.Animation.isPlaying(medic, "medic_cpr_out"))
                {
                    EMSTaskSeq.Dispose();
                    EMSTaskSeq = null;
                    EMSStatus  = State.EndDuty;
                    break;
                }
                break;

            case State.EndDuty:
                if (currentVictim.isDead)
                {
                    para1.DrawTextAboveHead("They're dead. We'll take him to the morgue for you", 4000);
                }
                else if (currentVictim == LPlayer.LocalPlayer.Ped)
                {
                    para1.DrawTextAboveHead("I've patched you up, you're good to go", 4000);
                }
                else
                {
                    para1.DrawTextAboveHead("They need to go to hospital immediately!", 4000);
                }

                if (currentVictim != null && currentVictim.Exists())
                {
                    if (currentVictim != LPlayer.LocalPlayer.Ped)
                    {
                        currentVictim.AttachBlip().Delete();
                        currentVictim.Delete();
                        currentVictim = null;
                    }
                    else
                    {
                        currentVictim.AttachBlip().Delete();
                    }

                    victims.RemoveAt(0);
                    victims.Sort(delegate(Ped a, Ped b)
                    {
                        if (a == null && b == null)
                        {
                            return(0);
                        }
                        else if (a == null)
                        {
                            return(-1);
                        }
                        else if (b == null)
                        {
                            return(1);
                        }
                        else
                        {
                            return
                            (a.Position.DistanceTo2D(para1.Position)
                             .CompareTo(b.Position.DistanceTo2D(para1.Position)));
                        }
                    });
                }

                if (victims.Count > 0)
                {
                    EMSStatus = State.OnScene;
                    break;
                }
                else
                {
                    para1.Task.CruiseWithVehicle(ambulance, 20f, true);
                    para1.Task.AlwaysKeepTask = true;
                    EMSStatus = State.Leave;
                    break;
                }

            case State.Leave:
                para1.NoLongerNeeded();
                ambulance.NoLongerNeeded();
                paramedicCalledOut = false;
                EMSStatus          = State.None;
                break;

            case State.None:
                paramedicTimer.Stop();
                break;
            }
        }