Skip to content
View in the app

A better way to browse. Learn more.

LCPDFR.com

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Heli Assistance - Observer Mode, Customizable Searchlight, More Features 2.4.2

(33 reviews)

7 Screenshots

This mod simulates the flight patterns of Southern California (more specifically, Los Angeles area) law enforcement air support helicopters. That is, they will orbit around a target entity or position instead of just hovering above. A spotlight will track the subject when night-time. You may also call for a backup heli anytime while on-duty.

 

 

 

A Must-Have For Realistic Gameplay!

 

 

 

 

Make sure to put HeliAssistance.dll and HeliAssistance.ini and HeliAssistance.pdb into \Plugins\LSPDFR folder.

Make sure you have the latest RageNativeUI installed. And make sure you have Spotlight installed.

 

API for Developers (for usage with v2.4.2)

Spoiler
namespace HeliAssistanceAPI
{
	using LSPD_First_Response.Mod.API;
	using Rage;
    using Functions = HeliAssistance.API.Functions;

    internal static class HeliAssistanceWrapper
	{
		private const string DllPath = @"Plugins\LSPDFR\HeliAssistance.dll";
		private static readonly bool DllExists = System.IO.File.Exists(DllPath);

		/// <summary>
		/// One more wrapper to prevent <see cref="CanBeUsed"/> from trying to load the HeliAssistance assembly.
		/// </summary>
		private static class IsLoadedWrapper
		{
			public static bool IsLoaded => Functions.IsLoaded;
		}

		/// <summary>
		/// Checks if the plugin is loaded within LSPDFR (i.e. LSPDFR is loaded and the player is on duty).
		/// </summary>
		public static bool CanBeUsed => DllExists ? IsLoadedWrapper.IsLoaded : false;

		/// <summary>
		/// Determines whether the menu can be toggled by the player. If set to false, the menu will be closed if it is visible.
		/// </summary>
		public static bool CanPlayerUseMenu
        {
			get => Functions.CanPlayerUseMenu;
			set => Functions.CanPlayerUseMenu = value;
        }

		/// <summary>
		/// Requests the air unit to be created and respond to the <see cref="Entity"/> target. If the air unit is already active and/or alive, then it will merely have the air unit respond to the target.
		/// </summary>
		public static void RequestAirUnit(Entity target) => Functions.RequestAirUnit(target);

		/// <summary>
		/// Requests the air unit to be created and respond to the <see cref="Vector3"/> target. If the air unit is already active and/or alive, then it will merely have the air unit respond to the target.
		/// </summary>
		public static void RequestAirUnit(Vector3 target) => Functions.RequestAirUnit(target);

		/// <summary>
		/// Dismisses the air unit from any active player-requested task.
		/// </summary>
		public static void DismissAirUnit() => Functions.DismissAirUnit();

		/// <summary>
		/// Attaches the active air unit to the <see cref="LHandle"/> pursuit.
		/// </summary>
		public static void AssignAirUnitToPursuit(LHandle pursuit) => Functions.AssignAirUnitToPursuit(pursuit);
		
		/// <summary>
		/// Removes the air unit from the <see cref="LHandle"/> pursuit.
		/// </summary>
		public static void RemoveAirUnitFromPursuit() => Functions.RemoveAirUnitFromPursuit();

		/// <summary>
		/// Checks if the air unit exists, regardless of its current assigned task.
		/// </summary>
		public static bool IsAirUnitAlive() => Functions.IsAirUnitAlive();

		[System.Obsolete("Use IsAirUnitInService()")]
		public static bool IsAirUnitActive() => Functions.IsAirUnitActive();

		/// <summary>
		/// Checks if the air unit exists and is currently assigned to a player-assigned task.
		/// </summary>
		public static bool IsAirUnitInService() => Functions.IsAirUnitInService();

		/// <summary>
		/// Assigns a new <see cref="Entity"/> target to the air unit, if it is active in service.
		/// </summary>
		public static void UpdateTarget(Entity target) => Functions.UpdateTarget(target);

		/// <summary>
		/// Assigns a new <see cref="Vector3"/> target to the air unit, if it is active in service.
		/// </summary>
		public static void UpdateTarget(Vector3 target) => Functions.UpdateTarget(target);

		/// <summary>
		/// Updates the air unit's flight characteristics. Pass a value <= 0 to a parameter to restore the default value of the respective flight behavior.
		/// </summary>
		/// <param name="flightAltitude">The altitude the air unit will fly when responding or following a target.</param>
		/// <param name="flightSpeed">The speed the air unit fly when responding or following a target. Value should be in GTA's default measurement, m/s.</param>
		/// <param name="orbitRadius">The radius the air unit will orbit.</param>
		/// <param name="orbitSpeed">The speed the air unit will orbit. Value should be in GTA's default measurement, m/s.</param>
		public static void UpdateFlightCharacteristics(float flightAltitude = -1f, float flightSpeed = -1f, float orbitRadius = -1f, float orbitSpeed = -1f) => Functions.UpdateFlightCharacteristics(flightAltitude, flightSpeed, orbitRadius, orbitSpeed);

		/// <summary>
		/// Sets the on-scene duration to the given <paramref name="duration"/>. If the air unit is already in the on-scene task, then it will extend the duration to the given <paramref name="duration"/>.
		/// </summary>
		/// <param name="duration">In milliseconds</param>
		public static void UpdateOnsceneDuration(int duration) => Functions.UpdateOnsceneDuration(duration);

		/// <summary>
		/// Checks if the target of the air unit is the given <see cref="Entity"/>. <br/>Note: Make sure to call <see cref="IsAirUnitInService"/> to verify the air unit is active before calling this.
		/// </summary>
		public static bool IsCurrentTarget(Entity pedToCheck) => Functions.IsCurrentTarget(pedToCheck);

		/// <summary>
		/// Checks if the target of the air unit is the given <see cref="Vector3"/>. <br/>Note: Make sure to call <see cref="IsAirUnitInService"/> to verify the air unit is active before calling this.
		/// </summary>
		public static bool IsCurrentTarget(Vector3 posToCheck) => Functions.IsCurrentTarget(posToCheck);

		/// <summary>
		/// Retrieves the <see cref="Entity"/> the air unit is targeting. <br/>Note: Make sure to call <see cref="IsAirUnitInService"/> to verify the air unit is active before calling this.
		/// </summary>
		public static Entity GetCurrentTarget() => Functions.GetCurrentTarget();

		/// <summary>
		/// Retrieves the <see cref="Vector3"/> the air unit is targeting. <br/>Note: Make sure to call <see cref="IsAirUnitInService"/> to verify the air unit is active before calling this.
		/// </summary>
		public static Vector3 GetCurrentTargetPosition() => Functions.GetCurrentTargetPosition();

		/// <summary>
		/// Checks if the air unit is active, but not assigned to the player's request. In other words, is the air unit currently roaming around.
		/// </summary>
		/// <returns></returns>
		public static bool IsCurrentlyRoaming() => Functions.IsCurrentlyRoaming();
	}
}

 

Take a look at the INI at least once to make sure you are satisfied with the settings. 

 

Special Thanks:

@alexguirre

@DiamondTKG

@NorthKing

@Echooo

LSPDFR Developer Discord

Edited by OJdoesIt
Update

What's New in Version 2.4.2

Released

- Added feature to modify the jerk rate and distance (shakiness) of the searchlight
- Improved the accuracy of ETA
- Updated API to allow an Entity object to be targeted instead of just a Ped object
- Made minor updates to the API methods


Short Description

helicopter helicopter helicopter helicopter

User Feedback

Recommended Comments

JBin818

Members

What's the key to open menu in-game?  I don't see it in the readme or .ini. 

Qertyipl

Members

The menu isn't opening for some reason. I have Ragenative UI installed.

utechy

Members

Hi great mod the only thing is rather than go for the red blip and focus the light on them the heli is lighting up my pursuit vehicle? Any suggestions?

Reasonable

Members

How do I make the helicopter actually go faster? I'm editing the speed in the ini and it's doing nothing.

Echooo

Members

Is it possible you could maybe add more customization for the spotlight? Like for example the size of the spotlight on the ground, as well as edit the intensity of volumetric lighting. It would also be nice to be able to edit the exact color of the spotlight, like how in the spotlight plugin (the one for cars) you can completely customize the color of the spotlight by editing the R G and B numbers/values. 

Legiaron

Members

Cool Plugin sadly it Crashes LSPDFR most of the time when you Agree to Air Backup... 

 

