Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Drawing;
- using System.Globalization;
- using System.IO;
- using System.Linq;
- using LSPD_First_Response.Mod.API;
- using Rage;
- using Rage.Native;
- namespace RAGEComputer
- {
- public class PortedAI : Plugin
- {
- public static float CopMaxRelativeSpeed = 1;
- uint ReferenceTime = Game.GameTime;
- public static bool PreventSuspectRammings = true;
- public static bool AllowTakePrimary = true;
- public static bool Debug = true;
- public static string ScriptVer = "v1.5";
- public static bool CopsYieldToPlayer = true;
- public static bool HelpCopsManageTraffic = true;
- uint GameRefTime = Game.GameTime;
- public List<PursuitHandler> Pursuits { get; set; }
- public static List<Vehicle> CopVehiclesInThisPursuit { get; set; }
- public override void Initialize()
- {
- Game.FrameRender += FrameRender;
- Pursuits = new List<PursuitHandler>();
- CopVehiclesInThisPursuit = new List<Vehicle>();
- Rage.Game.Console.Print("SAFER CHASES "+ ScriptVer + " LOADED");
- }
- private void FrameRender(object sender, GraphicsEventArgs graphicsEventArgs)
- {
- LookForFleeingVehicles();
- if(Game.GameTime > GameRefTime + 1000)
- {
- GameRefTime = Game.GameTime;
- UpdateCopVehicleList();
- }
- lock (Pursuits)
- foreach (var pursuit in Pursuits)
- {
- pursuit.Update();
- }
- }
- public static void UpdateCopVehicleList()
- {
- CopVehiclesInThisPursuit.Clear();
- foreach (Vehicle veh in World.GetAllVehicles())
- {
- if (veh.IsPoliceVehicle && CanWeUse(veh.GetPedOnSeat(-1))&& veh.GetPedOnSeat(-1).Handle != Game.LocalPlayer.Character.Handle)
- {
- CopVehiclesInThisPursuit.Add(veh);
- }
- }
- }
- public static Vehicle GetLastVehicle(Ped RecieveOrder)
- {
- if (CanWeUse(RecieveOrder.CurrentVehicle)) return RecieveOrder.CurrentVehicle; else if (CanWeUse(RecieveOrder.LastVehicle)) return RecieveOrder.LastVehicle; else return null;
- }
- public static bool CanWeUse(Entity entity)
- {
- return entity != null && entity.Exists() && entity.IsValid();
- }
- private void LoadSettings()
- {
- var s = IniSettings.Read("Plugins\\LSPDFR\\SaferChases.ini");
- CopMaxRelativeSpeed = s.CopMaxRelativeSpeed;
- PreventSuspectRammings = s.PreventSuspectRammings;
- AllowTakePrimary = s.AllowTakePrimary;
- Debug = s.Debug;
- CopsYieldToPlayer = s.CopsYieldToPlayer;
- HelpCopsManageTraffic = s.HelpCopsManageTraffic;
- }
- public static bool IsPedInList(Ped candidate, List<Ped> list)
- {
- return list.Any(p => p.Handle == candidate.Handle);
- }
- private LHandle _currentPursuit;
- private void LookForFleeingVehicles()
- {
- var pursuit = LSPD_First_Response.Mod.API.Functions.GetActivePursuit();
- if (_currentPursuit == null && pursuit != null)
- {
- LoadSettings();
- if (Debug) Game.DisplayNotification("Safer Chases ~g~loaded~w~ for this pursuit.~n~");
- _currentPursuit = pursuit;
- foreach (
- var veh in
- Functions.GetPursuitPeds(pursuit)
- .Where(ped => ped.IsInAnyVehicle(false) && CanWeUse(GetLastVehicle(ped)))
- .Select(GetLastVehicle)
- .Distinct())
- {
- Pursuits.Add(new PursuitHandler(pursuit, veh));
- }
- }
- else if (_currentPursuit != null && pursuit == null)
- {
- lock (Pursuits) Pursuits.Clear();
- if (PortedAI.Debug) Game.DisplayNotification("Safer chases ~r~unloaded~w~.~n~");
- _currentPursuit = null;
- }
- }
- public static bool IsThisEntityAheadThatEntity(Entity ent1, Entity ent2)
- {
- Vector3 pos = ent1.Position;
- return NativeFunction.CallByName<Vector3>("GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS", ent2, pos.X, pos.Y, pos.Z).Y > 0f;
- }
- public static bool isCopInRange(Vector3 Location, float Range)
- {
- return NativeFunction.CallByName<bool>("IS_COP_PED_IN_AREA_3D", Location.X - Range, Location.Y - Range, Location.Z - Range, Location.X + Range, Location.Y + Range, Location.Z + Range);
- }
- public override void Finally()
- {
- }
- }
- public class PursuitHandler
- {
- public PursuitHandler(LHandle pursuit, Vehicle puruitee)
- {
- PursuitParent = pursuit;
- Pursuitee = puruitee;
- _referenceTime = Game.GameTime;
- CanCopsRamSuspect = false;
- }
- public LHandle PursuitParent { get; set; }
- public Vehicle Pursuitee { get; set; }
- public bool IsPlayerPrimary { get; set; }
- public bool CanCopsRamSuspect { get; set; }
- private uint _referenceTime;
- private Dictionary<Entity, SizedQueue<string>> _debugMessages { get; set; }
- private void HandleCopCarefulBehavior()
- {
- int MaxVehicles =0;
- Vehicle playerveh = PortedAI.GetLastVehicle(Game.LocalPlayer.Character);
- foreach (Vehicle veh in PortedAI.CopVehiclesInThisPursuit)
- {
- if (PortedAI.CanWeUse(veh) && veh.Speed > 1f && veh.IsOnAllWheels)
- {
- if (PortedAI.CanWeUse(playerveh) && playerveh.Handle != veh.Handle)
- {
- //// YIELD TO PLAYER ////
- if (PortedAI.CopsYieldToPlayer && PortedAI.CanWeUse(playerveh) && Game.LocalPlayer.Character.IsInAnyPoliceVehicle && Game.IsControlPressed(2, GameControl.VehicleHorn) && (Game.LocalPlayer.Character.Position - veh.Position).Length() < 30f &&
- NativeFunction.CallByName<Vector3>("GET_ENTITY_SPEED_VECTOR", veh, true).Y > 3f &&
- playerveh.Speed < NativeFunction.CallByName<Vector3>("GET_ENTITY_SPEED_VECTOR", veh, true).Y + 10f)
- {
- NativeFunction.CallByName<int>("APPLY_FORCE_TO_ENTITY", veh, 3, 0f, -0.6f, 0f, 0f, 0f, -0.3f, 0, true, true, true, true, true);
- if (PortedAI.Debug) Game.DisplayHelp(veh.Model.Name + " YIELDS TO PLAYER", 3000);
- }
- //// ANTI CRASH INTO PLAYER ////
- if (veh.DistanceTo(Game.LocalPlayer.Character.Position + Game.LocalPlayer.Character.ForwardVector * -8f) < 6f && NativeFunction.CallByName<Vector3>("GET_ENTITY_SPEED_VECTOR", veh, true).Y + 2f > playerveh.Speed)
- {
- NativeFunction.CallByName<int>("APPLY_FORCE_TO_ENTITY", veh, 3, 0f, -0.4f, 0f, 0f, 0f, -0.2f, 0, true, true, true, true, true);
- if (PortedAI.Debug) Game.DisplayHelp("COP BEHIND TOO CLOSE", 3000);
- }
- if (NativeFunction.CallByName<Vector3>("GET_ENTITY_SPEED_VECTOR", veh, true).Y > 1f && PortedAI.IsThisEntityAheadThatEntity(Game.LocalPlayer.Character, veh) && (Game.LocalPlayer.Character.Position - veh.Position).Length() < 30f)
- {
- if (Game.LocalPlayer.Character.IsInAnyVehicle(true))
- {
- if (NativeFunction.CallByName<Vector3>("GET_ENTITY_SPEED_VECTOR", veh, true).Y > 10f && playerveh.Speed < NativeFunction.CallByName<Vector3>("GET_ENTITY_SPEED_VECTOR", veh, true).Y - PortedAI.CopMaxRelativeSpeed)
- {
- NativeFunction.CallByName<int>("APPLY_FORCE_TO_ENTITY", veh, 3, 0f, -0.6f, 0f, 0f, 0f, -0.2f, 0, true, true, true, true, true);
- if (PortedAI.Debug) Game.DisplayHelp(veh.Model.Name + " CAREFUL WITH DRIVING PLAYER", 3000);
- }
- }
- else
- {
- if (NativeFunction.CallByName<Vector3>("GET_ENTITY_SPEED_VECTOR", veh, true).Y > 10f)
- {
- NativeFunction.CallByName<int>("APPLY_FORCE_TO_ENTITY", veh, 3, 0f, -0.8f, 0f, 0f, 0f, -0.2f, 0, true, true, true, true, true);
- if (PortedAI.Debug) Game.DisplayHelp(veh.Model.Name + " CAREFUL WITH STANDING PLAYER", 3000);
- }
- }
- }
- //// ANTI CRASH INTO TRAFFIC ////
- if (MaxVehicles < 5 && PortedAI.HelpCopsManageTraffic && veh.DistanceTo(Game.LocalPlayer.Character.Position) < 50f)
- {
- MaxVehicles++;
- foreach (Entity saferentity in World.GetAllEntities())
- {//!Functions.GetPursuitPeds(Functions.GetActivePursuit()).Contains(saferentity) && saferentity.Handle != Game.LocalPlayer.Character.Handle && saferentity.Handle != playerveh.Handle && saferentity.Speed > 1f && saferentity.Position.DistanceTo(veh.Position + veh.ForwardVector * 10f) < 10f &&
- if (PortedAI.CanWeUse(saferentity) && saferentity.Speed > 1f && PortedAI.IsThisEntityAheadThatEntity(saferentity, veh) && saferentity.Position.DistanceTo(veh.Position + veh.ForwardVector * 10f) < 10f)
- {
- if (saferentity.Speed > 5f && saferentity.Speed < NativeFunction.CallByName<Vector3>("GET_ENTITY_SPEED_VECTOR", veh, true).Y - 10f)
- {
- NativeFunction.CallByName<int>("APPLY_FORCE_TO_ENTITY", veh, 3, 0f, -0.6f, 0f, 0f, 0f, -0.3f, 0, true, true, true, true, true);
- if (PortedAI.Debug) Game.DisplayHelp(veh.Model.Name + " CAREFUL WITH FAST ENTITY", 3000);
- break;
- }
- if (saferentity.Speed < 5f && NativeFunction.CallByName<Vector3>("GET_ENTITY_SPEED_VECTOR", veh, true).Y > 10f)
- {
- NativeFunction.CallByName<int>("APPLY_FORCE_TO_ENTITY", veh, 3, 0f, -0.6f, 0f, 0f, 0f, -0.3f, 0, true, true, true, true, true);
- if (PortedAI.Debug) Game.DisplayHelp(veh.Model.Name + " CAREFUL WITH SLOW ENTITY", 3000);
- break;
- }
- }
- }
- }
- if (PortedAI.CanWeUse(Pursuitee) && Pursuitee.Handle != veh.Handle)
- {
- //// ANTI CRASH INTO SUSPECT ////
- if (!CanCopsRamSuspect && PortedAI.PreventSuspectRammings && (veh.Position - Pursuitee.Position).Length() < 20f && Pursuitee.Speed > 1f &&
- PortedAI.IsThisEntityAheadThatEntity(Pursuitee, veh) && Pursuitee.Speed < NativeFunction.CallByName<Vector3>("GET_ENTITY_SPEED_VECTOR", veh, true).Y)
- {
- NativeFunction.CallByName<int>("APPLY_FORCE_TO_ENTITY", veh, 3, 0f, -0.6f, 0f, 0f, 0f, -0.3f, 0, true, true, true, true, true);
- if (PortedAI.Debug) Game.DisplayHelp(veh.Model.Name + " CAREFUL WITH " + Pursuitee.Model.Name, 3000);
- }
- //// ALLOW PLAYER TAKE PRIMARY ////
- if (PortedAI.AllowTakePrimary && PortedAI.CanWeUse(playerveh) && playerveh.Speed > 20f && Pursuitee.Speed > 15f &&
- (Game.LocalPlayer.Character.Position - Pursuitee.Position).Length() < 30f && (Pursuitee.Position - veh.Position).Length() < 30f &&
- PortedAI.IsThisEntityAheadThatEntity(playerveh, veh) && PortedAI.IsThisEntityAheadThatEntity(Pursuitee, playerveh) && playerveh.Speed < NativeFunction.CallByName<Vector3>("GET_ENTITY_SPEED_VECTOR", veh, true).Y + 2f)
- {
- NativeFunction.CallByName<int>("APPLY_FORCE_TO_ENTITY", veh, 3, 0f, -0.6f, 0f, 0f, 0f, -0.3f, 0, true, true, true, true, true);
- if (PortedAI.Debug) Game.DisplayHelp(veh.Model.Name + " ALLOWS PRIMARY", 3000);
- }
- }
- else if (PortedAI.Debug) Game.DisplayHelp("NO PURSUITEE VEH FOUND", 3000);
- } else if (PortedAI.Debug) Game.DisplayHelp("NO PLAYER VEH FOUND", 3000);
- }
- }
- }
- public void Update()
- {
- HandleCopCarefulBehavior();
- if(CanCopsRamSuspect && Game.IsControlJustPressed(2,GameControl.VehicleHorn) && Pursuitee.DistanceTo(Game.LocalPlayer.Character.Position) < 50f)
- {
- CanCopsRamSuspect = false;
- Game.DisplayNotification("web_lossantospolicedept", "web_lossantospolicedept", "LSPD First Response", "~b~Safer Chases " + PortedAI.ScriptVer, "Other units are ~o~prohibited~w~ form PITting the fleeing vehicle.");
- }
- if (Game.GameTime > _referenceTime + 2000)
- {
- _referenceTime = Game.GameTime;
- if (!CanCopsRamSuspect && PortedAI.CanWeUse(PortedAI.GetLastVehicle(Game.LocalPlayer.Character)) && PortedAI.CanWeUse(Pursuitee) && Pursuitee.Speed > 10f && NativeFunction.CallByName<bool>("HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY", Pursuitee, PortedAI.GetLastVehicle(Game.LocalPlayer.Character)))
- {
- CanCopsRamSuspect = true;
- Game.DisplayNotification("web_lossantospolicedept", "web_lossantospolicedept", "LSPD First Response", "~b~Safer Chases "+PortedAI.ScriptVer, "Other units are now allowed to ~y~PIT~w~ the fleeing vehicle.");
- NativeFunction.CallByName<int>("CLEAR_ENTITY_LAST_DAMAGE_ENTITY", Pursuitee);
- }
- if (PortedAI.AllowTakePrimary && PortedAI.CanWeUse(Pursuitee) && Pursuitee.Speed > 1f)
- {
- if (IsPlayerPrimary && (Game.LocalPlayer.Character.Position - Pursuitee.Position).Length() > 30f)
- {
- IsPlayerPrimary = false;
- }
- if (!IsPlayerPrimary && (Game.LocalPlayer.Character.Position - Pursuitee.Position).Length() < 30f)
- {
- IsPlayerPrimary = true;
- }
- }
- }
- }
- }
- public class IniSettings
- {
- public IniSettings()
- {
- CopMaxRelativeSpeed = 20f;
- PreventSuspectRammings = true;
- AllowTakePrimary = true;
- Debug = false;
- CopsYieldToPlayer = true;
- HelpCopsManageTraffic = false;
- }
- public float CopMaxRelativeSpeed { get; set; }
- public bool AllowTakePrimary { get; set; }
- public bool PreventSuspectRammings { get; set; }
- public bool Debug { get; set; }
- public bool CopsYieldToPlayer { get; set; }
- public bool HelpCopsManageTraffic { get; set; }
- public static IniSettings Read(string path)
- {
- var output = new IniSettings();
- var tmpDict = new Dictionary<string, string>();
- foreach (var line in File.ReadAllLines(path))
- {
- if (line.StartsWith("[") || line.StartsWith(";") || string.IsNullOrWhiteSpace(line)) continue;
- var split = line.Split('=');
- if (!tmpDict.ContainsKey(split[0]))
- tmpDict.Add(split[0], split[1]);
- }
- output.DecodeValueDict(tmpDict);
- return output;
- }
- public void DecodeValueDict(Dictionary<string, string> dict)
- {
- foreach (var pair in dict)
- {
- switch (pair.Key)
- {
- case "CopMaxRelativeSpeed":
- CopMaxRelativeSpeed = float.Parse(pair.Value, CultureInfo.InvariantCulture) / 3.6f;
- break;
- case "AllowTakePrimary":
- AllowTakePrimary = bool.Parse(pair.Value);
- break;
- case "PreventSuspectRammings":
- PreventSuspectRammings = bool.Parse(pair.Value);
- break;
- case "Debug":
- Debug = bool.Parse(pair.Value);
- break;
- case "CopsYieldToPlayer":
- CopsYieldToPlayer = bool.Parse(pair.Value);
- break;
- case "HelpCopsManageTraffic":
- HelpCopsManageTraffic = bool.Parse(pair.Value);
- break;
- }
- }
- }
- }
- public class SizedQueue<T> : List<T>
- {
- public int Size { get; set; }
- public SizedQueue(int size)
- {
- Size = size;
- }
- public new void Add(T item)
- {
- if (Count > 0 && base[base.Count - 1].Equals(item)) return;
- base.Add(item);
- if (base.Count > Size)
- base.RemoveAt(0);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement