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); }
public void PerformSequence(TaskSequence sequence) { if (sequence != null) { sequence.Perform(Ped); } }
/// <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; }
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; } }
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); } } } }
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(); }
/* * 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); } } }
/// <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 } } } }
//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; } }
//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; } }