[7/17/2022 6:16:03 PM.222] LSPD First Response: [HeliAssist] Create air unit from existing police helicopter
[7/17/2022 6:16:03 PM.318] LSPD First Response: 
[7/17/2022 6:16:03 PM.318] LSPD First Response: ==============================
[7/17/2022 6:16:03 PM.318] LSPD First Response: UNHANDLED EXCEPTION DURING GAME FIBER TICK
[7/17/2022 6:16:03 PM.318] LSPD First Response: ------------------------------
[7/17/2022 6:16:03 PM.318] LSPD First Response: Origin: Game fiber "HeliAssist".
[7/17/2022 6:16:03 PM.318] LSPD First Response: ------------------------------
[7/17/2022 6:16:03 PM.318] LSPD First Response: Exception type: System.IO.FileNotFoundException
[7/17/2022 6:16:03 PM.318] LSPD First Response: Exception message: Die Datei oder Assembly "Spotlight, Version=1.4.0.0, Culture=neutral, PublicKeyToken=null" oder eine Abhängigkeit davon wurde nicht gefunden. Das System kann die angegebene Datei nicht finden.
[7/17/2022 6:16:03 PM.318] LSPD First Response: ------------------------------
[7/17/2022 6:16:03 PM.318] LSPD First Response: Inner exceptions:
[7/17/2022 6:16:03 PM.318] LSPD First Response: ------------------------------
[7/17/2022 6:16:03 PM.318] LSPD First Response: Stack trace:
[7/17/2022 6:16:03 PM.318] LSPD First Response: at HeliUnit.IsSearchlightInitialized()
[7/17/2022 6:16:03 PM.318] at HeliAssistance.Main.ProcessSearchlightStuff() in C:\Users\OJ\Documents\Visual Studio 2022\source\repos\HeliAssistance\Main.cs:line 639
[7/17/2022 6:16:03 PM.318] at HeliAssistance.Main.OnTick() in C:\Users\OJ\Documents\Visual Studio 2022\source\repos\HeliAssistance\Main.cs:line 270
[7/17/2022 6:16:03 PM.318] at Rage.GameFiber.Main()
[7/17/2022 6:16:03 PM.318] LSPD First Response: ==============================

 

OJdoesIt

Members Author

24 minutes ago, Legiaron said:

Cool Plugin sadly it Crashes LSPDFR most of the time when you Agree to Air Backup... 

 

[7/17/2022 6:16:03 PM.222] LSPD First Response: [HeliAssist] Create air unit from existing police helicopter
[7/17/2022 6:16:03 PM.318] LSPD First Response: 
[7/17/2022 6:16:03 PM.318] LSPD First Response: ==============================
[7/17/2022 6:16:03 PM.318] LSPD First Response: UNHANDLED EXCEPTION DURING GAME FIBER TICK
[7/17/2022 6:16:03 PM.318] LSPD First Response: ------------------------------
[7/17/2022 6:16:03 PM.318] LSPD First Response: Origin: Game fiber "HeliAssist".
[7/17/2022 6:16:03 PM.318] LSPD First Response: ------------------------------
[7/17/2022 6:16:03 PM.318] LSPD First Response: Exception type: System.IO.FileNotFoundException
[7/17/2022 6:16:03 PM.318] LSPD First Response: Exception message: Die Datei oder Assembly "Spotlight, Version=1.4.0.0, Culture=neutral, PublicKeyToken=null" oder eine Abhängigkeit davon wurde nicht gefunden. Das System kann die angegebene Datei nicht finden.
[7/17/2022 6:16:03 PM.318] LSPD First Response: ------------------------------
[7/17/2022 6:16:03 PM.318] LSPD First Response: Inner exceptions:
[7/17/2022 6:16:03 PM.318] LSPD First Response: ------------------------------
[7/17/2022 6:16:03 PM.318] LSPD First Response: Stack trace:
[7/17/2022 6:16:03 PM.318] LSPD First Response: at HeliUnit.IsSearchlightInitialized()
[7/17/2022 6:16:03 PM.318] at HeliAssistance.Main.ProcessSearchlightStuff() in C:\Users\OJ\Documents\Visual Studio 2022\source\repos\HeliAssistance\Main.cs:line 639
[7/17/2022 6:16:03 PM.318] at HeliAssistance.Main.OnTick() in C:\Users\OJ\Documents\Visual Studio 2022\source\repos\HeliAssistance\Main.cs:line 270
[7/17/2022 6:16:03 PM.318] at Rage.GameFiber.Main()
[7/17/2022 6:16:03 PM.318] LSPD First Response: ==============================

 

Either set EnableSearchlight to false in the INI or menu, or download the Spotlight mod: 

 

The update crashes my game when I go on duty

OJdoesIt

Members Author

21 hours ago, DaHodedo said:

The update crashes my game when I go on duty

I need the log file if you're seeking a resolution.

JohnDong

Members

this is a good plugin

but whenever I want to change the brightness of the searchlight, it will crash my lspdfr

OJdoesIt

Members Author

6 hours ago, melrose said:

this is a good plugin

but whenever I want to change the brightness of the searchlight, it will crash my lspdfr

Make sure you have RageNativeUI installed. And make sure you have Spotlight installed.

Ryan33

Members

hi!

a great plugin but i have met some bugs in your latest version

plz tell me how to report these bugs to you

OJdoesIt

Members Author

1 hour ago, Ryan33 said:

hi!

a great plugin but i have met some bugs in your latest version

plz tell me how to report these bugs to you

If it's a bug, then you'll have to describe it here.

If it's a crash, then upload the RagePluginHook.log file

JohnDong

Members

On 2022/7/19 at PM11点38分, OJdoesIt said:

确保您已安装 RageNativeUI 并确保您已安装 Spotlight 

yes, I know. I'm sure these two are installed and enabled

OJdoesIt

Members Author

3 hours ago, melrose said:

yes, I know. I'm sure these two are installed and enabled

Show me your Rage log

JohnDong

Members

RagePluginHook.logMy rage log seems to tell me that there is a problem with ragenativeui, but I have installed the latest version of ragenativeui.

 

ziipzaaapM16A4

Insiders

(edited)

API Request:

public static int GetHeliRequestNumber();
//Gets you a ticket number of the current heli request.


This function creates for each heli request a new random number which the developer can use to check whether a heli request is still the latest.

Why?
For my example AmbientAICallouts this means the heli is going to be requested at other emergency locations than where the player is located.
In case the plugin calls the heli support and needs that heli support for a unknown duration, the random number can be stored and the Plugin can after finish either release the heli in case that number hasn't changed or do not release the heli if the number has changed due to the player calling for heli backup.

This would prevent plugins from releasing the players heli in case they have requested a heli while the heli was active for that plugin.


Why not just update the time period for that plugin which requested the heli?
Because it is not suitable when there is no specific duration how long the heli needs to be at this scene.
For me its never a specific duration. That's why i need to release the heli manually.
Oh and its destroying the ambiance because i simulate radio calls for that heli.

Greetings 


zip

Edited by ziipzaaapM16A4

Angil

Members

Thank you very much for all these plugins you have added to the LSPDFR community. I just crash with this plugin every time it launches. It's a shame because he looks great. Do you know why I crash? Otherwise no problem on the other plugins so thank you😀

RagePluginHook.log

OJdoesIt

Members Author

44 minutes ago, Angil said:

Thank you very much for all these plugins you have added to the LSPDFR community. I just crash with this plugin every time it launches. It's a shame because he looks great. Do you know why I crash? Otherwise no problem on the other plugins so thank you😀

RagePluginHook.log 289.34 kB · 0 downloads

Make sure you have Spotlight installed.

8 hours ago, ziipzaaapM16A4 said:

API Request:

public static int GetHeliRequestNumber();
//Gets you a ticket number of the current heli request.


This function creates for each heli request a new random number which the developer can use to check whether a heli request is still the latest.

Why?
For my example AmbientAICallouts this means the heli is going to be requested at other emergency locations than where the player is located.
In case the plugin calls the heli support and needs that heli support for a unknown duration, the random number can be stored and the Plugin can after finish either release the heli in case that number hasn't changed or do not release the heli if the number has changed due to the player calling for heli backup.

This would prevent plugins from releasing the players heli in case they have requested a heli while the heli was active for that plugin.


Why not just update the time period for that plugin which requested the heli?
Because it is not suitable when there is no specific duration how long the heli needs to be at this scene.
For me its never a specific duration. That's why i need to release the heli manually.
Oh and its destroying the ambiance because i simulate radio calls for that heli.

Greetings 


zip

If you're assigning a Vector3 as its target, you can use IsCurrentTarget(Vector3 posToCheck) to verify it's still targeting whatever you last assigned it.

Do you think that'll work?

ziipzaaapM16A4

Insiders

(edited)

10 minutes ago, OJdoesIt said:

Make sure you have Spotlight installed.

If you're assigning a Vector3 as its target, you can use IsCurrentTarget(Vector3 posToCheck) to verify it's still targeting whatever you last assigned it.

Do you think that'll work?

I guess that will work.
How detailed must be the Vector 3 to be still accepted as correct location in case the check will be made with a slightly diverting vector3 (los of some decimal places? like 1,2345XXXX)

Edited by ziipzaaapM16A4

OJdoesIt

Members Author

8 minutes ago, ziipzaaapM16A4 said:

I guess that will work.
How detailed must be the Vector 3 to be still accepted as correct location in case the check will be made with a slightly diverting vector3 (los of some decimal places? like 1,2345XXXX)

It's stores whatever Vector3 you give it.

  1. So you assign it a target position X
  2. Continue to do IsCurrentTarget(X) to verify that no new target was given to it.
    1. If it returns true, then the heli is still doing the task that you assigned it
    2. if it return false, then the user or some other plugin updated the heli task
  3. If it returns true, then give it a new target position and jump back to number 2

ziipzaaapM16A4

Insiders

(edited)

14 hours ago, OJdoesIt said:

It's stores whatever Vector3 you give it.

  1. So you assign it a target position X
  2. Continue to do IsCurrentTarget(X) to verify that no new target was given to it.
    1. If it returns true, then the heli is still doing the task that you assigned it
    2. if it return false, then the user or some other plugin updated the heli task
  3. If it returns true, then give it a new target position and jump back to number 2

That didn't answer my question.
My question was if it will still return true in case i check Vector3(1,2345, Y, Z) vs Vector3(1,2345678, Y, Z)?
So does it do 1:1 comparison or does it allow slight rounding difference and still return true?

Edited by ziipzaaapM16A4

celticcross989

Members

I cant get the helicopter to circle the pursuit it always circles back aways. It also wont follow the pursiut 

Legiaron

Members

On 7/17/2022 at 7:23 PM, OJdoesIt said:

Either set EnableSearchlight to false in the INI or menu, or download the Spotlight mod: 

 

Installed it still as soon as i agree on getting a Heli for the Chase -> LSPDFR Crashes 

 

 6:46:06 PM.158] LSPD First Response: ==============================
[7/23/2022 6:46:06 PM.158] LSPD First Response: UNHANDLED EXCEPTION DURING GAME FIBER TICK
[7/23/2022 6:46:06 PM.158] LSPD First Response: ------------------------------
[7/23/2022 6:46:06 PM.158] LSPD First Response: Origin: Game fiber "HeliAssist".
[7/23/2022 6:46:06 PM.158] LSPD First Response: ------------------------------
[7/23/2022 6:46:06 PM.158] LSPD First Response: Exception type: System.IO.FileNotFoundException
[7/23/2022 6:46:06 PM.158] LSPD First Response: Exception message: Die Datei oder Assembly "Spotlight, Version=1.4.0.0, Culture=neutral, PublicKeyToken=null" oder eine Abhängigkeit davon wurde nicht gefunden. Das System kann die angegebene Datei nicht finden.
[7/23/2022 6:46:06 PM.158] LSPD First Response: ------------------------------
[7/23/2022 6:46:06 PM.158] LSPD First Response: Inner exceptions:
[7/23/2022 6:46:06 PM.158] LSPD First Response: ------------------------------
[7/23/2022 6:46:06 PM.158] LSPD First Response: Stack trace:
[7/23/2022 6:46:06 PM.158] LSPD First Response: at HeliUnit.IsSearchlightInitialized()
[7/23/2022 6:46:06 PM.158] at HeliAssistance.Main.ProcessSearchlightStuff() in C:\Users\OJ\Documents\Visual Studio 2022\source\repos\HeliAssistance\Main.cs:line 639
[7/23/2022 6:46:06 PM.158] at HeliAssistance.Main.OnTick() in C:\Users\OJ\Documents\Visual Studio 2022\source\repos\HeliAssistance\Main.cs:line 270
[7/23/2022 6:46:06 PM.158] at Rage.GameFiber.Main()
[7/23/2022 6:46:06 PM.158] LSPD First Response: ==============================

No idea why it shows Spotlight is not found.. its loading on startup and i can open it but as soon as i wanna get the Heli for the Chase LSPDFR says bye 

Create an account or sign in to comment

Latest Mods

Account

Navigation

Search

Search

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.