From a754eadb2aea3d83bd3fd2e6de4b70627f3de7a5 Mon Sep 17 00:00:00 2001 From: Vespura <31419184+TomGrobbe@users.noreply.github.com> Date: Thu, 14 Mar 2019 15:31:45 +0100 Subject: [PATCH] CFX-API: Important changes, read full description: - vMenuShared component is now removed. This has been integrated into just 2 .cs files in the SharedClasses folder, which is added to both the client and server project. - CFX API packages have been updated to use the latest NuGet (official) versions. This required quite a bit of refactoring, including the removal of the vMenuShared project. - Appveyor compatibility update for the new packages and removed project. - MenuAPI update required refactoring of the dependency filename. - New FiveM production build allowed me to implement the Radar Controls hotkeys without it crashing, so that's also been added in this commit. - gitignore: ignore nuget package folder --- .gitignore | 2 +- .../ConfigManager.cs | 0 .../PermissionsManager.cs | 23 +- appveyor.yml | 10 +- dependencies/client/CitizenFX.Core.dll | Bin 2305024 -> 0 bytes dependencies/client/CitizenFX.Core.xml | 66753 ---------------- dependencies/server/CitizenFX.Core.Server.dll | Bin 180736 -> 0 bytes dependencies/server/CitizenFX.Core.xml | 7584 -- vMenu.sln | 14 +- vMenu/EventManager.cs | 4 +- vMenu/FunctionsController.cs | 150 +- vMenu/packages.config | 4 + vMenu/vMenuClient.csproj | 24 +- vMenuServer/packages.config | 4 + vMenuServer/vMenuServer.csproj | 20 +- vMenuShared/Properties/AssemblyInfo.cs | 36 - vMenuShared/vMenuShared.csproj | 75 - 17 files changed, 157 insertions(+), 74546 deletions(-) rename {vMenuShared => SharedClasses}/ConfigManager.cs (100%) rename {vMenuShared => SharedClasses}/PermissionsManager.cs (96%) delete mode 100644 dependencies/client/CitizenFX.Core.dll delete mode 100644 dependencies/client/CitizenFX.Core.xml delete mode 100644 dependencies/server/CitizenFX.Core.Server.dll delete mode 100644 dependencies/server/CitizenFX.Core.xml create mode 100644 vMenu/packages.config create mode 100644 vMenuServer/packages.config delete mode 100644 vMenuShared/Properties/AssemblyInfo.cs delete mode 100644 vMenuShared/vMenuShared.csproj diff --git a/.gitignore b/.gitignore index d4303a74..5d2bad77 100644 --- a/.gitignore +++ b/.gitignore @@ -154,7 +154,7 @@ PublishScripts/ # NuGet Packages *.nupkg # The packages folder can be ignored because of Package Restore -#**/packages/* +**/packages/* # except build/, which is used as an MSBuild target. !**/packages/build/ # Uncomment if necessary however generally it will be regenerated when needed diff --git a/vMenuShared/ConfigManager.cs b/SharedClasses/ConfigManager.cs similarity index 100% rename from vMenuShared/ConfigManager.cs rename to SharedClasses/ConfigManager.cs diff --git a/vMenuShared/PermissionsManager.cs b/SharedClasses/PermissionsManager.cs similarity index 96% rename from vMenuShared/PermissionsManager.cs rename to SharedClasses/PermissionsManager.cs index e21a38e1..2f0544e1 100644 --- a/vMenuShared/PermissionsManager.cs +++ b/SharedClasses/PermissionsManager.cs @@ -307,6 +307,18 @@ public enum Permission public static Dictionary Permissions { get; private set; } = new Dictionary(); public static bool ArePermissionsSetup { get; set; } = false; + +#if SERVER + /// + /// Public function to check if a permission is allowed. + /// + /// + /// + /// if true, then the permissions will be checked even if they aren't setup yet. + /// + public static bool IsAllowed(Permission permission, Player source = null, bool checkAnyway = false) => IsAllowedServer(permission, source); +#endif +#if CLIENT /// /// Public function to check if a permission is allowed. /// @@ -314,7 +326,8 @@ public enum Permission /// /// if true, then the permissions will be checked even if they aren't setup yet. /// - public static bool IsAllowed(Permission permission, Player source = null, bool checkAnyway = false) => IsDuplicityVersion() ? IsAllowedServer(permission, source) : IsAllowedClient(permission, checkAnyway); + public static bool IsAllowed(Permission permission, Player source = null, bool checkAnyway = false) => IsAllowedClient(permission, checkAnyway); +#endif private static Dictionary allowedPerms = new Dictionary(); /// @@ -348,6 +361,7 @@ private static bool IsAllowedClient(Permission permission, bool checkAnyway) return false; } +#if SERVER /// /// Checks if the player is allowed that specific permission. /// @@ -369,6 +383,7 @@ private static bool IsAllowedServer(Permission permission, Player source) return false; } +#endif private static Dictionary> parentPermissions = new Dictionary>(); @@ -408,6 +423,7 @@ public static List GetPermissionAndParentPermissions(Permission perm } +#if SERVER /// /// Sets the permissions for a specific player (checks server side, sends event to client side). /// @@ -471,7 +487,8 @@ public static void SetPermissionsForPlayer([FromSource]Player player) // Also tell the client to do the addons setup. player.TriggerEvent("vMenu:SetAddons"); } - +#endif +#if CLIENT /// /// Sets the permission (client side event handler). /// @@ -489,7 +506,7 @@ public static void SetPermissions(string permissions) } } - +#endif /// /// Gets the full permission ace name for the specific enum. /// diff --git a/appveyor.yml b/appveyor.yml index fd2f4eb0..6aeaf81c 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,13 +1,13 @@ pull_requests: do_not_increment_build_number: false -# branches: - # only: - # - production image: Visual Studio 2017 configuration: Release +before_build: + - nuget restore build: parallel: true project: vMenu.sln + include_nuget_references: true verbosity: minimal after_build: - cmd: copy README.md ..\build\README.md @@ -16,8 +16,6 @@ after_build: - cmd: if %APPVEYOR_REPO_TAG%==true (appveyor SetVariable -Name VERSION_NAME -Value %APPVEYOR_REPO_TAG_NAME%) else (appveyor SetVariable -Name VERSION_NAME -Value beta) - cmd: 7z a vMenu-%VERSION_NAME%.zip -r ..\build\* - cmd: appveyor PushArtifact vMenu-%VERSION_NAME%.zip - # - cmd: if %APPVEYOR_REPO_TAG%==false (7z a vMenu-beta.zip -r ..\build\*) - # - cmd: if %APPVEYOR_REPO_TAG%==false (appveyor PushArtifact vMenu-beta.zip) deploy: - provider: GitHub release: "[Release] vMenu $(VERSION_NAME)" @@ -29,8 +27,6 @@ deploy: on: APPVEYOR_REPO_TAG: true description: "vMenu version $(VERSION_NAME)." -before_build: - - ps: if($env:APPVEYOR_REPO_TAG -eq $True) {Invoke-RestMethod https://raw.githubusercontent.com/TomGrobbe/appveyor-discord-webhook/master/send.ps1 -o send.ps1; ./send.ps1 start $env:WEBHOOK_URL; rm send.ps1;} after_deploy: - ps: if($env:APPVEYOR_REPO_TAG -eq $True) {Invoke-RestMethod https://raw.githubusercontent.com/TomGrobbe/appveyor-discord-webhook/master/send.ps1 -o send.ps1; ./send.ps1 deploy $env:WEBHOOK_URL; rm send.ps1;} on_success: diff --git a/dependencies/client/CitizenFX.Core.dll b/dependencies/client/CitizenFX.Core.dll deleted file mode 100644 index 1c265d4c9167a384c1a1404abb7ac92d62803fd1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2305024 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 z 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

MS`IGMfFUn4Wb?KygiqrKi4V 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

^o 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 z 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

- An event containing callbacks to attempt to schedule on every game tick. - A callback will only be rescheduled once the associated task completes. - - - - - Returns a task that will delay scheduling of the current interval function by the passed amount of time. - - - await Delay(500); - - The amount of time by which to delay scheduling this interval function. - An awaitable task. - - - - Gets or sets the position of this . - - - - - Sets the rotation of this on the map. - - - - - Sets the scale of this on the map. - - - - - Gets the type of this . - - - - - Gets or sets the alpha of this on the map. - - - - - Sets the priority of this . - - - - - Sets this s label to the given number. - - - - - Gets or sets the color of this . - - - - - Gets or sets the sprite of this . - - - - - Sets this s label to the given string. - - - - - Gets the this is attached to. - - - - - Sets a value indicating whether the route to this should be shown on the map. - - - true to show the route; otherwise, false. - - - - - Sets a value indicating whether this is friendly. - - - true if this is friendly; otherwise, false. - - - - - Sets a value indicating whether this (Player) is a friend. Toggles a half cyan circle on the right side. - - - true if this (Player) is a friend; otherwise, false. - - - - - Sets a value indicating whether this (Player) is a CREW member. Toggles a half cyan circle on the left side. - - - true if this (Player) is a CREW member; otherwise, false. - - - - - Gets or sets a value indicating whether this is flashing. - - - true if this is flashing; otherwise, false. - - - - - Gets a value indicating whether this is on minimap. - - - true if this is on minimap; otherwise, false. - - - - - Gets or sets a value indicating whether this is short range. - - - true if this is short range; otherwise, false. - - - - - Removes the number label for this . - - - - - Removes this . - - - - - The Buttons enum used for creating s - - - - - A value type used for checking if a sequence of s has been pressed. - Check if the combination has been entered with . - - - - - Gets the calculated hash of the Sequence - - - - - Gets the length of the sequence - - - - - Creates a from a given list of s. - - The sequence of s in the order a user should enter in game. - There must be between 6 and 29 inclusive s otherwise an is thrown - - - - Gets the memory address of this . - - - - - Gets or sets a value indicating whether this is currently being rendered. - - - true if this is active; otherwise, false. - - - - - Gets or sets the position of this . - - - - - Gets or sets the rotation of this . - - - The yaw, pitch and roll rotations measured in degrees. - - - - - Gets or sets the direction this is pointing in. - - - - - Gets the up vector of this . - - - - - Gets the forward vector of this , see also . - - - - - Gets the right vector of this . - - - - - Gets the matrix of this . - - - - - Gets the position in world coords of an offset relative to this - - The offset from this . - - - - Gets the relative offset of this from a world coords position - - The world coords. - - - - Gets or sets the field of view of this . - - - - - Gets or sets the near clip of this . - - - - - Gets or sets the far clip of this . - - - - - Sets the near depth of field for this . - - - - - Gets or sets the far depth of field of this . - - - - - Sets the depth of field strength for this . - - - - - Sets the strenght of the motion blur for this - - - - - Shakes this . - - Type of the shake to apply. - The amplitude of the shaking. - - - - Stops shaking this . - - - - - Gets a value indicating whether this is shaking. - - - true if this is shaking; otherwise, false. - - - - - Sets the shake amplitude for this . - - - - - Points this at a specified . - - The to point at. - The offset from the to point at. - - - - Points this at a specified . - - The to point at. - The offset from the to point at - - - - Points this at a specified position. - - The position to point at. - - - - Stops this pointing at a specific target. - - - - - Starts a transition between this and the new camera. (Old (incorrect) function, please use the overload function!) - - - - - - - - - Starts a transition between this and the new camera. - - - - - - - - - Gets a value indicating whether this is interpolating. - - - true if this is interpolating; otherwise, false. - - - - - Attaches this to a specific . - - The to attach to. - The offset from the to attach to. - - - - Attaches this to a specific . - - The to attach to. - The offset from the to attach to. - - - - Detaches this from any or it may be attached to. - - - - - Destroys this . - - - - - Gets the memory address of the . - - - - - Gets the position of the . - - - - - Gets the rotation of the . - - - The yaw, pitch and roll rotations measured in degrees. - - - - - Gets the direction the is pointing in. - - - - - Gets the up vector of the . - - - - - Gets the forward vector of the , see also . - - - - - Gets the right vector of the . - - - - - Gets the matrix of the . - - - - - Gets the position in world coords of an offset relative to the - - The offset from the . - - - - Gets the relative offset of the from a world coords position - - The world coords. - - - - Gets or sets the relative pitch of the . - - - - - Gets or sets the relative heading of the . - - - - - Clamps the yaw of the . - - The minimum yaw value. - The maximum yaw value. - - - - Clamps the pitch of the . - - The minimum pitch value. - The maximum pitch value. - - - - Gets the zoom of the . - - - - - Gets the field of view of the . - - - - - Gets a value indicating whether the is rendering. - - - true if the is rendering; otherwise, false. - - - - - Gets a value indicating whether the aiming camera is rendering. - - - true if the aiming camera is rendering; otherwise, false. - - - - - Gets a value indicating whether the first person aiming camera is rendering. - - - true if the aiming camera is rendering; otherwise, false. - - - - - Gets a value indicating whether the is looking behind. - - - true if the is looking behind; otherwise, false. - - - - - Shakes the . - - Type of the shake to apply. - The amplitude of the shaking. - - - - Stops shaking the . - - - - - Gets a value indicating whether the is shaking. - - - true if the is shaking; otherwise, false. - - - - - Sets the shake amplitude for the . - - - - - Initializes a new instance of the struct. - - The icon style. - The icon number, - if is allowed range is 0 - 99 - otherwise allowed range is 0 - 9. - - - - Gets or sets the number to display inside the icon. - - - The number. - if is allowed range is 0 - 99 - otherwise allowed range is 0 - 9. - - - - - Gets the memory address of this . - - - - - Gets or sets the position of this . - - - - - Gets or sets the position where this points to. - - - - - Gets or sets the icon drawn in this . - - - - - Gets or sets the radius of this . - - - - - Gets or sets the color of this . - - - - - Gets or sets the color of the icon in this . - - - - - Gets or sets the near height of the cylinder of this . - - - - - Gets or sets the far height of the cylinder of this . - - - - - Gets or sets the radius of the cylinder in this . - - - - - Removes this . - - - - - Determines if this exists. - - true if this exists; otherwise, false. - - - - Determines if a specific exists. - - true if the exists; otherwise, false. - - - - Determines if a refer to the same as this . - - The other . - true if the is the same checkpoint as this ; otherwise, false. - - - - Determines if an refer to the same as this . - - The to check. - true if the is the same checkpoint as this ; otherwise, false. - - - - Determines if 2 s refer to the same checkpoint - - The left . - The right . - true if is the same checkpoint as this ; otherwise, false. - - - - Determines if 2 s don't refer to the same checkpoint - - The left . - The right . - true if is not the same checkpoint as this ; otherwise, false. - - - - Gets or sets a value indicating whether this will be drawn. - - - true if enabled; otherwise, false. - - - - - Gets or sets the color of this . - - - The color. - - - - - Gets or sets the position of this . - - - The position scaled on a 1280*720 pixel base. - - - If ScaledDraw is called, the position will be scaled by the width returned in . - - - - - Gets or sets a value indicating whether this should be positioned based on its center or top left corner - - - true if centered; otherwise, false. - - - - - Draws this this frame. - - - - - Draws this this frame at the specified offset. - - The offset to shift the draw position of this using a 1280*720 pixel base. - - - - Draws this this frame using the width returned in . - - - - - Draws this this frame at the specified offset using the width returned in . - - The offset to shift the draw position of this using a *720 pixel base. - - - - Gets or sets a value indicating whether this will be drawn. - - - true if enabled; otherwise, false. - - - - - Gets or sets the color of this . - - - The color. - - - - - Gets or sets the position of this . - - - The position scaled on a 1280*720 pixel base. - - - If ScaledDraw is called, the position will be scaled by the width returned in . - - - - - Gets or sets a value indicating whether this should be positioned based on its center or top left corner - - - true if centered; otherwise, false. - - - - - Gets or sets the size to draw the - - - The size on a 1280*720 pixel base - - - If ScaledDraw is called, the size will be scaled by the width returned in . - - - - - Initializes a new instance of the class used for grouping drawing Rectangles on screen. - - - - - Initializes a new instance of the class used for grouping drawing Rectangles on screen. - - Set the on screen where to draw the . - Set the of the . - - - - Initializes a new instance of the class used for grouping drawing Rectangles on screen. - - Set the on screen where to draw the . - Set the of the . - Set the used to draw the . - - - - Initializes a new instance of the class used for grouping drawing Rectangles on screen. - - Set the on screen where to draw the . - Set the of the . - Set the used to draw the . - Position the based on its center instead of top left corner, see also . - - - - Draws this this frame. - - - - - Draws this this frame at the specified offset. - - The offset to shift the draw position of this using a 1280*720 pixel base. - - - - Draws this this frame using the width returned in . - - - - - Draws this this frame at the specified offset using the width returned in . - - The offset to shift the draw position of this using a *720 pixel base. - - - - The s Contained inside this - - - - - Initializes a new instance of the class used for grouping s together. - - - - - Initializes a new instance of the class used for grouping s together. - - Set the on screen where to draw the . - Set the of the . - - - - Initializes a new instance of the class used for grouping s together. - - Set the on screen where to draw the . - Set the of the . - Set the used to draw the . - - - - Initializes a new instance of the class used for grouping s together. - - Set the on screen where to draw the . - Set the of the . - Set the used to draw the . - Position the based on its center instead of top left corner, see also . - - - - Draws this this frame and all its s. - - - - - Draws this this frame and all its s at the specified offset. - - The offset to shift the draw position of this using a 1280*720 pixel base. - - - - Draws this this frame and all its s using the width returned in . - - - - - Draws this this frame and all its s at the specified offset using the width returned in . - - The offset to shift the draw position of this using a *720 pixel base. - - - - Hides this instantly - - - - - Converts the inputString into a string[] (array) containing strings each 99 or less characters long. - - The string to convert. - string[] containing strings each 99 or less characters long. - - - - The base width of the screen used for all UI Calculations, unless ScaledDraw is used - - - - - The base height of the screen used for all UI Calculations - - - - - Gets the current Screen Aspect Ratio - - - - - Gets the width of the scaled against a 720pixel height base. - - - - - Gets the actual Screen resolution the game is being rendered at - - - - - Shows a subtitle at the bottom of the screen for a given time - - The message to display. - The duration to display the subtitle in milliseconds. - - - - Displays a help message in the top corner of the screen this frame. - - The text to display. - - - - Creates a above the minimap with the given message. - - The message in the notification. - if set to true the notification will blink. - The handle of the which can be used to hide it using - - - - Translates a point in WorldSpace to its given Coordinates on the - - The position in the World. - if set to true Returns the screen position scaled by ; otherwise, returns the screen position scaled by . - - - - - Creates a loading prompt at the bottom right of the screen with the given text and spinner type - - The text to display next to the spinner - The style of spinner to draw - - , , and all see to be the same. - But Rockstar always seem to use the in the scripts - - - - - Remove the loading prompt at the bottom right of the screen - - - - - Gets a value indicating whether the Loading Prompt is currently being displayed - - - - - Determines whether a given is Active. - - The to check - true if the is Active; otherwise, false - - - - Draws the specified this frame. - - The - This will only draw the if the can be drawn - - - - Hides the specified this frame. - - The to hide. - - - - Shows the mouse cursor this frame. - - - - - Gets or sets the sprite the cursor should used when drawn - - - - - Gets or sets a value indicating whether any HUD components should be rendered. - - - - - Gets or sets a value indicating whether the radar is visible. - - - - - Sets how far the Minimap should be zoomed in - - - The Radar zoom, Accepts values from 0 to 200 - - - - - Gets a value indicating whether the screen is faded in. - - - true if the screen is faded in; otherwise, false. - - - - - Gets a value indicating whether the screen is faded out. - - - true if the screen is faded out; otherwise, false. - - - - - Gets a value indicating whether the screen is fading in. - - - true if the screen is fading in; otherwise, false. - - - - - Gets a value indicating whether the screen is fading out. - - - true if the screen is fading out; otherwise, false. - - - - - Fades the screen in over a specific time, useful for transitioning - - The time for the fade in to take - - - - Fades the screen out over a specific time, useful for transitioning - - The time for the fade out to take - - - - Gets or sets the size to draw the - - - The size on a 1280*720 pixel base - - - If ScaledDraw is called, the size will be scaled by the width returned in . - - - - - Gets or sets the rotation to draw thie . - - - The rotation measured in degrees, clockwise increasing, 0.0 at vertical - - - - - Gets or sets a value indicating whether this will be drawn. - - - true if enabled; otherwise, false. - - - - - Gets or sets the color of this . - - - The color. - - - - - Gets or sets the position of this . - - - The position scaled on a 1280*720 pixel base. - - - If ScaledDraw is called, the position will be scaled by the width returned in . - - - - - Gets or sets the size to draw the - - - The size on a 1280*720 pixel base - - - If ScaledDraw is called, the size will be scaled by the width returned in . - - - - - Gets or sets the rotation to draw thie . - - - The rotation measured in degrees, clockwise increasing, 0.0 at vertical - - - - - Gets or sets a value indicating whether this should be positioned based on its center or top left corner - - - true if centered; otherwise, false. - - - - - Initializes a new instance of the class used for drawing in game textures on the screen. - - The Texture dictionary where the is stored (the *.ytd file). - Name of the inside the Texture dictionary. - Set the of the . - Set the on screen where to draw the . - - - - Initializes a new instance of the class used for drawing in game textures on the screen. - - The Texture dictionary where the is stored (the *.ytd file). - Name of the inside the Texture dictionary. - Set the of the . - Set the on screen where to draw the . - Set the used to draw the . - - - - Initializes a new instance of the class used for drawing in game textures on the screen. - - The Texture dictionary where the is stored (the *.ytd file). - Name of the inside the Texture dictionary. - Set the of the . - Set the on screen where to draw the . - Set the used to draw the . - Set the rotation to draw the sprite, measured in degrees, see also . - - - - Initializes a new instance of the class used for drawing in game textures on the screen. - - The Texture dictionary where the is stored (the *.ytd file). - Name of the inside the Texture dictionary. - Set the of the . - Set the on screen where to draw the . - Set the used to draw the . - Set the rotation to draw the sprite, measured in degrees, see also . - Position the based on its center instead of top left corner, see also . - - - - Draws this . - - - - - Draws the at the specified offset. - - The offset. - - - - Draws this using the width returned in . - - - - - Draws the at the specified offset using the width returned in . - - The offset. - - - - Gets or sets a value indicating whether this will be drawn. - - - true if enabled; otherwise, false. - - - - - Gets or sets the color of this . - - - The color. - - - - - Gets or sets the position of this . - - - The position scaled on a 1280*720 pixel base. - - - If ScaledDraw is called, the position will be scaled by the width returned in . - - - - - Gets or sets the scale of this . - - - The scale usually a value between ~0.5 and 3.0, Default = 1.0 - - - - - Gets or sets the font of this . - - - The GTA Font use when drawing. - - - - - Gets or sets the text to draw in this . - - - The caption. - - - - - Gets or sets the alignment of this . - - - The alignment:Left, Center, Right Justify - - - - - Gets or sets a value indicating whether this is drawn with a shadow effect. - - - true if shadow; otherwise, false. - - - - - Gets or sets a value indicating whether this is drawn with an outline. - - - true if outline; otherwise, false. - - - - - Gets or sets the maximun size of the before it wraps to a new line. - - - The width of the . - - - - - Gets or sets a value indicating whether the alignment of this is centered. - See - - - true if centered; otherwise, false. - - - - - Measures how many pixels in the horizontal axis this will use when drawn against a 1280 pixel base - - - - - Measures how many pixels in the horizontal axis this will use when drawn against a pixel base - - - - - Initializes a new instance of the class used for drawing text on the screen. - - The to draw. - Set the on screen where to draw the . - Sets a used to increase of decrease the size of the , for no scaling use 1.0f. - - - - Initializes a new instance of the class used for drawing text on the screen. - - The to draw. - Set the on screen where to draw the . - Sets a used to increase of decrease the size of the , for no scaling use 1.0f. - Set the used to draw the . - - - - Initializes a new instance of the class used for drawing text on the screen. - - The to draw. - Set the on screen where to draw the . - Sets a used to increase of decrease the size of the , for no scaling use 1.0f. - Set the used to draw the . - Sets the used when drawing the text. - - - - Initializes a new instance of the class used for drawing text on the screen. - - The to draw. - Set the on screen where to draw the . - Sets a used to increase of decrease the size of the , for no scaling use 1.0f. - Set the used to draw the . - Sets the used when drawing the text. - Sets the used when drawing the text, , or . - - - - Initializes a new instance of the class used for drawing text on the screen. - - The to draw. - Set the on screen where to draw the . - Sets a used to increase of decrease the size of the , for no scaling use 1.0f. - Set the used to draw the . - Sets the used when drawing the text. - Sets the used when drawing the text, , or . - Sets whether or not to draw the with a effect. - Sets whether or not to draw the with an around the letters. - - - - Initializes a new instance of the class used for drawing text on the screen. - - The to draw. - Set the on screen where to draw the . - Sets a used to increase of decrease the size of the , for no scaling use 1.0f. - Set the used to draw the . - Sets the used when drawing the text. - Sets the used when drawing the text, , or . - Sets whether or not to draw the with a effect. - Sets whether or not to draw the with an around the letters. - Sets how many horizontal pixel to draw before wrapping the on the next line down. - - - - Measures how many pixels in the horizontal axis the string will use when drawn - - The string of text to measure. - The of the textu to measure. - Sets a sclae value for increasing or decreasing the size of the text, default value 1.0f - no scaling. - - The amount of pixels scaled on a 1280 pixel width base - - - - - Measures how many pixels in the horizontal axis the string will use when drawn - - The string of text to measure. - The of the textu to measure. - Sets a sclae value for increasing or decreasing the size of the text, default value 1.0f - no scaling. - - The amount of pixels scaled by the pixel width base return in - - - - - Draws the this frame. - - - - - Draws the this frame at the specified offset. - - The offset to shift the draw position of this using a 1280*720 pixel base. - - - - Draws the this frame using the width returned in . - - - - - Draws the this frame at the specified offset using the width returned in . - - The offset to shift the draw position of this using a *720 pixel base. - - - - Gets the memory address where the is stored in memory. - - - - - Gets or sets the health of this as an . - - - The health from 0 - 100 as an integer. - - if you need to get or set the value strictly, use instead. - - - - Gets or sets the health of this as a . - - - The health in float. - - - - - Gets or sets the maximum health of this as an . - - - The maximum health from 0 - 100 as an integer. - - if you need to get or set the value strictly, use instead. - - - - Gets or sets the maximum health of this in float. - - - The maximum health in float. - - - - - Gets a value indicating whether this is dead. - - - true if this is dead; otherwise, false. - - - - - Gets a value indicating whether this is alive. - - - true if this is alive; otherwise, false. - - - - - Gets or sets the position of this . - - - The position in world space. - - - - - Sets the position of this without any offset. - - - The position in world space. - - - - - Gets or sets the rotation of this . - - - The yaw, pitch, roll rotation values. - - - - - Gets or sets the quaternion of this . - - - - - Gets or sets the heading of this . - - - The heading in degrees. - - - - - Gets the vector that points above this - - - - - Gets the vector that points to the right of this - - - - - Gets the vector that points in front of this - - - - - Gets this s matrix which stores position and rotation information. - - - - - Gets or sets a value indicating whether this is frozen. - - - true if this is position frozen; otherwise, false. - - - - - Gets or sets the velocity of this . - - - - - Gets the rotation velocity of this . - - - - - Sets the maximum speed this can move at. - - - - - Gets or sets a value indicating whether this has gravity. - - - true if this has gravity; otherwise, false. - - - - - Gets how high above ground this is. - - - - - Gets a value indicating how submersed this is, 1.0f means the whole entity is submerged. - - - - - Gets or sets the level of detail distance of this . - - - - - Gets or sets a value indicating whether this is visible. - - - true if this is visible; otherwise, false. - - - - - Gets a value indicating whether this is occluded. - - - true if this is occluded; otherwise, false. - - - - - Gets a value indicating whether this is on screen. - - - true if this is on screen; otherwise, false. - - - - - Gets a value indicating whether this is rendered. - - - true if this is rendered; otherwise, false. - - - - - Gets a value indicating whether this is upright. - - - true if this is upright; otherwise, false. - - - - - Gets a value indicating whether this is upside down. - - - true if this is upside down; otherwise, false. - - - - - Gets a value indicating whether this is in the air. - - - true if this is in the air; otherwise, false. - - - - - Gets a value indicating whether this is in water. - - - true if this is in water; otherwise, false. - - - - - Gets or sets a value indicating whether this is persistent. - - - true if this is persistent; otherwise, false. - - - - - Gets a value indicating whether this is on fire. - - - true if this is on fire; otherwise, false. - - - - - Gets or sets a value indicating whether this is fire proof. - - - true if this is fire proof; otherwise, false. - - - - - Gets or sets a value indicating whether this is melee proof. - - - true if this is melee proof; otherwise, false. - - - - - Gets or sets a value indicating whether this is bullet proof. - - - true if this is bullet proof; otherwise, false. - - - - - Gets or sets a value indicating whether this is explosion proof. - - - true if this is explosion proof; otherwise, false. - - - - - Gets or sets a value indicating whether this is collision proof. - - - true if this is collision proof; otherwise, false. - - - - - Gets or sets a value indicating whether this is invincible. - - - true if this is invincible; otherwise, false. - - - - - Gets or sets a value indicating whether this can only be damaged by s. - - - true if this can only be damaged by s; otherwise, false. - - - - - Gets or sets how opacque this is. - - - 0 for completely see through, 255 for fully opacque - - - - - Resets the opacity, . - - - - - Gets a value indicating whether this has collided with anything. - - - true if this has collided; otherwise, false. - - must be true for this to work. - - - - Gets the material this entity is currently brushing up against. Only works - for the material the entity is facing towards. - - - - - Gets or sets a value indicating whether this has collision. - - - true if this has collision; otherwise, false. - - - - - Gets or sets a value indicating whether this is recording collisions. - - - - - Sets the collision between this and another - - The to set collision with - if set to true the 2 s wont collide with each other. - - - - Determines whether this has been damaged by a specified . - - The to check - - true if this has been damaged by the specified ; otherwise, false. - - - - - Determines whether this has been damaged by a specific weapon]. - - The weapon to check. - - true if this has been damaged by the specified weapon; otherwise, false. - - - - - Determines whether this has been damaged by any weapon. - - - true if this has been damaged by any weapon; otherwise, false. - - - - - Determines whether this has been damaged by any melee weapon. - - - true if this has been damaged by any melee weapon; otherwise, false. - - - - - Clears the last weapon damage this received. - - - - - Determines whether this is in a specified area - - The minimum bounds. - The maximum bounds. - - true if this is in the specified area; otherwise, false. - - - - - Determines whether this is in a specified angled area - - The origin. - The edge. - The angle. - - true if this is in the specified angled area; otherwise, false. - - - - - Determines whether this is in range of a specified position - - The position. - The maximum range. - - true if this is in range of the ; otherwise, false. - - - - - Determines whether this is near a specified . - - The to check. - The max displacement from the . - - true if this is near the ; otherwise, false. - - - - - Determines whether this is touching an with the . - - The to check - - true if this is touching a ; otherwise, false. - - - - - Determines whether this is touching the . - - The to check. - - true if this is touching ; otherwise, false. - - - - - Gets the position in world coords of an offset relative this - - The offset from this . - - - - Gets the relative offset of this from a world coords position - - The world coords. - - - - Gets a collection of the s in this - - - - - Creates a on this - - - - - Gets the attached to this - - returns null if no s are attached to this - - - - Gets an array of all s attached to this . - - - - - Attaches this to a different - - The to attach this to. - The position relative to the to attach this to. - The rotation to apply to this relative to the - - - - Attaches this to a different - - The to attach this to. - The position relative to the to attach this to. - The rotation to apply to this relative to the - - - - Detaches this from any it may be attached to. - - - - - Determines whether this is attached to any other . - - - true if this is attached to another ; otherwise, false. - - - - - Determines whether this is attached to the specified . - - The to check if this is attached to. - - true if this is attached to ; otherwise, false. - - - - - Gets the this is attached to. - returns null if this isnt attached to any entity - - - - - Applies a force to this . - - The direction to apply the force relative to world coords. - The rotation force to apply - Type of the force to apply. - - - - Applies a force to this . - - The direction to apply the force relative to this s rotation - The rotation force to apply - Type of the force to apply. - - - - Stops all particle effects attached to this - - - - - Gets the network ID of this - - - - - Deletes this - - - - - Marks this as no longer needed letting the game delete it when its too far away. - - - - - Creates a new instance of an from the given handle. - - The entity handle. - Returns a if this handle corresponds to a Ped. - Returns a if this handle corresponds to a Vehicle. - Returns a if this handle corresponds to a Prop. - Returns null if no exists this the specified - - - - Creates a new instance of an from the given network ID. - - The network ID of the entity. - Returns a if this network ID corresponds to a Ped. - Returns a if this network ID corresponds to a Vehicle. - Returns a if this network ID corresponds to a Prop. - Returns null if no exists for the specified - - - - Determines whether this exists. - - true if this exists; otherwise, false - - - - Determines whether the exists. - - The to check. - true if the exists; otherwise, false - - - - Checks if two s refer to the same - - The other . - true if they are the same ; otherwise, false - - - - Gets the bone index of this . - - - - - Gets the position of this in world coords. - - - - - Determines if this is valid - - - true if this is valid; otherwise, false. - - - - - Checks if two s refer to the same - - The other . - true if they are the same bone of the same ; otherwise, false - - - - Gets the with the specified bone name. - - Name of the bone. - - - - Gets the at the specified bone index. - - The bone index. - - - - Determines whether this has a bone with the specified bone name - - Name of the bone. - - true if this has a bone with the specified bone name; otherwise, false. - - - - - Gets the number of bones that this has. - - - - - Gets a ActivePose Helper class for sending ActivePose to this - - - - - Gets a ApplyImpulse Helper class for sending ApplyImpulse to this - - - - - Gets a ApplyBulletImpulse Helper class for sending ApplyBulletImpulse to this - - - - - Gets a BodyRelax Helper class for sending BodyRelax to this - - - Set the amount of relaxation across the whole body; Used to collapse the character into a rag-doll-like state. - - - - - Gets a ConfigureBalance Helper class for sending ConfigureBalance to this - - - This single message allows you to configure various parameters used on any behaviour that uses the dynamic balance. - - - - - Gets a ConfigureBalanceReset Helper class for sending ConfigureBalanceReset to this - - - reset the values configurable by the Configure Balance message to their defaults. - - - - - Gets a ConfigureSelfAvoidance Helper class for sending ConfigureSelfAvoidance to this - - - this single message allows to configure self avoidance for the character.BBDD Self avoidance tech. - - - - - Gets a ConfigureBullets Helper class for sending ConfigureBullets to this - - - - - Gets a ConfigureBulletsExtra Helper class for sending ConfigureBulletsExtra to this - - - - - Gets a ConfigureLimits Helper class for sending ConfigureLimits to this - - - Enable/disable/edit character limits in real time. This adjusts limits in RAGE-native space and will *not* reorient the joint. - - - - - Gets a ConfigureSoftLimit Helper class for sending ConfigureSoftLimit to this - - - - - Gets a ConfigureShotInjuredArm Helper class for sending ConfigureShotInjuredArm to this - - - This single message allows you to configure the injured arm reaction during shot - - - - - Gets a ConfigureShotInjuredLeg Helper class for sending ConfigureShotInjuredLeg to this - - - This single message allows you to configure the injured leg reaction during shot - - - - - Gets a DefineAttachedObject Helper class for sending DefineAttachedObject to this - - - - - Gets a ForceToBodyPart Helper class for sending ForceToBodyPart to this - - - Apply an impulse to a named body part - - - - - Gets a LeanInDirection Helper class for sending LeanInDirection to this - - - - - Gets a LeanRandom Helper class for sending LeanRandom to this - - - - - Gets a LeanToPosition Helper class for sending LeanToPosition to this - - - - - Gets a LeanTowardsObject Helper class for sending LeanTowardsObject to this - - - - - Gets a HipsLeanInDirection Helper class for sending HipsLeanInDirection to this - - - - - Gets a HipsLeanRandom Helper class for sending HipsLeanRandom to this - - - - - Gets a HipsLeanToPosition Helper class for sending HipsLeanToPosition to this - - - - - Gets a HipsLeanTowardsObject Helper class for sending HipsLeanTowardsObject to this - - - - - Gets a ForceLeanInDirection Helper class for sending ForceLeanInDirection to this - - - - - Gets a ForceLeanRandom Helper class for sending ForceLeanRandom to this - - - - - Gets a ForceLeanToPosition Helper class for sending ForceLeanToPosition to this - - - - - Gets a ForceLeanTowardsObject Helper class for sending ForceLeanTowardsObject to this - - - - - Gets a SetStiffness Helper class for sending SetStiffness to this - - - Use this message to manually set the body stiffness values -before using Active Pose to drive to an animated pose, for example. - - - - - Gets a SetMuscleStiffness Helper class for sending SetMuscleStiffness to this - - - Use this message to manually set the muscle stiffness values -before using Active Pose to drive to an animated pose, for example. - - - - - Gets a SetWeaponMode Helper class for sending SetWeaponMode to this - - - Use this message to set the character's weapon mode. This is an alternativeto the setWeaponMode public function. - - - - - Gets a RegisterWeapon Helper class for sending RegisterWeapon to this - - - Use this message to register weapon. This is an alternativeto the registerWeapon public function. - - - - - Gets a ShotRelax Helper class for sending ShotRelax to this - - - - - Gets a FireWeapon Helper class for sending FireWeapon to this - - - One shot message apply a force to the hand as we fire the gun that should be in this hand - - - - - Gets a ConfigureConstraints Helper class for sending ConfigureConstraints to this - - - One shot to give state of constraints on character and response to constraints - - - - - Gets a StayUpright Helper class for sending StayUpright to this - - - - - Gets a StopAllBehaviours Helper class for sending StopAllBehaviours to this - - - Send this message to immediately stop all behaviours from executing. - - - - - Gets a SetCharacterStrength Helper class for sending SetCharacterStrength to this - - - Sets character's strength on the dead-granny-to-healthy-terminator scale: [0..1] - - - - - Gets a SetCharacterHealth Helper class for sending SetCharacterHealth to this - - - Sets character's health on the dead-to-alive scale: [0..1] - - - - - Gets a SetFallingReaction Helper class for sending SetFallingReaction to this - - - Sets the type of reaction if catchFall is called - - - - - Gets a SetCharacterUnderwater Helper class for sending SetCharacterUnderwater to this - - - Sets viscosity applied to damping limbs - - - - - Gets a SetCharacterCollisions Helper class for sending SetCharacterCollisions to this - - - setCharacterCollisions: - - - - - Gets a SetCharacterDamping Helper class for sending SetCharacterDamping to this - - - Damp out cartwheeling and somersaulting above a certain threshold - - - - - Gets a SetFrictionScale Helper class for sending SetFrictionScale to this - - - setFrictionScale: - - - - - Gets a AnimPose Helper class for sending AnimPose to this - - - - - Gets a ArmsWindmill Helper class for sending ArmsWindmill to this - - - - - Gets a ArmsWindmillAdaptive Helper class for sending ArmsWindmillAdaptive to this - - - - - Gets a BalancerCollisionsReaction Helper class for sending BalancerCollisionsReaction to this - - - - - Gets a BodyBalance Helper class for sending BodyBalance to this - - - - - Gets a BodyFoetal Helper class for sending BodyFoetal to this - - - - - Gets a BodyRollUp Helper class for sending BodyRollUp to this - - - - - Gets a BodyWrithe Helper class for sending BodyWrithe to this - - - - - Gets a BraceForImpact Helper class for sending BraceForImpact to this - - - - - Gets a Buoyancy Helper class for sending Buoyancy to this - - - Simple buoyancy model. No character movement just fluid forces/torques added to parts. - - - - - Gets a CatchFall Helper class for sending CatchFall to this - - - - - Gets a Electrocute Helper class for sending Electrocute to this - - - - - Gets a FallOverWall Helper class for sending FallOverWall to this - - - - - Gets a Grab Helper class for sending Grab to this - - - - - Gets a HeadLook Helper class for sending HeadLook to this - - - - - Gets a HighFall Helper class for sending HighFall to this - - - - - Gets a IncomingTransforms Helper class for sending IncomingTransforms to this - - - - - Gets a InjuredOnGround Helper class for sending InjuredOnGround to this - - - InjuredOnGround - - - - - Gets a Carried Helper class for sending Carried to this - - - Carried - - - - - Gets a Dangle Helper class for sending Dangle to this - - - Dangle - - - - - Gets a OnFire Helper class for sending OnFire to this - - - - - Gets a PedalLegs Helper class for sending PedalLegs to this - - - - - Gets a PointArm Helper class for sending PointArm to this - - - BEHAVIOURS REFERENCED: AnimPose - allows animPose to overridebodyParts: Arms (useLeftArm, useRightArm) - - - - - Gets a PointGun Helper class for sending PointGun to this - - - - - Gets a PointGunExtra Helper class for sending PointGunExtra to this - - - Seldom set parameters for pointGun - just to keep number of parameters in any message less than or equal to 64 - - - - - Gets a RollDownStairs Helper class for sending RollDownStairs to this - - - - - Gets a Shot Helper class for sending Shot to this - - - - - Gets a ShotNewBullet Helper class for sending ShotNewBullet to this - - - Send new wound information to the shot. Can cause shot to restart it's performance in part or in whole. - - - - - Gets a ShotSnap Helper class for sending ShotSnap to this - - - - - Gets a ShotShockSpin Helper class for sending ShotShockSpin to this - - - configure the shockSpin effect in shot. Spin/Lift the character using cheat torques/forces - - - - - Gets a ShotFallToKnees Helper class for sending ShotFallToKnees to this - - - configure the fall to knees shot. - - - - - Gets a ShotFromBehind Helper class for sending ShotFromBehind to this - - - configure the shot from behind reaction - - - - - Gets a ShotInGuts Helper class for sending ShotInGuts to this - - - configure the shot in guts reaction - - - - - Gets a ShotHeadLook Helper class for sending ShotHeadLook to this - - - - - Gets a ShotConfigureArms Helper class for sending ShotConfigureArms to this - - - configure the arm reactions in shot - - - - - Gets a SmartFall Helper class for sending SmartFall to this - - - Clone of High Fall with a wider range of operating conditions. - - - - - Gets a StaggerFall Helper class for sending StaggerFall to this - - - - - Gets a Teeter Helper class for sending Teeter to this - - - - - Gets a UpperBodyFlinch Helper class for sending UpperBodyFlinch to this - - - - - Gets a Yanked Helper class for sending Yanked to this - - - - - A Base class for manually building a - - - - - Creates a class to manually build s that can be sent to any . - - The name of the natual motion message. - - - - Stops this Natural Motion behavious on the given - - The to send the Abort to. - - - - Starts this Natural Motion behaviour on the that will loop until manually aborted - - The to send the to. - - - - Starts this Natural Motion behaviour on the for a specified duration. - - The to send the to. - How long to apply the behaviour for (-1 for looped). - - - - Sets a argument to a value - - The argument name. - The value to set the argument to. - - - - Sets a argument to a value - - The argument name. - The value to set the argument to. - - - - Sets a argument to a value - - The argument name. - The value to set the argument to. - - - - Sets a argument to a value - - The argument name. - The value to set the argument to. - - - - Sets a argument to a value - - The argument name. - The value to set the argument to. - - - - Resets all arguments to their default value's - - - - - A Helper class for building a and sending it to a given - - - - - Creates a Helper class for building Natural Motion messages to send to a given - - The that the message will be applied to. - The name of the natual motion message. - - - - Starts this Natural Motion behaviour on the that will loop until manually aborted - - - - - Starts this Natural Motion behaviour on the for a specified duration. - - How long to apply the behaviour for (-1 for looped). - - - - Stops this Natural Motion behavious on the - - - - - Sets a argument to a value - - The argument name. - The value to set the argument to. - - - - Sets a argument to a value - - The argument name. - The value to set the argument to. - - - - Sets a argument to a value - - The argument name. - The value to set the argument to. - - - - Sets a argument to a value - - The argument name. - The value to set the argument to. - - - - Sets a argument to a value - - The argument name. - The value to set the argument to. - - - - Resets all arguments to their default value's - - - - - Creates a new Instance of the ActivePoseHelper for sending a ActivePose to a given . - - The to send the ActivePose to. - - - - Sets the Mask setting for this . - Two character body-masking value, bitwise joint mask or bitwise logic string of two character body-masking value (see notes for explanation). - - - Default value = fb. - - - - - Sets the UseGravityCompensation setting for this . - Apply gravity compensation as well?. - - - Default value = False. - - - - - Sets the AnimSource setting for this . - - - - - Creates a new Instance of the ApplyImpulseHelper for sending a ApplyImpulse to a given . - - The to send the ApplyImpulse to. - - - - Sets the EqualizeAmount setting for this . - 0 means straight impulse, 1 means multiply by the mass (change in velocity). - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the PartIndex setting for this . - index of part being hit. -1 apply impulse to COM. - - - Default value = 0. - Min value = -1. - Max value = 28. - - - - - Sets the Impulse setting for this . - impulse vector (impulse is change in momentum). - - - Default value = Vector3(0.0f, 0.0f, 0.0f). - Min value = -4500.0f. - Max value = 4500.0f. - - - - - Sets the HitPoint setting for this . - optional point on part where hit. If not supplied then the impulse is applied at the part centre. - - - Default value = Vector3(0.0f, 0.0f, 0.0f). - - - - - Sets the LocalHitPointInfo setting for this . - hitPoint in local coordinates of bodyPart. - - - Default value = False. - - - - - Sets the LocalImpulseInfo setting for this . - impulse in local coordinates of bodyPart. - - - Default value = False. - - - - - Sets the AngularImpulse setting for this . - impulse should be considered an angular impulse. - - - Default value = False. - - - - - Creates a new Instance of the ApplyBulletImpulseHelper for sending a ApplyBulletImpulse to a given . - - The to send the ApplyBulletImpulse to. - - - - Sets the EqualizeAmount setting for this . - 0 means straight impulse, 1 means multiply by the mass (change in velocity). - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the PartIndex setting for this . - index of part being hit. - - - Default value = 0. - Min value = 0. - Max value = 28. - - - - - Sets the Impulse setting for this . - impulse vector (impulse is change in momentum). - - - Default value = Vector3(0.0f, 0.0f, 0.0f). - Min value = -1000.0f. - Max value = 1000.0f. - - - - - Sets the HitPoint setting for this . - optional point on part where hit. - - - Default value = Vector3(0.0f, 0.0f, 0.0f). - - - - - Sets the LocalHitPointInfo setting for this . - true = hitPoint is in local coordinates of bodyPart, false = hitpoint is in world coordinates. - - - Default value = False. - - - - - Sets the ExtraShare setting for this . - if not 0.0 then have an extra bullet applied to spine0 (approximates the COM). Uses setup from configureBulletsExtra. 0-1 shared 0.0 = no extra bullet, 0.5 = impulse split equally between extra and bullet, 1.0 only extra bullet. LT 0.0 then bullet + scaled extra bullet. Eg.-0.5 = bullet + 0.5 impulse extra bullet. - - - Default value = 0.0f. - Min value = -2.0f. - Max value = 1.0f. - - - - - Set the amount of relaxation across the whole body; Used to collapse the character into a rag-doll-like state. - - - - - Creates a new Instance of the BodyRelaxHelper for sending a BodyRelax to a given . - - The to send the BodyRelax to. - - Set the amount of relaxation across the whole body; Used to collapse the character into a rag-doll-like state. - - - - - Sets the Relaxation setting for this . - How relaxed the body becomes, in percentage relaxed. 100 being totally rag-dolled, 0 being very stiff and rigid. - - - Default value = 50.0f. - Min value = 0.0f. - Max value = 100.0f. - - - - - Sets the Damping setting for this . - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the Mask setting for this . - Two character body-masking value, bitwise joint mask or bitwise logic string of two character body-masking value (see Active Pose notes for possible values). - - - Default value = fb. - - - - - Sets the HoldPose setting for this . - automatically hold the current pose as the character relaxes - can be used to avoid relaxing into a t-pose. - - - Default value = False. - - - - - Sets the DisableJointDriving setting for this . - sets the drive state to free - this reduces drifting on the ground. - - - Default value = False. - - - - - This single message allows you to configure various parameters used on any behaviour that uses the dynamic balance. - - - - - Creates a new Instance of the ConfigureBalanceHelper for sending a ConfigureBalance to a given . - - The to send the ConfigureBalance to. - - This single message allows you to configure various parameters used on any behaviour that uses the dynamic balance. - - - - - Sets the StepHeight setting for this . - maximum height that character steps vertically (above 0.2 is high...but ok for say underwater). - - - Default value = 0.1f. - Min value = 0.0f. - Max value = 0.4f. - - - - - Sets the StepHeightInc4Step setting for this . - added to stepHeight if going up steps. - - - Default value = 0.1f. - Min value = 0.0f. - Max value = 0.4f. - - - - - Sets the LegsApartRestep setting for this . - if the legs end up more than (legsApartRestep + hipwidth) apart even though balanced, take another step. - - - Default value = 0.2f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the LegsTogetherRestep setting for this . - mmmm0.1 for drunk if the legs end up less than (hipwidth - legsTogetherRestep) apart even though balanced, take another step. A value of 1 will turn off this feature and the max value is hipWidth = 0.23f by default but is model dependent. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the LegsApartMax setting for this . - FRICTION WORKAROUND: if the legs end up more than (legsApartMax + hipwidth) apart when balanced, adjust the feet positions to slide back so they are legsApartMax + hipwidth apart. Needs to be less than legsApartRestep to see any effect. - - - Default value = 2.0f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the TaperKneeStrength setting for this . - does the knee strength reduce with angle. - - - Default value = True. - - - - - Sets the LegStiffness setting for this . - stiffness of legs. - - - Default value = 12.0f. - Min value = 6.0f. - Max value = 16.0f. - - - - - Sets the LeftLegSwingDamping setting for this . - damping of left leg during swing phase (mmmmDrunk used 1.25 to slow legs movement). - - - Default value = 1.0f. - Min value = 0.2f. - Max value = 4.0f. - - - - - Sets the RightLegSwingDamping setting for this . - damping of right leg during swing phase (mmmmDrunk used 1.25 to slow legs movement). - - - Default value = 1.0f. - Min value = 0.2f. - Max value = 4.0f. - - - - - Sets the OpposeGravityLegs setting for this . - Gravity opposition applied to hips and knees. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 4.0f. - - - - - Sets the OpposeGravityAnkles setting for this . - Gravity opposition applied to ankles. General balancer likes 1.0. StaggerFall likes 0.1. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 4.0f. - - - - - Sets the LeanAcc setting for this . - Multiplier on the floorAcceleration added to the lean. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the HipLeanAcc setting for this . - Multiplier on the floorAcceleration added to the leanHips. - - - Default value = 0.5f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the LeanAccMax setting for this . - Max floorAcceleration allowed for lean and leanHips. - - - Default value = 5.0f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the ResistAcc setting for this . - Level of cheat force added to character to resist the effect of floorAcceleration (anti-Acceleration) - added to upperbody. - - - Default value = 0.5f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the ResistAccMax setting for this . - Max floorAcceleration allowed for anti-Acceleration. If GT 20.0 then it is probably in a crash. - - - Default value = 3.0f. - Min value = 0.0f. - Max value = 20.0f. - - - - - Sets the FootSlipCompOnMovingFloor setting for this . - This parameter will be removed when footSlipCompensation preserves the foot angle on a moving floor]. If the character detects a moving floor and footSlipCompOnMovingFloor is false then it will turn off footSlipCompensation - at footSlipCompensation preserves the global heading of the feet. If footSlipCompensation is off then the character usually turns to the side in the end although when turning the vehicle turns it looks promising for a while. - - - Default value = True. - - - - - Sets the AnkleEquilibrium setting for this . - ankle equilibrium angle used when static balancing. - - - Default value = 0.0f. - Min value = -1.0f. - Max value = 1.0f. - - - - - Sets the ExtraFeetApart setting for this . - additional feet apart setting. - - - Default value = 0.0f. - Min value = -1.0f. - Max value = 1.0f. - - - - - Sets the DontStepTime setting for this . - amount of time at the start of a balance before the character is allowed to start stepping. - - - Default value = 0.0f. - Min value = 0.0f. - - - - - Sets the BalanceAbortThreshold setting for this . - when the character gives up and goes into a fall. Larger values mean that the balancer can lean more before failing. - - - Default value = 0.6f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the GiveUpHeight setting for this . - height between lowest foot and COM below which balancer will give up. - - - Default value = 0.5f. - Min value = 0.0f. - Max value = 1.5f. - - - - - Sets the StepClampScale setting for this . - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the StepClampScaleVariance setting for this . - Variance in clamp scale every step. if negative only takes away from clampScale. - - - Default value = 0.0f. - Min value = -1.0f. - Max value = 1.0f. - - - - - Sets the PredictionTimeHip setting for this . - amount of time (seconds) into the future that the character tries to move hip to (kind of). Will be controlled by balancer in future but can help recover spine quicker from bending forwards to much. - - - Default value = 0.3f. - Min value = -1.0f. - Max value = 1.0f. - - - - - Sets the PredictionTime setting for this . - amount of time (seconds) into the future that the character tries to step to. bigger values try to recover with fewer, bigger steps. smaller values recover with smaller steps, and generally recover less. - - - Default value = 0.2f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the PredictionTimeVariance setting for this . - Variance in predictionTime every step. if negative only takes away from predictionTime. - - - Default value = 0.0f. - Min value = -1.0f. - Max value = 1.0f. - - - - - Sets the MaxSteps setting for this . - Maximum number of steps that the balancer will take. - - - Default value = 100. - Min value = 1. - - - - - Sets the MaxBalanceTime setting for this . - Maximum time(seconds) that the balancer will balance for. - - - Default value = 50.0f. - Min value = 1.0f. - - - - - Sets the ExtraSteps setting for this . - Allow the balancer to take this many more steps before hitting maxSteps. If negative nothing happens(safe default). - - - Default value = -1. - Min value = -1. - - - - - Sets the ExtraTime setting for this . - Allow the balancer to balance for this many more seconds before hitting maxBalanceTime. If negative nothing happens(safe default). - - - Default value = -1.0f. - Min value = -1.0f. - - - - - Sets the FallType setting for this . - How to fall after maxSteps or maxBalanceTime. - - - Default value = . - If BCR has to be active. - - - - - Sets the FallMult setting for this . - Multiply the rampDown of stiffness on falling by this amount ( GT 1 fall quicker). - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 100.0f. - - - - - Sets the FallReduceGravityComp setting for this . - Reduce gravity compensation as the legs weaken on falling. - - - Default value = False. - - - - - Sets the RampHipPitchOnFail setting for this . - bend over when falling after maxBalanceTime. - - - Default value = False. - - - - - Sets the StableLinSpeedThresh setting for this . - Linear speed threshold for successful balance. - - - Default value = 0.3f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the StableRotSpeedThresh setting for this . - Rotational speed threshold for successful balance. - - - Default value = 0.3f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the FailMustCollide setting for this . - The upper body of the character must be colliding and other failure conditions met to fail. - - - Default value = False. - - - - - Sets the IgnoreFailure setting for this . - Ignore maxSteps and maxBalanceTime and try to balance forever. - - - Default value = False. - - - - - Sets the ChangeStepTime setting for this . - time not in contact (airborne) before step is changed. If -ve don't change step. - - - Default value = -1.0f. - Min value = -1.0f. - Max value = 5.0f. - - - - - Sets the BalanceIndefinitely setting for this . - Ignore maxSteps and maxBalanceTime and try to balance forever. - - - Default value = False. - - - - - Sets the MovingFloor setting for this . - temporary variable to ignore movingFloor code that generally causes the character to fall over if the feet probe a moving object e.g. treading on a gun. - - - Default value = False. - - - - - Sets the AirborneStep setting for this . - when airborne try to step. Set to false for e.g. shotGun reaction. - - - Default value = True. - - - - - Sets the UseComDirTurnVelThresh setting for this . - Velocity below which the balancer turns in the direction of the COM forward instead of the ComVel - for use with shot from running with high upright constraint use 1.9. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the MinKneeAngle setting for this . - Minimum knee angle (-ve value will mean this functionality is not applied). 0.4 seems a good value. - - - Default value = -0.5f. - Min value = -0.5f. - Max value = 1.5f. - - - - - Sets the FlatterSwingFeet setting for this . - - - Default value = False. - - - - - Sets the FlatterStaticFeet setting for this . - - - Default value = False. - - - - - Sets the AvoidLeg setting for this . - If true then balancer tries to avoid leg2leg collisions/avoid crossing legs. Avoid tries to not step across a line of the inside of the stance leg's foot. - - - Default value = False. - - - - - Sets the AvoidFootWidth setting for this . - NB. Very sensitive. Avoid tries to not step across a line of the inside of the stance leg's foot. avoidFootWidth = how much inwards from the ankle this line is in (m). - - - Default value = 0.1f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the AvoidFeedback setting for this . - NB. Very sensitive. Avoid tries to not step across a line of the inside of the stance leg's foot. Avoid doesn't allow the desired stepping foot to cross the line. avoidFeedback = how much of the actual crossing of that line is fedback as an error. - - - Default value = 0.6f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the LeanAgainstVelocity setting for this . - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the StepDecisionThreshold setting for this . - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the StepIfInSupport setting for this . - The balancer sometimes decides to step even if balanced. - - - Default value = True. - - - - - Sets the AlwaysStepWithFarthest setting for this . - - - Default value = False. - - - - - Sets the StandUp setting for this . - standup more with increased velocity. - - - Default value = False. - - - - - Sets the DepthFudge setting for this . - Supposed to increase foot friction: Impact depth of a collision with the foot is changed when the balancer is running - impact.SetDepth(impact.GetDepth() - depthFudge). - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the DepthFudgeStagger setting for this . - Supposed to increase foot friction: Impact depth of a collision with the foot is changed when staggerFall is running - impact.SetDepth(impact.GetDepth() - depthFudgeStagger). - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the FootFriction setting for this . - Foot friction multiplier is multiplied by this amount if balancer is running. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 40.0f. - - - - - Sets the FootFrictionStagger setting for this . - Foot friction multiplier is multiplied by this amount if staggerFall is running. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 40.0f. - - - - - Sets the BackwardsLeanCutoff setting for this . - Backwards lean threshold to cut off stay upright forces. 0.0 Vertical - 1.0 horizontal. 0.6 is a sensible value. NB: the balancer does not fail in order to give stagger that extra step as it falls. A backwards lean of GT 0.6 will generally mean the balancer will soon fail without stayUpright forces. - - - Default value = 1.1f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the GiveUpHeightEnd setting for this . - if this value is different from giveUpHeight, actual giveUpHeight will be ramped toward this value. - - - Default value = 0.5f. - Min value = 0.0f. - Max value = 1.5f. - - - - - Sets the BalanceAbortThresholdEnd setting for this . - if this value is different from balanceAbortThreshold, actual balanceAbortThreshold will be ramped toward this value. - - - Default value = 0.6f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the GiveUpRampDuration setting for this . - duration of ramp from start of behaviour for above two parameters. If smaller than 0, no ramp is applied. - - - Default value = -1.0f. - Min value = -1.0f. - Max value = 10.0f. - - - - - Sets the LeanToAbort setting for this . - lean at which to send abort message when maxSteps or maxBalanceTime is reached. - - - Default value = 0.6f. - Min value = 0.0f. - Max value = 1.0f. - - - - - reset the values configurable by the Configure Balance message to their defaults. - - - - - Creates a new Instance of the ConfigureBalanceResetHelper for sending a ConfigureBalanceReset to a given . - - The to send the ConfigureBalanceReset to. - - reset the values configurable by the Configure Balance message to their defaults. - - - - - this single message allows to configure self avoidance for the character.BBDD Self avoidance tech. - - - - - Creates a new Instance of the ConfigureSelfAvoidanceHelper for sending a ConfigureSelfAvoidance to a given . - - The to send the ConfigureSelfAvoidance to. - - this single message allows to configure self avoidance for the character.BBDD Self avoidance tech. - - - - - Sets the UseSelfAvoidance setting for this . - Enable or disable self avoidance tech. - - - Default value = False. - - - - - Sets the OverwriteDragReduction setting for this . - Specify whether self avoidance tech should use original IK input target or the target that has been already modified by getStabilisedPos() tech i.e. function that compensates for rotational and linear velocity of shoulder/thigh. - - - Default value = False. - - - - - Sets the TorsoSwingFraction setting for this . - Place the adjusted target this much along the arc between effector (wrist) and target, value in range [0,1]. - - - Default value = 0.8f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the MaxTorsoSwingAngleRad setting for this . - Max value on the effector (wrist) to adjusted target offset. - - - Default value = 0.8f. - Min value = 0.0f. - Max value = 1.6f. - - - - - Sets the SelfAvoidIfInSpineBoundsOnly setting for this . - Restrict self avoidance to operate on targets that are within character torso bounds only. - - - Default value = False. - - - - - Sets the SelfAvoidAmount setting for this . - Amount of self avoidance offset applied when angle from effector (wrist) to target is greater then right angle i.e. when total offset is a blend between where effector currently is to value that is a product of total arm length and selfAvoidAmount. SelfAvoidAmount is in a range between [0, 1]. - - - Default value = 0.5f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the OverwriteTwist setting for this . - Overwrite desired IK twist with self avoidance procedural twist. - - - Default value = False. - - - - - Sets the UsePolarPathAlgorithm setting for this . - Use the alternative self avoidance algorithm that is based on linear and polar target blending. WARNING: It only requires "radius" in terms of parametrization. - - - Default value = False. - - - - - Sets the Radius setting for this . - Self avoidance radius, measured out from the spine axis along the plane perpendicular to that axis. The closer is the proximity of reaching target to that radius, the more polar (curved) motion is used for offsetting the target. WARNING: Parameter only used by the alternative algorithm that is based on linear and polar target blending. - - - Default value = 0.3f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Creates a new Instance of the ConfigureBulletsHelper for sending a ConfigureBullets to a given . - - The to send the ConfigureBullets to. - - - - Sets the ImpulseSpreadOverParts setting for this . - spreads impulse across parts. currently only for spine parts, not limbs. - - - Default value = False. - - - - - Sets the ImpulseLeakageStrengthScaled setting for this . - for weaker characters subsequent impulses remain strong. - - - Default value = False. - - - - - Sets the ImpulsePeriod setting for this . - duration that impulse is spread over (triangular shaped). - - - Default value = 0.1f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the ImpulseTorqueScale setting for this . - An impulse applied at a point on a body equivalent to an impulse at the centre of the body and a torque. This parameter scales the torque component. (The torque component seems to be excite the rage looseness bug which sends the character in a sometimes wildly different direction to an applied impulse). - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the LoosenessFix setting for this . - Fix the rage looseness bug by applying only the impulse at the centre of the body unless it is a spine part then apply the twist component only of the torque as well. - - - Default value = False. - - - - - Sets the ImpulseDelay setting for this . - time from hit before impulses are being applied. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the ImpulseReductionPerShot setting for this . - by how much are subsequent impulses reduced (e.g. 0.0: no reduction, 0.1: 10% reduction each new hit). - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the ImpulseRecovery setting for this . - recovery rate of impulse strength per second (impulse strength from 0.0:1.0). At 60fps a impulseRecovery=60.0 will recover in 1 frame. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 60.0f. - - - - - Sets the ImpulseMinLeakage setting for this . - the minimum amount of impulse leakage allowed. - - - Default value = 0.2f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the TorqueMode setting for this . - - - Default value = . - If - proportional to character strength, can reduce impulse amount. - If - no reduction of impulse and not proportional to character strength. - - - - - Sets the TorqueSpinMode setting for this . - - - Default value = . - If a burst effect is achieved. - - - - - Sets the TorqueFilterMode setting for this . - - - Default value = . - - - - - Sets the TorqueAlwaysSpine3 setting for this . - always apply torques to spine3 instead of actual part hit. - - - Default value = True. - - - - - Sets the TorqueDelay setting for this . - time from hit before torques are being applied. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the TorquePeriod setting for this . - duration of torque. - - - Default value = 0.1f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the TorqueGain setting for this . - multiplies impulse magnitude to arrive at torque that is applied. - - - Default value = 4.0f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the TorqueCutoff setting for this . - minimum ratio of impulse that remains after converting to torque (if in strength-proportional mode). - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the TorqueReductionPerTick setting for this . - ratio of torque for next tick (e.g. 1.0: not reducing over time, 0.9: each tick torque is reduced by 10%). - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the LiftGain setting for this . - amount of lift (directly multiplies torque axis to give lift force). - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the CounterImpulseDelay setting for this . - time after impulse is applied that counter impulse is applied. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the CounterImpulseMag setting for this . - amount of the original impulse that is countered. - - - Default value = 0.5f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the CounterAfterMagReached setting for this . - applies the counter impulse counterImpulseDelay(secs) after counterImpulseMag of the Impulse has been applied. - - - Default value = False. - - - - - Sets the DoCounterImpulse setting for this . - add a counter impulse to the pelvis. - - - Default value = False. - - - - - Sets the CounterImpulse2Hips setting for this . - amount of the counter impulse applied to hips - the rest is applied to the part originally hit. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the ImpulseNoBalMult setting for this . - amount to scale impulse by if the dynamicBalance is not OK. 1.0 means this functionality is not applied. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the ImpulseBalStabStart setting for this . - 100% LE Start to impulseBalStabMult*100% GT End. NB: Start LT End. - - - Default value = 3.0f. - Min value = 0.0f. - Max value = 100.0f. - - - - - Sets the ImpulseBalStabEnd setting for this . - 100% LE Start to impulseBalStabMult*100% GT End. NB: Start LT End. - - - Default value = 10.0f. - Min value = 0.0f. - Max value = 100.0f. - - - - - Sets the ImpulseBalStabMult setting for this . - 100% LE Start to impulseBalStabMult*100% GT End. NB: leaving this as 1.0 means this functionality is not applied and Start and End have no effect. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the ImpulseSpineAngStart setting for this . - 100% GE Start to impulseSpineAngMult*100% LT End. NB: Start GT End. This the dot of hip2Head with up. - - - Default value = 0.7f. - Min value = -1.0f. - Max value = 1.0f. - - - - - Sets the ImpulseSpineAngEnd setting for this . - 100% GE Start to impulseSpineAngMult*100% LT End. NB: Start GT End. This the dot of hip2Head with up. - - - Default value = 0.2f. - Min value = -1.0f. - Max value = 1.0f. - - - - - Sets the ImpulseSpineAngMult setting for this . - 100% GE Start to impulseSpineAngMult*100% LT End. NB: leaving this as 1.0 means this functionality is not applied and Start and End have no effect. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the ImpulseVelStart setting for this . - 100% LE Start to impulseVelMult*100% GT End. NB: Start LT End. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 100.0f. - - - - - Sets the ImpulseVelEnd setting for this . - 100% LE Start to impulseVelMult*100% GT End. NB: Start LT End. - - - Default value = 4.0f. - Min value = 0.0f. - Max value = 100.0f. - - - - - Sets the ImpulseVelMult setting for this . - 100% LE Start to impulseVelMult*100% GT End. NB: leaving this as 1.0 means this functionality is not applied and Start and End have no effect. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the ImpulseAirMult setting for this . - amount to scale impulse by if the character is airborne and dynamicBalance is OK and impulse is above impulseAirMultStart. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the ImpulseAirMultStart setting for this . - if impulse is above this value scale it by impulseAirMult. - - - Default value = 100.0f. - Min value = 0.0f. - - - - - Sets the ImpulseAirMax setting for this . - amount to clamp impulse to if character is airborne and dynamicBalance is OK. - - - Default value = 100.0f. - Min value = 0.0f. - - - - - Sets the ImpulseAirApplyAbove setting for this . - if impulse is above this amount then do not scale/clamp just let it through as is - it's a shotgun or cannon. - - - Default value = 399.0f. - Min value = 0.0f. - - - - - Sets the ImpulseAirOn setting for this . - scale and/or clamp impulse if the character is airborne and dynamicBalance is OK. - - - Default value = False. - - - - - Sets the ImpulseOneLegMult setting for this . - amount to scale impulse by if the character is contacting with one foot only and dynamicBalance is OK and impulse is above impulseAirMultStart. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the ImpulseOneLegMultStart setting for this . - if impulse is above this value scale it by impulseOneLegMult. - - - Default value = 100.0f. - Min value = 0.0f. - - - - - Sets the ImpulseOneLegMax setting for this . - amount to clamp impulse to if character is contacting with one foot only and dynamicBalance is OK. - - - Default value = 100.0f. - Min value = 0.0f. - - - - - Sets the ImpulseOneLegApplyAbove setting for this . - if impulse is above this amount then do not scale/clamp just let it through as is - it's a shotgun or cannon. - - - Default value = 399.0f. - Min value = 0.0f. - - - - - Sets the ImpulseOneLegOn setting for this . - scale and/or clamp impulse if the character is contacting with one leg only and dynamicBalance is OK. - - - Default value = False. - - - - - Sets the RbRatio setting for this . - 0.0 no rigidBody response, 0.5 half partForce half rigidBody, 1.0 = no partForce full rigidBody. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the RbLowerShare setting for this . - rigid body response is shared between the upper and lower body (rbUpperShare = 1-rbLowerShare). rbLowerShare=0.5 gives upper and lower share scaled by mass. i.e. if 70% ub mass and 30% lower mass then rbLowerShare=0.5 gives actualrbShare of 0.7ub and 0.3lb. rbLowerShare GT 0.5 scales the ub share down from 0.7 and the lb up from 0.3. - - - Default value = 0.5f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the RbMoment setting for this . - 0.0 only force, 0.5 = force and half the rigid body moment applied, 1.0 = force and full rigidBody moment. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the RbMaxTwistMomentArm setting for this . - Maximum twist arm moment of bullet applied. - - - Default value = 0.5f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the RbMaxBroomMomentArm setting for this . - Maximum broom((everything but the twist) arm moment of bullet applied. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the RbRatioAirborne setting for this . - if Airborne: 0.0 no rigidBody response, 0.5 half partForce half rigidBody, 1.0 = no partForce full rigidBody. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the RbMomentAirborne setting for this . - if Airborne: 0.0 only force, 0.5 = force and half the rigid body moment applied, 1.0 = force and full rigidBody moment. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the RbMaxTwistMomentArmAirborne setting for this . - if Airborne: Maximum twist arm moment of bullet applied. - - - Default value = 0.5f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the RbMaxBroomMomentArmAirborne setting for this . - if Airborne: Maximum broom((everything but the twist) arm moment of bullet applied. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the RbRatioOneLeg setting for this . - if only one leg in contact: 0.0 no rigidBody response, 0.5 half partForce half rigidBody, 1.0 = no partForce full rigidBody. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the RbMomentOneLeg setting for this . - if only one leg in contact: 0.0 only force, 0.5 = force and half the rigid body moment applied, 1.0 = force and full rigidBody moment. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the RbMaxTwistMomentArmOneLeg setting for this . - if only one leg in contact: Maximum twist arm moment of bullet applied. - - - Default value = 0.5f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the RbMaxBroomMomentArmOneLeg setting for this . - if only one leg in contact: Maximum broom((everything but the twist) arm moment of bullet applied. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the RbTwistAxis setting for this . - - - Default value = . - . - - - - Sets the RbPivot setting for this . - if false pivot around COM always, if true change pivot depending on foot contact: to feet centre if both feet in contact, or foot position if 1 foot in contact or COM position if no feet in contact. - - - Default value = False. - - - - - Creates a new Instance of the ConfigureBulletsExtraHelper for sending a ConfigureBulletsExtra to a given . - - The to send the ConfigureBulletsExtra to. - - - - Sets the ImpulseSpreadOverParts setting for this . - spreads impulse across parts. currently only for spine parts, not limbs. - - - Default value = False. - - - - - Sets the ImpulsePeriod setting for this . - duration that impulse is spread over (triangular shaped). - - - Default value = 0.1f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the ImpulseTorqueScale setting for this . - An impulse applied at a point on a body equivalent to an impulse at the centre of the body and a torque. This parameter scales the torque component. (The torque component seems to be excite the rage looseness bug which sends the character in a sometimes wildly different direction to an applied impulse). - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the LoosenessFix setting for this . - Fix the rage looseness bug by applying only the impulse at the centre of the body unless it is a spine part then apply the twist component only of the torque as well. - - - Default value = False. - - - - - Sets the ImpulseDelay setting for this . - time from hit before impulses are being applied. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the TorqueMode setting for this . - - - Default value = . - If - proportional to character strength, can reduce impulse amount. - If - no reduction of impulse and not proportional to character strength. - - - - - Sets the TorqueSpinMode setting for this . - - - Default value = . - If a burst effect is achieved. - - - - - Sets the TorqueFilterMode setting for this . - - - Default value = . - - - - - Sets the TorqueAlwaysSpine3 setting for this . - always apply torques to spine3 instead of actual part hit. - - - Default value = True. - - - - - Sets the TorqueDelay setting for this . - time from hit before torques are being applied. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the TorquePeriod setting for this . - duration of torque. - - - Default value = 0.1f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the TorqueGain setting for this . - multiplies impulse magnitude to arrive at torque that is applied. - - - Default value = 4.0f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the TorqueCutoff setting for this . - minimum ratio of impulse that remains after converting to torque (if in strength-proportional mode). - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the TorqueReductionPerTick setting for this . - ratio of torque for next tick (e.g. 1.0: not reducing over time, 0.9: each tick torque is reduced by 10%). - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the LiftGain setting for this . - amount of lift (directly multiplies torque axis to give lift force). - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the CounterImpulseDelay setting for this . - time after impulse is applied that counter impulse is applied. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the CounterImpulseMag setting for this . - amount of the original impulse that is countered. - - - Default value = 0.5f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the CounterAfterMagReached setting for this . - applies the counter impulse counterImpulseDelay(secs) after counterImpulseMag of the Impulse has been applied. - - - Default value = False. - - - - - Sets the DoCounterImpulse setting for this . - add a counter impulse to the pelvis. - - - Default value = False. - - - - - Sets the CounterImpulse2Hips setting for this . - amount of the counter impulse applied to hips - the rest is applied to the part originally hit. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the ImpulseNoBalMult setting for this . - amount to scale impulse by if the dynamicBalance is not OK. 1.0 means this functionality is not applied. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the ImpulseBalStabStart setting for this . - 100% LE Start to impulseBalStabMult*100% GT End. NB: Start LT End. - - - Default value = 3.0f. - Min value = 0.0f. - Max value = 100.0f. - - - - - Sets the ImpulseBalStabEnd setting for this . - 100% LE Start to impulseBalStabMult*100% GT End. NB: Start LT End. - - - Default value = 10.0f. - Min value = 0.0f. - Max value = 100.0f. - - - - - Sets the ImpulseBalStabMult setting for this . - 100% LE Start to impulseBalStabMult*100% GT End. NB: leaving this as 1.0 means this functionality is not applied and Start and End have no effect. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the ImpulseSpineAngStart setting for this . - 100% GE Start to impulseSpineAngMult*100% LT End. NB: Start GT End. This the dot of hip2Head with up. - - - Default value = 0.7f. - Min value = -1.0f. - Max value = 1.0f. - - - - - Sets the ImpulseSpineAngEnd setting for this . - 100% GE Start to impulseSpineAngMult*100% LT End. NB: Start GT End. This the dot of hip2Head with up. - - - Default value = 0.2f. - Min value = -1.0f. - Max value = 1.0f. - - - - - Sets the ImpulseSpineAngMult setting for this . - 100% GE Start to impulseSpineAngMult*100% LT End. NB: leaving this as 1.0 means this functionality is not applied and Start and End have no effect. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the ImpulseVelStart setting for this . - 100% LE Start to impulseVelMult*100% GT End. NB: Start LT End. - - - Default value = 4.0f. - Min value = 0.0f. - Max value = 100.0f. - - - - - Sets the ImpulseVelEnd setting for this . - 100% LE Start to impulseVelMult*100% GT End. NB: Start LT End. - - - Default value = 4.0f. - Min value = 0.0f. - Max value = 100.0f. - - - - - Sets the ImpulseVelMult setting for this . - 100% LE Start to impulseVelMult*100% GT End. NB: leaving this as 1.0 means this functionality is not applied and Start and End have no effect. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the ImpulseAirMult setting for this . - amount to scale impulse by if the character is airborne and dynamicBalance is OK and impulse is above impulseAirMultStart. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the ImpulseAirMultStart setting for this . - if impulse is above this value scale it by impulseAirMult. - - - Default value = 100.0f. - Min value = 0.0f. - - - - - Sets the ImpulseAirMax setting for this . - amount to clamp impulse to if character is airborne and dynamicBalance is OK. - - - Default value = 100.0f. - Min value = 0.0f. - - - - - Sets the ImpulseAirApplyAbove setting for this . - if impulse is above this amount then do not scale/clamp just let it through as is - it's a shotgun or cannon. - - - Default value = 399.0f. - Min value = 0.0f. - - - - - Sets the ImpulseAirOn setting for this . - scale and/or clamp impulse if the character is airborne and dynamicBalance is OK. - - - Default value = False. - - - - - Sets the ImpulseOneLegMult setting for this . - amount to scale impulse by if the character is contacting with one foot only and dynamicBalance is OK and impulse is above impulseAirMultStart. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the ImpulseOneLegMultStart setting for this . - if impulse is above this value scale it by impulseOneLegMult. - - - Default value = 100.0f. - Min value = 0.0f. - - - - - Sets the ImpulseOneLegMax setting for this . - amount to clamp impulse to if character is contacting with one foot only and dynamicBalance is OK. - - - Default value = 100.0f. - Min value = 0.0f. - - - - - Sets the ImpulseOneLegApplyAbove setting for this . - if impulse is above this amount then do not scale/clamp just let it through as is - it's a shotgun or cannon. - - - Default value = 399.0f. - Min value = 0.0f. - - - - - Sets the ImpulseOneLegOn setting for this . - scale and/or clamp impulse if the character is contacting with one leg only and dynamicBalance is OK. - - - Default value = False. - - - - - Sets the RbRatio setting for this . - 0.0 no rigidBody response, 0.5 half partForce half rigidBody, 1.0 = no partForce full rigidBody. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the RbLowerShare setting for this . - rigid body response is shared between the upper and lower body (rbUpperShare = 1-rbLowerShare). rbLowerShare=0.5 gives upper and lower share scaled by mass. i.e. if 70% ub mass and 30% lower mass then rbLowerShare=0.5 gives actualrbShare of 0.7ub and 0.3lb. rbLowerShare GT 0.5 scales the ub share down from 0.7 and the lb up from 0.3. - - - Default value = 0.5f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the RbMoment setting for this . - 0.0 only force, 0.5 = force and half the rigid body moment applied, 1.0 = force and full rigidBody moment. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the RbMaxTwistMomentArm setting for this . - Maximum twist arm moment of bullet applied. - - - Default value = 0.5f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the RbMaxBroomMomentArm setting for this . - Maximum broom((everything but the twist) arm moment of bullet applied. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the RbRatioAirborne setting for this . - if Airborne: 0.0 no rigidBody response, 0.5 half partForce half rigidBody, 1.0 = no partForce full rigidBody. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the RbMomentAirborne setting for this . - if Airborne: 0.0 only force, 0.5 = force and half the rigid body moment applied, 1.0 = force and full rigidBody moment. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the RbMaxTwistMomentArmAirborne setting for this . - if Airborne: Maximum twist arm moment of bullet applied. - - - Default value = 0.5f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the RbMaxBroomMomentArmAirborne setting for this . - if Airborne: Maximum broom((everything but the twist) arm moment of bullet applied. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the RbRatioOneLeg setting for this . - if only one leg in contact: 0.0 no rigidBody response, 0.5 half partForce half rigidBody, 1.0 = no partForce full rigidBody. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the RbMomentOneLeg setting for this . - if only one leg in contact: 0.0 only force, 0.5 = force and half the rigid body moment applied, 1.0 = force and full rigidBody moment. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the RbMaxTwistMomentArmOneLeg setting for this . - if only one leg in contact: Maximum twist arm moment of bullet applied. - - - Default value = 0.5f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the RbMaxBroomMomentArmOneLeg setting for this . - if only one leg in contact: Maximum broom((everything but the twist) arm moment of bullet applied. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the RbTwistAxis setting for this . - - - Default value = . - . - - - - Sets the RbPivot setting for this . - if false pivot around COM always, if true change pivot depending on foot contact: to feet centre if both feet in contact, or foot position if 1 foot in contact or COM position if no feet in contact. - - - Default value = False. - - - - - Enable/disable/edit character limits in real time. This adjusts limits in RAGE-native space and will *not* reorient the joint. - - - - - Creates a new Instance of the ConfigureLimitsHelper for sending a ConfigureLimits to a given . - - The to send the ConfigureLimits to. - - Enable/disable/edit character limits in real time. This adjusts limits in RAGE-native space and will *not* reorient the joint. - - - - - Sets the Mask setting for this . - Two character body-masking value, bitwise joint mask or bitwise logic string of two character body-masking value for joint limits to configure. Ignored if index != -1. - - - Default value = fb. - - - - - Sets the Enable setting for this . - If false, disable (set all to PI, -PI) limits. - - - Default value = True. - - - - - Sets the ToDesired setting for this . - If true, set limits to accommodate current desired angles. - - - Default value = False. - - - - - Sets the Restore setting for this . - Return to cached defaults?. - - - Default value = False. - - - - - Sets the ToCurAnimation setting for this . - If true, set limits to the current animated limits. - - - Default value = False. - - - - - Sets the Index setting for this . - Index of effector to configure. Set to -1 to use mask. - - - Default value = -1. - Min value = -1. - - - - - Sets the Lean1 setting for this . - Custom limit values to use if not setting limits to desired. Limits are RAGE-native, not NM-wrapper-native. - - - Default value = 1.6f. - Min value = 0.0f. - Max value = 3.1f. - - - - - Sets the Lean2 setting for this . - - - Default value = 1.6f. - Min value = 0.0f. - Max value = 3.1f. - - - - - Sets the Twist setting for this . - - - Default value = 1.6f. - Min value = 0.0f. - Max value = 3.1f. - - - - - Sets the Margin setting for this . - Joint limit margin to add to current animation limits when using those to set runtime limits. - - - Default value = 0.2f. - Min value = 0.0f. - Max value = 3.1f. - - - - - Creates a new Instance of the ConfigureSoftLimitHelper for sending a ConfigureSoftLimit to a given . - - The to send the ConfigureSoftLimit to. - - - - Sets the Index setting for this . - Select limb that the soft limit is going to be applied to. - - - Default value = 0. - Min value = 0. - Max value = 3. - - - - - Sets the Stiffness setting for this . - Stiffness of the soft limit. Parameter is used to calculate spring term that contributes to the desired acceleration. - - - Default value = 15.0f. - Min value = 0.0f. - Max value = 30.0f. - - - - - Sets the Damping setting for this . - Damping of the soft limit. Parameter is used to calculate damper term that contributes to the desired acceleration. To have the system critically dampened set it to 1.0. - - - Default value = 1.0f. - Min value = 0.9f. - Max value = 1.1f. - - - - - Sets the LimitAngle setting for this . - Soft limit angle. Positive angle in RAD, measured relatively either from hard limit maxAngle (approach direction = -1) or minAngle (approach direction = 1). This angle will be clamped if outside the joint hard limit range. - - - Default value = 0.4f. - Min value = 0.0f. - Max value = 6.3f. - - - - - Sets the ApproachDirection setting for this . - Limit angle can be measured relatively to joints hard limit minAngle or maxAngle. Set approachDirection to +1 to measure soft limit angle relatively to hard limit minAngle that corresponds to the maximum stretch of the elbow. Set it to -1 to measure soft limit angle relatively to hard limit maxAngle that corresponds to the maximum stretch of the knee. - - - Default value = 1. - Min value = -1. - Max value = 1. - - - - - Sets the VelocityScaled setting for this . - Scale stiffness based on character angular velocity. - - - Default value = False. - - - - - This single message allows you to configure the injured arm reaction during shot. - - - - - Creates a new Instance of the ConfigureShotInjuredArmHelper for sending a ConfigureShotInjuredArm to a given . - - The to send the ConfigureShotInjuredArm to. - - This single message allows you to configure the injured arm reaction during shot. - - - - - Sets the InjuredArmTime setting for this . - length of the reaction. - - - Default value = 0.3f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the HipYaw setting for this . - Amount of hip twist. (Negative values twist into bullet direction - probably not what is wanted). - - - Default value = 0.8f. - Min value = -2.0f. - Max value = 2.0f. - - - - - Sets the HipRoll setting for this . - Amount of hip roll. - - - Default value = 0.0f. - Min value = -2.0f. - Max value = 2.0f. - - - - - Sets the ForceStepExtraHeight setting for this . - Additional height added to stepping foot. - - - Default value = 0.1f. - Min value = 0.0f. - Max value = 0.7f. - - - - - Sets the ForceStep setting for this . - force a step to be taken whether pushed out of balance or not. - - - Default value = True. - - - - - Sets the StepTurn setting for this . - turn the character using the balancer. - - - Default value = True. - - - - - Sets the VelMultiplierStart setting for this . - Start velocity where parameters begin to be ramped down to zero linearly. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 20.0f. - - - - - Sets the VelMultiplierEnd setting for this . - End velocity of ramp where parameters are scaled to zero. - - - Default value = 5.0f. - Min value = 1.0f. - Max value = 40.0f. - - - - - Sets the VelForceStep setting for this . - Velocity above which a step is not forced. - - - Default value = 0.8f. - Min value = 0.0f. - Max value = 20.0f. - - - - - Sets the VelStepTurn setting for this . - Velocity above which a stepTurn is not asked for. - - - Default value = 0.8f. - Min value = 0.0f. - Max value = 20.0f. - - - - - Sets the VelScales setting for this . - Use the velocity scaling parameters. Tune for standing still then use velocity scaling to make sure a running character stays balanced (the turning tends to make the character fall over more at speed). - - - Default value = True. - - - - - This single message allows you to configure the injured leg reaction during shot. - - - - - Creates a new Instance of the ConfigureShotInjuredLegHelper for sending a ConfigureShotInjuredLeg to a given . - - The to send the ConfigureShotInjuredLeg to. - - This single message allows you to configure the injured leg reaction during shot. - - - - - Sets the TimeBeforeCollapseWoundLeg setting for this . - time before a wounded leg is set to be weak and cause the character to collapse. - - - Default value = 0.3f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the LegInjuryTime setting for this . - Leg inury duration (reaction to being shot in leg). - - - Default value = 0.4f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the LegForceStep setting for this . - force a step to be taken whether pushed out of balance or not. - - - Default value = True. - - - - - Sets the LegLimpBend setting for this . - Bend the legs via the balancer by this amount if stepping on the injured leg. 0.2 seems a good default. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the LegLiftTime setting for this . - Leg lift duration (reaction to being shot in leg) (lifting happens when not stepping with other leg). - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the LegInjury setting for this . - Leg injury - leg strength is reduced. - - - Default value = 0.3f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the LegInjuryHipPitch setting for this . - Leg injury bend forwards amount when not lifting leg. - - - Default value = 0.0f. - Min value = -1.0f. - Max value = 1.0f. - - - - - Sets the LegInjuryLiftHipPitch setting for this . - Leg injury bend forwards amount when lifting leg (lifting happens when not stepping with other leg). - - - Default value = 0.0f. - Min value = -1.0f. - Max value = 1.0f. - - - - - Sets the LegInjurySpineBend setting for this . - Leg injury bend forwards amount when not lifting leg. - - - Default value = 0.1f. - Min value = -1.0f. - Max value = 1.0f. - - - - - Sets the LegInjuryLiftSpineBend setting for this . - Leg injury bend forwards amount when lifting leg (lifting happens when not stepping with other leg). - - - Default value = 0.2f. - Min value = -1.0f. - Max value = 1.0f. - - - - - Creates a new Instance of the DefineAttachedObjectHelper for sending a DefineAttachedObject to a given . - - The to send the DefineAttachedObject to. - - - - Sets the PartIndex setting for this . - index of part to attach to. - - - Default value = -1. - Min value = -1. - Max value = 21. - - - - - Sets the ObjectMass setting for this . - mass of the attached object. - - - Default value = 0.0f. - Min value = 0.0f. - - - - - Sets the WorldPos setting for this . - world position of attached object's centre of mass. must be updated each frame. - - - Default value = Vector3(0.0f, 0.0f, 0.0f). - - - - - Apply an impulse to a named body part. - - - - - Creates a new Instance of the ForceToBodyPartHelper for sending a ForceToBodyPart to a given . - - The to send the ForceToBodyPart to. - - Apply an impulse to a named body part. - - - - - Sets the PartIndex setting for this . - part or link or bound index. - - - Default value = 0. - Min value = 0. - Max value = 28. - - - - - Sets the Force setting for this . - force to apply. - - - Default value = Vector3(0.0f, -50.0f, 0.0f). - Min value = -100000.0f. - Max value = 100000.0f. - - - - - Sets the ForceDefinedInPartSpace setting for this . - - - Default value = False. - - - - - Creates a new Instance of the LeanInDirectionHelper for sending a LeanInDirection to a given . - - The to send the LeanInDirection to. - - - - Sets the LeanAmount setting for this . - amount of lean, 0 to about 0.5. -ve will move away from the target. - - - Default value = 0.2f. - Min value = -1.0f. - Max value = 1.0f. - - - - - Sets the Dir setting for this . - direction to lean in. - - - Default value = Vector3(0.0f, 0.0f, 1.0f). - Min value = 0.0f. - - - - - Creates a new Instance of the LeanRandomHelper for sending a LeanRandom to a given . - - The to send the LeanRandom to. - - - - Sets the LeanAmountMin setting for this . - minimum amount of lean. - - - Default value = 0.2f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the LeanAmountMax setting for this . - maximum amount of lean. - - - Default value = 0.2f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the ChangeTimeMin setting for this . - min time until changing direction. - - - Default value = 0.5f. - Min value = 0.0f. - Max value = 20.0f. - - - - - Sets the ChangeTimeMax setting for this . - maximum time until changing direction. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 20.0f. - - - - - Creates a new Instance of the LeanToPositionHelper for sending a LeanToPosition to a given . - - The to send the LeanToPosition to. - - - - Sets the LeanAmount setting for this . - amount of lean, 0 to about 0.5. -ve will move away from the target. - - - Default value = 0.2f. - Min value = -0.5f. - Max value = 0.5f. - - - - - Sets the Pos setting for this . - position to head towards. - - - Default value = Vector3(0.0f, 0.0f, 0.0f). - - - - - Creates a new Instance of the LeanTowardsObjectHelper for sending a LeanTowardsObject to a given . - - The to send the LeanTowardsObject to. - - - - Sets the LeanAmount setting for this . - amount of lean, 0 to about 0.5. -ve will move away from the target. - - - Default value = 0.2f. - Min value = -0.5f. - Max value = 0.5f. - - - - - Sets the Offset setting for this . - offset from instance position added when calculating position to lean to. - - - Default value = Vector3(0.0f, 0.0f, 0.0f). - Min value = -100.0f. - Max value = 100.0f. - - - - - Sets the InstanceIndex setting for this . - levelIndex of object to lean towards. - - - Default value = -1. - Min value = -1. - - - - - Sets the BoundIndex setting for this . - boundIndex of object to lean towards (0 = just use instance coordinates). - - - Default value = 0. - Min value = 0. - - - - - Creates a new Instance of the HipsLeanInDirectionHelper for sending a HipsLeanInDirection to a given . - - The to send the HipsLeanInDirection to. - - - - Sets the LeanAmount setting for this . - amount of lean, 0 to about 0.5. -ve will move away from the target. - - - Default value = 0.2f. - Min value = -1.0f. - Max value = 1.0f. - - - - - Sets the Dir setting for this . - direction to lean in. - - - Default value = Vector3(0.0f, 0.0f, 1.0f). - Min value = 0.0f. - - - - - Creates a new Instance of the HipsLeanRandomHelper for sending a HipsLeanRandom to a given . - - The to send the HipsLeanRandom to. - - - - Sets the LeanAmountMin setting for this . - minimum amount of lean. - - - Default value = 0.3f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the LeanAmountMax setting for this . - maximum amount of lean. - - - Default value = 0.4f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the ChangeTimeMin setting for this . - min time until changing direction. - - - Default value = 2.0f. - Min value = 0.0f. - Max value = 20.0f. - - - - - Sets the ChangeTimeMax setting for this . - maximum time until changing direction. - - - Default value = 4.0f. - Min value = 0.0f. - Max value = 20.0f. - - - - - Creates a new Instance of the HipsLeanToPositionHelper for sending a HipsLeanToPosition to a given . - - The to send the HipsLeanToPosition to. - - - - Sets the LeanAmount setting for this . - amount of lean, 0 to about 0.5. -ve will move away from the target. - - - Default value = 0.2f. - Min value = -0.5f. - Max value = 0.5f. - - - - - Sets the Pos setting for this . - position to head towards. - - - Default value = Vector3(0.0f, 0.0f, 0.0f). - - - - - Creates a new Instance of the HipsLeanTowardsObjectHelper for sending a HipsLeanTowardsObject to a given . - - The to send the HipsLeanTowardsObject to. - - - - Sets the LeanAmount setting for this . - amount of lean, 0 to about 0.5. -ve will move away from the target. - - - Default value = 0.2f. - Min value = -0.5f. - Max value = 0.5f. - - - - - Sets the Offset setting for this . - offset from instance position added when calculating position to lean to. - - - Default value = Vector3(0.0f, 0.0f, 0.0f). - Min value = -100.0f. - Max value = 100.0f. - - - - - Sets the InstanceIndex setting for this . - levelIndex of object to lean hips towards. - - - Default value = -1. - Min value = -1. - - - - - Sets the BoundIndex setting for this . - boundIndex of object to lean hips towards (0 = just use instance coordinates). - - - Default value = 0. - Min value = 0. - - - - - Creates a new Instance of the ForceLeanInDirectionHelper for sending a ForceLeanInDirection to a given . - - The to send the ForceLeanInDirection to. - - - - Sets the LeanAmount setting for this . - amount of lean, 0 to about 0.5. -ve will move away from the target. - - - Default value = 0.2f. - Min value = -1.0f. - Max value = 1.0f. - - - - - Sets the Dir setting for this . - direction to lean in. - - - Default value = Vector3(0.0f, 0.0f, 1.0f). - Min value = 0.0f. - - - - - Sets the BodyPart setting for this . - body part that the force is applied to. - - - Default value = 0. - Min value = 0. - Max value = 21. - - - - - Creates a new Instance of the ForceLeanRandomHelper for sending a ForceLeanRandom to a given . - - The to send the ForceLeanRandom to. - - - - Sets the LeanAmountMin setting for this . - minimum amount of lean. - - - Default value = 0.3f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the LeanAmountMax setting for this . - maximum amount of lean. - - - Default value = 0.4f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the ChangeTimeMin setting for this . - min time until changing direction. - - - Default value = 2.0f. - Min value = 0.0f. - Max value = 20.0f. - - - - - Sets the ChangeTimeMax setting for this . - maximum time until changing direction. - - - Default value = 4.0f. - Min value = 0.0f. - Max value = 20.0f. - - - - - Sets the BodyPart setting for this . - body part that the force is applied to. - - - Default value = 0. - Min value = 0. - Max value = 21. - - - - - Creates a new Instance of the ForceLeanToPositionHelper for sending a ForceLeanToPosition to a given . - - The to send the ForceLeanToPosition to. - - - - Sets the LeanAmount setting for this . - amount of lean, 0 to about 0.5. -ve will move away from the target. - - - Default value = 0.2f. - Min value = -0.5f. - Max value = 0.5f. - - - - - Sets the Pos setting for this . - position to head towards. - - - Default value = Vector3(0.0f, 0.0f, 0.0f). - - - - - Sets the BodyPart setting for this . - body part that the force is applied to. - - - Default value = 0. - Min value = 0. - Max value = 21. - - - - - Creates a new Instance of the ForceLeanTowardsObjectHelper for sending a ForceLeanTowardsObject to a given . - - The to send the ForceLeanTowardsObject to. - - - - Sets the LeanAmount setting for this . - amount of lean, 0 to about 0.5. -ve will move away from the target. - - - Default value = 0.2f. - Min value = -0.5f. - Max value = 0.5f. - - - - - Sets the Offset setting for this . - offset from instance position added when calculating position to lean to. - - - Default value = Vector3(0.0f, 0.0f, 0.0f). - Min value = -100.0f. - Max value = 100.0f. - - - - - Sets the InstanceIndex setting for this . - levelIndex of object to move towards. - - - Default value = -1. - Min value = -1. - - - - - Sets the BoundIndex setting for this . - boundIndex of object to move towards (0 = just use instance coordinates). - - - Default value = 0. - Min value = 0. - - - - - Sets the BodyPart setting for this . - body part that the force is applied to. - - - Default value = 0. - Min value = 0. - Max value = 21. - - - - - Use this message to manually set the body stiffness values -before using Active Pose to drive to an animated pose, for example. - - - - - Creates a new Instance of the SetStiffnessHelper for sending a SetStiffness to a given . - - The to send the SetStiffness to. - - Use this message to manually set the body stiffness values -before using Active Pose to drive to an animated pose, for example. - - - - - Sets the BodyStiffness setting for this . - stiffness of whole character. - - - Default value = 12.0f. - Min value = 2.0f. - Max value = 20.0f. - - - - - Sets the Damping setting for this . - damping amount, less is underdamped. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 3.0f. - - - - - Sets the Mask setting for this . - Two character body-masking value, bitwise joint mask or bitwise logic string of two character body-masking value (see Active Pose notes for possible values). - - - Default value = fb. - - - - - Use this message to manually set the muscle stiffness values -before using Active Pose to drive to an animated pose, for example. - - - - - Creates a new Instance of the SetMuscleStiffnessHelper for sending a SetMuscleStiffness to a given . - - The to send the SetMuscleStiffness to. - - Use this message to manually set the muscle stiffness values -before using Active Pose to drive to an animated pose, for example. - - - - - Sets the MuscleStiffness setting for this . - muscle stiffness of joint/s. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 20.0f. - - - - - Sets the Mask setting for this . - Two character body-masking value, bitwise joint mask or bitwise logic string of two character body-masking value (see Active Pose notes for possible values). - - - Default value = fb. - - - - - Use this message to set the character's weapon mode. This is an alternativeto the setWeaponMode public function. - - - - - Creates a new Instance of the SetWeaponModeHelper for sending a SetWeaponMode to a given . - - The to send the SetWeaponMode to. - - Use this message to set the character's weapon mode. This is an alternativeto the setWeaponMode public function. - - - - - Sets the WeaponMode setting for this . - - - Default value = . - . - - - - Use this message to register weapon. This is an alternativeto the registerWeapon public function. - - - - - Creates a new Instance of the RegisterWeaponHelper for sending a RegisterWeapon to a given . - - The to send the RegisterWeapon to. - - Use this message to register weapon. This is an alternativeto the registerWeapon public function. - - - - - Sets the Hand setting for this . - - - Default value = . - - - - - Sets the LevelIndex setting for this . - Level index of the weapon. - - - Default value = -1. - Min value = -1. - - - - - Sets the ConstraintHandle setting for this . - pointer to the hand-gun constraint handle. - - - Default value = -1. - Min value = -1. - - - - - Sets the GunToHandA setting for this . - A vector of the gunToHand matrix. The gunToHandMatrix is the desired gunToHandMatrix in the aimingPose. (The gunToHandMatrix when pointGun starts can be different so will be blended to this desired one). - - - Default value = Vector3(1.0f, 0.0f, 0.0f). - Min value = 0.0f. - - - - - Sets the GunToHandB setting for this . - B vector of the gunToHand matrix. - - - Default value = Vector3(0.0f, 1.0f, 0.0f). - Min value = 0.0f. - - - - - Sets the GunToHandC setting for this . - C vector of the gunToHand matrix. - - - Default value = Vector3(0.0f, 0.0f, 1.0f). - Min value = 0.0f. - - - - - Sets the GunToHandD setting for this . - D vector of the gunToHand matrix. - - - Default value = Vector3(0.0f, 0.0f, 0.0f). - Min value = 0.0f. - - - - - Sets the GunToMuzzleInGun setting for this . - Gun centre to muzzle expressed in gun co-ordinates. To get the line of sight/barrel of the gun. Assumption: the muzzle direction is always along the same primary axis of the gun. - - - Default value = Vector3(0.0f, 0.0f, 0.0f). - - - - - Sets the GunToButtInGun setting for this . - Gun centre to butt expressed in gun co-ordinates. The gun pivots around this point when aiming. - - - Default value = Vector3(0.0f, 0.0f, 0.0f). - - - - - Creates a new Instance of the ShotRelaxHelper for sending a ShotRelax to a given . - - The to send the ShotRelax to. - - - - Sets the RelaxPeriodUpper setting for this . - time over which to relax to full relaxation for upper body. - - - Default value = 2.0f. - Min value = 0.0f. - Max value = 40.0f. - - - - - Sets the RelaxPeriodLower setting for this . - time over which to relax to full relaxation for lower body. - - - Default value = 0.4f. - Min value = 0.0f. - Max value = 40.0f. - - - - - One shot message apply a force to the hand as we fire the gun that should be in this hand. - - - - - Creates a new Instance of the FireWeaponHelper for sending a FireWeapon to a given . - - The to send the FireWeapon to. - - One shot message apply a force to the hand as we fire the gun that should be in this hand. - - - - - Sets the FiredWeaponStrength setting for this . - The force of the gun. - - - Default value = 1000.0f. - Min value = 0.0f. - Max value = 10000.0f. - - - - - Sets the GunHandEnum setting for this . - Which hand is the gun in. - - - Default value = . - - - - - Sets the ApplyFireGunForceAtClavicle setting for this . - Should we apply some of the force at the shoulder. Force double handed weapons (Ak47 etc). - - - Default value = False. - - - - - Sets the InhibitTime setting for this . - Minimum time before next fire impulse. - - - Default value = 0.4f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the Direction setting for this . - direction of impulse in gun frame. - - - Default value = Vector3(0.0f, 0.0f, 0.0f). - - - - - Sets the Split setting for this . - Split force between hand and clavicle when applyFireGunForceAtClavicle is true. 1 = all hand, 0 = all clavicle. - - - Default value = 0.5f. - Min value = 0.0f. - Max value = 1.0f. - - - - - One shot to give state of constraints on character and response to constraints. - - - - - Creates a new Instance of the ConfigureConstraintsHelper for sending a ConfigureConstraints to a given . - - The to send the ConfigureConstraints to. - - One shot to give state of constraints on character and response to constraints. - - - - - Sets the HandCuffs setting for this . - - - Default value = False. - - - - - Sets the HandCuffsBehindBack setting for this . - not implemented. - - - Default value = False. - - - - - Sets the LegCuffs setting for this . - not implemented. - - - Default value = False. - - - - - Sets the RightDominant setting for this . - - - Default value = False. - - - - - Sets the PassiveMode setting for this . - 0 setCurrent, 1= IK to dominant, (2=pointGunLikeIK //not implemented). - - - Default value = 0. - Min value = 0. - Max value = 5. - - - - - Sets the BespokeBehaviour setting for this . - not implemented. - - - Default value = False. - - - - - Sets the Blend2ZeroPose setting for this . - Blend Arms to zero pose. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Creates a new Instance of the StayUprightHelper for sending a StayUpright to a given . - - The to send the StayUpright to. - - - - Sets the UseForces setting for this . - enable force based constraint. - - - Default value = False. - - - - - Sets the UseTorques setting for this . - enable torque based constraint. - - - Default value = False. - - - - - Sets the LastStandMode setting for this . - Uses position/orientation control on the spine and drifts in the direction of bullets. This ignores all other stayUpright settings. - - - Default value = False. - - - - - Sets the LastStandSinkRate setting for this . - The sink rate (higher for a faster drop). - - - Default value = 0.3f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the LastStandHorizDamping setting for this . - Higher values for more damping. - - - Default value = 0.4f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the LastStandMaxTime setting for this . - Max time allowed in last stand mode. - - - Default value = 0.4f. - Min value = 0.0f. - Max value = 5.0f. - - - - - Sets the TurnTowardsBullets setting for this . - Use cheat torques to face the direction of bullets if not facing too far away. - - - Default value = False. - - - - - Sets the VelocityBased setting for this . - make strength of constraint function of COM velocity. Uses -1 for forceDamping if the damping is positive. - - - Default value = False. - - - - - Sets the TorqueOnlyInAir setting for this . - only apply torque based constraint when airBorne. - - - Default value = False. - - - - - Sets the ForceStrength setting for this . - strength of constraint. - - - Default value = 3.0f. - Min value = 0.0f. - Max value = 16.0f. - - - - - Sets the ForceDamping setting for this . - damping in constraint: -1 makes it scale automagically with forceStrength. Other negative values will scale this automagic damping. - - - Default value = -1.0f. - Min value = -1.0f. - Max value = 50.0f. - - - - - Sets the ForceFeetMult setting for this . - multiplier to the force applied to the feet. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the ForceSpine3Share setting for this . - share of pelvis force applied to spine3. - - - Default value = 0.3f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the ForceLeanReduction setting for this . - how much the character lean is taken into account when reducing the force. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the ForceInAirShare setting for this . - share of the feet force to the airborne foot. - - - Default value = 0.5f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the ForceMin setting for this . - when min and max are greater than 0 the constraint strength is determined from character strength, scaled into the range given by min and max. - - - Default value = -1.0f. - Min value = -1.0f. - Max value = 16.0f. - - - - - Sets the ForceMax setting for this . - see above. - - - Default value = -1.0f. - Min value = -1.0f. - Max value = 16.0f. - - - - - Sets the ForceSaturationVel setting for this . - when in velocityBased mode, the COM velocity at which constraint reaches maximum strength (forceStrength). - - - Default value = 4.0f. - Min value = 0.1f. - Max value = 10.0f. - - - - - Sets the ForceThresholdVel setting for this . - when in velocityBased mode, the COM velocity above which constraint starts applying forces. - - - Default value = 0.5f. - Min value = 0.0f. - Max value = 5.0f. - - - - - Sets the TorqueStrength setting for this . - strength of torque based constraint. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 16.0f. - - - - - Sets the TorqueDamping setting for this . - damping of torque based constraint. - - - Default value = 0.5f. - Min value = 0.0f. - Max value = 16.0f. - - - - - Sets the TorqueSaturationVel setting for this . - when in velocityBased mode, the COM velocity at which constraint reaches maximum strength (torqueStrength). - - - Default value = 4.0f. - Min value = 0.1f. - Max value = 10.0f. - - - - - Sets the TorqueThresholdVel setting for this . - when in velocityBased mode, the COM velocity above which constraint starts applying torques. - - - Default value = 2.5f. - Min value = 0.0f. - Max value = 5.0f. - - - - - Sets the SupportPosition setting for this . - distance the foot is behind Com projection that is still considered able to generate the support for the upright constraint. - - - Default value = 2.0f. - Min value = -2.0f. - Max value = 2.0f. - - - - - Sets the NoSupportForceMult setting for this . - still apply this fraction of the upright constaint force if the foot is not in a position (defined by supportPosition) to generate the support for the upright constraint. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the StepUpHelp setting for this . - strength of cheat force applied upwards to spine3 to help the character up steps/slopes. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 16.0f. - - - - - Sets the StayUpAcc setting for this . - How much the cheat force takes into account the acceleration of moving platforms. - - - Default value = 0.7f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the StayUpAccMax setting for this . - The maximum floorAcceleration (of a moving platform) that the cheat force takes into account. - - - Default value = 5.0f. - Min value = 0.0f. - Max value = 15.0f. - - - - - Send this message to immediately stop all behaviours from executing. - - - - - Creates a new Instance of the StopAllBehavioursHelper for sending a StopAllBehaviours to a given . - - The to send the StopAllBehaviours to. - - Send this message to immediately stop all behaviours from executing. - - - - - Sets character's strength on the dead-granny-to-healthy-terminator scale: [0..1]. - - - - - Creates a new Instance of the SetCharacterStrengthHelper for sending a SetCharacterStrength to a given . - - The to send the SetCharacterStrength to. - - Sets character's strength on the dead-granny-to-healthy-terminator scale: [0..1]. - - - - - Sets the CharacterStrength setting for this . - strength of character. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets character's health on the dead-to-alive scale: [0..1]. - - - - - Creates a new Instance of the SetCharacterHealthHelper for sending a SetCharacterHealth to a given . - - The to send the SetCharacterHealth to. - - Sets character's health on the dead-to-alive scale: [0..1]. - - - - - Sets the CharacterHealth setting for this . - health of character. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the type of reaction if catchFall is called. - - - - - Creates a new Instance of the SetFallingReactionHelper for sending a SetFallingReaction to a given . - - The to send the SetFallingReaction to. - - Sets the type of reaction if catchFall is called. - - - - - Sets the HandsAndKnees setting for this . - set to true to get handsAndKnees catchFall if catchFall called. If true allows the dynBalancer to stay on during the catchfall and modifies the catch fall to give a more alive looking performance (hands and knees for front landing or sitting up for back landing). - - - Default value = False. - - - - - Sets the CallRDS setting for this . - If true catchFall will call rollDownstairs if comVel GT comVelRDSThresh - prevents excessive sliding in catchFall. Was previously only true for handsAndKnees. - - - Default value = False. - - - - - Sets the ComVelRDSThresh setting for this . - comVel above which rollDownstairs will start - prevents excessive sliding in catchFall. - - - Default value = 2.0f. - Min value = 0.0f. - Max value = 20.0f. - - - - - Sets the ResistRolling setting for this . - For rds catchFall only: True to resist rolling motion (rolling motion is set off by ub contact and a sliding velocity), false to allow more of a continuous rolling (rolling motion is set off at a sliding velocity). - - - Default value = False. - - - - - Sets the ArmReduceSpeed setting for this . - Strength is reduced in the catchFall when the arms contact the ground. 0.2 is good for handsAndKnees. 2.5 is good for normal catchFall, anything lower than 1.0 for normal catchFall may lead to bad catchFall poses. - - - Default value = 2.5f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the ReachLengthMultiplier setting for this . - Reach length multiplier that scales characters arm topological length, value in range from (0, 1 GT where 1.0 means reach length is maximum. - - - Default value = 1.0f. - Min value = 0.3f. - Max value = 1.0f. - - - - - Sets the InhibitRollingTime setting for this . - Time after hitting ground that the catchFall can call rds. - - - Default value = 0.2f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the ChangeFrictionTime setting for this . - Time after hitting ground that the catchFall can change the friction of parts to inhibit sliding. - - - Default value = 0.2f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the GroundFriction setting for this . - 8.0 was used on yanked) Friction multiplier on bodyParts when on ground. Character can look too slidy with groundFriction = 1. Higher values give a more jerky reation but this seems timestep dependent especially for dragged by the feet. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the FrictionMin setting for this . - Min Friction of an impact with a body part (not head, hands or feet) - to increase friction of slippy environment to get character to roll better. Applied in catchFall and rollUp(rollDownStairs). - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the FrictionMax setting for this . - Max Friction of an impact with a body part (not head, hands or feet) - to increase friction of slippy environment to get character to roll better. Applied in catchFall and rollUp(rollDownStairs). - - - Default value = 9999.0f. - Min value = 0.0f. - - - - - Sets the StopOnSlopes setting for this . - Apply tactics to help stop on slopes. - - - Default value = False. - - - - - Sets the StopManual setting for this . - Override slope value to manually force stopping on flat ground. Encourages character to come to rest face down or face up. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the StoppedStrengthDecay setting for this . - Speed at which strength reduces when stopped. - - - Default value = 5.0f. - Min value = 0.0f. - Max value = 20.0f. - - - - - Sets the SpineLean1Offset setting for this . - Bias spine post towards hunched (away from arched). - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the RiflePose setting for this . - Hold rifle in a safe position to reduce complications with collision. Only applied if holding a rifle. - - - Default value = False. - - - - - Sets the HkHeadAvoid setting for this . - Enable head ground avoidance when handsAndKnees is true. - - - Default value = True. - - - - - Sets the AntiPropClav setting for this . - Discourage the character getting stuck propped up by elbows when falling backwards - by inhibiting backwards moving clavicles (keeps the arms slightly wider). - - - Default value = False. - - - - - Sets the AntiPropWeak setting for this . - Discourage the character getting stuck propped up by elbows when falling backwards - by weakening the arms as soon they hit the floor. (Also stops the hands lifting up when flat on back). - - - Default value = False. - - - - - Sets the HeadAsWeakAsArms setting for this . - Head weakens as arms weaken. If false and antiPropWeak when falls onto back doesn't loosen neck so early (matches bodyStrength instead). - - - Default value = True. - - - - - Sets the SuccessStrength setting for this . - When bodyStrength is less than successStrength send a success feedback - DO NOT GO OUTSIDE MIN/MAX PARAMETER VALUES OTHERWISE NO SUCCESS FEEDBACK WILL BE SENT. - - - Default value = 1.0f. - Min value = 0.3f. - Max value = 1.0f. - - - - - Sets viscosity applied to damping limbs. - - - - - Creates a new Instance of the SetCharacterUnderwaterHelper for sending a SetCharacterUnderwater to a given . - - The to send the SetCharacterUnderwater to. - - Sets viscosity applied to damping limbs. - - - - - Sets the Underwater setting for this . - is character underwater?. - - - Default value = False. - - - - - Sets the Viscosity setting for this . - viscosity applied to character's parts. - - - Default value = -1.0f. - Min value = -1.0f. - Max value = 100.0f. - - - - - Sets the GravityFactor setting for this . - gravity factor applied to character. - - - Default value = 1.0f. - Min value = -10.0f. - Max value = 10.0f. - - - - - Sets the Stroke setting for this . - swimming force applied to character as a function of handVelocity and footVelocity. - - - Default value = 0.0f. - Min value = -1000.0f. - Max value = 1000.0f. - - - - - Sets the LinearStroke setting for this . - swimming force (linearStroke=true,False) = (f(v),f(v*v)). - - - Default value = False. - - - - - setCharacterCollisions:. - - - - - Creates a new Instance of the SetCharacterCollisionsHelper for sending a SetCharacterCollisions to a given . - - The to send the SetCharacterCollisions to. - - setCharacterCollisions:. - - - - - Sets the Spin setting for this . - sliding friction turned into spin 80.0 (used in demo videos) good for rest of default params below. If 0.0 then no collision enhancement. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 100.0f. - - - - - Sets the MaxVelocity setting for this . - torque = spin*(relative velocity) up to this maximum for relative velocity. - - - Default value = 8.0f. - Min value = 0.0f. - Max value = 100.0f. - - - - - Sets the ApplyToAll setting for this . - - - Default value = False. - - - - - Sets the ApplyToSpine setting for this . - - - Default value = True. - - - - - Sets the ApplyToThighs setting for this . - - - Default value = True. - - - - - Sets the ApplyToClavicles setting for this . - - - Default value = True. - - - - - Sets the ApplyToUpperArms setting for this . - - - Default value = True. - - - - - Sets the FootSlip setting for this . - allow foot slipping if collided. - - - Default value = True. - - - - - Sets the VehicleClass setting for this . - ClassType of the object against which to enhance the collision. All character vehicle interaction (e.g. braceForImpact glancing spins) relies on this value so EDIT WISELY. If it is used for things other than vehicles then NM should be informed. - - - Default value = 15. - Min value = 0. - Max value = 100. - - - - - Damp out cartwheeling and somersaulting above a certain threshold. - - - - - Creates a new Instance of the SetCharacterDampingHelper for sending a SetCharacterDamping to a given . - - The to send the SetCharacterDamping to. - - Damp out cartwheeling and somersaulting above a certain threshold. - - - - - Sets the SomersaultThresh setting for this . - Somersault AngularMomentum measure above which we start damping - try 34.0. Falling over straight backwards gives 54 on hitting ground. - - - Default value = 34.0f. - Min value = 0.0f. - Max value = 200.0f. - - - - - Sets the SomersaultDamp setting for this . - Amount to damp somersaulting by (spinning around left/right axis) - try 0.45. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the CartwheelThresh setting for this . - Cartwheel AngularMomentum measure above which we start damping - try 27.0. - - - Default value = 27.0f. - Min value = 0.0f. - Max value = 200.0f. - - - - - Sets the CartwheelDamp setting for this . - Amount to damp somersaulting by (spinning around front/back axis) - try 0.8. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the VehicleCollisionTime setting for this . - Time after impact with a vehicle to apply characterDamping. -ve values mean always apply whether collided with vehicle or not. =0.0 never apply. =timestep apply for only that frame. A typical roll from being hit by a car lasts about 4secs. - - - Default value = 0.0f. - Min value = -1.0f. - Max value = 1000.0f. - - - - - Sets the V2 setting for this . - If true damping is proportional to Angular momentum squared. If false proportional to Angular momentum. - - - Default value = False. - - - - - setFrictionScale:. - - - - - Creates a new Instance of the SetFrictionScaleHelper for sending a SetFrictionScale to a given . - - The to send the SetFrictionScale to. - - setFrictionScale:. - - - - - Sets the Scale setting for this . - Friction scale to be applied to parts in mask. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the GlobalMin setting for this . - Character-wide minimum impact friction. Affects all parts (not just those in mask). - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 1000000.0f. - - - - - Sets the GlobalMax setting for this . - Character-wide maximum impact friction. Affects all parts (not just those in mask). - - - Default value = 999999.0f. - Min value = 0.0f. - Max value = 1000000.0f. - - - - - Sets the Mask setting for this . - Two character body-masking value, bitwise joint mask or bitwise logic string of two character body-masking value (see Active Pose notes for possible values). - - - Default value = fb. - - - - - Creates a new Instance of the AnimPoseHelper for sending a AnimPose to a given . - - The to send the AnimPose to. - - - - Sets the MuscleStiffness setting for this . - muscleStiffness of masked joints. -values mean don't apply (just use defaults or ones applied by behaviours - safer if you are going to return to a behaviour). - - - Default value = -1.0f. - Min value = -1.1f. - Max value = 10.0f. - - - - - Sets the Stiffness setting for this . - stiffness of masked joints. -ve values mean don't apply stiffness or damping (just use defaults or ones applied by behaviours). If you are using animpose fullbody on its own then this gives the opprtunity to use setStffness and setMuscleStiffness messages to set up the character's muscles. mmmmtodo get rid of this -ve. - - - Default value = -1.0f. - Min value = -1.1f. - Max value = 16.0f. - - - - - Sets the Damping setting for this . - damping of masked joints. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the EffectorMask setting for this . - Two character body-masking value, bitwise joint mask or bitwise logic string of two character body-masking value (see notes for explanation). - - - Default value = ub. - - - - - Sets the OverideHeadlook setting for this . - overide Headlook behaviour (if animPose includes the head). - - - Default value = False. - - - - - Sets the OveridePointArm setting for this . - overide PointArm behaviour (if animPose includes the arm/arms). - - - Default value = False. - - - - - Sets the OveridePointGun setting for this . - overide PointGun behaviour (if animPose includes the arm/arms)//mmmmtodo not used at moment. - - - Default value = False. - - - - - Sets the UseZMPGravityCompensation setting for this . - If true then modify gravity compensation based on stance (can reduce gravity compensation to zero if cofm is outside of balance area). - - - Default value = True. - - - - - Sets the GravityCompensation setting for this . - gravity compensation applied to joints in the effectorMask. If -ve then not applied (use current setting). - - - Default value = -1.0f. - Min value = -1.0f. - Max value = 14.0f. - - - - - Sets the MuscleStiffnessLeftArm setting for this . - muscle stiffness applied to left arm (applied after stiffness). If -ve then not applied (use current setting). - - - Default value = -1.0f. - Min value = -1.0f. - Max value = 10.0f. - - - - - Sets the MuscleStiffnessRightArm setting for this . - muscle stiffness applied to right arm (applied after stiffness). If -ve then not applied (use current setting). - - - Default value = -1.0f. - Min value = -1.0f. - Max value = 10.0f. - - - - - Sets the MuscleStiffnessSpine setting for this . - muscle stiffness applied to spine (applied after stiffness). If -ve then not applied (use current setting). - - - Default value = -1.0f. - Min value = -1.0f. - Max value = 10.0f. - - - - - Sets the MuscleStiffnessLeftLeg setting for this . - muscle stiffness applied to left leg (applied after stiffness). If -ve then not applied (use current setting). - - - Default value = -1.0f. - Min value = -1.0f. - Max value = 10.0f. - - - - - Sets the MuscleStiffnessRightLeg setting for this . - muscle stiffness applied to right leg (applied after stiffness). If -ve then not applied (use current setting). - - - Default value = -1.0f. - Min value = -1.0f. - Max value = 10.0f. - - - - - Sets the StiffnessLeftArm setting for this . - stiffness applied to left arm (applied after stiffness). If -ve then not applied (use current setting). - - - Default value = -1.0f. - Min value = -1.0f. - Max value = 16.0f. - - - - - Sets the StiffnessRightArm setting for this . - stiffness applied to right arm (applied after stiffness). If -ve then not applied (use current setting). - - - Default value = -1.0f. - Min value = -1.0f. - Max value = 16.0f. - - - - - Sets the StiffnessSpine setting for this . - stiffness applied to spine (applied after stiffness). If -ve then not applied (use current setting). - - - Default value = -1.0f. - Min value = -1.0f. - Max value = 16.0f. - - - - - Sets the StiffnessLeftLeg setting for this . - stiffness applied to left leg (applied after stiffness). If -ve then not applied (use current setting). - - - Default value = -1.0f. - Min value = -1.0f. - Max value = 16.0f. - - - - - Sets the StiffnessRightLeg setting for this . - stiffness applied to right leg (applied after stiffness). If -ve then not applied (use current setting). - - - Default value = -1.0f. - Min value = -1.0f. - Max value = 16.0f. - - - - - Sets the DampingLeftArm setting for this . - damping applied to left arm (applied after stiffness). If stiffness -ve then not applied (use current setting). - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the DampingRightArm setting for this . - damping applied to right arm (applied after stiffness). If stiffness -ve then not applied (use current setting). - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the DampingSpine setting for this . - damping applied to spine (applied after stiffness). If stiffness-ve then not applied (use current setting). - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the DampingLeftLeg setting for this . - damping applied to left leg (applied after stiffness). If stiffness-ve then not applied (use current setting). - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the DampingRightLeg setting for this . - damping applied to right leg (applied after stiffness). If stiffness -ve then not applied (use current setting). - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the GravCompLeftArm setting for this . - gravity compensation applied to left arm (applied after gravityCompensation). If -ve then not applied (use current setting). - - - Default value = -1.0f. - Min value = -1.0f. - Max value = 14.0f. - - - - - Sets the GravCompRightArm setting for this . - gravity compensation applied to right arm (applied after gravityCompensation). If -ve then not applied (use current setting). - - - Default value = -1.0f. - Min value = -1.0f. - Max value = 14.0f. - - - - - Sets the GravCompSpine setting for this . - gravity compensation applied to spine (applied after gravityCompensation). If -ve then not applied (use current setting). - - - Default value = -1.0f. - Min value = -1.0f. - Max value = 14.0f. - - - - - Sets the GravCompLeftLeg setting for this . - gravity compensation applied to left leg (applied after gravityCompensation). If -ve then not applied (use current setting). - - - Default value = -1.0f. - Min value = -1.0f. - Max value = 14.0f. - - - - - Sets the GravCompRightLeg setting for this . - gravity compensation applied to right leg (applied after gravityCompensation). If -ve then not applied (use current setting). - - - Default value = -1.0f. - Min value = -1.0f. - Max value = 14.0f. - - - - - Sets the ConnectedLeftHand setting for this . - Is the left hand constrained to the world/ an object: -1=auto decide by impact info, 0=no, 1=part fully constrained (not implemented:, 2=part point constraint, 3=line constraint). - - - Default value = 0. - Min value = -1. - Max value = 2. - - - - - Sets the ConnectedRightHand setting for this . - Is the right hand constrained to the world/ an object: -1=auto decide by impact info, 0=no, 1=part fully constrained (not implemented:, 2=part point constraint, 3=line constraint). - - - Default value = 0. - Min value = -1. - Max value = 2. - - - - - Sets the ConnectedLeftFoot setting for this . - Is the left foot constrained to the world/ an object: -2=do not set in animpose (e.g. let the balancer decide), -1=auto decide by impact info, 0=no, 1=part fully constrained (not implemented:, 2=part point constraint, 3=line constraint). - - - Default value = -2. - Min value = -2. - Max value = 2. - - - - - Sets the ConnectedRightFoot setting for this . - Is the right foot constrained to the world/ an object: -2=do not set in animpose (e.g. let the balancer decide),-1=auto decide by impact info, 0=no, 1=part fully constrained (not implemented:, 2=part point constraint, 3=line constraint). - - - Default value = -2. - Min value = -2. - Max value = 2. - - - - - Sets the AnimSource setting for this . - - - - - Sets the DampenSideMotionInstanceIndex setting for this . - LevelIndex of object to dampen side motion relative to. -1 means not used. - - - Default value = -1. - Min value = -1. - - - - - Creates a new Instance of the ArmsWindmillHelper for sending a ArmsWindmill to a given . - - The to send the ArmsWindmill to. - - - - Sets the LeftPartID setting for this . - ID of part that the circle uses as local space for positioning. - - - Default value = 10. - Min value = 0. - Max value = 21. - - - - - Sets the LeftRadius1 setting for this . - radius for first axis of ellipse. - - - Default value = 0.8f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the LeftRadius2 setting for this . - radius for second axis of ellipse. - - - Default value = 0.8f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the LeftSpeed setting for this . - speed of target around the circle. - - - Default value = 1.0f. - Min value = -2.0f. - Max value = 2.0f. - - - - - Sets the LeftNormal setting for this . - Euler Angles orientation of circle in space of part with part ID. - - - Default value = Vector3(0.0f, 0.2f, 0.2f). - - - - - Sets the LeftCentre setting for this . - centre of circle in the space of partID. - - - Default value = Vector3(0.0f, 0.5f, -0.1f). - - - - - Sets the RightPartID setting for this . - ID of part that the circle uses as local space for positioning. - - - Default value = 10. - Min value = 0. - Max value = 21. - - - - - Sets the RightRadius1 setting for this . - radius for first axis of ellipse. - - - Default value = 0.8f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the RightRadius2 setting for this . - radius for second axis of ellipse. - - - Default value = 0.8f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the RightSpeed setting for this . - speed of target around the circle. - - - Default value = 1.0f. - Min value = -2.0f. - Max value = 2.0f. - - - - - Sets the RightNormal setting for this . - Euler Angles orientation of circle in space of part with part ID. - - - Default value = Vector3(0.0f, -0.2f, -0.2f). - - - - - Sets the RightCentre setting for this . - centre of circle in the space of partID. - - - Default value = Vector3(0.0f, -0.5f, -0.1f). - - - - - Sets the ShoulderStiffness setting for this . - Stiffness applied to the shoulders. - - - Default value = 12.0f. - Min value = 1.0f. - Max value = 16.0f. - - - - - Sets the ShoulderDamping setting for this . - Damping applied to the shoulders. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the ElbowStiffness setting for this . - Stiffness applied to the elbows. - - - Default value = 12.0f. - Min value = 1.0f. - Max value = 16.0f. - - - - - Sets the ElbowDamping setting for this . - Damping applied to the elbows. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the LeftElbowMin setting for this . - Minimum left elbow bend. - - - Default value = 0.5f. - Min value = 0.0f. - Max value = 1.7f. - - - - - Sets the RightElbowMin setting for this . - Minimum right elbow bend. - - - Default value = 0.5f. - Min value = 0.0f. - Max value = 1.7f. - - - - - Sets the PhaseOffset setting for this . - phase offset(degrees) when phase synchronization is turned on. - - - Default value = 0.0f. - Min value = -360.0f. - Max value = 360.0f. - - - - - Sets the DragReduction setting for this . - how much to compensate for movement of character/target. - - - Default value = 0.2f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the IKtwist setting for this . - angle of elbow around twist axis ?. - - - Default value = 0.0f. - Min value = -3.1f. - Max value = 3.1f. - - - - - Sets the AngVelThreshold setting for this . - value of character angular speed above which adaptive arm motion starts. - - - Default value = 0.1f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the AngVelGain setting for this . - multiplies angular speed of character to get speed of arms. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the MirrorMode setting for this . - - - Default value = . - If leftArm parameters are used. - - - - - Sets the AdaptiveMode setting for this . - - - Default value = . - - - - - Sets the ForceSync setting for this . - toggles phase synchronization. - - - Default value = True. - - - - - Sets the UseLeft setting for this . - Use the left arm. - - - Default value = True. - - - - - Sets the UseRight setting for this . - Use the right arm. - - - Default value = True. - - - - - Sets the DisableOnImpact setting for this . - If true, each arm will stop windmilling if it hits the ground. - - - Default value = True. - - - - - Creates a new Instance of the ArmsWindmillAdaptiveHelper for sending a ArmsWindmillAdaptive to a given . - - The to send the ArmsWindmillAdaptive to. - - - - Sets the AngSpeed setting for this . - Controls the speed of the windmilling. - - - Default value = 6.3f. - Min value = 0.1f. - Max value = 10.0f. - - - - - Sets the BodyStiffness setting for this . - Controls how stiff the rest of the body is. - - - Default value = 11.0f. - Min value = 6.0f. - Max value = 16.0f. - - - - - Sets the Amplitude setting for this . - Controls how large the motion is, higher values means the character waves his arms in a massive arc. - - - Default value = 0.6f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the Phase setting for this . - Set to a non-zero value to desynchronise the left and right arms motion. - - - Default value = 0.0f. - Min value = -4.0f. - Max value = 8.0f. - - - - - Sets the ArmStiffness setting for this . - How stiff the arms are controls how pronounced the windmilling motion appears. - - - Default value = 14.1f. - Min value = 6.0f. - Max value = 16.0f. - - - - - Sets the LeftElbowAngle setting for this . - If not negative then left arm will blend to this angle. - - - Default value = -1.0f. - Min value = -1.0f. - Max value = 6.0f. - - - - - Sets the RightElbowAngle setting for this . - If not negative then right arm will blend to this angle. - - - Default value = -1.0f. - Min value = -1.0f. - Max value = 6.0f. - - - - - Sets the Lean1mult setting for this . - 0 arms go up and down at the side. 1 circles. 0..1 elipse. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the Lean1offset setting for this . - 0.f centre of circle at side. - - - Default value = 0.0f. - Min value = -6.0f. - Max value = 6.0f. - - - - - Sets the ElbowRate setting for this . - rate at which elbow tries to match *ElbowAngle. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 6.0f. - - - - - Sets the ArmDirection setting for this . - - - Default value = . - - - - - Sets the DisableOnImpact setting for this . - If true, each arm will stop windmilling if it hits the ground. - - - Default value = True. - - - - - Sets the SetBackAngles setting for this . - If true, back angles will be set to compliment arms windmill. - - - Default value = True. - - - - - Sets the UseAngMom setting for this . - If true, use angular momentum about com to choose arm circling direction. Otherwise use com angular velocity. - - - Default value = False. - - - - - Sets the BendLeftElbow setting for this . - If true, bend the left elbow to give a stuntman type scramble look. - - - Default value = False. - - - - - Sets the BendRightElbow setting for this . - If true, bend the right elbow to give a stuntman type scramble look. - - - Default value = False. - - - - - Sets the Mask setting for this . - Two character body-masking value, bitwise joint mask or bitwise logic string of two character body-masking value (see Active Pose notes for possible values). - - - Default value = ub. - - - - - Creates a new Instance of the BalancerCollisionsReactionHelper for sending a BalancerCollisionsReaction to a given . - - The to send the BalancerCollisionsReaction to. - - - - Sets the NumStepsTillSlump setting for this . - Begin slump and stop stepping after this many steps. - - - Default value = 4. - Min value = 0. - - - - - Sets the Stable2SlumpTime setting for this . - Time after becoming stable leaning against a wall that slump starts. - - - Default value = 0.0f. - Min value = 0.0f. - - - - - Sets the ExclusionZone setting for this . - Steps are ihibited to not go closer to the wall than this (after impact). - - - Default value = 0.2f. - Min value = 0.0f. - - - - - Sets the FootFrictionMultStart setting for this . - Friction multiplier applied to feet when slump starts. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 4.0f. - - - - - Sets the FootFrictionMultRate setting for this . - Friction multiplier reduced by this amount every second after slump starts (only if character is not slumping). - - - Default value = 2.0f. - Min value = 0.0f. - Max value = 50.0f. - - - - - Sets the BackFrictionMultStart setting for this . - Friction multiplier applied to back when slump starts. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 4.0f. - - - - - Sets the BackFrictionMultRate setting for this . - Friction multiplier reduced by this amount every second after slump starts (only if character is not slumping). - - - Default value = 2.0f. - Min value = 0.0f. - Max value = 50.0f. - - - - - Sets the ImpactLegStiffReduction setting for this . - Reduce the stiffness of the legs by this much as soon as an impact is detected. - - - Default value = 3.0f. - Min value = 0.0f. - Max value = 16.0f. - - - - - Sets the SlumpLegStiffReduction setting for this . - Reduce the stiffness of the legs by this much as soon as slump starts. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 16.0f. - - - - - Sets the SlumpLegStiffRate setting for this . - Rate at which the stiffness of the legs is reduced during slump. - - - Default value = 8.0f. - Min value = 0.0f. - Max value = 50.0f. - - - - - Sets the ReactTime setting for this . - Time that the character reacts to the impact with ub flinch and writhe. - - - Default value = 0.3f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the ImpactExagTime setting for this . - Time that the character exaggerates impact with spine. - - - Default value = 0.3f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the GlanceSpinTime setting for this . - Duration that the glance torque is applied for. - - - Default value = 0.5f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the GlanceSpinMag setting for this . - Magnitude of the glance torque. - - - Default value = 50.0f. - Min value = 0.0f. - Max value = 1000.0f. - - - - - Sets the GlanceSpinDecayMult setting for this . - multiplier used when decaying torque spin over time. - - - Default value = 0.3f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the IgnoreColWithIndex setting for this . - used so impact with the character that is pushing you over doesn't set off the behaviour. - - - Default value = -2. - Min value = -2. - - - - - Sets the SlumpMode setting for this . - 0=Normal slump(less movement then slump and movement LT small), 1=fast slump, 2=less movement then slump. - - - Default value = 1. - Min value = 0. - Max value = 2. - - - - - Sets the ReboundMode setting for this . - 0=fall2knees/slump if shot not running, 1=stumble, 2=slump, 3=restart. - - - Default value = 0. - Min value = 0. - Max value = 3. - - - - - Sets the IgnoreColMassBelow setting for this . - collisions with non-fixed objects with mass below this will not set this behaviour off (e.g. ignore guns). - - - Default value = 20.0f. - Min value = -1.0f. - Max value = 1000.0f. - - - - - Sets the ForwardMode setting for this . - 0=slump, 1=fallToKnees if shot is running, otherwise slump. - - - Default value = 0. - Min value = 0. - Max value = 1. - - - - - Sets the TimeToForward setting for this . - time after a forwards impact before forwardMode is called (leave sometime for a rebound or brace - the min of 0.1 is to ensure fallOverWall can start although it probably needs only 1or2 frames for the probes to return). - - - Default value = 0.5f. - Min value = 0.1f. - Max value = 2.0f. - - - - - Sets the ReboundForce setting for this . - if forwards impact only: cheat force to try to get the character away from the wall. 3 is a good value. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the BraceWall setting for this . - Brace against wall if forwards impact(at the moment only if bodyBalance is running/in charge of arms). - - - Default value = True. - - - - - Sets the IgnoreColVolumeBelow setting for this . - collisions with non-fixed objects with volume below this will not set this behaviour off. - - - Default value = 0.1f. - Min value = -1.0f. - Max value = 1000.0f. - - - - - Sets the FallOverWallDrape setting for this . - use fallOverWall as the main drape reaction. - - - Default value = True. - - - - - Sets the FallOverHighWalls setting for this . - trigger fall over wall if hit up to spine2 else only if hit up to spine1. - - - Default value = False. - - - - - Sets the Snap setting for this . - Add a Snap to when you hit a wall to emphasize the hit. - - - Default value = False. - - - - - Sets the SnapMag setting for this . - The magnitude of the snap reaction. - - - Default value = -0.6f. - Min value = -10.0f. - Max value = 10.0f. - - - - - Sets the SnapDirectionRandomness setting for this . - The character snaps in a prescribed way (decided by bullet direction) - Higher the value the more random this direction is. - - - Default value = 0.3f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the SnapLeftArm setting for this . - snap the leftArm. - - - Default value = False. - - - - - Sets the SnapRightArm setting for this . - snap the rightArm. - - - Default value = False. - - - - - Sets the SnapLeftLeg setting for this . - snap the leftLeg. - - - Default value = False. - - - - - Sets the SnapRightLeg setting for this . - snap the rightLeg. - - - Default value = False. - - - - - Sets the SnapSpine setting for this . - snap the spine. - - - Default value = True. - - - - - Sets the SnapNeck setting for this . - snap the neck. - - - Default value = True. - - - - - Sets the SnapPhasedLegs setting for this . - Legs are either in phase with each other or not. - - - Default value = True. - - - - - Sets the SnapHipType setting for this . - type of hip reaction 0=none, 1=side2side 2=steplike. - - - Default value = 0. - Min value = 0. - Max value = 2. - - - - - Sets the UnSnapInterval setting for this . - Interval before applying reverse snap. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 100.0f. - - - - - Sets the UnSnapRatio setting for this . - The magnitude of the reverse snap. - - - Default value = 0.7f. - Min value = 0.0f. - Max value = 100.0f. - - - - - Sets the SnapUseTorques setting for this . - use torques to make the snap otherwise use a change in the parts angular velocity. - - - Default value = True. - - - - - Sets the ImpactWeaknessZeroDuration setting for this . - duration for which the character's upper body stays at minimum stiffness (not quite zero). - - - Default value = 0.2f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the ImpactWeaknessRampDuration setting for this . - duration of the ramp to bring the character's upper body stiffness back to normal levels. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the ImpactLoosenessAmount setting for this . - how loose the character is on impact. between 0 and 1. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the ObjectBehindVictim setting for this . - detected an object behind a shot victim in the direction of a bullet?. - - - Default value = False. - - - - - Sets the ObjectBehindVictimPos setting for this . - the intersection pos of a detected object behind a shot victim in the direction of a bullet. - - - Default value = Vector3(0.0f, 0.0f, 0.0f). - - - - - Sets the ObjectBehindVictimNormal setting for this . - the normal of a detected object behind a shot victim in the direction of a bullet. - - - Default value = Vector3(0.0f, 0.0f, 0.0f). - Min value = -1.0f. - Max value = 1.0f. - - - - - Creates a new Instance of the BodyBalanceHelper for sending a BodyBalance to a given . - - The to send the BodyBalance to. - - - - Sets the ArmStiffness setting for this . - NB. WAS m_bodyStiffness ClaviclesStiffness=9.0f. - - - Default value = 9.0f. - Min value = 6.0f. - Max value = 16.0f. - - - - - Sets the Elbow setting for this . - How much the elbow swings based on the leg movement. - - - Default value = 0.9f. - Min value = 0.0f. - Max value = 4.0f. - - - - - Sets the Shoulder setting for this . - How much the shoulder(lean1) swings based on the leg movement. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 4.0f. - - - - - Sets the ArmDamping setting for this . - NB. WAS m_damping NeckDamping=1 ClaviclesDamping=1. - - - Default value = 0.7f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the UseHeadLook setting for this . - enable and provide a look-at target to make the character's head turn to face it while balancing. - - - Default value = False. - - - - - Sets the HeadLookPos setting for this . - position of thing to look at. - - - Default value = Vector3(0.0f, 0.0f, 0.0f). - - - - - Sets the HeadLookInstanceIndex setting for this . - level index of thing to look at. - - - Default value = -1. - Min value = -1. - - - - - Sets the SpineStiffness setting for this . - - - Default value = 10.0f. - Min value = 6.0f. - Max value = 16.0f. - - - - - Sets the SomersaultAngle setting for this . - multiplier of the somersault 'angle' (lean forward/back) for arms out (lean2). - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the SomersaultAngleThreshold setting for this . - Amount of somersault 'angle' before m_somersaultAngle is used for ArmsOut. Unless drunk - DO NOT EXCEED 0.8. - - - Default value = 0.3f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the SideSomersaultAngle setting for this . - Amount of side somersault 'angle' before sideSomersault is used for ArmsOut. Unless drunk - DO NOT EXCEED 0.8. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the SideSomersaultAngleThreshold setting for this . - - - Default value = 0.3f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the BackwardsAutoTurn setting for this . - Automatically turn around if moving backwards. - - - Default value = False. - - - - - Sets the TurnWithBumpRadius setting for this . - 0.9 is a sensible value. If pusher within this distance then turn to get out of the way of the pusher. - - - Default value = -1.0f. - Min value = -1.0f. - Max value = 10.0f. - - - - - Sets the BackwardsArms setting for this . - Bend elbows, relax shoulders and inhibit spine twist when moving backwards. - - - Default value = False. - - - - - Sets the BlendToZeroPose setting for this . - Blend upper body to zero pose as the character comes to rest. If false blend to a stored pose. - - - Default value = False. - - - - - Sets the ArmsOutOnPush setting for this . - Put arms out based on lean2 of legs, or angular velocity (lean or twist), or lean (front/back or side/side). - - - Default value = True. - - - - - Sets the ArmsOutOnPushMultiplier setting for this . - Arms out based on lean2 of the legs to simulate being pushed. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the ArmsOutOnPushTimeout setting for this . - number of seconds before turning off the armsOutOnPush response only for Arms out based on lean2 of the legs (NOT for the angle or angular velocity). - - - Default value = 1.1f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the ReturningToBalanceArmsOut setting for this . - range 0:1 0 = don't raise arms if returning to upright position, 0.x = 0.x*raise arms based on angvel and 'angle' settings, 1 = raise arms based on angvel and 'angle' settings. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the ArmsOutStraightenElbows setting for this . - multiplier for straightening the elbows based on the amount of arms out(lean2) 0 = dont straighten elbows. Otherwise straighten elbows proportionately to armsOut. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the ArmsOutMinLean2 setting for this . - Minimum desiredLean2 applied to shoulder (to stop arms going above shoulder height or not). - - - Default value = -9.9f. - Min value = -10.0f. - Max value = 0.0f. - - - - - Sets the SpineDamping setting for this . - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the UseBodyTurn setting for this . - - - Default value = True. - - - - - Sets the ElbowAngleOnContact setting for this . - on contact with upperbody the desired elbow angle is set to at least this value. - - - Default value = 1.9f. - Min value = 0.0f. - Max value = 3.0f. - - - - - Sets the BendElbowsTime setting for this . - Time after contact (with Upper body) that the min m_elbowAngleOnContact is applied. - - - Default value = 0.3f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the BendElbowsGait setting for this . - Minimum desired angle of elbow during non contact arm swing. - - - Default value = 0.7f. - Min value = -3.0f. - Max value = 3.0f. - - - - - Sets the HipL2ArmL2 setting for this . - mmmmdrunk = 0.2 multiplier of hip lean2 (star jump) to give shoulder lean2 (flapping). - - - Default value = 0.3f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the ShoulderL2 setting for this . - mmmmdrunk = 0.7 shoulder lean2 offset. - - - Default value = 0.5f. - Min value = -3.0f. - Max value = 3.0f. - - - - - Sets the ShoulderL1 setting for this . - mmmmdrunk 1.1 shoulder lean1 offset (+ve frankenstein). - - - Default value = 0.0f. - Min value = -1.0f. - Max value = 2.0f. - - - - - Sets the ShoulderTwist setting for this . - mmmmdrunk = 0.0 shoulder twist. - - - Default value = -0.4f. - Min value = -3.0f. - Max value = 3.0f. - - - - - Sets the HeadLookAtVelProb setting for this . - Probability [0-1] that headLook will be looking in the direction of velocity when stepping. - - - Default value = -1.0f. - Min value = -1.0f. - Max value = 1.0f. - - - - - Sets the TurnOffProb setting for this . - Weighted Probability that turn will be off. This is one of six turn type weights. - - - Default value = 0.1f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the Turn2VelProb setting for this . - Weighted Probability of turning towards velocity. This is one of six turn type weights. - - - Default value = 0.3f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the TurnAwayProb setting for this . - Weighted Probability of turning away from headLook target. This is one of six turn type weights. - - - Default value = 0.2f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the TurnLeftProb setting for this . - Weighted Probability of turning left. This is one of six turn type weights. - - - Default value = 0.1f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the TurnRightProb setting for this . - Weighted Probability of turning right. This is one of six turn type weights. - - - Default value = 0.1f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the Turn2TargetProb setting for this . - Weighted Probability of turning towards headLook target. This is one of six turn type weights. - - - Default value = 0.2f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the AngVelMultiplier setting for this . - somersault, twist, sideSomersault) multiplier of the angular velocity for arms out (lean2) (somersault, twist, sideSomersault). - - - Default value = Vector3(4.0f, 1.0f, 4.0f). - Min value = 0.0f. - Max value = 20.0f. - - - - - Sets the AngVelThreshold setting for this . - somersault, twist, sideSomersault) threshold above which angVel is used for arms out (lean2) Unless drunk - DO NOT EXCEED 7.0 for each component. - - - Default value = Vector3(1.2f, 3.0f, 1.2f). - Min value = 0.0f. - Max value = 40.0f. - - - - - Sets the BraceDistance setting for this . - if -ve then do not brace. distance from object at which to raise hands to brace 0.5 good if newBrace=true - otherwise 0.65. - - - Default value = -1.0f. - Min value = -1.0f. - Max value = 1.0f. - - - - - Sets the TargetPredictionTime setting for this . - time expected to get arms up from idle. - - - Default value = 0.5f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the ReachAbsorbtionTime setting for this . - larger values and he absorbs the impact more. - - - Default value = 0.2f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the BraceStiffness setting for this . - stiffness of character. catch_fall stiffness scales with this too, with its defaults at this values default. - - - Default value = 12.0f. - Min value = 6.0f. - Max value = 16.0f. - - - - - Sets the MinBraceTime setting for this . - minimum bracing time so the character doesn't look twitchy. - - - Default value = 0.3f. - Min value = 0.0f. - Max value = 3.0f. - - - - - Sets the TimeToBackwardsBrace setting for this . - time before arm brace kicks in when hit from behind. - - - Default value = 0.5f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the HandsDelayMin setting for this . - If bracing with 2 hands delay one hand by at least this amount of time to introduce some asymmetry. - - - Default value = 0.3f. - Min value = 0.0f. - Max value = 3.0f. - - - - - Sets the HandsDelayMax setting for this . - If bracing with 2 hands delay one hand by at most this amount of time to introduce some asymmetry. - - - Default value = 0.7f. - Min value = 0.0f. - Max value = 3.0f. - - - - - Sets the BraceOffset setting for this . - braceTarget is global headLookPos plus braceOffset m in the up direction. - - - Default value = 0.0f. - Min value = -2.0f. - Max value = 2.0f. - - - - - Sets the MoveRadius setting for this . - if -ve don't move away from pusher unless moveWhenBracing is true and braceDistance GT 0.0f. if the pusher is closer than moveRadius then move away from it. - - - Default value = -1.0f. - Min value = -1.0f. - Max value = 2.0f. - - - - - Sets the MoveAmount setting for this . - amount of leanForce applied away from pusher. - - - Default value = 0.3f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the MoveWhenBracing setting for this . - Only move away from pusher when bracing against pusher. - - - Default value = False. - - - - - Creates a new Instance of the BodyFoetalHelper for sending a BodyFoetal to a given . - - The to send the BodyFoetal to. - - - - Sets the Stiffness setting for this . - The stiffness of the body determines how fast the character moves into the position, and how well that they hold it. - - - Default value = 9.0f. - Min value = 6.0f. - Max value = 16.0f. - - - - - Sets the DampingFactor setting for this . - Sets damping value for the character joints. - - - Default value = 1.4f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the Asymmetry setting for this . - A value between 0-1 that controls how asymmetric the results are by varying stiffness across the body. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the RandomSeed setting for this . - Random seed used to generate asymmetry values. - - - Default value = 100. - Min value = 0. - - - - - Sets the BackTwist setting for this . - Amount of random back twist to add. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the Mask setting for this . - Two character body-masking value, bitwise joint mask or bitwise logic string of two character body-masking value (see Active Pose notes for possible values). - - - Default value = fb. - - - - - Creates a new Instance of the BodyRollUpHelper for sending a BodyRollUp to a given . - - The to send the BodyRollUp to. - - - - Sets the Stiffness setting for this . - stiffness of whole body. - - - Default value = 10.0f. - Min value = 6.0f. - Max value = 16.0f. - - - - - Sets the UseArmToSlowDown setting for this . - the degree to which the character will try to stop a barrel roll with his arms. - - - Default value = 1.3f. - Min value = -2.0f. - Max value = 3.0f. - - - - - Sets the ArmReachAmount setting for this . - the likeliness of the character reaching for the ground with its arms. - - - Default value = 1.4f. - Min value = 0.0f. - Max value = 3.0f. - - - - - Sets the Mask setting for this . - Two character body-masking value, bitwise joint mask or bitwise logic string of two character body-masking value (see Active Pose notes for possible values). - - - Default value = fb. - - - - - Sets the LegPush setting for this . - used to keep rolling down slope, 1 is full (kicks legs out when pointing upwards). - - - Default value = 0.0f. - Min value = -1.0f. - Max value = 2.0f. - - - - - Sets the AsymmetricalLegs setting for this . - 0 is no leg asymmetry in 'foetal' position. greater than 0 a asymmetricalLegs-rand(30%), added/minus each joint of the legs in radians. Random number changes about once every roll. 0.4 gives a lot of asymmetry. - - - Default value = 0.0f. - Min value = -2.0f. - Max value = 2.0f. - - - - - Sets the NoRollTimeBeforeSuccess setting for this . - time that roll velocity has to be lower than rollVelForSuccess, before success message is sent. - - - Default value = 0.5f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the RollVelForSuccess setting for this . - lower threshold for roll velocity at which success message can be sent. - - - Default value = 0.2f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the RollVelLinearContribution setting for this . - contribution of linear COM velocity to roll Velocity (if 0, roll velocity equal to COM angular velocity). - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the VelocityScale setting for this . - Scales perceived body velocity. The higher this value gets, the more quickly the velocity measure saturates, resulting in a tighter roll at slower speeds. (NB: Set to 1 to match earlier behaviour). - - - Default value = 0.2f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the VelocityOffset setting for this . - Offsets perceived body velocity. Increase to create larger "dead zone" around zero velocity where character will be less rolled. (NB: Reset to 0 to match earlier behaviour). - - - Default value = 2.0f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the ApplyMinMaxFriction setting for this . - Controls whether or not behaviour enforces min/max friction. - - - Default value = True. - - - - - Creates a new Instance of the BodyWritheHelper for sending a BodyWrithe to a given . - - The to send the BodyWrithe to. - - - - Sets the ArmStiffness setting for this . - - - Default value = 13.0f. - Min value = 6.0f. - Max value = 16.0f. - - - - - Sets the BackStiffness setting for this . - - - Default value = 13.0f. - Min value = 6.0f. - Max value = 16.0f. - - - - - Sets the LegStiffness setting for this . - The stiffness of the character will determine how 'determined' a writhe this is - high values will make him thrash about wildly. - - - Default value = 13.0f. - Min value = 6.0f. - Max value = 16.0f. - - - - - Sets the ArmDamping setting for this . - damping amount, less is underdamped. - - - Default value = 0.5f. - Min value = 0.0f. - Max value = 3.0f. - - - - - Sets the BackDamping setting for this . - damping amount, less is underdamped. - - - Default value = 0.5f. - Min value = 0.0f. - Max value = 3.0f. - - - - - Sets the LegDamping setting for this . - damping amount, less is underdamped. - - - Default value = 0.5f. - Min value = 0.0f. - Max value = 3.0f. - - - - - Sets the ArmPeriod setting for this . - Controls how fast the writhe is executed, smaller values make faster motions. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 4.0f. - - - - - Sets the BackPeriod setting for this . - Controls how fast the writhe is executed, smaller values make faster motions. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 4.0f. - - - - - Sets the LegPeriod setting for this . - Controls how fast the writhe is executed, smaller values make faster motions. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 4.0f. - - - - - Sets the Mask setting for this . - Two character body-masking value, bitwise joint mask or bitwise logic string of two character body-masking value (see Active Pose notes for possible values). - - - Default value = fb. - - - - - Sets the ArmAmplitude setting for this . - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 3.0f. - - - - - Sets the BackAmplitude setting for this . - scales the amount of writhe. 0 = no writhe. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 3.0f. - - - - - Sets the LegAmplitude setting for this . - scales the amount of writhe. 0 = no writhe. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 3.0f. - - - - - Sets the ElbowAmplitude setting for this . - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 3.0f. - - - - - Sets the KneeAmplitude setting for this . - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 3.0f. - - - - - Sets the RollOverFlag setting for this . - Flag to set trying to rollOver. - - - Default value = False. - - - - - Sets the BlendArms setting for this . - Blend the writhe arms with the current desired arms (0=don't apply any writhe, 1=only writhe). - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the BlendBack setting for this . - Blend the writhe spine and neck with the current desired (0=don't apply any writhe, 1=only writhe). - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the BlendLegs setting for this . - Blend the writhe legs with the current desired legs (0=don't apply any writhe, 1=only writhe). - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the ApplyStiffness setting for this . - Use writhe stiffnesses if true. If false don't set any stiffnesses. - - - Default value = True. - - - - - Sets the OnFire setting for this . - Extra shoulderBlend. Rolling:one way only, maxRollOverTime, rollOverRadius, doesn't reduce arm stiffness to help rolling. No shoulder twist. - - - Default value = False. - - - - - Sets the ShoulderLean1 setting for this . - Blend writhe shoulder desired lean1 with this angle in RAD. Note that onFire has to be set to true for this parameter to take any effect. - - - Default value = 0.7f. - Min value = 0.0f. - Max value = 6.3f. - - - - - Sets the ShoulderLean2 setting for this . - Blend writhe shoulder desired lean2 with this angle in RAD. Note that onFire has to be set to true for this parameter to take any effect. - - - Default value = 0.4f. - Min value = 0.0f. - Max value = 6.3f. - - - - - Sets the Lean1BlendFactor setting for this . - Shoulder desired lean1 with shoulderLean1 angle blend factor. Set it to 0 to use original shoulder withe desired lean1 angle for shoulders. Note that onFire has to be set to true for this parameter to take any effect. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the Lean2BlendFactor setting for this . - Shoulder desired lean2 with shoulderLean2 angle blend factor. Set it to 0 to use original shoulder withe desired lean2 angle for shoulders. Note that onFire has to be set to true for this parameter to take any effect. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the RollTorqueScale setting for this . - Scale rolling torque that is applied to character spine. - - - Default value = 150.0f. - Min value = 0.0f. - Max value = 300.0f. - - - - - Sets the MaxRollOverTime setting for this . - Rolling torque is ramped down over time. At this time in seconds torque value converges to zero. Use this parameter to restrict time the character is rolling. Note that onFire has to be set to true for this parameter to take any effect. - - - Default value = 8.0f. - Min value = 0.0f. - Max value = 60.0f. - - - - - Sets the RollOverRadius setting for this . - Rolling torque is ramped down with distance measured from position where character hit the ground and started rolling. At this distance in meters torque value converges to zero. Use this parameter to restrict distance the character travels due to rolling. Note that onFire has to be set to true for this parameter to take any effect. - - - Default value = 2.0f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Creates a new Instance of the BraceForImpactHelper for sending a BraceForImpact to a given . - - The to send the BraceForImpact to. - - - - Sets the BraceDistance setting for this . - distance from object at which to raise hands to brace 0.5 good if newBrace=true - otherwise 0.65. - - - Default value = 0.5f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the TargetPredictionTime setting for this . - time epected to get arms up from idle. - - - Default value = 0.5f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the ReachAbsorbtionTime setting for this . - larger values and he absorbs the impact more. - - - Default value = 0.2f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the InstanceIndex setting for this . - levelIndex of object to brace. - - - Default value = -1. - Min value = -1. - - - - - Sets the BodyStiffness setting for this . - stiffness of character. catch_fall stiffness scales with this too, with its defaults at this values default. - - - Default value = 12.0f. - Min value = 6.0f. - Max value = 16.0f. - - - - - Sets the GrabDontLetGo setting for this . - Once a constraint is made, keep reaching with whatever hand is allowed. - - - Default value = False. - - - - - Sets the GrabStrength setting for this . - strength in hands for grabbing (kg m/s), -1 to ignore/disable. - - - Default value = 40.0f. - Min value = -1.0f. - Max value = 1000.0f. - - - - - Sets the GrabDistance setting for this . - Relative distance at which the grab starts. - - - Default value = 2.0f. - Min value = 0.0f. - Max value = 4.0f. - - - - - Sets the GrabReachAngle setting for this . - Angle from front at which the grab activates. If the point is outside this angle from front will not try to grab. - - - Default value = 1.5f. - Min value = 0.0f. - Max value = 3.2f. - - - - - Sets the GrabHoldTimer setting for this . - amount of time, in seconds, before grab automatically bails. - - - Default value = 2.5f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the MaxGrabCarVelocity setting for this . - Don't try to grab a car moving above this speed mmmmtodo make this the relative velocity of car to character?. - - - Default value = 95.0f. - Min value = 0.0f. - Max value = 1000.0f. - - - - - Sets the LegStiffness setting for this . - Balancer leg stiffness mmmmtodo remove this parameter and use configureBalance?. - - - Default value = 12.0f. - Min value = 6.0f. - Max value = 16.0f. - - - - - Sets the TimeToBackwardsBrace setting for this . - time before arm brace kicks in when hit from behind. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the Look setting for this . - position to look at, e.g. the driver. - - - Default value = Vector3(0.0f, 0.0f, 0.0f). - - - - - Sets the Pos setting for this . - location of the front part of the object to brace against. This should be the centre of where his hands should meet the object. - - - Default value = Vector3(0.0f, 0.0f, 0.0f). - - - - - Sets the MinBraceTime setting for this . - minimum bracing time so the character doesn't look twitchy. - - - Default value = 0.3f. - Min value = 0.0f. - Max value = 3.0f. - - - - - Sets the HandsDelayMin setting for this . - If bracing with 2 hands delay one hand by at least this amount of time to introduce some asymmetry. - - - Default value = 0.1f. - Min value = 0.0f. - Max value = 3.0f. - - - - - Sets the HandsDelayMax setting for this . - If bracing with 2 hands delay one hand by at most this amount of time to introduce some asymmetry. - - - Default value = 0.3f. - Min value = 0.0f. - Max value = 3.0f. - - - - - Sets the MoveAway setting for this . - move away from the car (if in reaching zone). - - - Default value = False. - - - - - Sets the MoveAwayAmount setting for this . - forceLean away amount (-ve is lean towards). - - - Default value = 0.1f. - Min value = -1.0f. - Max value = 1.0f. - - - - - Sets the MoveAwayLean setting for this . - Lean away amount (-ve is lean towards). - - - Default value = 0.1f. - Min value = -0.5f. - Max value = 0.5f. - - - - - Sets the MoveSideways setting for this . - Amount of sideways movement if at the front or back of the car to add to the move away from car. - - - Default value = 0.3f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the BbArms setting for this . - Use bodyBalance arms for the default (non bracing) behaviour if bodyBalance is active. - - - Default value = False. - - - - - Sets the NewBrace setting for this . - Use the new brace prediction code. - - - Default value = True. - - - - - Sets the BraceOnImpact setting for this . - If true then if a shin or thigh is in contact with the car then brace. NB: newBrace must be true. For those situations where the car has pushed the ped backwards (at the same speed as the car) before the behaviour has been started and so doesn't predict an impact. - - - Default value = False. - - - - - Sets the Roll2Velocity setting for this . - When rollDownStairs is running use roll2Velocity to control the helper torques (this only attempts to roll to the chaarcter's velocity not some default linear velocity mag. - - - Default value = False. - - - - - Sets the RollType setting for this . - 0 = original/roll off/stay on car: Roll with character velocity, 1 = //Gentle: roll off/stay on car = use relative velocity of character to car to roll against, 2 = //roll over car: Roll against character velocity. i.e. roll against any velocity picked up by hitting car, 3 = //Gentle: roll over car: use relative velocity of character to car to roll with. - - - Default value = 3. - Min value = 0. - Max value = 3. - - - - - Sets the SnapImpacts setting for this . - Exaggerate impacts using snap. - - - Default value = False. - - - - - Sets the SnapImpact setting for this . - Exaggeration amount of the initial impact (legs). +ve fold with car impact (as if pushed at hips in the car velocity direction). -ve fold away from car impact. - - - Default value = 7.0f. - Min value = -20.0f. - Max value = 20.0f. - - - - - Sets the SnapBonnet setting for this . - Exaggeration amount of the secondary (torso) impact with bonnet. +ve fold with car impact (as if pushed at hips by the impact normal). -ve fold away from car impact. - - - Default value = -7.0f. - Min value = -20.0f. - Max value = 20.0f. - - - - - Sets the SnapFloor setting for this . - Exaggeration amount of the impact with the floor after falling off of car +ve fold with floor impact (as if pushed at hips in the impact normal direction). -ve fold away from car impact. - - - Default value = 7.0f. - Min value = -20.0f. - Max value = 20.0f. - - - - - Sets the DampVel setting for this . - Damp out excessive spin and upward velocity when on car. - - - Default value = False. - - - - - Sets the DampSpin setting for this . - Amount to damp spinning by (cartwheeling and somersaulting). - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 40.0f. - - - - - Sets the DampUpVel setting for this . - Amount to damp upward velocity by to limit the amount of air above the car the character can get. - - - Default value = 10.0f. - Min value = 0.0f. - Max value = 40.0f. - - - - - Sets the DampSpinThresh setting for this . - Angular velocity above which we start damping. - - - Default value = 4.0f. - Min value = 0.0f. - Max value = 20.0f. - - - - - Sets the DampUpVelThresh setting for this . - Upward velocity above which we start damping. - - - Default value = 2.0f. - Min value = 0.0f. - Max value = 20.0f. - - - - - Sets the GsHelp setting for this . - Enhance a glancing spin with the side of the car by modulating body friction. - - - Default value = False. - - - - - Sets the GsEndMin setting for this . - ID for glancing spin. min depth to be considered from either end (front/rear) of a car (-ve is inside the car area). - - - Default value = -0.1f. - Min value = -10.0f. - Max value = 1.0f. - - - - - Sets the GsSideMin setting for this . - ID for glancing spin. min depth to be considered on the side of a car (-ve is inside the car area). - - - Default value = -0.2f. - Min value = -10.0f. - Max value = 1.0f. - - - - - Sets the GsSideMax setting for this . - ID for glancing spin. max depth to be considered on the side of a car (+ve is outside the car area). - - - Default value = 0.5f. - Min value = -10.0f. - Max value = 1.0f. - - - - - Sets the GsUpness setting for this . - ID for glancing spin. Character has to be more upright than this value for it to be considered on the side of a car. Fully upright = 1, upsideDown = -1. Max Angle from upright is acos(gsUpness). - - - Default value = 0.9f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the GsCarVelMin setting for this . - ID for glancing spin. Minimum car velocity. - - - Default value = 3.0f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the GsScale1Foot setting for this . - Apply gsFricScale1 to the foot if colliding with car. (Otherwise foot friction - with the ground - is determined by gsFricScale2 if it is in gsFricMask2). - - - Default value = True. - - - - - Sets the GsFricScale1 setting for this . - Glancing spin help. Friction scale applied when to the side of the car. e.g. make the character spin more by upping the friction against the car. - - - Default value = 8.0f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the GsFricMask1 setting for this . - Glancing spin help. Two character body-masking value, bitwise joint mask or bitwise logic string of two character body-masking value (see notes for explanation). Note gsFricMask1 and gsFricMask2 are made independent by the code so you can have fb for gsFricMask1 but gsFricScale1 will not be applied to any bodyParts in gsFricMask2. - - - Default value = fb. - - - - - Sets the GsFricScale2 setting for this . - Glancing spin help. Friction scale applied when to the side of the car. e.g. make the character spin more by lowering the feet friction. You could also lower the wrist friction here to stop the car pulling along the hands i.e. gsFricMask2 = la|uw. - - - Default value = 0.2f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the GsFricMask2 setting for this . - Two character body-masking value, bitwise joint mask or bitwise logic string of two character body-masking value (see notes for explanation). Note gsFricMask1 and gsFricMask2 are made independent by the code so you can have fb for gsFricMask1 but gsFricScale1 will not be applied to any bodyParts in gsFricMask2. - - - Default value = la. - - - - - Simple buoyancy model. No character movement just fluid forces/torques added to parts. - - - - - Creates a new Instance of the BuoyancyHelper for sending a Buoyancy to a given . - - The to send the Buoyancy to. - - Simple buoyancy model. No character movement just fluid forces/torques added to parts. - - - - - Sets the SurfacePoint setting for this . - Arbitrary point on surface of water. - - - Default value = Vector3(0.0f, 0.0f, 0.0f). - - - - - Sets the SurfaceNormal setting for this . - Normal to surface of water. - - - Default value = Vector3(0.0f, 0.0f, 1.0f). - Min value = 0.0f. - - - - - Sets the Buoyancy setting for this . - Buoyancy multiplier. - - - Default value = 1.0f. - Min value = 0.0f. - - - - - Sets the ChestBuoyancy setting for this . - Buoyancy mulplier for spine2/3. Helps character float upright. - - - Default value = 8.0f. - Min value = 0.0f. - - - - - Sets the Damping setting for this . - Damping for submerged parts. - - - Default value = 40.0f. - Min value = 0.0f. - - - - - Sets the Righting setting for this . - Use righting torque to being character face-up in water?. - - - Default value = True. - - - - - Sets the RightingStrength setting for this . - Strength of righting torque. - - - Default value = 25.0f. - Min value = 0.0f. - - - - - Sets the RightingTime setting for this . - How long to wait after chest hits water to begin righting torque. - - - Default value = 1.0f. - Min value = 0.0f. - - - - - Creates a new Instance of the CatchFallHelper for sending a CatchFall to a given . - - The to send the CatchFall to. - - - - Sets the TorsoStiffness setting for this . - stiffness of torso. - - - Default value = 9.0f. - Min value = 6.0f. - Max value = 16.0f. - - - - - Sets the LegsStiffness setting for this . - stiffness of legs. - - - Default value = 6.0f. - Min value = 4.0f. - Max value = 16.0f. - - - - - Sets the ArmsStiffness setting for this . - stiffness of arms. - - - Default value = 15.0f. - Min value = 6.0f. - Max value = 16.0f. - - - - - Sets the BackwardsMinArmOffset setting for this . - 0 will prop arms up near his shoulders. -0.3 will place hands nearer his behind. - - - Default value = -0.3f. - Min value = -1.0f. - Max value = 0.0f. - - - - - Sets the ForwardMaxArmOffset setting for this . - 0 will point arms down with angled body, 0.45 will point arms forward a bit to catch nearer the head. - - - Default value = 0.4f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the ZAxisSpinReduction setting for this . - Tries to reduce the spin around the Z axis. Scale 0 - 1. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the ExtraSit setting for this . - Scale extra-sit value 0..1. Setting to 0 helps with arched-back issues. Set to 1 for a more alive-looking finish. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the UseHeadLook setting for this . - Toggle to use the head look in this behaviour. - - - Default value = True. - - - - - Sets the Mask setting for this . - Two character body-masking value, bitwise joint mask or bitwise logic string of two character body-masking value (see Active Pose notes for possible values). - - - Default value = fb. - - - - - Creates a new Instance of the ElectrocuteHelper for sending a Electrocute to a given . - - The to send the Electrocute to. - - - - Sets the StunMag setting for this . - The magnitude of the reaction. - - - Default value = 0.3f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the InitialMult setting for this . - initialMult*stunMag = The magnitude of the 1st snap reaction (other mults are applied after this). - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 20.0f. - - - - - Sets the LargeMult setting for this . - largeMult*stunMag = The magnitude of a random large snap reaction (other mults are applied after this). - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 20.0f. - - - - - Sets the LargeMinTime setting for this . - min time to next large random snap (about 14 snaps with stunInterval = 0.07s). - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 200.0f. - - - - - Sets the LargeMaxTime setting for this . - max time to next large random snap (about 28 snaps with stunInterval = 0.07s). - - - Default value = 2.0f. - Min value = 0.0f. - Max value = 200.0f. - - - - - Sets the MovingMult setting for this . - movingMult*stunMag = The magnitude of the reaction if moving(comVelMag) faster than movingThresh. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 20.0f. - - - - - Sets the BalancingMult setting for this . - balancingMult*stunMag = The magnitude of the reaction if balancing = (not lying on the floor/ not upper body not collided) and not airborne. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 20.0f. - - - - - Sets the AirborneMult setting for this . - airborneMult*stunMag = The magnitude of the reaction if airborne. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 20.0f. - - - - - Sets the MovingThresh setting for this . - If moving(comVelMag) faster than movingThresh then mvingMult applied to stunMag. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 20.0f. - - - - - Sets the StunInterval setting for this . - Direction flips every stunInterval. - - - Default value = 0.1f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the DirectionRandomness setting for this . - The character vibrates in a prescribed way - Higher the value the more random this direction is. - - - Default value = 0.3f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the LeftArm setting for this . - vibrate the leftArm. - - - Default value = True. - - - - - Sets the RightArm setting for this . - vibrate the rightArm. - - - Default value = True. - - - - - Sets the LeftLeg setting for this . - vibrate the leftLeg. - - - Default value = True. - - - - - Sets the RightLeg setting for this . - vibrate the rightLeg. - - - Default value = True. - - - - - Sets the Spine setting for this . - vibrate the spine. - - - Default value = True. - - - - - Sets the Neck setting for this . - vibrate the neck. - - - Default value = True. - - - - - Sets the PhasedLegs setting for this . - Legs are either in phase with each other or not. - - - Default value = True. - - - - - Sets the ApplyStiffness setting for this . - let electrocute apply a (higher generally) stiffness to the character whilst being vibrated. - - - Default value = True. - - - - - Sets the UseTorques setting for this . - use torques to make vibration otherwise use a change in the parts angular velocity. - - - Default value = True. - - - - - Sets the HipType setting for this . - type of hip reaction 0=none, 1=side2side 2=steplike. - - - Default value = 2. - Min value = 0. - Max value = 2. - - - - - Creates a new Instance of the FallOverWallHelper for sending a FallOverWall to a given . - - The to send the FallOverWall to. - - - - Sets the BodyStiffness setting for this . - stiffness of the body, roll up stiffness scales with this and defaults at this default value. - - - Default value = 9.0f. - Min value = 6.0f. - Max value = 16.0f. - - - - - Sets the Damping setting for this . - Damping in the effectors. - - - Default value = 0.5f. - Min value = 0.0f. - Max value = 3.0f. - - - - - Sets the MagOfForce setting for this . - Magnitude of the falloverWall helper force. - - - Default value = 0.5f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the MaxDistanceFromPelToHitPoint setting for this . - The maximum distance away from the pelvis that hit points will be registered. - - - Default value = 0.3f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the MaxForceDist setting for this . - maximum distance between hitPoint and body part at which forces are applied to part. - - - Default value = 0.8f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the StepExclusionZone setting for this . - Specifies extent of area in front of the wall in which balancer won't try to take another step. - - - Default value = 0.5f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the MinLegHeight setting for this . - minimum height of pelvis above feet at which fallOverWall is attempted. - - - Default value = 0.4f. - Min value = 0.1f. - Max value = 2.0f. - - - - - Sets the BodyTwist setting for this . - amount of twist to apply to the spine as the character tries to fling himself over the wall, provides more of a believable roll but increases the amount of lateral space the character needs to successfully flip. - - - Default value = 0.5f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the MaxTwist setting for this . - max angle the character can twist before twsit helper torques are turned off. - - - Default value = 3.1f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the FallOverWallEndA setting for this . - One end of the wall to try to fall over. - - - Default value = Vector3(0.0f, 0.0f, 0.0f). - - - - - Sets the FallOverWallEndB setting for this . - One end of the wall over which we are trying to fall over. - - - Default value = Vector3(0.0f, 0.0f, 0.0f). - - - - - Sets the ForceAngleAbort setting for this . - The angle abort threshold. - - - Default value = -0.2f. - - - - - Sets the ForceTimeOut setting for this . - The force time out. - - - Default value = 2.0f. - - - - - Sets the MoveArms setting for this . - Lift the arms up if true. Do nothing with the arms if false (eg when using catchfall arms or brace etc). - - - Default value = True. - - - - - Sets the MoveLegs setting for this . - Move the legs if true. Do nothing with the legs if false (eg when using dynamicBalancer etc). - - - Default value = True. - - - - - Sets the BendSpine setting for this . - Bend spine to help falloverwall if true. Do nothing with the spine if false. - - - Default value = True. - - - - - Sets the AngleDirWithWallNormal setting for this . - Maximum angle in degrees (between the direction of the velocity of the COM and the wall normal) to start to apply forces and torques to fall over the wall. - - - Default value = 180.0f. - Min value = 0.0f. - Max value = 180.0f. - - - - - Sets the LeaningAngleThreshold setting for this . - Maximum angle in degrees (between the vertical vector and a vector from pelvis to lower neck) to start to apply forces and torques to fall over the wall. - - - Default value = 180.0f. - Min value = 0.0f. - Max value = 180.0f. - - - - - Sets the MaxAngVel setting for this . - if the angular velocity is higher than maxAngVel, the torques and forces are not applied. - - - Default value = 2.0f. - Min value = -1.0f. - Max value = 30.0f. - - - - - Sets the AdaptForcesToLowWall setting for this . - Will reduce the magnitude of the forces applied to the character to help him to fall over wall. - - - Default value = False. - - - - - Sets the MaxWallHeight setting for this . - Maximum height (from the lowest foot) to start to apply forces and torques to fall over the wall. - - - Default value = -1.0f. - Min value = -1.0f. - Max value = 3.0f. - - - - - Sets the DistanceToSendSuccessMessage setting for this . - Minimum distance between the pelvis and the wall to send the success message. If negative doesn't take this parameter into account when sending feedback. - - - Default value = -1.0f. - Min value = -1.0f. - Max value = 3.0f. - - - - - Sets the RollingBackThr setting for this . - Value of the angular velocity about the wallEgde above which the character is considered as rolling backwards i.e. goes in to fow_RollingBack state. - - - Default value = 0.5f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the RollingPotential setting for this . - On impact with the wall if the rollingPotential(calculated from the characters linear velocity w.r.t the wall) is greater than this value the character will try to go over the wall otherwise it won't try (fow_Aborted). - - - Default value = 0.3f. - Min value = -1.0f. - Max value = 10.0f. - - - - - Sets the UseArmIK setting for this . - Try to reach the wallEdge. To configure the IK : use limitAngleBack, limitAngleFront and limitAngleTotallyBack. - - - Default value = False. - - - - - Sets the ReachDistanceFromHitPoint setting for this . - distance from predicted hitpoint where each hands will try to reach the wall. - - - Default value = 0.3f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the MinReachDistanceFromHitPoint setting for this . - minimal distance from predicted hitpoint where each hands will try to reach the wall. Used if the hand target is outside the wall Edge. - - - Default value = 0.1f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the AngleTotallyBack setting for this . - max angle in degrees (between 1.the vector between two hips and 2. wallEdge) to try to reach the wall just behind his pelvis with his arms when the character is back to the wall. - - - Default value = 15.0f. - Min value = 0.0f. - Max value = 180.0f. - - - - - Creates a new Instance of the GrabHelper for sending a Grab to a given . - - The to send the Grab to. - - - - Sets the UseLeft setting for this . - Flag to toggle use of left hand. - - - Default value = False. - - - - - Sets the UseRight setting for this . - Flag to toggle the use of the Right hand. - - - Default value = False. - - - - - Sets the DropWeaponIfNecessary setting for this . - if hasn't grabbed when weapon carrying hand is close to target, grab anyway. - - - Default value = False. - - - - - Sets the DropWeaponDistance setting for this . - distance below which a weapon carrying hand will request weapon to be dropped. - - - Default value = 0.3f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the GrabStrength setting for this . - strength in hands for grabbing (kg m/s), -1 to ignore/disable. - - - Default value = -1.0f. - Min value = -1.0f. - Max value = 10000.0f. - - - - - Sets the StickyHands setting for this . - strength of cheat force on hands to pull towards target and stick to target ("cleverHandIK" strength). - - - Default value = 4.0f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the TurnToTarget setting for this . - - - Default value = . - - - - - Sets the GrabHoldMaxTimer setting for this . - amount of time, in seconds, before grab automatically bails. - - - Default value = 100.0f. - Min value = 0.0f. - Max value = 1000.0f. - - - - - Sets the PullUpTime setting for this . - Time to reach the full pullup strength. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 4.0f. - - - - - Sets the PullUpStrengthRight setting for this . - Strength to pull up with the right arm. 0 = no pull up. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the PullUpStrengthLeft setting for this . - Strength to pull up with the left arm. 0 = no pull up. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the Pos1 setting for this . - Grab pos1, right hand if not using line or surface grab. - - - Default value = Vector3(0.0f, 0.0f, 0.0f). - - - - - Sets the Pos2 setting for this . - Grab pos2, left hand if not using line or surface grab. - - - Default value = Vector3(0.0f, 0.0f, 0.0f). - - - - - Sets the Pos3 setting for this . - - - Default value = Vector3(0.0f, 0.0f, 0.0f). - - - - - Sets the Pos4 setting for this . - - - Default value = Vector3(0.0f, 0.0f, 0.0f). - - - - - Sets the NormalR setting for this . - Normal for the right grab point. - - - Default value = Vector3(0.0f, 0.0f, 0.0f). - Min value = -1.0f. - Max value = 1.0f. - - - - - Sets the NormalL setting for this . - Normal for the left grab point. - - - Default value = Vector3(0.0f, 0.0f, 0.0f). - Min value = -1.0f. - Max value = 1.0f. - - - - - Sets the NormalR2 setting for this . - Normal for the 2nd right grab point (if pointsX4grab=true). - - - Default value = Vector3(0.0f, 0.0f, 0.0f). - Min value = -1.0f. - Max value = 1.0f. - - - - - Sets the NormalL2 setting for this . - Normal for the 3rd left grab point (if pointsX4grab=true). - - - Default value = Vector3(0.0f, 0.0f, 0.0f). - Min value = -1.0f. - Max value = 1.0f. - - - - - Sets the HandsCollide setting for this . - Hand collisions on when grabbing (false turns off hand collisions making grab more stable esp. to grab points slightly inside geometry). - - - Default value = False. - - - - - Sets the JustBrace setting for this . - Flag to toggle between grabbing and bracing. - - - Default value = False. - - - - - Sets the UseLineGrab setting for this . - use the line grab, Grab along the line (x-x2). - - - Default value = False. - - - - - Sets the PointsX4grab setting for this . - use 2 point. - - - Default value = False. - - - - - Sets the FromEA setting for this . - use 2 point. - - - Default value = False. - - - - - Sets the SurfaceGrab setting for this . - Toggle surface grab on. Requires pos1,pos2,pos3 and pos4 to be specified. - - - Default value = False. - - - - - Sets the InstanceIndex setting for this . - levelIndex of instance to grab (-1 = world coordinates). - - - Default value = -1. - Min value = -1. - - - - - Sets the InstancePartIndex setting for this . - boundIndex of part on instance to grab (0 = just use instance coordinates). - - - Default value = 0. - Min value = 0. - - - - - Sets the DontLetGo setting for this . - Once a constraint is made, keep reaching with whatever hand is allowed - no matter what the angle/distance and whether or not the constraint has broken due to constraintForce GT grabStrength. mmmtodo this is a badly named parameter. - - - Default value = False. - - - - - Sets the BodyStiffness setting for this . - stiffness of upper body. Scales the arm grab such that the armStiffness is default when this is at default value. - - - Default value = 11.0f. - Min value = 6.0f. - Max value = 16.0f. - - - - - Sets the ReachAngle setting for this . - Angle from front at which the grab activates. If the point is outside this angle from front will not try to grab. - - - Default value = 2.8f. - Min value = 0.0f. - Max value = 3.0f. - - - - - Sets the OneSideReachAngle setting for this . - Angle at which we will only reach with one hand. - - - Default value = 1.4f. - Min value = 0.0f. - Max value = 3.0f. - - - - - Sets the GrabDistance setting for this . - Relative distance at which the grab starts. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 4.0f. - - - - - Sets the Move2Radius setting for this . - Relative distance (additional to grabDistance - doesn't try to move inside grabDistance)at which the grab tries to use the balancer to move to the grab point. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 14.0f. - - - - - Sets the ArmStiffness setting for this . - Stiffness of the arm. - - - Default value = 14.0f. - Min value = 6.0f. - Max value = 16.0f. - - - - - Sets the MaxReachDistance setting for this . - distance to reach out towards the grab point. - - - Default value = 0.7f. - Min value = 0.0f. - Max value = 4.0f. - - - - - Sets the OrientationConstraintScale setting for this . - scale torque used to rotate hands to face normals. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 4.0f. - - - - - Sets the MaxWristAngle setting for this . - When we are grabbing the max angle the wrist ccan be at before we break the grab. - - - Default value = 3.1f. - Min value = 0.0f. - Max value = 3.2f. - - - - - Sets the UseHeadLookToTarget setting for this . - if true, the character will look at targetForHeadLook after a hand grabs until the end of the behavior. (Before grabbing it looks at the grab target). - - - Default value = False. - - - - - Sets the LookAtGrab setting for this . - if true, the character will look at the grab. - - - Default value = True. - - - - - Sets the TargetForHeadLook setting for this . - Only used if useHeadLookToTarget is true, the target in world space to look at. - - - Default value = Vector3(0.0f, 0.0f, 0.0f). - - - - - Creates a new Instance of the HeadLookHelper for sending a HeadLook to a given . - - The to send the HeadLook to. - - - - Sets the Damping setting for this . - Damping of the muscles. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 3.0f. - - - - - Sets the Stiffness setting for this . - Stiffness of the muscles. - - - Default value = 10.0f. - Min value = 6.0f. - Max value = 16.0f. - - - - - Sets the InstanceIndex setting for this . - levelIndex of object to be looked at. vel parameters are ignored if this is non -1. - - - Default value = -1. - Min value = -1. - - - - - Sets the Vel setting for this . - The velocity of the point being looked at. - - - Default value = Vector3(0.0f, 0.0f, 0.0f). - Min value = -100.0f. - Max value = 100.0f. - - - - - Sets the Pos setting for this . - The point being looked at. - - - Default value = Vector3(0.0f, 0.0f, 0.0f). - - - - - Sets the AlwaysLook setting for this . - Flag to force always to look. - - - Default value = False. - - - - - Sets the EyesHorizontal setting for this . - Keep the eyes horizontal. Use true for impact with cars. Use false if you want better look at target accuracy when the character is on the floor or leaned over alot. - - - Default value = True. - - - - - Sets the AlwaysEyesHorizontal setting for this . - Keep the eyes horizontal. Use true for impact with cars. Use false if you want better look at target accuracy when the character is on the floor or leaned over (when not leaned over the eyes are still kept horizontal if eyesHorizontal=true ) alot. - - - Default value = True. - - - - - Sets the KeepHeadAwayFromGround setting for this . - - - Default value = False. - - - - - Sets the TwistSpine setting for this . - Allow headlook to twist spine. - - - Default value = True. - - - - - Creates a new Instance of the HighFallHelper for sending a HighFall to a given . - - The to send the HighFall to. - - - - Sets the BodyStiffness setting for this . - stiffness of body. Value feeds through to bodyBalance (synched with defaults), to armsWindmill (14 for this value at default ), legs pedal, head look and roll down stairs directly. - - - Default value = 11.0f. - Min value = 6.0f. - Max value = 16.0f. - - - - - Sets the Bodydamping setting for this . - The damping of the joints. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 3.0f. - - - - - Sets the Catchfalltime setting for this . - The length of time before the impact that the character transitions to the landing. - - - Default value = 0.3f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the CrashOrLandCutOff setting for this . - 0.52angle is 0.868 dot//A threshold for deciding how far away from upright the character needs to be before bailing out (going into a foetal) instead of trying to land (keeping stretched out). NB: never does bailout if ignorWorldCollisions true. - - - Default value = 0.9f. - Min value = -1.0f. - Max value = 1.0f. - - - - - Sets the PdStrength setting for this . - Strength of the controller to keep the character at angle aimAngleBase from vertical. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the PdDamping setting for this . - Damping multiplier of the controller to keep the character at angle aimAngleBase from vertical. The actual damping is pdDamping*pdStrength*constant*angVel. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 5.0f. - - - - - Sets the ArmAngSpeed setting for this . - arm circling speed in armWindMillAdaptive. - - - Default value = 7.9f. - Min value = 0.0f. - Max value = 20.0f. - - - - - Sets the ArmAmplitude setting for this . - in armWindMillAdaptive. - - - Default value = 2.0f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the ArmPhase setting for this . - in armWindMillAdaptive 3.1 opposite for stuntman. 1.0 old default. 0.0 in phase. - - - Default value = 3.1f. - Min value = 0.0f. - Max value = 6.3f. - - - - - Sets the ArmBendElbows setting for this . - in armWindMillAdaptive bend the elbows as a function of armAngle. For stuntman true otherwise false. - - - Default value = True. - - - - - Sets the LegRadius setting for this . - radius of legs on pedal. - - - Default value = 0.4f. - Min value = 0.0f. - Max value = 0.5f. - - - - - Sets the LegAngSpeed setting for this . - in pedal. - - - Default value = 7.9f. - Min value = 0.0f. - Max value = 15.0f. - - - - - Sets the LegAsymmetry setting for this . - 0.0 for stuntman. Random offset applied per leg to the angular speed to desynchronise the pedaling - set to 0 to disable, otherwise should be set to less than the angularSpeed value. - - - Default value = 4.0f. - Min value = -10.0f. - Max value = 10.0f. - - - - - Sets the Arms2LegsPhase setting for this . - phase angle between the arms and legs circling angle. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 6.5f. - - - - - Sets the Arms2LegsSync setting for this . - Syncs the arms angle to what the leg angle is. - - - Default value = . - All speed/direction parameters of armswindmill are overwritten if = . - If and you want synced arms/legs then armAngSpeed=legAngSpeed, legAsymmetry = 0.0 (to stop randomizations of the leg cicle speed). - - - - - Sets the ArmsUp setting for this . - Where to put the arms when preparing to land. Approx 1 = above head, 0 = head height, -1 = down. LT -2.0 use catchFall arms, LT -3.0 use prepare for landing pose if Agent is due to land vertically, feet first. - - - Default value = -3.1f. - Min value = -4.0f. - Max value = 2.0f. - - - - - Sets the OrientateBodyToFallDirection setting for this . - toggle to orientate to fall direction. i.e. orientate so that the character faces the horizontal velocity direction. - - - Default value = False. - - - - - Sets the OrientateTwist setting for this . - If false don't worry about the twist angle of the character when orientating the character. If false this allows the twist axis of the character to be free (You can get a nice twisting highFall like the one in dieHard 4 when the car goes into the helicopter). - - - Default value = True. - - - - - Sets the OrientateMax setting for this . - DEVEL parameter - suggest you don't edit it. Maximum torque the orientation controller can apply. If 0 then no helper torques will be used. 300 will orientate the character soflty for all but extreme angles away from aimAngleBase. If abs (current -aimAngleBase) is getting near 3.0 then this can be reduced to give a softer feel. - - - Default value = 300.0f. - Min value = 0.0f. - Max value = 2000.0f. - - - - - Sets the AlanRickman setting for this . - If true then orientate the character to face the point from where it started falling. HighFall like the one in dieHard with Alan Rickman. - - - Default value = False. - - - - - Sets the FowardRoll setting for this . - Try to execute a forward Roll on landing. - - - Default value = False. - - - - - Sets the UseZeroPose_withFowardRoll setting for this . - Blend to a zero pose when forward roll is attempted. - - - Default value = False. - - - - - Sets the AimAngleBase setting for this . - Angle from vertical the pdController is driving to ( positive = forwards). - - - Default value = 0.2f. - Min value = -3.1f. - Max value = 3.1f. - - - - - Sets the FowardVelRotation setting for this . - scale to add/subtract from aimAngle based on forward speed (Internal). - - - Default value = 0.0f. - Min value = -1.0f. - Max value = 1.0f. - - - - - Sets the FootVelCompScale setting for this . - Scale to change to amount of vel that is added to the foot ik from the velocity (Internal). - - - Default value = 0.1f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the SideD setting for this . - sideoffset for the feet during prepareForLanding. +ve = right. - - - Default value = 0.2f. - Min value = -1.0f. - Max value = 1.0f. - - - - - Sets the FowardOffsetOfLegIK setting for this . - Forward offset for the feet during prepareForLanding. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the LegL setting for this . - Leg Length for ik (Internal)//unused. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the CatchFallCutOff setting for this . - 0.5angle is 0.878 dot. Cutoff to go to the catchFall ( internal) //mmmtodo do like crashOrLandCutOff. - - - Default value = 0.9f. - Min value = -1.0f. - Max value = 1.0f. - - - - - Sets the LegStrength setting for this . - Strength of the legs at landing. - - - Default value = 12.0f. - Min value = 6.0f. - Max value = 16.0f. - - - - - Sets the Balance setting for this . - If true have enough strength to balance. If false not enough strength in legs to balance (even though bodyBlance called). - - - Default value = True. - - - - - Sets the IgnorWorldCollisions setting for this . - Never go into bailout (foetal). - - - Default value = False. - - - - - Sets the AdaptiveCircling setting for this . - stuntman type fall. Arm and legs circling direction controlled by angmom and orientation. - - - Default value = True. - - - - - Sets the Hula setting for this . - With stuntman type fall. Hula reaction if can't see floor and not rotating fast. - - - Default value = True. - - - - - Sets the MaxSpeedForRecoverableFall setting for this . - Character needs to be moving less than this speed to consider fall as a recoverable one. - - - Default value = 15.0f. - Min value = 0.0f. - Max value = 100.0f. - - - - - Sets the MinSpeedForBrace setting for this . - Character needs to be moving at least this fast horizontally to start bracing for impact if there is an object along its trajectory. - - - Default value = 10.0f. - Min value = 0.0f. - Max value = 100.0f. - - - - - Sets the LandingNormal setting for this . - Ray-cast normal doted with up direction has to be greater than this number to consider object flat enough to land on it. - - - Default value = 0.6f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Creates a new Instance of the IncomingTransformsHelper for sending a IncomingTransforms to a given . - - The to send the IncomingTransforms to. - - - - InjuredOnGround. - - - - - Creates a new Instance of the InjuredOnGroundHelper for sending a InjuredOnGround to a given . - - The to send the InjuredOnGround to. - - InjuredOnGround. - - - - - Sets the NumInjuries setting for this . - - - Default value = 0. - Min value = 0. - Max value = 2. - - - - - Sets the Injury1Component setting for this . - - - Default value = 0. - Min value = 0. - - - - - Sets the Injury2Component setting for this . - - - Default value = 0. - Min value = 0. - - - - - Sets the Injury1LocalPosition setting for this . - - - Default value = Vector3(0.0f, 0.0f, 0.0f). - - - - - Sets the Injury2LocalPosition setting for this . - - - Default value = Vector3(0.0f, 0.0f, 0.0f). - - - - - Sets the Injury1LocalNormal setting for this . - - - Default value = Vector3(1.0f, 0.0f, 0.0f). - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the Injury2LocalNormal setting for this . - - - Default value = Vector3(1.0f, 0.0f, 0.0f). - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the AttackerPos setting for this . - - - Default value = Vector3(1.0f, 0.0f, 0.0f). - Min value = 0.0f. - - - - - Sets the DontReachWithLeft setting for this . - - - Default value = False. - - - - - Sets the DontReachWithRight setting for this . - - - Default value = False. - - - - - Sets the StrongRollForce setting for this . - - - Default value = False. - - - - - Carried. - - - - - Creates a new Instance of the CarriedHelper for sending a Carried to a given . - - The to send the Carried to. - - Carried. - - - - - Dangle. - - - - - Creates a new Instance of the DangleHelper for sending a Dangle to a given . - - The to send the Dangle to. - - Dangle. - - - - - Sets the DoGrab setting for this . - - - Default value = True. - - - - - Sets the GrabFrequency setting for this . - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Creates a new Instance of the OnFireHelper for sending a OnFire to a given . - - The to send the OnFire to. - - - - Sets the StaggerTime setting for this . - Max time for stumbling around before falling to ground. - - - Default value = 2.5f. - Min value = 0.0f. - Max value = 30.0f. - - - - - Sets the StaggerLeanRate setting for this . - How quickly the character leans hips when staggering. - - - Default value = 0.9f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the StumbleMaxLeanBack setting for this . - max the character leans hips back when staggering. - - - Default value = 0.4f. - Min value = 0.0f. - Max value = 1.5f. - - - - - Sets the StumbleMaxLeanForward setting for this . - max the character leans hips forwards when staggering. - - - Default value = 0.5f. - Min value = 0.0f. - Max value = 1.5f. - - - - - Sets the ArmsWindmillWritheBlend setting for this . - Blend armsWindmill with the bodyWrithe arms when character is upright. - - - Default value = 0.4f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the SpineStumbleWritheBlend setting for this . - Blend spine stumble with the bodyWrithe spine when character is upright. - - - Default value = 0.7f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the LegsStumbleWritheBlend setting for this . - Blend legs stumble with the bodyWrithe legs when character is upright. - - - Default value = 0.2f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the ArmsPoseWritheBlend setting for this . - Blend the bodyWrithe arms with the current desired pose from on fire behaviour when character is on the floor. - - - Default value = 0.7f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the SpinePoseWritheBlend setting for this . - Blend the bodyWrithe back with the current desired pose from on fire behaviour when character is on the floor. - - - Default value = 0.6f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the LegsPoseWritheBlend setting for this . - Blend the bodyWrithe legs with the current desired pose from on fire behaviour when character is on the floor. - - - Default value = 0.5f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the RollOverFlag setting for this . - Flag to set bodyWrithe trying to rollOver. - - - Default value = True. - - - - - Sets the RollTorqueScale setting for this . - Scale rolling torque that is applied to character spine by bodyWrithe. Torque magnitude is calculated with the following formula: m_rollOverDirection*rollOverPhase*rollTorqueScale. - - - Default value = 25.0f. - Min value = 0.0f. - Max value = 300.0f. - - - - - Sets the PredictTime setting for this . - Character pose depends on character facing direction that is evaluated from its COMTM orientation. Set this value to 0 to use no orientation prediction i.e. current character COMTM orientation will be used to determine character facing direction and finally the pose bodyWrithe is blending to. Set this value to GT 0 to predict character COMTM orientation this amout of time in seconds to the future. - - - Default value = 0.1f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the MaxRollOverTime setting for this . - Rolling torque is ramped down over time. At this time in seconds torque value converges to zero. Use this parameter to restrict time the character is rolling. - - - Default value = 8.0f. - Min value = 0.0f. - Max value = 60.0f. - - - - - Sets the RollOverRadius setting for this . - Rolling torque is ramped down with distance measured from position where character hit the ground and started rolling. At this distance in meters torque value converges to zero. Use this parameter to restrict distance the character travels due to rolling. - - - Default value = 2.0f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Creates a new Instance of the PedalLegsHelper for sending a PedalLegs to a given . - - The to send the PedalLegs to. - - - - Sets the PedalLeftLeg setting for this . - pedal with this leg or not. - - - Default value = True. - - - - - Sets the PedalRightLeg setting for this . - pedal with this leg or not. - - - Default value = True. - - - - - Sets the BackPedal setting for this . - pedal forwards or backwards. - - - Default value = False. - - - - - Sets the Radius setting for this . - base radius of pedal action. - - - Default value = 0.3f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the AngularSpeed setting for this . - rate of pedaling. If adaptivePedal4Dragging is true then the legsAngularSpeed calculated to match the linear speed of the character can have a maximum value of angularSpeed (this max used to be hard coded to 13.0). - - - Default value = 10.0f. - Min value = 0.0f. - Max value = 100.0f. - - - - - Sets the LegStiffness setting for this . - stiffness of legs. - - - Default value = 10.0f. - Min value = 6.0f. - Max value = 16.0f. - - - - - Sets the PedalOffset setting for this . - Move the centre of the pedal for the left leg up by this amount, the right leg down by this amount. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the RandomSeed setting for this . - Random seed used to generate speed changes. - - - Default value = 100. - Min value = 0. - - - - - Sets the SpeedAsymmetry setting for this . - Random offset applied per leg to the angular speed to desynchronise the pedaling - set to 0 to disable, otherwise should be set to less than the angularSpeed value. - - - Default value = 8.0f. - Min value = -10.0f. - Max value = 10.0f. - - - - - Sets the AdaptivePedal4Dragging setting for this . - Will pedal in the direction of travel (if backPedal = false, against travel if backPedal = true) and with an angular velocity relative to speed upto a maximum of 13(rads/sec). Use when being dragged by a car. Overrides angularSpeed. - - - Default value = False. - - - - - Sets the AngSpeedMultiplier4Dragging setting for this . - newAngularSpeed = Clamp(angSpeedMultiplier4Dragging * linear_speed/pedalRadius, 0.0, angularSpeed). - - - Default value = 0.3f. - Min value = 0.0f. - Max value = 100.0f. - - - - - Sets the RadiusVariance setting for this . - 0-1 value used to add variance to the radius value while pedalling, to desynchonize the legs' movement and provide some variety. - - - Default value = 0.4f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the LegAngleVariance setting for this . - 0-1 value used to vary the angle of the legs from the hips during the pedal. - - - Default value = 0.5f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the CentreSideways setting for this . - Move the centre of the pedal for both legs sideways (+ve = right). NB: not applied to hula. - - - Default value = 0.0f. - Min value = -1.0f. - Max value = 1.0f. - - - - - Sets the CentreForwards setting for this . - Move the centre of the pedal for both legs forward (or backward -ve). - - - Default value = 0.0f. - Min value = -1.0f. - Max value = 1.0f. - - - - - Sets the CentreUp setting for this . - Move the centre of the pedal for both legs up (or down -ve). - - - Default value = 0.0f. - Min value = -1.0f. - Max value = 1.0f. - - - - - Sets the Ellipse setting for this . - Turn the circle into an ellipse. Ellipse has horizontal radius a and vertical radius b. If ellipse is +ve then a=radius*ellipse and b=radius. If ellipse is -ve then a=radius and b = radius*ellipse. 0.0 = vertical line of length 2*radius, 0.0:1.0 circle squashed horizontally (vertical radius = radius), 1.0=circle. -0.001 = horizontal line of length 2*radius, -0.0:-1.0 circle squashed vertically (horizontal radius = radius), -1.0 = circle. - - - Default value = 1.0f. - Min value = -1.0f. - Max value = 1.0f. - - - - - Sets the DragReduction setting for this . - how much to account for the target moving through space rather than being static. - - - Default value = 0.3f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the Spread setting for this . - Spread legs. - - - Default value = 0.0f. - Min value = -1.0f. - Max value = 1.0f. - - - - - Sets the Hula setting for this . - If true circle the legs in a hula motion. - - - Default value = False. - - - - - BEHAVIOURS REFERENCED: AnimPose - allows animPose to overridebodyParts: Arms (useLeftArm, useRightArm). - - - - - Creates a new Instance of the PointArmHelper for sending a PointArm to a given . - - The to send the PointArm to. - - BEHAVIOURS REFERENCED: AnimPose - allows animPose to overridebodyParts: Arms (useLeftArm, useRightArm). - - - - - Sets the TargetLeft setting for this . - point to point to (in world space). - - - Default value = Vector3(0.0f, 0.0f, 0.0f). - - - - - Sets the TwistLeft setting for this . - twist of the arm around point direction. - - - Default value = 0.3f. - Min value = -1.0f. - Max value = 1.0f. - - - - - Sets the ArmStraightnessLeft setting for this . - values less than 1 can give the arm a more bent look. - - - Default value = 0.8f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the UseLeftArm setting for this . - - - Default value = False. - - - - - Sets the ArmStiffnessLeft setting for this . - stiffness of arm. - - - Default value = 15.0f. - Min value = 6.0f. - Max value = 16.0f. - - - - - Sets the ArmDampingLeft setting for this . - damping value for arm used to point. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the InstanceIndexLeft setting for this . - level index of thing to point at, or -1 for none. if -1, target is specified in world space, otherwise it is an offset from the object specified by this index. - - - Default value = -1. - Min value = -1. - - - - - Sets the PointSwingLimitLeft setting for this . - Swing limit. - - - Default value = 1.5f. - Min value = 0.0f. - Max value = 3.0f. - - - - - Sets the UseZeroPoseWhenNotPointingLeft setting for this . - - - Default value = False. - - - - - Sets the TargetRight setting for this . - point to point to (in world space). - - - Default value = Vector3(0.0f, 0.0f, 0.0f). - - - - - Sets the TwistRight setting for this . - twist of the arm around point direction. - - - Default value = 0.3f. - Min value = -1.0f. - Max value = 1.0f. - - - - - Sets the ArmStraightnessRight setting for this . - values less than 1 can give the arm a more bent look. - - - Default value = 0.8f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the UseRightArm setting for this . - - - Default value = False. - - - - - Sets the ArmStiffnessRight setting for this . - stiffness of arm. - - - Default value = 15.0f. - Min value = 6.0f. - Max value = 16.0f. - - - - - Sets the ArmDampingRight setting for this . - damping value for arm used to point. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the InstanceIndexRight setting for this . - level index of thing to point at, or -1 for none. if -1, target is specified in world space, otherwise it is an offset from the object specified by this index. - - - Default value = -1. - Min value = -1. - - - - - Sets the PointSwingLimitRight setting for this . - Swing limit. - - - Default value = 1.5f. - Min value = 0.0f. - Max value = 3.0f. - - - - - Sets the UseZeroPoseWhenNotPointingRight setting for this . - - - Default value = False. - - - - - Creates a new Instance of the PointGunHelper for sending a PointGun to a given . - - The to send the PointGun to. - - - - Sets the EnableRight setting for this . - Allow right hand to point/support?. - - - Default value = True. - - - - - Sets the EnableLeft setting for this . - Allow right hand to point/support?. - - - Default value = True. - - - - - Sets the LeftHandTarget setting for this . - Target for the left Hand. - - - Default value = Vector3(0.0f, 0.0f, 0.0f). - - - - - Sets the LeftHandTargetIndex setting for this . - Index of the object that the left hand target is specified in, -1 is world space. - - - Default value = -1. - - - - - Sets the RightHandTarget setting for this . - Target for the right Hand. - - - Default value = Vector3(0.0f, 0.0f, 0.0f). - - - - - Sets the RightHandTargetIndex setting for this . - Index of the object that the right hand target is specified in, -1 is world space. - - - Default value = -1. - - - - - Sets the LeadTarget setting for this . - NB: Only Applied to single handed weapons (some more work is required to have this tech on two handed weapons). Amount to lead target based on target velocity relative to the chest. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the ArmStiffness setting for this . - Stiffness of the arm. - - - Default value = 14.0f. - Min value = 2.0f. - Max value = 15.0f. - - - - - Sets the ArmStiffnessDetSupport setting for this . - Stiffness of the arm on pointing arm when a support arm is detached from a two-handed weapon. - - - Default value = 8.0f. - Min value = 2.0f. - Max value = 15.0f. - - - - - Sets the ArmDamping setting for this . - Damping. - - - Default value = 1.0f. - Min value = 0.1f. - Max value = 5.0f. - - - - - Sets the GravityOpposition setting for this . - Amount of gravity opposition on pointing arm. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the GravOppDetachedSupport setting for this . - Amount of gravity opposition on pointing arm when a support arm is detached from a two-handed weapon. - - - Default value = 0.5f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the MassMultDetachedSupport setting for this . - Amount of mass of weapon taken into account by gravity opposition on pointing arm when a support arm is detached from a two-handed weapon. The lower the value the more the character doesn't know about the weapon mass and therefore is more affected by it. - - - Default value = 0.1f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the AllowShotLooseness setting for this . - Allow shot to set a lower arm muscleStiffness than pointGun normally would. - - - Default value = False. - - - - - Sets the ClavicleBlend setting for this . - How much of blend should come from incoming transforms 0(all IK) .. 1(all ITMs) For pointing arms only. (Support arm uses the IK solution as is for clavicles). - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the ElbowAttitude setting for this . - Controls arm twist. (except in pistolIK). - - - Default value = 0.3f. - Min value = -1.0f. - Max value = 1.0f. - - - - - Sets the SupportConstraint setting for this . - Type of constraint between the support hand and gun. 0=no constraint, 1=hard distance constraint, 2=Force based constraint, 3=hard spherical constraint. - - - Default value = 1. - Min value = 0. - Max value = 3. - - - - - Sets the ConstraintMinDistance setting for this . - For supportConstraint = 1: Support hand constraint distance will be slowly reduced until it hits this value. This is for stability and also allows the pointing arm to lead a little. Don't set lower than NM_MIN_STABLE_DISTANCECONSTRAINT_DISTANCE 0.001f. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 0.1f. - - - - - Sets the MakeConstraintDistance setting for this . - For supportConstraint = 1: Minimum distance within which support hand constraint will be made. - - - Default value = 0.1f. - Min value = 0.0f. - Max value = 3.0f. - - - - - Sets the ReduceConstraintLengthVel setting for this . - For supportConstraint = 1: Velocity at which to reduce the support hand constraint length. - - - Default value = 1.5f. - Min value = 0.1f. - Max value = 10.0f. - - - - - Sets the BreakingStrength setting for this . - For supportConstraint = 1: strength of the supporting hands constraint (kg m/s), -1 to ignore/disable. - - - Default value = -1.0f. - Min value = -1.0f. - Max value = 1000.0f. - - - - - Sets the BrokenSupportTime setting for this . - Once constraint is broken then do not try to reconnect/support for this amount of time. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 5.0f. - - - - - Sets the BrokenToSideProb setting for this . - Probability that the when a constraint is broken that during brokenSupportTime a side pose will be selected. - - - Default value = 0.5f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the ConnectAfter setting for this . - If gunArm has been controlled by other behaviours for this time when it could have been pointing but couldn't due to pointing only allowed if connected, change gunArm pose to something that could connect for connectFor seconds. - - - Default value = 0.7f. - Min value = 0.0f. - Max value = 5.0f. - - - - - Sets the ConnectFor setting for this . - Time to try to reconnect for. - - - Default value = 0.6f. - Min value = 0.0f. - Max value = 5.0f. - - - - - Sets the OneHandedPointing setting for this . - 0 = don't allow, 1= allow for kPistol(two handed pistol) only, 2 = allow for kRifle only, 3 = allow for kPistol and kRifle. Allow one handed pointing - no constraint if cant be supported . If not allowed then gunHand does not try to point at target if it cannot be supported - the constraint will be controlled by always support. - - - Default value = 1. - Min value = 0. - Max value = 3. - - - - - Sets the AlwaysSupport setting for this . - Support a non pointing gunHand i.e. if in zero pose (constrain as well if constraint possible). - - - Default value = False. - - - - - Sets the PoseUnusedGunArm setting for this . - Apply neutral pose when a gun arm isn't in use. NB: at the moment Rifle hand is always controlled by pointGun. - - - Default value = False. - - - - - Sets the PoseUnusedSupportArm setting for this . - Apply neutral pose when a support arm isn't in use. - - - Default value = False. - - - - - Sets the PoseUnusedOtherArm setting for this . - Apply neutral pose to the non-gun arm (otherwise it is always under the control of other behaviours or not set). If the non-gun hand is a supporting hand it is not controlled by this parameter but by poseUnusedSupportArm. - - - Default value = False. - - - - - Sets the MaxAngleAcross setting for this . - max aiming angle(deg) sideways across body midline measured from chest forward that the character will try to point. - - - Default value = 90.0f. - Min value = 0.0f. - Max value = 180.0f. - - - - - Sets the MaxAngleAway setting for this . - max aiming angle(deg) sideways away from body midline measured from chest forward that the character will try to point. - - - Default value = 90.0f. - Min value = 0.0f. - Max value = 180.0f. - - - - - Sets the FallingLimits setting for this . - 0= don't apply limits. 1=apply the limits below only when the character is falling. 2 = always apply these limits (instead of applying maxAngleAcross and maxAngleAway which only limits the horizontal angle but implicity limits the updown (the limit shape is a vertical hinge). - - - Default value = 0. - Min value = 0. - Max value = 2. - - - - - Sets the AcrossLimit setting for this . - max aiming angle(deg) sideways across body midline measured from chest forward that the character will try to point. i.e. for rightHanded gun this is the angle left of the midline. - - - Default value = 90.0f. - Min value = 0.0f. - Max value = 180.0f. - - - - - Sets the AwayLimit setting for this . - max aiming angle(deg) sideways away from body midline measured from chest forward that the character will try to point. i.e. for rightHanded gun this is the angle right of the midline. - - - Default value = 90.0f. - Min value = 0.0f. - Max value = 180.0f. - - - - - Sets the UpLimit setting for this . - max aiming angle(deg) upwards from body midline measured from chest forward that the character will try to point. - - - Default value = 90.0f. - Min value = 0.0f. - Max value = 180.0f. - - - - - Sets the DownLimit setting for this . - max aiming angle(deg) downwards from body midline measured from chest forward that the character will try to point. - - - Default value = 45.0f. - Min value = 0.0f. - Max value = 180.0f. - - - - - Sets the RifleFall setting for this . - Pose the rifle hand to reduce complications with collisions. 0 = false, 1 = always when falling, 2 = when falling except if falling backwards. - - - Default value = 0. - Min value = 0. - Max value = 2. - - - - - Sets the FallingSupport setting for this . - Allow supporting of a rifle(or two handed pistol) when falling. 0 = false, 1 = support if allowed, 2 = support until constraint not active (don't allow support to restart), 3 = support until constraint not effective (support hand to support distance must be less than 0.15 - don't allow support to restart). - - - Default value = 1. - Min value = 0. - Max value = 3. - - - - - Sets the FallingTypeSupport setting for this . - What is considered a fall by fallingSupport). Apply fallingSupport 0=never(will support if allowed), 1 = falling, 2 = falling except if falling backwards, 3 = falling and collided, 4 = falling and collided except if falling backwards, 5 = falling except if falling backwards until collided. - - - Default value = 0. - Min value = 0. - Max value = 5. - - - - - Sets the PistolNeutralType setting for this . - 0 = byFace, 1=acrossFront, 2=bySide. NB: bySide is not connectible so be careful if combined with kPistol and oneHandedPointing = 0 or 2. - - - Default value = 0. - Min value = 0. - Max value = 2. - - - - - Sets the NeutralPoint4Pistols setting for this . - NOT IMPLEMENTED YET KEEP=false - use pointing for neutral targets in pistol modes. - - - Default value = False. - - - - - Sets the NeutralPoint4Rifle setting for this . - use pointing for neutral targets in rifle mode. - - - Default value = True. - - - - - Sets the CheckNeutralPoint setting for this . - Check the neutral pointing is pointable, if it isn't then choose a neutral pose instead. - - - Default value = False. - - - - - Sets the Point2Side setting for this . - side, up, back) side is left for left arm, right for right arm mmmmtodo. - - - Default value = Vector3(5.0f, -5.0f, -2.0f). - - - - - Sets the Add2WeaponDistSide setting for this . - add to weaponDistance for point2Side neutral pointing (to straighten the arm). - - - Default value = 0.3f. - Min value = -1.0f. - Max value = 1000.0f. - - - - - Sets the Point2Connect setting for this . - side, up, back) side is left for left arm, right for rght arm mmmmtodo. - - - Default value = Vector3(-1.0f, -0.9f, -0.2f). - - - - - Sets the Add2WeaponDistConnect setting for this . - add to weaponDistance for point2Connect neutral pointing (to straighten the arm). - - - Default value = 0.0f. - Min value = -1.0f. - Max value = 1000.0f. - - - - - Sets the UsePistolIK setting for this . - enable new ik for pistol pointing. - - - Default value = True. - - - - - Sets the UseSpineTwist setting for this . - Use spine twist to orient chest?. - - - Default value = True. - - - - - Sets the UseTurnToTarget setting for this . - Turn balancer to help gun point at target. - - - Default value = False. - - - - - Sets the UseHeadLook setting for this . - Use head look to drive head?. - - - Default value = True. - - - - - Sets the ErrorThreshold setting for this . - angular difference between pointing direction and target direction above which feedback will be generated. - - - Default value = 0.4f. - Min value = 0.0f. - Max value = 3.1f. - - - - - Sets the FireWeaponRelaxTime setting for this . - Duration of arms relax following firing weapon. NB:This is clamped (0,5) in pointGun. - - - Default value = 0.4f. - Min value = 0.0f. - Max value = 5.0f. - - - - - Sets the FireWeaponRelaxAmount setting for this . - Relax multiplier following firing weapon. Recovers over relaxTime. - - - Default value = 0.5f. - Min value = 0.1f. - Max value = 1.0f. - - - - - Sets the FireWeaponRelaxDistance setting for this . - Range of motion for ik-based recoil. - - - Default value = 0.1f. - Min value = 0.0f. - Max value = 0.3f. - - - - - Sets the UseIncomingTransforms setting for this . - Use the incoming transforms to inform the pointGun of the primaryWeaponDistance, poleVector for the arm. - - - Default value = True. - - - - - Sets the MeasureParentOffset setting for this . - If useIncomingTransforms = true and measureParentOffset=true then measure the Pointing-from offset from parent effector, using itms - this should point the barrel of the gun to the target. This is added to the rightHandParentOffset. NB NOT used if rightHandParentEffector LT 0. - - - Default value = True. - - - - - Sets the LeftHandParentOffset setting for this . - Pointing-from offset from parent effector, expressed in spine3's frame, x = back/forward, y = right/left, z = up/down. - - - Default value = Vector3(0.0f, 0.0f, 0.0f). - - - - - Sets the LeftHandParentEffector setting for this . - 1 = Use leftShoulder. Effector from which the left hand pointing originates. ie, point from this part to the target. -1 causes default offset for active weapon mode to be applied. - - - Default value = -1. - Min value = -1. - Max value = 21. - - - - - Sets the RightHandParentOffset setting for this . - Pointing-from offset from parent effector, expressed in spine3's frame, x = back/forward, y = right/left, z = up/down. This is added to the measured one if useIncomingTransforms=true and measureParentOffset=true. NB NOT used if rightHandParentEffector LT 0. Pistol(0,0,0) Rifle(0.0032, 0.0, -0.0). - - - Default value = Vector3(0.0f, 0.0f, 0.0f). - - - - - Sets the RightHandParentEffector setting for this . - 1 = Use rightShoulder.. Effector from which the right hand pointing originates. ie, point from this part to the target. -1 causes default offset for active weapon mode to be applied. - - - Default value = -1. - Min value = -1. - Max value = 21. - - - - - Sets the PrimaryHandWeaponDistance setting for this . - Distance from the shoulder to hold the weapon. If -1 and useIncomingTransforms then weaponDistance is read from ITMs. weaponDistance=primaryHandWeaponDistance clamped [0.2f:m_maxArmReach=0.65] if useIncomingTransforms = false. pistol 0.60383, rifle 0.336. - - - Default value = -1.0f. - Min value = -1.0f. - Max value = 1.0f. - - - - - Sets the ConstrainRifle setting for this . - Use hard constraint to keep rifle stock against shoulder?. - - - Default value = True. - - - - - Sets the RifleConstraintMinDistance setting for this . - Rifle constraint distance. Deliberately kept large to create a flat constraint surface where rifle meets the shoulder. - - - Default value = 0.2f. - Min value = 0.0f. - - - - - Sets the DisableArmCollisions setting for this . - Disable collisions between right hand/forearm and the torso/legs. - - - Default value = False. - - - - - Sets the DisableRifleCollisions setting for this . - Disable collisions between right hand/forearm and spine3/spine2 if in rifle mode. - - - Default value = False. - - - - - Seldom set parameters for pointGun - just to keep number of parameters in any message less than or equal to 64. - - - - - Creates a new Instance of the PointGunExtraHelper for sending a PointGunExtra to a given . - - The to send the PointGunExtra to. - - Seldom set parameters for pointGun - just to keep number of parameters in any message less than or equal to 64. - - - - - Sets the ConstraintStrength setting for this . - For supportConstraint = 2: force constraint strength of the supporting hands - it gets shaky at about 4.0. - - - Default value = 2.0f. - Min value = 0.0f. - Max value = 5.0f. - - - - - Sets the ConstraintThresh setting for this . - For supportConstraint = 2: Like makeConstraintDistance. Force starts acting when the hands are LT 3.0*thresh apart but is maximum strength LT thresh. For comparison: 0.1 is used for reachForWound in shot, 0.25 is used in grab. - - - Default value = 0.1f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the WeaponMask setting for this . - Currently unused - no intoWorldTest. RAGE bit mask to exclude weapons from ray probe - currently defaults to MP3 weapon flag. - - - Default value = 1024. - Min value = 0. - - - - - Sets the TimeWarpActive setting for this . - Is timeWarpActive enabled?. - - - Default value = False. - - - - - Sets the TimeWarpStrengthScale setting for this . - Scale for arm and helper strength when timewarp is enabled. 1 = normal compensation. - - - Default value = 1.0f. - Min value = 0.1f. - Max value = 2.0f. - - - - - Sets the OriStiff setting for this . - Hand stabilization controller stiffness. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 100.0f. - - - - - Sets the OriDamp setting for this . - Hand stabilization controller damping. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the PosStiff setting for this . - Hand stabilization controller stiffness. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 100.0f. - - - - - Sets the PosDamp setting for this . - Hand stabilization controller damping. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Creates a new Instance of the RollDownStairsHelper for sending a RollDownStairs to a given . - - The to send the RollDownStairs to. - - - - Sets the Stiffness setting for this . - Effector Stiffness. value feeds through to rollUp directly. - - - Default value = 11.0f. - Min value = 6.0f. - Max value = 16.0f. - - - - - Sets the Damping setting for this . - Effector Damping. - - - Default value = 1.4f. - Min value = 0.0f. - Max value = 4.0f. - - - - - Sets the Forcemag setting for this . - Helper force strength. Do not go above 1 for a rollDownStairs/roll along ground reaction. - - - Default value = 0.6f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the M_useArmToSlowDown setting for this . - the degree to which the character will try to stop a barrel roll with his arms. - - - Default value = -1.9f. - Min value = -3.0f. - Max value = 3.0f. - - - - - Sets the UseZeroPose setting for this . - Blends between a zeroPose and the Rollup, Faster the character is rotating the less the zeroPose. - - - Default value = False. - - - - - Sets the SpinWhenInAir setting for this . - Applied cheat forces to spin the character when in the air, the forces are 40% of the forces applied when touching the ground. Be careful little bunny rabbits, the character could spin unnaturally in the air. - - - Default value = False. - - - - - Sets the M_armReachAmount setting for this . - how much the character reaches with his arms to brace against the ground. - - - Default value = 1.4f. - Min value = 0.0f. - Max value = 3.0f. - - - - - Sets the M_legPush setting for this . - amount that the legs push outwards when tumbling. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the TryToAvoidHeadButtingGround setting for this . - Blends between a zeroPose and the Rollup, Faster the character is rotating the less the zeroPose. - - - Default value = False. - - - - - Sets the ArmReachLength setting for this . - the length that the arm reaches and so how much it straightens. - - - Default value = 0.4f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the CustomRollDir setting for this . - pass in a custom direction in to have the character try and roll in that direction. - - - Default value = Vector3(0.0f, 0.0f, 1.0f). - Min value = 1.0f. - Max value = 1.0f. - - - - - Sets the UseCustomRollDir setting for this . - pass in true to use the customRollDir parameter. - - - Default value = False. - - - - - Sets the StiffnessDecayTarget setting for this . - The target linear velocity used to start the rolling. - - - Default value = 9.0f. - Min value = 0.0f. - Max value = 20.0f. - - - - - Sets the StiffnessDecayTime setting for this . - time, in seconds, to decay stiffness down to the stiffnessDecayTarget value (or -1 to disable). - - - Default value = -1.0f. - Min value = -1.0f. - Max value = 10.0f. - - - - - Sets the AsymmetricalLegs setting for this . - 0 is no leg asymmetry in 'foetal' position. greater than 0 a asymmetricalLegs-rand(30%), added/minus each joint of the legs in radians. Random number changes about once every roll. 0.4 gives a lot of asymmetry. - - - Default value = 0.0f. - Min value = -1.0f. - Max value = 1.0f. - - - - - Sets the ZAxisSpinReduction setting for this . - Tries to reduce the spin around the z axis. Scale 0 - 1. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the TargetLinearVelocityDecayTime setting for this . - Time for the targetlinearVelocity to decay to zero. - - - Default value = 0.5f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the TargetLinearVelocity setting for this . - Helper torques are applied to match the spin of the character to the max of targetLinearVelocity and COMVelMag. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the OnlyApplyHelperForces setting for this . - Don't use rollup if true. - - - Default value = False. - - - - - Sets the UseVelocityOfObjectBelow setting for this . - scale applied cheat forces/torques to (zero) if object underneath character has velocity greater than 1.f. - - - Default value = False. - - - - - Sets the UseRelativeVelocity setting for this . - useVelocityOfObjectBelow uses a relative velocity of the character to the object underneath. - - - Default value = False. - - - - - Sets the ApplyFoetalToLegs setting for this . - if true, use rollup for upper body and a kind of foetal behavior for legs. - - - Default value = False. - - - - - Sets the MovementLegsInFoetalPosition setting for this . - Only used if applyFoetalToLegs = true : define the variation of angles for the joints of the legs. - - - Default value = 1.3f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the MaxAngVelAroundFrontwardAxis setting for this . - Only used if applyNewRollingCheatingTorques or applyHelPerTorqueToAlign defined to true : maximal angular velocity around frontward axis of the pelvis to apply cheating torques. - - - Default value = 2.0f. - Min value = -1.0f. - Max value = 10.0f. - - - - - Sets the MinAngVel setting for this . - Only used if applyNewRollingCheatingTorques or applyHelPerTorqueToAlign defined to true : minimal angular velocity of the roll to apply cheating torques. - - - Default value = 0.5f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the ApplyNewRollingCheatingTorques setting for this . - if true will use the new way to apply cheating torques (like in fallOverWall), otherwise will use the old way. - - - Default value = False. - - - - - Sets the MaxAngVel setting for this . - Only used if applyNewRollingCheatingTorques defined to true : maximal angular velocity of the roll to apply cheating torque. - - - Default value = 5.0f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the MagOfTorqueToRoll setting for this . - Only used if applyNewRollingCheatingTorques defined to true : magnitude of the torque to roll down the stairs. - - - Default value = 50.0f. - Min value = 0.0f. - Max value = 500.0f. - - - - - Sets the ApplyHelPerTorqueToAlign setting for this . - apply torque to align the body orthogonally to the direction of the roll. - - - Default value = False. - - - - - Sets the DelayToAlignBody setting for this . - Only used if applyHelPerTorqueToAlign defined to true : delay to start to apply torques. - - - Default value = 0.2f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the MagOfTorqueToAlign setting for this . - Only used if applyHelPerTorqueToAlign defined to true : magnitude of the torque to align orthogonally the body. - - - Default value = 50.0f. - Min value = 0.0f. - Max value = 500.0f. - - - - - Sets the AirborneReduction setting for this . - Ordinarily keep at 0.85. Make this lower if you want spinning in the air. - - - Default value = 0.9f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the ApplyMinMaxFriction setting for this . - Pass-through to Roll Up. Controls whether or not behaviour enforces min/max friction. - - - Default value = True. - - - - - Sets the LimitSpinReduction setting for this . - Scale zAxisSpinReduction back when rotating end-over-end (somersault) to give the body a chance to align with the axis of rotation. - - - Default value = False. - - - - - Creates a new Instance of the ShotHelper for sending a Shot to a given . - - The to send the Shot to. - - - - Sets the BodyStiffness setting for this . - stiffness of body. Feeds through to roll_up. - - - Default value = 11.0f. - Min value = 6.0f. - Max value = 16.0f. - - - - - Sets the SpineDamping setting for this . - stiffness of body. Feeds through to roll_up. - - - Default value = 1.0f. - Min value = 0.1f. - Max value = 2.0f. - - - - - Sets the ArmStiffness setting for this . - arm stiffness. - - - Default value = 10.0f. - Min value = 6.0f. - Max value = 16.0f. - - - - - Sets the InitialNeckStiffness setting for this . - initial stiffness of neck after being shot. - - - Default value = 14.0f. - Min value = 3.0f. - Max value = 16.0f. - - - - - Sets the InitialNeckDamping setting for this . - intial damping of neck after being shot. - - - Default value = 1.0f. - Min value = 0.1f. - Max value = 10.0f. - - - - - Sets the NeckStiffness setting for this . - stiffness of neck. - - - Default value = 14.0f. - Min value = 3.0f. - Max value = 16.0f. - - - - - Sets the NeckDamping setting for this . - damping of neck. - - - Default value = 1.0f. - Min value = 0.1f. - Max value = 2.0f. - - - - - Sets the KMultOnLoose setting for this . - how much to add to upperbody stiffness dependent on looseness. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the KMult4Legs setting for this . - how much to add to leg stiffnesses dependent on looseness. - - - Default value = 0.3f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the LoosenessAmount setting for this . - how loose the character is made by a newBullet. between 0 and 1. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the Looseness4Fall setting for this . - how loose the character is made by a newBullet if falling. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the Looseness4Stagger setting for this . - how loose the upperBody of the character is made by a newBullet if staggerFall is running (and not falling). Note atm the neck ramp values are ignored in staggerFall. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the MinArmsLooseness setting for this . - minimum looseness to apply to the arms. - - - Default value = 0.1f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the MinLegsLooseness setting for this . - minimum looseness to apply to the Legs. - - - Default value = 0.1f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the GrabHoldTime setting for this . - how long to hold for before returning to relaxed arm position. - - - Default value = 2.0f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the SpineBlendExagCPain setting for this . - true: spine is blended with zero pose, false: spine is blended with zero pose if not setting exag or cpain. - - - Default value = False. - - - - - Sets the SpineBlendZero setting for this . - spine is always blended with zero pose this much and up to 1 as the character become stationary. If negative no blend is ever applied. - - - Default value = 0.6f. - Min value = -0.1f. - Max value = 1.0f. - - - - - Sets the BulletProofVest setting for this . - looseness applied to spine is different if bulletProofVest is true. - - - Default value = False. - - - - - Sets the AlwaysResetLooseness setting for this . - looseness always reset on shotNewBullet even if previous looseness ramp still running. Except for the neck which has it's own ramp. - - - Default value = True. - - - - - Sets the AlwaysResetNeckLooseness setting for this . - Neck looseness always reset on shotNewBullet even if previous looseness ramp still running. - - - Default value = True. - - - - - Sets the AngVelScale setting for this . - How much to scale the angular velocity coming in from animation of a part if it is in angVelScaleMask (otherwise scale by 1.0). - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the AngVelScaleMask setting for this . - Parts to scale the initial angular velocity by angVelScale (otherwize scale by 1.0). - - - Default value = fb. - - - - - Sets the FlingWidth setting for this . - Width of the fling behaviour. - - - Default value = 0.5f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the FlingTime setting for this . - Duration of the fling behaviour. - - - Default value = 0.6f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the TimeBeforeReachForWound setting for this . - time, in seconds, before the character begins to grab for the wound on the first hit. - - - Default value = 0.2f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the ExagDuration setting for this . - exaggerate bullet duration (at exagMag/exagTwistMag). - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the ExagMag setting for this . - exaggerate bullet spine Lean magnitude. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the ExagTwistMag setting for this . - exaggerate bullet spine Twist magnitude. - - - Default value = 0.5f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the ExagSmooth2Zero setting for this . - exaggerate bullet duration ramping to zero after exagDuration. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the ExagZeroTime setting for this . - exaggerate bullet time spent at 0 spine lean/twist after exagDuration + exagSmooth2Zero. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the CpainSmooth2Time setting for this . - conscious pain duration ramping from zero to cpainMag/cpainTwistMag. - - - Default value = 0.2f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the CpainDuration setting for this . - conscious pain duration at cpainMag/cpainTwistMag after cpainSmooth2Time. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the CpainMag setting for this . - conscious pain spine Lean(back/Forward) magnitude (Replaces spinePainMultiplier). - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the CpainTwistMag setting for this . - conscious pain spine Twist/Lean2Side magnitude Replaces spinePainTwistMultiplier). - - - Default value = 0.5f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the CpainSmooth2Zero setting for this . - conscious pain ramping to zero after cpainSmooth2Time + cpainDuration (Replaces spinePainTime). - - - Default value = 1.5f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the Crouching setting for this . - is the guy crouching or not. - - - Default value = False. - - - - - Sets the ChickenArms setting for this . - Type of reaction. - - - Default value = False. - - - - - Sets the ReachForWound setting for this . - Type of reaction. - - - Default value = True. - - - - - Sets the Fling setting for this . - Type of reaction. - - - Default value = False. - - - - - Sets the AllowInjuredArm setting for this . - injured arm code runs if arm hit (turns and steps and bends injured arm). - - - Default value = False. - - - - - Sets the AllowInjuredLeg setting for this . - when false injured leg is not bent and character does not bend to reach it. - - - Default value = True. - - - - - Sets the AllowInjuredLowerLegReach setting for this . - when false don't try to reach for injured Lower Legs (shins/feet). - - - Default value = False. - - - - - Sets the AllowInjuredThighReach setting for this . - when false don't try to reach for injured Thighs. - - - Default value = True. - - - - - Sets the StableHandsAndNeck setting for this . - additional stability for hands and neck (less loose). - - - Default value = False. - - - - - Sets the Melee setting for this . - - - Default value = False. - - - - - Sets the FallingReaction setting for this . - 0=Rollup, 1=Catchfall, 2=rollDownStairs, 3=smartFall. - - - Default value = 0. - Min value = 0. - Max value = 3. - - - - - Sets the UseExtendedCatchFall setting for this . - keep the character active instead of relaxing at the end of the catch fall. - - - Default value = False. - - - - - Sets the InitialWeaknessZeroDuration setting for this . - duration for which the character's upper body stays at minimum stiffness (not quite zero). - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the InitialWeaknessRampDuration setting for this . - duration of the ramp to bring the character's upper body stiffness back to normal levels. - - - Default value = 0.4f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the InitialNeckDuration setting for this . - duration for which the neck stays at intial stiffness/damping. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the InitialNeckRampDuration setting for this . - duration of the ramp to bring the neck stiffness/damping back to normal levels. - - - Default value = 0.4f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the UseCStrModulation setting for this . - if enabled upper and lower body strength scales with character strength, using the range given by parameters below. - - - Default value = False. - - - - - Sets the CStrUpperMin setting for this . - proportions to what the strength would be normally. - - - Default value = 0.1f. - Min value = 0.1f. - Max value = 1.0f. - - - - - Sets the CStrUpperMax setting for this . - - - Default value = 1.0f. - Min value = 0.1f. - Max value = 1.0f. - - - - - Sets the CStrLowerMin setting for this . - - - Default value = 0.1f. - Min value = 0.1f. - Max value = 1.0f. - - - - - Sets the CStrLowerMax setting for this . - - - Default value = 1.0f. - Min value = 0.1f. - Max value = 1.0f. - - - - - Sets the DeathTime setting for this . - time to death (HACK for underwater). If -ve don't ever die. - - - Default value = -1.0f. - Min value = -1.0f. - Max value = 1000.0f. - - - - - Send new wound information to the shot. Can cause shot to restart it's performance in part or in whole. - - - - - Creates a new Instance of the ShotNewBulletHelper for sending a ShotNewBullet to a given . - - The to send the ShotNewBullet to. - - Send new wound information to the shot. Can cause shot to restart it's performance in part or in whole. - - - - - Sets the BodyPart setting for this . - part ID on the body where the bullet hit. - - - Default value = 0. - Min value = 0. - Max value = 21. - - - - - Sets the LocalHitPointInfo setting for this . - if true then normal and hitPoint should be supplied in local coordinates of bodyPart. If false then normal and hitPoint should be supplied in World coordinates. - - - Default value = True. - - - - - Sets the Normal setting for this . - Normal coming out of impact point on character. Can be local or global depending on localHitPointInfo. - - - Default value = Vector3(0.0f, 0.0f, -1.0f). - Min value = -1.0f. - Max value = 1.0f. - - - - - Sets the HitPoint setting for this . - position of impact on character. Can be local or global depending on localHitPointInfo. - - - Default value = Vector3(0.0f, 0.0f, 0.0f). - - - - - Sets the BulletVel setting for this . - bullet velocity in world coordinates. - - - Default value = Vector3(0.0f, 0.0f, 0.0f). - Min value = -2000.0f. - Max value = 2000.0f. - - - - - Creates a new Instance of the ShotSnapHelper for sending a ShotSnap to a given . - - The to send the ShotSnap to. - - - - Sets the Snap setting for this . - Add a Snap to shot. - - - Default value = False. - - - - - Sets the SnapMag setting for this . - The magnitude of the reaction. - - - Default value = 0.4f. - Min value = -10.0f. - Max value = 10.0f. - - - - - Sets the SnapMovingMult setting for this . - movingMult*snapMag = The magnitude of the reaction if moving(comVelMag) faster than movingThresh. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 20.0f. - - - - - Sets the SnapBalancingMult setting for this . - balancingMult*snapMag = The magnitude of the reaction if balancing = (not lying on the floor/ not upper body not collided) and not airborne. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 20.0f. - - - - - Sets the SnapAirborneMult setting for this . - airborneMult*snapMag = The magnitude of the reaction if airborne. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 20.0f. - - - - - Sets the SnapMovingThresh setting for this . - If moving(comVelMag) faster than movingThresh then mvingMult applied to stunMag. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 20.0f. - - - - - Sets the SnapDirectionRandomness setting for this . - The character snaps in a prescribed way (decided by bullet direction) - Higher the value the more random this direction is. - - - Default value = 0.3f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the SnapLeftArm setting for this . - snap the leftArm. - - - Default value = False. - - - - - Sets the SnapRightArm setting for this . - snap the rightArm. - - - Default value = False. - - - - - Sets the SnapLeftLeg setting for this . - snap the leftLeg. - - - Default value = False. - - - - - Sets the SnapRightLeg setting for this . - snap the rightLeg. - - - Default value = False. - - - - - Sets the SnapSpine setting for this . - snap the spine. - - - Default value = True. - - - - - Sets the SnapNeck setting for this . - snap the neck. - - - Default value = True. - - - - - Sets the SnapPhasedLegs setting for this . - Legs are either in phase with each other or not. - - - Default value = True. - - - - - Sets the SnapHipType setting for this . - type of hip reaction 0=none, 1=side2side 2=steplike. - - - Default value = 0. - Min value = 0. - Max value = 2. - - - - - Sets the SnapUseBulletDir setting for this . - Legs are either in phase with each other or not. - - - Default value = True. - - - - - Sets the SnapHitPart setting for this . - Snap only around the wounded part//mmmmtodo check whether bodyPart doesn't have to be remembered for unSnap. - - - Default value = False. - - - - - Sets the UnSnapInterval setting for this . - Interval before applying reverse snap. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 100.0f. - - - - - Sets the UnSnapRatio setting for this . - The magnitude of the reverse snap. - - - Default value = 0.7f. - Min value = 0.0f. - Max value = 100.0f. - - - - - Sets the SnapUseTorques setting for this . - use torques to make the snap otherwise use a change in the parts angular velocity. - - - Default value = True. - - - - - configure the shockSpin effect in shot. Spin/Lift the character using cheat torques/forces. - - - - - Creates a new Instance of the ShotShockSpinHelper for sending a ShotShockSpin to a given . - - The to send the ShotShockSpin to. - - configure the shockSpin effect in shot. Spin/Lift the character using cheat torques/forces. - - - - - Sets the AddShockSpin setting for this . - if enabled, add a short 'shock' of torque to the character's spine to exaggerate bullet impact. - - - Default value = False. - - - - - Sets the RandomizeShockSpinDirection setting for this . - for use with close-range shotgun blasts, or similar. - - - Default value = False. - - - - - Sets the AlwaysAddShockSpin setting for this . - if true, apply the shock spin no matter which body component was hit. otherwise only apply if the spine or clavicles get hit. - - - Default value = False. - - - - - Sets the ShockSpinMin setting for this . - minimum amount of torque to add if using shock-spin feature. - - - Default value = 50.0f. - Min value = 0.0f. - Max value = 1000.0f. - - - - - Sets the ShockSpinMax setting for this . - maxiumum amount of torque to add if using shock-spin feature. - - - Default value = 90.0f. - Min value = 0.0f. - Max value = 1000.0f. - - - - - Sets the ShockSpinLiftForceMult setting for this . - if greater than 0, apply a force to lift the character up while the torque is applied, trying to produce a dramatic spun/twist shotgun-to-the-chest effect. this is a scale of the torque applied, so 8.0 or so would give a reasonable amount of lift. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the ShockSpinDecayMult setting for this . - multiplier used when decaying torque spin over time. - - - Default value = 4.0f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the ShockSpinScalePerComponent setting for this . - torque applied is scaled by this amount across the spine components - spine2 recieving the full amount, then 3 and 1 and finally 0. each time, this value is used to scale it down. 0.5 means half the torque each time. - - - Default value = 0.5f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the ShockSpinMaxTwistVel setting for this . - shock spin ends when twist velocity is greater than this value (try 6.0). If set to -1 does not stop. - - - Default value = -1.0f. - Min value = -1.0f. - Max value = 200.0f. - - - - - Sets the ShockSpinScaleByLeverArm setting for this . - shock spin scales by lever arm of bullet i.e. bullet impact point to centre line. - - - Default value = True. - - - - - Sets the ShockSpinAirMult setting for this . - shockSpin's torque is multipied by this value when both the character's feet are not in contact. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the ShockSpin1FootMult setting for this . - shockSpin's torque is multipied by this value when the one of the character's feet are not in contact. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the ShockSpinFootGripMult setting for this . - shockSpin scales the torques applied to the feet by footSlipCompensation. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the BracedSideSpinMult setting for this . - If shot on a side with a forward foot and both feet are on the ground and balanced, increase the shockspin to compensate for the balancer naturally resisting spin to that side. - - - Default value = 1.0f. - Min value = 1.0f. - Max value = 5.0f. - - - - - configure the fall to knees shot. - - - - - Creates a new Instance of the ShotFallToKneesHelper for sending a ShotFallToKnees to a given . - - The to send the ShotFallToKnees to. - - configure the fall to knees shot. - - - - - Sets the FallToKnees setting for this . - Type of reaction. - - - Default value = False. - - - - - Sets the FtkAlwaysChangeFall setting for this . - Always change fall behaviour. If false only change when falling forward. - - - Default value = False. - - - - - Sets the FtkBalanceTime setting for this . - How long the balancer runs for before fallToKnees starts. - - - Default value = 0.7f. - Min value = 0.0f. - Max value = 5.0f. - - - - - Sets the FtkHelperForce setting for this . - Hip helper force magnitude - to help character lean over balance point of line between toes. - - - Default value = 200.0f. - Min value = 0.0f. - Max value = 2000.0f. - - - - - Sets the FtkHelperForceOnSpine setting for this . - Helper force applied to spine3 aswell. - - - Default value = True. - - - - - Sets the FtkLeanHelp setting for this . - Help balancer lean amount - to help character lean over balance point of line between toes. Half of this is also applied as hipLean. - - - Default value = 0.1f. - Min value = 0.0f. - Max value = 0.3f. - - - - - Sets the FtkSpineBend setting for this . - Bend applied to spine when falling from knees. (+ve forward - try -0.1) (only if rds called). - - - Default value = 0.0f. - Min value = -0.2f. - Max value = 0.3f. - - - - - Sets the FtkStiffSpine setting for this . - Stiffen spine when falling from knees (only if rds called). - - - Default value = False. - - - - - Sets the FtkImpactLooseness setting for this . - Looseness (muscleStiffness = 1.01f - m_parameters.ftkImpactLooseness) applied to upperBody on knee impacts. - - - Default value = 0.5f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the FtkImpactLoosenessTime setting for this . - Time that looseness is applied after knee impacts. - - - Default value = 0.2f. - Min value = -0.1f. - Max value = 1.0f. - - - - - Sets the FtkBendRate setting for this . - Rate at which the legs are bent to go from standing to on knees. - - - Default value = 0.7f. - Min value = 0.0f. - Max value = 4.0f. - - - - - Sets the FtkHipBlend setting for this . - Blend from current hip to balancing on knees hip angle. - - - Default value = 0.3f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the FtkLungeProb setting for this . - Probability that a lunge reaction will be allowed. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the FtkKneeSpin setting for this . - When on knees allow some spinning of the character. If false then the balancers' footSlipCompensation remains on and tends to keep the character facing the same way as when it was balancing. - - - Default value = False. - - - - - Sets the FtkFricMult setting for this . - Multiplier on the reduction of friction for the feet based on angle away from horizontal - helps the character fall to knees quicker. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 5.0f. - - - - - Sets the FtkHipAngleFall setting for this . - Apply this hip angle when the character starts to fall backwards when on knees. - - - Default value = 0.5f. - Min value = -1.0f. - Max value = 1.0f. - - - - - Sets the FtkPitchForwards setting for this . - Hip pitch applied (+ve forward, -ve backwards) if character is falling forwards on way down to it's knees. - - - Default value = 0.1f. - Min value = -0.5f. - Max value = 0.5f. - - - - - Sets the FtkPitchBackwards setting for this . - Hip pitch applied (+ve forward, -ve backwards) if character is falling backwards on way down to it's knees. - - - Default value = 0.1f. - Min value = -0.5f. - Max value = 0.5f. - - - - - Sets the FtkFallBelowStab setting for this . - Balancer instability below which the character starts to bend legs even if it isn't going to fall on to it's knees (i.e. if going backwards). 0.3 almost ensures a fall to knees but means the character will keep stepping backward until it slows down enough. - - - Default value = 0.5f. - Min value = 0.0f. - Max value = 15.0f. - - - - - Sets the FtkBalanceAbortThreshold setting for this . - when the character gives up and goes into a fall. - - - Default value = 2.0f. - Min value = 0.0f. - Max value = 4.0f. - - - - - Sets the FtkOnKneesArmType setting for this . - Type of arm response when on knees falling forward 0=useFallArms (from RollDownstairs or catchFall), 1= armsIn, 2=armsOut. - - - Default value = 2. - Min value = 0. - Max value = 2. - - - - - Sets the FtkReleaseReachForWound setting for this . - Release the reachForWound this amount of time after the knees have hit. If LT 0.0 then keep reaching for wound regardless of fall/onground state. - - - Default value = -1.0f. - Min value = -1.0f. - Max value = 5.0f. - - - - - Sets the FtkReachForWound setting for this . - true = Keep reaching for wound regardless of fall/onground state. false = respect the shotConfigureArms params: reachFalling, reachFallingWithOneHand, reachOnFloor. - - - Default value = True. - - - - - Sets the FtkReleasePointGun setting for this . - Override the pointGun when knees hit. - - - Default value = False. - - - - - Sets the FtkFailMustCollide setting for this . - The upper body of the character must be colliding and other failure conditions met to fail. - - - Default value = True. - - - - - configure the shot from behind reaction. - - - - - Creates a new Instance of the ShotFromBehindHelper for sending a ShotFromBehind to a given . - - The to send the ShotFromBehind to. - - configure the shot from behind reaction. - - - - - Sets the ShotFromBehind setting for this . - Type of reaction. - - - Default value = False. - - - - - Sets the SfbSpineAmount setting for this . - SpineBend. - - - Default value = 4.0f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the SfbNeckAmount setting for this . - Neck Bend. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the SfbHipAmount setting for this . - hip Pitch. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the SfbKneeAmount setting for this . - knee bend. - - - Default value = 0.1f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the SfbPeriod setting for this . - shotFromBehind reaction period after being shot. - - - Default value = 0.7f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the SfbForceBalancePeriod setting for this . - amount of time not taking a step. - - - Default value = 0.3f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the SfbArmsOnset setting for this . - amount of time before applying spread out arms pose. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the SfbKneesOnset setting for this . - amount of time before bending knees a bit. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the SfbNoiseGain setting for this . - Controls additional independent randomized bending of left/right elbows. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the SfbIgnoreFail setting for this . - 0=balancer fails as normal, 1= ignore backArchedBack and leanedTooFarBack balancer failures, 2= ignore backArchedBack balancer failure only, 3= ignore leanedTooFarBack balancer failure only. - - - Default value = 0. - Min value = 0. - Max value = 3. - - - - - configure the shot in guts reaction. - - - - - Creates a new Instance of the ShotInGutsHelper for sending a ShotInGuts to a given . - - The to send the ShotInGuts to. - - configure the shot in guts reaction. - - - - - Sets the ShotInGuts setting for this . - Type of reaction. - - - Default value = False. - - - - - Sets the SigSpineAmount setting for this . - SpineBend. - - - Default value = 2.0f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the SigNeckAmount setting for this . - Neck Bend. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the SigHipAmount setting for this . - hip Pitch. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the SigKneeAmount setting for this . - knee bend. - - - Default value = 0.1f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the SigPeriod setting for this . - active time after being shot. - - - Default value = 2.0f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the SigForceBalancePeriod setting for this . - amount of time not taking a step. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the SigKneesOnset setting for this . - amount of time not taking a step. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Creates a new Instance of the ShotHeadLookHelper for sending a ShotHeadLook to a given . - - The to send the ShotHeadLook to. - - - - Sets the UseHeadLook setting for this . - Use headLook. Default: looks at provided target or if this is zero - looks forward or in velocity direction. If reachForWound is enabled, switches between looking at the wound and at the default target. - - - Default value = False. - - - - - Sets the HeadLook setting for this . - position to look at with headlook flag. - - - Default value = Vector3(0.0f, 0.0f, 0.0f). - - - - - Sets the HeadLookAtWoundMinTimer setting for this . - Min time to look at wound. - - - Default value = 0.3f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the HeadLookAtWoundMaxTimer setting for this . - Max time to look at wound. - - - Default value = 0.8f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the HeadLookAtHeadPosMaxTimer setting for this . - Min time to look headLook or if zero - forward or in velocity direction. - - - Default value = 1.7f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the HeadLookAtHeadPosMinTimer setting for this . - Max time to look headLook or if zero - forward or in velocity direction. - - - Default value = 0.6f. - Min value = 0.0f. - Max value = 10.0f. - - - - - configure the arm reactions in shot. - - - - - Creates a new Instance of the ShotConfigureArmsHelper for sending a ShotConfigureArms to a given . - - The to send the ShotConfigureArms to. - - configure the arm reactions in shot. - - - - - Sets the Brace setting for this . - blind brace with arms if appropriate. - - - Default value = True. - - - - - Sets the PointGun setting for this . - Point gun if appropriate. - - - Default value = False. - - - - - Sets the UseArmsWindmill setting for this . - armsWindmill if going backwards fast enough. - - - Default value = True. - - - - - Sets the ReleaseWound setting for this . - release wound if going sideways/forward fast enough. 0 = don't. 1 = only if bracing. 2 = any default arm reaction. - - - Default value = 1. - Min value = 0. - Max value = 2. - - - - - Sets the ReachFalling setting for this . - reachForWound when falling 0 = false, 1 = true, 2 = once per shot performance. - - - Default value = 0. - Min value = 0. - Max value = 2. - - - - - Sets the ReachFallingWithOneHand setting for this . - Force character to reach for wound with only one hand when falling or fallen. 0= allow 2 handed reach, 1= left only if 2 handed possible, 2= right only if 2 handed possible, 3 = one handed but automatic (allows switching of hands). - - - Default value = 3. - Min value = 0. - Max value = 3. - - - - - Sets the ReachOnFloor setting for this . - reachForWound when on floor - 0 = false, 1 = true, 2 = once per shot performance. - - - Default value = 0. - Min value = 0. - Max value = 2. - - - - - Sets the AlwaysReachTime setting for this . - Inhibit arms brace for this amount of time after reachForWound has begun. - - - Default value = 0.3f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the AWSpeedMult setting for this . - For armsWindmill, multiplier on character speed - increase of speed of circling is proportional to character speed (max speed of circliing increase = 1.5). eg. lowering the value increases the range of velocity that the 0-1.5 is applied over. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the AWRadiusMult setting for this . - For armsWindmill, multiplier on character speed - increase of radii is proportional to character speed (max radius increase = 0.45). eg. lowering the value increases the range of velocity that the 0-0.45 is applied over. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the AWStiffnessAdd setting for this . - For armsWindmill, added arm stiffness ranges from 0 to AWStiffnessAdd. - - - Default value = 4.0f. - Min value = 0.0f. - Max value = 16.0f. - - - - - Sets the ReachWithOneHand setting for this . - Force character to reach for wound with only one hand. 0= allow 2 handed reach, 1= left only if 2 handed possible, 2= right only if 2 handed possible. - - - Default value = 0. - Min value = 0. - Max value = 2. - - - - - Sets the AllowLeftPistolRFW setting for this . - Allow character to reach for wound with left hand if holding a pistol. It never will for a rifle. If pointGun is running this will only happen if the hand cannot point and pointGun:poseUnusedGunArm = false. - - - Default value = True. - - - - - Sets the AllowRightPistolRFW setting for this . - Allow character to reach for wound with right hand if holding a pistol. It never will for a rifle. If pointGun is running this will only happen if the hand cannot point and pointGun:poseUnusedGunArm = false. - - - Default value = False. - - - - - Sets the RfwWithPistol setting for this . - Override pointGun and reachForWound if desired if holding a pistol. It never will for a rifle. - - - Default value = False. - - - - - Sets the Fling2 setting for this . - Type of reaction. - - - Default value = False. - - - - - Sets the Fling2Left setting for this . - Fling the left arm. - - - Default value = True. - - - - - Sets the Fling2Right setting for this . - Fling the right arm. - - - Default value = True. - - - - - Sets the Fling2OverrideStagger setting for this . - Override stagger arms even if staggerFall:m_upperBodyReaction = true. - - - Default value = False. - - - - - Sets the Fling2TimeBefore setting for this . - Time after hit that the fling will start (allows for a bit of loose arm movement from bullet impact.snap etc). - - - Default value = 0.1f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the Fling2Time setting for this . - Duration of the fling behaviour. - - - Default value = 0.5f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the Fling2MStiffL setting for this . - MuscleStiffness of the left arm. If negative then uses the shots underlying muscle stiffness from controlStiffness (i.e. respects looseness). - - - Default value = 1.0f. - Min value = -1.0f. - Max value = 1.5f. - - - - - Sets the Fling2MStiffR setting for this . - MuscleStiffness of the right arm. If negative then uses the shots underlying muscle stiffness from controlStiffness (i.e. respects looseness). - - - Default value = -1.0f. - Min value = -1.0f. - Max value = 1.5f. - - - - - Sets the Fling2RelaxTimeL setting for this . - Maximum time before the left arm relaxes in the fling. It will relax automatically when the arm has completed it's bent arm fling. This is what causes the arm to straighten. - - - Default value = 0.5f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the Fling2RelaxTimeR setting for this . - Maximum time before the right arm relaxes in the fling. It will relax automatically when the arm has completed it's bent arm fling. This is what causes the arm to straighten. - - - Default value = 0.5f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the Fling2AngleMinL setting for this . - Min fling angle for left arm. Fling angle is random in the range fling2AngleMin:fling2AngleMax. Angle of fling in radians measured from the body horizontal sideways from shoulder. positive is up, 0 shoulder level, negative down. - - - Default value = -1.5f. - Min value = -1.5f. - Max value = 1.0f. - - - - - Sets the Fling2AngleMaxL setting for this . - Max fling angle for left arm. - - - Default value = 1.0f. - Min value = -1.5f. - Max value = 1.0f. - - - - - Sets the Fling2AngleMinR setting for this . - Min fling angle for right arm. - - - Default value = -1.5f. - Min value = -1.5f. - Max value = 1.0f. - - - - - Sets the Fling2AngleMaxR setting for this . - Max fling angle for right arm. - - - Default value = 1.0f. - Min value = -1.5f. - Max value = 1.0f. - - - - - Sets the Fling2LengthMinL setting for this . - Min left arm length. Armlength is random in the range fling2LengthMin:fling2LengthMax. Armlength maps one to one with elbow angle. (These values are scaled internally for the female character). - - - Default value = 0.3f. - Min value = 0.3f. - Max value = 0.6f. - - - - - Sets the Fling2LengthMaxL setting for this . - Max left arm length. - - - Default value = 0.6f. - Min value = 0.3f. - Max value = 0.6f. - - - - - Sets the Fling2LengthMinR setting for this . - Min right arm length. - - - Default value = 0.3f. - Min value = 0.3f. - Max value = 0.6f. - - - - - Sets the Fling2LengthMaxR setting for this . - Max right arm length. - - - Default value = 0.6f. - Min value = 0.3f. - Max value = 0.6f. - - - - - Sets the Bust setting for this . - Has the character got a bust. If so then cupBust (move bust reach targets below bust) or bustElbowLift and cupSize (stop upperArm penetrating bust and move bust targets to surface of bust) are implemented. - - - Default value = False. - - - - - Sets the BustElbowLift setting for this . - Lift the elbows up this much extra to avoid upper arm penetrating the bust (when target hits spine2 or spine3). - - - Default value = 0.7f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the CupSize setting for this . - Amount reach target to bust (spine2) will be offset forward by. - - - Default value = 0.1f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the CupBust setting for this . - All reach targets above or on the bust will cause a reach below the bust. (specifically moves spine3 and spine2 targets to spine1). bustElbowLift and cupSize are ignored. - - - Default value = False. - - - - - Clone of High Fall with a wider range of operating conditions. - - - - - Creates a new Instance of the SmartFallHelper for sending a SmartFall to a given . - - The to send the SmartFall to. - - Clone of High Fall with a wider range of operating conditions. - - - - - Sets the BodyStiffness setting for this . - stiffness of body. Value feeds through to bodyBalance (synched with defaults), to armsWindmill (14 for this value at default ), legs pedal, head look and roll down stairs directly. - - - Default value = 11.0f. - Min value = 6.0f. - Max value = 16.0f. - - - - - Sets the Bodydamping setting for this . - The damping of the joints. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 3.0f. - - - - - Sets the Catchfalltime setting for this . - The length of time before the impact that the character transitions to the landing. - - - Default value = 0.3f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the CrashOrLandCutOff setting for this . - 0.52angle is 0.868 dot//A threshold for deciding how far away from upright the character needs to be before bailing out (going into a foetal) instead of trying to land (keeping stretched out). NB: never does bailout if ignorWorldCollisions true. - - - Default value = 0.9f. - Min value = -1.0f. - Max value = 1.0f. - - - - - Sets the PdStrength setting for this . - Strength of the controller to keep the character at angle aimAngleBase from vertical. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the PdDamping setting for this . - Damping multiplier of the controller to keep the character at angle aimAngleBase from vertical. The actual damping is pdDamping*pdStrength*constant*angVel. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 5.0f. - - - - - Sets the ArmAngSpeed setting for this . - arm circling speed in armWindMillAdaptive. - - - Default value = 7.9f. - Min value = 0.0f. - Max value = 20.0f. - - - - - Sets the ArmAmplitude setting for this . - in armWindMillAdaptive. - - - Default value = 2.0f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the ArmPhase setting for this . - in armWindMillAdaptive 3.1 opposite for stuntman. 1.0 old default. 0.0 in phase. - - - Default value = 3.1f. - Min value = 0.0f. - Max value = 6.3f. - - - - - Sets the ArmBendElbows setting for this . - in armWindMillAdaptive bend the elbows as a function of armAngle. For stuntman true otherwise false. - - - Default value = True. - - - - - Sets the LegRadius setting for this . - radius of legs on pedal. - - - Default value = 0.4f. - Min value = 0.0f. - Max value = 0.5f. - - - - - Sets the LegAngSpeed setting for this . - in pedal. - - - Default value = 7.9f. - Min value = 0.0f. - Max value = 15.0f. - - - - - Sets the LegAsymmetry setting for this . - 0.0 for stuntman. Random offset applied per leg to the angular speed to desynchronise the pedaling - set to 0 to disable, otherwise should be set to less than the angularSpeed value. - - - Default value = 4.0f. - Min value = -10.0f. - Max value = 10.0f. - - - - - Sets the Arms2LegsPhase setting for this . - phase angle between the arms and legs circling angle. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 6.5f. - - - - - Sets the Arms2LegsSync setting for this . - Syncs the arms angle to what the leg angle is. - - - Default value = . - All speed/direction parameters of armswindmill are overwritten if = . - If and you want synced arms/legs then armAngSpeed=legAngSpeed, legAsymmetry = 0.0 (to stop randomizations of the leg cicle speed). - - - - - Sets the ArmsUp setting for this . - Where to put the arms when preparing to land. Approx 1 = above head, 0 = head height, -1 = down. LT -2.0 use catchFall arms, LT -3.0 use prepare for landing pose if Agent is due to land vertically, feet first. - - - Default value = -3.1f. - Min value = -4.0f. - Max value = 2.0f. - - - - - Sets the OrientateBodyToFallDirection setting for this . - toggle to orientate to fall direction. i.e. orientate so that the character faces the horizontal velocity direction. - - - Default value = False. - - - - - Sets the OrientateTwist setting for this . - If false don't worry about the twist angle of the character when orientating the character. If false this allows the twist axis of the character to be free (You can get a nice twisting highFall like the one in dieHard 4 when the car goes into the helicopter). - - - Default value = True. - - - - - Sets the OrientateMax setting for this . - DEVEL parameter - suggest you don't edit it. Maximum torque the orientation controller can apply. If 0 then no helper torques will be used. 300 will orientate the character soflty for all but extreme angles away from aimAngleBase. If abs (current -aimAngleBase) is getting near 3.0 then this can be reduced to give a softer feel. - - - Default value = 300.0f. - Min value = 0.0f. - Max value = 2000.0f. - - - - - Sets the AlanRickman setting for this . - If true then orientate the character to face the point from where it started falling. HighFall like the one in dieHard with Alan Rickman. - - - Default value = False. - - - - - Sets the FowardRoll setting for this . - Try to execute a forward Roll on landing. - - - Default value = False. - - - - - Sets the UseZeroPose_withFowardRoll setting for this . - Blend to a zero pose when forward roll is attempted. - - - Default value = False. - - - - - Sets the AimAngleBase setting for this . - Angle from vertical the pdController is driving to ( positive = forwards). - - - Default value = 0.2f. - Min value = -3.1f. - Max value = 3.1f. - - - - - Sets the FowardVelRotation setting for this . - scale to add/subtract from aimAngle based on forward speed (Internal). - - - Default value = 0.0f. - Min value = -1.0f. - Max value = 1.0f. - - - - - Sets the FootVelCompScale setting for this . - Scale to change to amount of vel that is added to the foot ik from the velocity (Internal). - - - Default value = 0.1f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the SideD setting for this . - sideoffset for the feet during prepareForLanding. +ve = right. - - - Default value = 0.2f. - Min value = -1.0f. - Max value = 1.0f. - - - - - Sets the FowardOffsetOfLegIK setting for this . - Forward offset for the feet during prepareForLanding. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the LegL setting for this . - Leg Length for ik (Internal)//unused. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the CatchFallCutOff setting for this . - 0.5angle is 0.878 dot. Cutoff to go to the catchFall ( internal) //mmmtodo do like crashOrLandCutOff. - - - Default value = 0.9f. - Min value = -1.0f. - Max value = 1.0f. - - - - - Sets the LegStrength setting for this . - Strength of the legs at landing. - - - Default value = 12.0f. - Min value = 6.0f. - Max value = 16.0f. - - - - - Sets the Balance setting for this . - If true have enough strength to balance. If false not enough strength in legs to balance (even though bodyBlance called). - - - Default value = True. - - - - - Sets the IgnorWorldCollisions setting for this . - Never go into bailout (foetal). - - - Default value = False. - - - - - Sets the AdaptiveCircling setting for this . - stuntman type fall. Arm and legs circling direction controlled by angmom and orientation. - - - Default value = True. - - - - - Sets the Hula setting for this . - With stuntman type fall. Hula reaction if can't see floor and not rotating fast. - - - Default value = True. - - - - - Sets the MaxSpeedForRecoverableFall setting for this . - Character needs to be moving less than this speed to consider fall as a recoverable one. - - - Default value = 15.0f. - Min value = 0.0f. - Max value = 100.0f. - - - - - Sets the MinSpeedForBrace setting for this . - Character needs to be moving at least this fast horizontally to start bracing for impact if there is an object along its trajectory. - - - Default value = 10.0f. - Min value = 0.0f. - Max value = 100.0f. - - - - - Sets the LandingNormal setting for this . - Ray-cast normal doted with up direction has to be greater than this number to consider object flat enough to land on it. - - - Default value = 0.6f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the RdsForceMag setting for this . - - - Default value = 0.8f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the RdsTargetLinVeDecayTime setting for this . - RDS: Time for the targetlinearVelocity to decay to zero. - - - Default value = 0.5f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the RdsTargetLinearVelocity setting for this . - RDS: Helper torques are applied to match the spin of the character to the max of targetLinearVelocity and COMVelMag. -1 to use initial character velocity. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 30.0f. - - - - - Sets the RdsUseStartingFriction setting for this . - Start Catch Fall/RDS state with specified friction. Catch fall will overwrite based on setFallingReaction. - - - Default value = False. - - - - - Sets the RdsStartingFriction setting for this . - Catch Fall/RDS starting friction. Catch fall will overwrite based on setFallingReaction. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the RdsStartingFrictionMin setting for this . - Catch Fall/RDS starting friction minimum. Catch fall will overwrite based on setFallingReaction. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the RdsForceVelThreshold setting for this . - Velocity threshold under which RDS force mag will be applied. - - - Default value = 10.0f. - Min value = 0.0f. - Max value = 100.0f. - - - - - Sets the InitialState setting for this . - Force initial state (used in vehicle bail out to start SF_CatchFall (6) earlier. - - - Default value = 0. - Min value = 0. - Max value = 7. - - - - - Sets the ChangeExtremityFriction setting for this . - Allow friction changes to be applied to the hands and feet. - - - Default value = False. - - - - - Sets the Teeter setting for this . - Set up an immediate teeter in the direction of trave if initial state is SF_Balance. - - - Default value = False. - - - - - Sets the TeeterOffset setting for this . - Offset the default Teeter edge in the direction of travel. Will need to be tweaked depending on how close to the real edge AI tends to trigger the behaviour. - - - Default value = 0.3f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the StopRollingTime setting for this . - Time in seconds before ped should start actively trying to stop rolling. - - - Default value = 2.0f. - Min value = 0.0f. - Max value = 100.0f. - - - - - Sets the ReboundScale setting for this . - Scale for rebound assistance. 0=off, 1=very bouncy, 2=jbone crazy Try 0.5?. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the ReboundMask setting for this . - Part mask to apply rebound assistance. - - - Default value = uk. - - - - - Sets the ForceHeadAvoid setting for this . - Force head avoid to be active during Catch Fall even when character is not on the ground. - - - Default value = False. - - - - - Sets the CfZAxisSpinReduction setting for this . - Pass-through parameter for Catch Fall spin reduction. Increase to stop more spin. 0..1. - - - Default value = 0.5f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the SplatWhenStopped setting for this . - Transition to splat state when com vel is below value, regardless of character health or fall velocity. Set to zero to disable. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 100.0f. - - - - - Sets the BlendHeadWhenStopped setting for this . - Blend head to neutral pose com vel approaches zero. Linear between zero and value. Set to zero to disable. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 100.0f. - - - - - Sets the SpreadLegs setting for this . - Spread legs amount for Pedal during fall. - - - Default value = 0.1f. - Min value = -1.0f. - Max value = 1.0f. - - - - - Creates a new Instance of the StaggerFallHelper for sending a StaggerFall to a given . - - The to send the StaggerFall to. - - - - Sets the ArmStiffness setting for this . - stiffness of arms. catch_fall's stiffness scales with this value, but has default values when this is default. - - - Default value = 12.0f. - Min value = 0.0f. - Max value = 16.0f. - - - - - Sets the ArmDamping setting for this . - Sets damping value for the arms. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the SpineDamping setting for this . - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the SpineStiffness setting for this . - - - Default value = 10.0f. - Min value = 0.0f. - Max value = 16.0f. - - - - - Sets the ArmStiffnessStart setting for this . - armStiffness during the yanked timescale ie timeAtStartValues. - - - Default value = 3.0f. - Min value = 0.0f. - Max value = 16.0f. - - - - - Sets the ArmDampingStart setting for this . - armDamping during the yanked timescale ie timeAtStartValues. - - - Default value = 0.1f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the SpineDampingStart setting for this . - spineDamping during the yanked timescale ie timeAtStartValues. - - - Default value = 0.1f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the SpineStiffnessStart setting for this . - spineStiffness during the yanked timescale ie timeAtStartValues. - - - Default value = 3.0f. - Min value = 0.0f. - Max value = 16.0f. - - - - - Sets the TimeAtStartValues setting for this . - time spent with Start values for arms and spine stiffness and damping ie for whiplash efffect. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the RampTimeFromStartValues setting for this . - time spent ramping from Start to end values for arms and spine stiffness and damping ie for whiplash efffect (occurs after timeAtStartValues). - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the StaggerStepProb setting for this . - Probability per step of time spent in a stagger step. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the StepsTillStartEnd setting for this . - steps taken before lowerBodyStiffness starts ramping down by perStepReduction1. - - - Default value = 2. - Min value = 0. - Max value = 100. - - - - - Sets the TimeStartEnd setting for this . - time from start of behaviour before lowerBodyStiffness starts ramping down for rampTimeToEndValues to endValues. - - - Default value = 100.0f. - Min value = 0.0f. - Max value = 100.0f. - - - - - Sets the RampTimeToEndValues setting for this . - time spent ramping from lowerBodyStiffness to lowerBodyStiffnessEnd. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the LowerBodyStiffness setting for this . - lowerBodyStiffness should be 12. - - - Default value = 13.0f. - Min value = 0.0f. - Max value = 16.0f. - - - - - Sets the LowerBodyStiffnessEnd setting for this . - lowerBodyStiffness at end. - - - Default value = 8.0f. - Min value = 0.0f. - Max value = 16.0f. - - - - - Sets the PredictionTime setting for this . - amount of time (seconds) into the future that the character tries to step to. bigger values try to recover with fewer, bigger steps. smaller values recover with smaller steps, and generally recover less. - - - Default value = 0.1f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the PerStepReduction1 setting for this . - LowerBody stiffness will be reduced every step to make the character fallover. - - - Default value = 0.7f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the LeanInDirRate setting for this . - leanInDirection will be increased from 0 to leanInDirMax linearly at this rate. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the LeanInDirMaxF setting for this . - Max of leanInDirection magnitude when going forwards. - - - Default value = 0.1f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the LeanInDirMaxB setting for this . - Max of leanInDirection magnitude when going backwards. - - - Default value = 0.3f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the LeanHipsMaxF setting for this . - Max of leanInDirectionHips magnitude when going forwards. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the LeanHipsMaxB setting for this . - Max of leanInDirectionHips magnitude when going backwards. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the Lean2multF setting for this . - Lean of spine to side in side velocity direction when going forwards. - - - Default value = -1.0f. - Min value = -5.0f. - Max value = 5.0f. - - - - - Sets the Lean2multB setting for this . - Lean of spine to side in side velocity direction when going backwards. - - - Default value = -2.0f. - Min value = -5.0f. - Max value = 5.0f. - - - - - Sets the PushOffDist setting for this . - amount stance foot is behind com in the direction of velocity before the leg tries to pushOff to increase momentum. Increase to lower the probability of the pushOff making the character bouncy. - - - Default value = 0.2f. - Min value = -1.0f. - Max value = 1.0f. - - - - - Sets the MaxPushoffVel setting for this . - stance leg will only pushOff to increase momentum if the vertical hip velocity is less than this value. 0.4 seems like a good value. The higher it is the the less this functionality is applied. If it is very low or negative this can stop the pushOff altogether. - - - Default value = 20.0f. - Min value = -20.0f. - Max value = 20.0f. - - - - - Sets the HipBendMult setting for this . - hipBend scaled with velocity. - - - Default value = 0.0f. - Min value = -10.0f. - Max value = 10.0f. - - - - - Sets the AlwaysBendForwards setting for this . - bend forwards at the hip (hipBendMult) whether moving backwards or forwards. - - - Default value = False. - - - - - Sets the SpineBendMult setting for this . - spine bend scaled with velocity. - - - Default value = 0.4f. - Min value = -10.0f. - Max value = 10.0f. - - - - - Sets the UseHeadLook setting for this . - enable and provide a look-at target to make the character's head turn to face it while balancing, balancer default is 0.2. - - - Default value = True. - - - - - Sets the HeadLookPos setting for this . - position of thing to look at. - - - Default value = Vector3(0.0f, 0.0f, 0.0f). - - - - - Sets the HeadLookInstanceIndex setting for this . - level index of thing to look at. - - - Default value = -1. - Min value = -1. - - - - - Sets the HeadLookAtVelProb setting for this . - Probability [0-1] that headLook will be looking in the direction of velocity when stepping. - - - Default value = 1.0f. - Min value = -1.0f. - Max value = 1.0f. - - - - - Sets the TurnOffProb setting for this . - Weighted Probability that turn will be off. This is one of six turn type weights. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the Turn2TargetProb setting for this . - Weighted Probability of turning towards headLook target. This is one of six turn type weights. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the Turn2VelProb setting for this . - Weighted Probability of turning towards velocity. This is one of six turn type weights. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the TurnAwayProb setting for this . - Weighted Probability of turning away from headLook target. This is one of six turn type weights. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the TurnLeftProb setting for this . - Weighted Probability of turning left. This is one of six turn type weights. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the TurnRightProb setting for this . - Weighted Probability of turning right. This is one of six turn type weights. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the UseBodyTurn setting for this . - enable and provide a positive bodyTurnTimeout and provide a look-at target to make the character turn to face it while balancing. - - - Default value = False. - - - - - Sets the UpperBodyReaction setting for this . - enable upper body reaction ie blindBrace and armswindmill. - - - Default value = True. - - - - - Creates a new Instance of the TeeterHelper for sending a Teeter to a given . - - The to send the Teeter to. - - - - Sets the EdgeLeft setting for this . - Defines the left edge point (left of character facing edge). - - - Default value = Vector3(39.5f, 38.9f, 21.1f). - Min value = 0.0f. - - - - - Sets the EdgeRight setting for this . - Defines the right edge point (right of character facing edge). - - - Default value = Vector3(39.5f, 39.9f, 21.1f). - Min value = 0.0f. - - - - - Sets the UseExclusionZone setting for this . - stop stepping across the line defined by edgeLeft and edgeRight. - - - Default value = True. - - - - - Sets the UseHeadLook setting for this . - - - Default value = True. - - - - - Sets the CallHighFall setting for this . - call highFall if fallen over the edge. If false just call blended writhe (to go over the top of the fall behaviour of the underlying behaviour e.g. bodyBalance). - - - Default value = True. - - - - - Sets the LeanAway setting for this . - lean away from the edge based on velocity towards the edge (if closer than 2m from edge). - - - Default value = True. - - - - - Sets the PreTeeterTime setting for this . - Time-to-edge threshold to start pre-teeter (windmilling, etc). - - - Default value = 2.0f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the LeanAwayTime setting for this . - Time-to-edge threshold to start leaning away from a potential fall. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the LeanAwayScale setting for this . - Scales stay upright lean and hip pitch. - - - Default value = 0.5f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the TeeterTime setting for this . - Time-to-edge threshold to start full-on teeter (more aggressive lean, drop-and-twist, etc). - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Creates a new Instance of the UpperBodyFlinchHelper for sending a UpperBodyFlinch to a given . - - The to send the UpperBodyFlinch to. - - - - Sets the HandDistanceLeftRight setting for this . - Left-Right distance between the hands. - - - Default value = 0.1f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the HandDistanceFrontBack setting for this . - Front-Back distance between the hands. - - - Default value = 0.1f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the HandDistanceVertical setting for this . - Vertical distance between the hands. - - - Default value = 0.1f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the BodyStiffness setting for this . - stiffness of body. Value carries over to head look, spine twist. - - - Default value = 11.0f. - Min value = 6.0f. - Max value = 16.0f. - - - - - Sets the BodyDamping setting for this . - damping value used for upper body. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the BackBendAmount setting for this . - Amount to bend the back during the flinch. - - - Default value = -0.6f. - Min value = -1.0f. - Max value = 1.0f. - - - - - Sets the UseRightArm setting for this . - Toggle to use the right arm. - - - Default value = True. - - - - - Sets the UseLeftArm setting for this . - Toggle to Use the Left arm. - - - Default value = True. - - - - - Sets the NoiseScale setting for this . - Amplitude of the perlin noise applied to the arms positions in the flicnh to the front part of the behaviour. - - - Default value = 0.1f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the NewHit setting for this . - Relaxes the character for 1 frame if set. - - - Default value = True. - - - - - Sets the ProtectHeadToggle setting for this . - Always protect head. Note if false then character flinches if target is in front, protects head if target is behind. - - - Default value = False. - - - - - Sets the DontBraceHead setting for this . - don't protect head only brace from front. Turned on by bcr. - - - Default value = False. - - - - - Sets the ApplyStiffness setting for this . - Turned of by bcr. - - - Default value = True. - - - - - Sets the HeadLookAwayFromTarget setting for this . - Look away from target (unless protecting head then look between feet). - - - Default value = False. - - - - - Sets the UseHeadLook setting for this . - Use headlook. - - - Default value = True. - - - - - Sets the TurnTowards setting for this . - ve balancer turn Towards, negative balancer turn Away, 0 balancer won't turn. NB.There is a 50% chance that the character will not turn even if this parameter is set to turn. - - - Default value = 1. - Min value = -2. - Max value = 2. - - - - - Sets the Pos setting for this . - position in world-space of object to flinch from. - - - Default value = Vector3(0.0f, 0.0f, 0.0f). - - - - - Creates a new Instance of the YankedHelper for sending a Yanked to a given . - - The to send the Yanked to. - - - - Sets the ArmStiffness setting for this . - stiffness of arms when upright. - - - Default value = 11.0f. - Min value = 6.0f. - Max value = 16.0f. - - - - - Sets the ArmDamping setting for this . - Sets damping value for the arms when upright. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the SpineDamping setting for this . - Spine Damping when upright. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the SpineStiffness setting for this . - Spine Stiffness when upright... - - - Default value = 10.0f. - Min value = 6.0f. - Max value = 16.0f. - - - - - Sets the ArmStiffnessStart setting for this . - armStiffness during the yanked timescale ie timeAtStartValues. - - - Default value = 3.0f. - Min value = 0.0f. - Max value = 16.0f. - - - - - Sets the ArmDampingStart setting for this . - armDamping during the yanked timescale ie timeAtStartValues. - - - Default value = 0.1f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the SpineDampingStart setting for this . - spineDamping during the yanked timescale ie timeAtStartValues. - - - Default value = 0.1f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the SpineStiffnessStart setting for this . - spineStiffness during the yanked timescale ie timeAtStartValues. - - - Default value = 3.0f. - Min value = 0.0f. - Max value = 16.0f. - - - - - Sets the TimeAtStartValues setting for this . - time spent with Start values for arms and spine stiffness and damping ie for whiplash efffect. - - - Default value = 0.4f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the RampTimeFromStartValues setting for this . - time spent ramping from Start to end values for arms and spine stiffness and damping ie for whiplash efffect (occurs after timeAtStartValues). - - - Default value = 0.1f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the StepsTillStartEnd setting for this . - steps taken before lowerBodyStiffness starts ramping down. - - - Default value = 2. - Min value = 0. - Max value = 100. - - - - - Sets the TimeStartEnd setting for this . - time from start of behaviour before lowerBodyStiffness starts ramping down by perStepReduction1. - - - Default value = 100.0f. - Min value = 0.0f. - Max value = 100.0f. - - - - - Sets the RampTimeToEndValues setting for this . - time spent ramping from lowerBodyStiffness to lowerBodyStiffnessEnd. - - - Default value = 0.0f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the LowerBodyStiffness setting for this . - lowerBodyStiffness should be 12. - - - Default value = 12.0f. - Min value = 0.0f. - Max value = 16.0f. - - - - - Sets the LowerBodyStiffnessEnd setting for this . - lowerBodyStiffness at end. - - - Default value = 8.0f. - Min value = 0.0f. - Max value = 16.0f. - - - - - Sets the PerStepReduction setting for this . - LowerBody stiffness will be reduced every step to make the character fallover. - - - Default value = 1.5f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the HipPitchForward setting for this . - Amount to bend forward at the hips (+ve forward, -ve backwards). Behaviour switches between hipPitchForward and hipPitchBack. - - - Default value = 0.6f. - Min value = -1.3f. - Max value = 1.3f. - - - - - Sets the HipPitchBack setting for this . - Amount to bend backwards at the hips (+ve backwards, -ve forwards). Behaviour switches between hipPitchForward and hipPitchBack. - - - Default value = 1.0f. - Min value = -1.3f. - Max value = 1.3f. - - - - - Sets the SpineBend setting for this . - Bend/Twist the spine amount. - - - Default value = 0.7f. - Min value = 0.0f. - Max value = 1.0f. - - - - - Sets the FootFriction setting for this . - Foot friction when standing/stepping. 0.5 gives a good slide sometimes. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Sets the TurnThresholdMin setting for this . - min angle at which the turn with toggle to the other direction (actual toggle angle is chosen randomly in range min to max). If it is 1 then it will never toggle. If negative then no turn is applied. - - - Default value = 0.6f. - Min value = -0.1f. - Max value = 1.0f. - - - - - Sets the TurnThresholdMax setting for this . - max angle at which the turn with toggle to the other direction (actual toggle angle is chosen randomly in range min to max). If it is 1 then it will never toggle. If negative then no turn is applied. - - - Default value = 0.6f. - Min value = -0.1f. - Max value = 1.0f. - - - - - Sets the UseHeadLook setting for this . - enable and provide a look-at target to make the character's head turn to face it while balancing. - - - Default value = False. - - - - - Sets the HeadLookPos setting for this . - position of thing to look at. - - - Default value = Vector3(0.0f, 0.0f, 0.0f). - - - - - Sets the HeadLookInstanceIndex setting for this . - level index of thing to look at. - - - Default value = -1. - Min value = -1. - - - - - Sets the HeadLookAtVelProb setting for this . - Probability [0-1] that headLook will be looking in the direction of velocity when stepping. - - - Default value = -1.0f. - Min value = -1.0f. - Max value = 1.0f. - - - - - Sets the ComVelRDSThresh setting for this . - for handsAndKnees catchfall ONLY: comVel above which rollDownstairs will start. - - - Default value = 2.0f. - Min value = 0.0f. - Max value = 20.0f. - - - - - Sets the HulaPeriod setting for this . - 0.25 A complete wiggle will take 4*hulaPeriod. - - - Default value = 0.3f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the HipAmplitude setting for this . - Amount of hip movement. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 4.0f. - - - - - Sets the SpineAmplitude setting for this . - Amount of spine movement. - - - Default value = 1.0f. - Min value = 0.0f. - Max value = 4.0f. - - - - - Sets the MinRelaxPeriod setting for this . - wriggle relaxes for a minimum of minRelaxPeriod (if it is negative it is a multiplier on the time previously spent wriggling). - - - Default value = 0.3f. - Min value = -5.0f. - Max value = 5.0f. - - - - - Sets the MaxRelaxPeriod setting for this . - wriggle relaxes for a maximum of maxRelaxPeriod (if it is negative it is a multiplier on the time previously spent wriggling). - - - Default value = 1.5f. - Min value = -5.0f. - Max value = 5.0f. - - - - - Sets the RollHelp setting for this . - Amount of cheat torque applied to turn the character over. - - - Default value = 0.5f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the GroundLegStiffness setting for this . - Leg Stiffness when on the ground. - - - Default value = 11.0f. - Min value = 0.0f. - Max value = 16.0f. - - - - - Sets the GroundArmStiffness setting for this . - Arm Stiffness when on the ground. - - - Default value = 11.0f. - Min value = 0.0f. - Max value = 16.0f. - - - - - Sets the GroundSpineStiffness setting for this . - Spine Stiffness when on the ground. - - - Default value = 14.0f. - Min value = 0.0f. - Max value = 16.0f. - - - - - Sets the GroundLegDamping setting for this . - Leg Damping when on the ground. - - - Default value = 0.5f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the GroundArmDamping setting for this . - Arm Damping when on the ground. - - - Default value = 0.5f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the GroundSpineDamping setting for this . - Spine Damping when on the ground. - - - Default value = 0.5f. - Min value = 0.0f. - Max value = 2.0f. - - - - - Sets the GroundFriction setting for this . - Friction multiplier on bodyParts when on ground. Character can look too slidy with groundFriction = 1. Higher values give a more jerky reation but this seems timestep dependent especially for dragged by the feet. - - - Default value = 8.0f. - Min value = 0.0f. - Max value = 10.0f. - - - - - Gets the current GameVersion. - - - - - Gets the game Language. - - - - - Gets how many milliseconds the game has been open in this session - - - - - Sets the time scale of the Game. - - - The Time Scale, only accepts values in range 0.0f to 1.0f - - - - - Gets the total number of frames that's been rendered in this session. - - - - - Gets the current frame rate per second. - - - - - Gets the time it currently takes to render a frame, in seconds. - - - - - Gets or sets the maximum wanted level a can receive. - - - The maximum wanted level, only accepts values 0 to 5 - - - - - Sets the wanted level multiplier - - - The multiplier to apply to a players wanted level - - - - - Sets a value indicating whether Police s should be visible on the Minimap - - - - - Gets or sets the radio station. - - - - - Gets the that you are controling - - - - - Gets the that you are controling - - - - - Gets or sets a value indicating whether to render the world with a night vision filter - - - - - Gets or sets a value indicating whether to render the world with a thermal vision filter - - - - - Gets or sets a value informing the Game Engine if a mission is in progress - - - if true a mission is currently active; otherwise, false - - - - - Gets or sets a value informing the Game Engine if a random event is in progress. - - - if true a random event is currently active; otherwise, false - - - - - Gets or a value indicating whether the cutscene is active. - - - if true a cutscene is currently active; otherwise, false - - - - - Gets a value indicating whether there is a Waypoint set - - - - - Gets or sets a value indicating whether the game is paused - - - - - Gets a value indicating whether there is a loading screen being displayed - - - - - Gets whether the last input was made with a GamePad or Keyboard and Mouse - - - - - Gets whether a was entered. - - The to check against. - true if the was just entered; otherwise, false - - Only works for Gamepad inputs - Cheat combinations use the same system - - - - - Gets whether a cheat code was entered into the cheat text box - - The name of the cheat to check. - true if the cheat was just entered; otherwise, false - - - - Gets whether a is currently pressed - - The Input Method (0 = Mouse and Keyboard, 2 = GamePad). - The . - true if the is pressed; otherwise, false - - - - Gets whether a was just pressed this frame - - The Input Method (0 = Mouse and Keyboard, 2 = GamePad). - The . - true if the was just pressed this frame; otherwise, false - - - - Gets whether a was just released this frame - - The Input Method (0 = Mouse and Keyboard, 2 = GamePad). - The . - true if the was just released this frame; otherwise, false - - - - Gets whether a is Enabled this frame and is currently pressed - - The Input Method (0 = Mouse and Keyboard, 2 = GamePad). - The . - true if the is pressed; otherwise, false - - - - Gets whether a is Enabled and was just pressed this frame - - The Input Method (0 = Mouse and Keyboard, 2 = GamePad). - The . - true if the was just pressed this frame; otherwise, false - - - - Gets whether a is Enabled and was just released this frame - - The Input Method (0 = Mouse and Keyboard, 2 = GamePad). - The . - true if the was just released this frame; otherwise, false - - - - Gets whether a is Disabled this frame and is currently pressed - - The Input Method (0 = Mouse and Keyboard, 2 = GamePad). - The . - true if the is pressed; otherwise, false - - - - Gets whether a is Disabled and was just pressed this frame - - The Input Method (0 = Mouse and Keyboard, 2 = GamePad). - The . - true if the was just pressed this frame; otherwise, false - - - - Gets whether a is Disabled and was just released this frame - - The Input Method (0 = Mouse and Keyboard, 2 = GamePad). - The . - true if the was just released this frame; otherwise, false - - - - Gets whether a is Enabled ot Disabled this frame - - The Input Method (0 = Mouse and Keyboard, 2 = GamePad). - The . - true if the is Enabled; otherwise, false - - - - Makes the Game Engine respond to the given Control this frame - - The Input Method (0 = Mouse and Keyboard, 2 = GamePad). - The . - - - - Makes the Game Engine ignore to the given Control this frame - - The Input Method (0 = Mouse and Keyboard, 2 = GamePad). - The . - - - - Disables all s this frame. - - The Input Method (0 = Mouse and Keyboard, 2 = GamePad). - - - - Enables all s this frame. - - The Input Method (0 = Mouse and Keyboard, 2 = GamePad). - - - - Gets an Analog value of a input between -1.0f and 1.0f - - The Input Method (0 = Mouse and Keyboard, 2 = GamePad). - The . - The normalised value - - - - Gets an Analog value of a Disabled input between -1.0f and 1.0f - - The Input Method (0 = Mouse and Keyboard, 2 = GamePad). - The . - The normalised value - - - - Gets an value of a input. - - The Input Method (0 = Mouse and Keyboard, 2 = GamePad). - The . - The value - - - - Override a by giving it a user defined value this frame. - - The Input Method (0 = Mouse and Keyboard, 2 = GamePad). - The . - the value to set the control to. - - - - Pauses or Resumes the game - - if set to true Pause the game; otherwise, resume the game. - - - - Pauses or Resumes the game clock - - if set to true Pause the game clock; otherwise, resume the game clock. - - - - Performs and automative game save - - - - - Shows the save menu enabling the user to perform a manual game save. - - - - - Determines the game language files contain a entry for the specified GXT key - - The GXT key. - true if GXT entry exists; otherwise, false - - - - Returns a localised from the games language files with a specified GXT key - - The GXT key. - The localised if the key exists; otherwise, - - - - Calculates a Jenkins One At A Time hash from the given which can then be used by any native function that takes a hash - - The input to hash. - The Jenkins hash of the - - - - Plays a sound from the games sound files - - The file the sound is stored in. - The name of the sound inside the file. - - - - Plays music from the games music files - - The music file to play. - - - - Stops playing a music file - - The music file to stop. - - - - Creates an input box for enabling a user to input text using the keyboard - - The maximum length of input allowed. - The of what the user entered, If the user cancelled is returned - - - - Creates an input box for enabling a user to input text using the keyboard - - The default text. - The maximum length of input allowed. - The of what the user entered, If the user cancelled is returned - - - - Creates an input box for enabling a user to input text using the keyboard - - The Title of the Window. - The maximum length of input allowed. - The of what the user entered, If the user cancelled is returned - - - - Creates an input box for enabling a user to input text using the keyboard - - The Title of the Window. - The default text. - The maximum length of input allowed. - The of what the user entered, If the user cancelled is returned - - - - Private unsafe version of - - - - - - - - Returns a struct containing information about a specific tattoo. - Currently only the , - and are known. It's still unkown what the other values are used for or if - they're even correctly offset in the byte array. - - Character types 0 = Michael, 1 = Franklin, 2 = Trevor, 3 = MPMale, 4 = MPFemale - Tattoo index, value between 0 and - - - - - Private (unsafe) version of - - - - - - - - Gets the alternate prop index data for a specific prop on a specific ped. - This is used to check for the 'alternate' version of a helmet with a visor for example (open/closed visor variants). - - - - - - - - Gets the hash for this . - - - - - Returns true if this is valid. - - - true if this is valid; otherwise, false. - - - - - Gets a value indicating whether this is in the cd image. - - - true if this is in the cd image; otherwise, false. - - - - - Gets a value indicating whether this is loaded so it can be spawned. - - - true if this is loaded; otherwise, false. - - - - - Gets a value indicating whether the collision for this is loaded. - - - true if the collision is loaded; otherwise, false. - - - - - Gets a value indicating whether this is a bicycle. - - - true if this is a bicycle; otherwise, false. - - - - - Gets a value indicating whether this is a motorbike. - - - true if this is a motorbike; otherwise, false. - - - - - Gets a value indicating whether this is a boat. - - - true if this is a boat; otherwise, false. - - - - - Gets a value indicating whether this is a car. - - - true if this is a car; otherwise, false. - - - - - Gets a value indicating whether this is a cargobob. - - - true if this is a cargobob; otherwise, false. - - - - - Gets a value indicating whether this is a helicopter. - - - true if this is a helicopter; otherwise, false. - - - - - Gets a value indicating whether this is a ped. - - - true if this is a ped; otherwise, false. - - - - - Gets a value indicating whether this is a plane. - - - true if this is a plane; otherwise, false. - - - - - Gets a value indicating whether this is a prop. - - - true if this is a prop; otherwise, false. - - - - - Gets a value indicating whether this is a quadbike. - - - true if this is a quadbike; otherwise, false. - - - - - Gets a value indicating whether this is a train. - - - true if this is a train; otherwise, false. - - - - - Gets a value indicating whether this is a vehicle. - - - true if this is a vehicle; otherwise, false. - - - - - Gets the dimensions of this . - - - - - - Gets the dimensions of this . - - The minimum dimensions output . - The maximum dimensions output . - - - - Attempt to load this into memory. - - - - - Attempt to load this into memory for a given period of time. - - The time (in milliseconds) before giving up trying to load this - true if this is loaded; otherwise, false - - - - Frees this from memory. - - - - - This is used to GET the data. The GetData() function returns the data into a usable struct for scripts to use safely. - - - - - A struct containing all ped head blend data. Used for MP (freemode) characters. - - - - - This is used to GET the data. The GetData() function returns the data into a usable struct for scripts to use safely. - - - - - Creates a class used for loading s than can be used to start s from inside the Asset - - The name of the asset file which contains all the s you are wanting to start - The files have the extension *.ypt in OpenIV, use the file name withouth the extension for the - - - - Gets the name of the this file - - - - - Gets a value indicating whether this is Loaded - - Use or to load the asset - - - - Starts a Particle Effect that runs once at a given position then is destroyed. - - The name of the effect. - The World position where the effect is. - What rotation to apply to the effect. - How much to scale the size of the effect by. - Which axis to flip the effect in. - trueIf the effect was able to start; otherwise, false. - - - - Starts a Particle Effect on an that runs once then is destroyed. - - the name of the effect. - The the effect is attached to. - The offset from the to attach the effect. - The rotation, relative to the , the effect has. - How much to scale the size of the effect by. - Which axis to flip the effect in. For a car side exahust you may need to flip in the Y Axis - trueIf the effect was able to start; otherwise, false. - - - - Starts a Particle Effect on an that runs once then is destroyed. - - the name of the effect. - The the effect is attached to. - The offset from the to attach the effect. - The rotation, relative to the , the effect has. - How much to scale the size of the effect by. - Which axis to flip the effect in. For a car side exahust you may need to flip in the Y Axis - trueIf the effect was able to start; otherwise, false. - - - - Creates a on an that runs looped. - - The name of the Effect - The the effect is attached to. - The offset from the to attach the effect. - The rotation, relative to the , the effect has. - How much to scale the size of the effect by. - Which axis to flip the effect in. For a car side exahust you may need to flip in the Y Axis. - if true attempt to start this effect now; otherwise, the effect will start when is called. - The represented by this that can be used to start/stop/modify this effect - - - - Creates a on an that runs looped. - - The name of the Effect - The the effect is attached to. - The offset from the to attach the effect. - The rotation, relative to the , the effect has. - How much to scale the size of the effect by. - Which axis to flip the effect in. For a car side exahust you may need to flip in the Y Axis. - if true attempt to start this effect now; otherwise, the effect will start when is called. - The represented by this that can be used to start/stop/modify this effect - - - - Creates a at a position that runs looped. - - The name of the effect. - The World position where the effect is. - What rotation to apply to the effect. - How much to scale the size of the effect by. - Which axis to flip the effect in. - if true attempt to start this effect now; otherwise, the effect will start when is called. - The represented by this that can be used to start/stop/modify this effect - - - - Sets the for all NonLooped Particle Effects - - - - - Attempts to load this into memory so it can be used for starting s. - - - - - Attempts to load this into memory so it can be used for starting s. - - How long in milli-seconds should the game wait while the model hasnt been loaded before giving up - true if the is Loaded; otherwise, false - - - - Tells the game we have finished using this and it can be freed from memory - - - - - Gets the Handle of this - - - The handle, will return -1 when the this is not active - - - - - Gets a value indicating whether this is active. - - - true if this is active; otherwise, false. - - - - - Deletes this . - - - - - Gets the memory address where this is located in game memory. - - - - - Gets or sets the offset. - If this is attached to an , this refers to the offset from the ; - otherwise, this refers to its position in World coords - - - - - Gets or Sets the rotation of this - - - - - Gets or sets the of this . - - - - - Gets or sets the size scaling factor of this - - - The scale, default = 1.0f; - To Decrease the size use a value less than 1.0f; - To Increase the size use a value greater than 1.0f; - - - - - Gets or sets which axis of this should be inverted. - - - - - Modifys parameters of this . - - Name of the parameter you want to modify, these are stored inside the effect files. - The new value for the parameter. - - - - Gets the name of the asset this effect is stored in. - - - - - Gets the name of this effect. - - - - - Gets or sets the this is attached to. - - - - - Gets or sets the that this is attached to. - - - - - Starts this . - - true if this was sucessfully started; otherwise, false. - - - - Creates a copy of this to another to simplify applying the same effect to many Entities. - - The to copy to. - An that has all the same properties as this instance, but for a different . - - - - Creates a copy of this to another to simplify applying the same effect to many Entities. - - The to copy to. - An that has all the same properties as this instance, but for a different . - - - - Starts this . - - true if this was sucessfully started; otherwise, false. - - - - Creates a copy of this to another position to simplify applying the same effect to many positions. - - The position to copy to. - A that has all the same properties as this instance, but for a different position. - - - - Get the headblend data from this . - - A struct containing all headblend data from a mp ped. - - - - Gets the unsafe headblend struct and converts it into a safe struct and returns that struct. - - A struct. - - - - Gets or sets how much money this is carrying. - - - - - Gets the gender of this . Note this does not seem to work correctly for all peds. - - - - - Gets or sets how much Armor this is wearing. - - if you need to get or set the value strictly, use instead. - - - - Gets or sets how much Armor this is wearing in float. - - - - - Gets or sets how accurate this s shooting ability is. - - - The accuracy from 0 to 100, 0 being very innacurate, 100 being perfectly accurate. - - - - - Opens a list of that this can carry out. - - - - - Gets the stage of the this is currently executing. - - - - - Opens a list of Helpers which can be applied to this . - - - - - Gets a collection of all this s s. - - - - - Opens a list of clothing and prop configurations that this can wear. - - - - - Gets the vehicle weapon this is using. - The vehicle weapon, returns if this isnt using a vehicle weapon. - - - - - Gets the last this used. - - returns null if the last vehicle doesn't exist. - - - - Gets the current this is using. - - returns null if this isn't in a . - - - - Gets the this is trying to enter. - - returns null if this isn't trying to enter a . - - - - Gets the PedGroup this is in. - - - - - Gets or sets the how much sweat should be rendered on this . - - - The sweat from 0 to 100, 0 being no sweat, 100 being saturated. - - - - - Sets how high up on this s body water should be visible. - - - The height ranges from 0.0f to 1.99f, 0.0f being no water visible, 1.99f being covered in water. - - - - - Sets the voice to use when this speaks. - - - - - Sets the rate this will shoot at. - - - The shoot rate from 0.0f to 1000.0f, 100.0f is the default value. - - - - - Gets a value indicating whether this was killed by a stealth attack. - - - true if this was killed by stealth; otherwise, false. - - - - - Gets a value indicating whether this was killed by a takedown. - - - true if this was killed by a takedown; otherwise, false. - - - - - Gets the this is in. - - - The this is in if this is in a ; otherwise, . - - - - - Gets a value indicating whether this is jumping out of their vehicle. - - - true if this is jumping out of their vehicle; otherwise, false. - - - - - Sets a value indicating whether this will stay in the vehicle when the driver gets jacked. - - - true if stays in vehicle when jacked; otherwise, false. - - - - - Sets the maximum driving speed this can drive at. - - - - - Gets or sets the injury health threshold for this . - The ped is considered injured when its health drops below this value. - - - The injury health threshold. Should be below . - - - - - Gets or sets the fatal injury health threshold for this . - The ped is considered dead when its health drops below this value. - - - The fatal injury health threshold. Should be below . - - - Note on player controlled peds: One of the game scripts will kill the player when their health drops below 100, regardless of this setting. - - - - - Gets a value indicating whether this is human. - - - true if this is human; otherwise, false. - - - - - Sets whether permanent events are blocked for this . - If permanent events are blocked, this will only do as it's told, and won't flee when shot at, etc. - - - true if permanent events are blocked; otherwise, false. - - - - - Determines whether this exists. - - true if this exists; otherwise, false - - - - Determines whether the exists. - - The to check. - true if the exists; otherwise, false - - - - Gets the with the specified bone name. - - Name of the bone. - - - - Gets the at the specified bone index. - - The bone index. - - - - Gets the with the specified boneId. - - The boneId. - - - - Gets the last damaged Bone for this . - - - - - Clears the last damage a bone on this received. - - - - - Gets the this is controling. - - - - - Gets the name of this . - - - - - Gets or sets how much money this has. - Only works if current player is , or - - - - - Gets or sets the wanted level for this . - - - - - Gets or sets the wanted center position for this . - - - The place in world coords where the police think this is. - - - - - Gets or sets the maximum amount of armor this can carry. - - - - - Gets or sets the primary parachute tint for this . - - - - - Gets or sets the reserve parachute tint for this . - - - - - Sets a value indicating whether this can leave a parachute smoke trail. - - - true if this can leave a parachute smoke trail; otherwise, false. - - - - - Gets or sets the color of the parachute smoke trail for this . - - - The color of the parachute smoke trail for this . - - - - - Gets a value indicating whether this is alive. - - - true if this is alive; otherwise, false. - - - - - Gets a value indicating whether this is dead. - - - true if this is dead; otherwise, false. - - - - - Gets a value indicating whether this is aiming. - - - true if this is aiming; otherwise, false. - - - - - Gets a value indicating whether this is climbing. - - - true if this is climbing; otherwise, false. - - - - - Gets a value indicating whether this is riding a train. - - - true if this is riding a train; otherwise, false. - - - - - Gets a value indicating whether this is pressing a horn. - - - true if this is pressing a horn; otherwise, false. - - - - - Gets a value indicating whether this is playing. - - - true if this is playing; otherwise, false. - - - - - Gets or sets a value indicating whether this is invincible. - - - true if this is invincible; otherwise, false. - - - - - Sets a value indicating whether this is ignored by the police. - - - true if this is ignored by the police; otherwise, false. - - - - - Sets a value indicating whether this is ignored by everyone. - - - true if this is ignored by everyone; otherwise, false. - - - - - Sets a value indicating whether cops will be dispatched for this - - - true if cops will be dispatched; otherwise, false. - - - - - Sets a value indicating whether this can use cover. - - - true if this can use cover; otherwise, false. - - - - - Gets a value indicating whether this can start a mission. - - - true if this can start a mission; otherwise, false. - - - - - Sets a value indicating whether this can control ragdoll. - - - true if this can control ragdoll; otherwise, false. - - - - - Gets or sets a value indicating whether this can control its . - - - true if this can control its ; otherwise, false. - - - - - Attempts to change the of this . - - The to change this to. - true if the change was sucessful; otherwise, false. - - - - Gets how long this can remain sprinting for. - - - - - Gets how much sprint stamina this currently has. - - - - - Gets how long this can stay underwater before they start losing health. - - - - - Gets a value indicating whether this is using their special ability. - - - true if this is using their special ability; otherwise, false. - - - - - Gets or sets a value indicating whether this can use their special ability. - - - true if this can use their special ability; otherwise, false. - - - - - Charges the special ability for this . - - The absolute amount. - - - - Charges the special ability for this . - - The amount between 0.0f and 1.0f - - - - Refills the special ability for this . - - - - - Depletes the special ability for this . - - - - - Gets the last this used. - - returns null if the last vehicle doesn't exist. - - - - Determines whether this is targetting the specified . - - The to check. - - true if this is targetting the specified ; otherwise, false. - - - - - Gets a value indicating whether this is targetting anything. - - - true if this is targetting anything; otherwise, false. - - - - - Gets the this is targetting. - - The if this is targetting any ; otherwise, null - - - - Sets a value indicating whether ths player is forced to aim. - - - true to make the player always be aiming; otherwise, false. - - - - - Prevents this firing this frame. - - - - - Sets the run speed mult for this this this frame. (THIS NAME IS WRONG, SHOULD NOT BE CALLED EVERY FRAME). - - The factor - min: 0.0f, default: 1.0f, max: 1.499f. - - - - Sets the swim speed mult for this this this frame. (THIS NAME IS WRONG, SHOULD NOT BE CALLED EVERY FRAME). - - The factor - min: 0.0f, default: 1.0f, max: 1.499f. - - - - Makes this shoot fire bullets this frame. - - - - - Makes this shoot explosive bullets this frame. - - - - - Makes this have an explosive melee attack this frame. - - - - - Lets this jump really high this frame. - - - - - Blocks this from entering any this frame. - - - - - Only lets this enter a specific this frame. - - The this is allowed to enter. - - - - Determines whether this exists. - - true if this exists; otherwise, false - - - - Determines whether the exists. - - The to check. - true if the exists; otherwise, false - - - - Gets the this raycast collided with. - Returns null if the raycast didnt collide with any . - - - - - Gets the world coordinates where this raycast collided. - Returns if the raycast didnt collide with anything. - - - - - Gets the normal of the surface where this raycast collided. - Returns if the raycast didnt collide with anything. - - - - - Gets a value indicating whether this raycast collided with anything. - - - - - Gets a value indicating whether this raycast collided with any . - - - - - Gets a value indicating the material type of the collision. - - - - - Looks at the specified . - - - Must be greater than 0 for the ped to actually move their head. - - - - Looks at the specified position. - - - Must be greater than 0 for the ped to actually move their head. - - - - Gets the display name of this . - Use to get the localized name. - - - - - Gets the localized name of this - - - - - Gets the display name of this s . - Use to get the localized class name. - - - - - Gets the localized name of this s . - - - - - Gets the class of this . - - - - - Gets or sets this s body health. - - - - - Gets or sets this engine health. - - - - - Gets or sets this petrol tank health. - - - - - Gets or sets this fuel level. - - - - - Gets or sets a value indicating whether this s engine is running. - - - true if this s engine is running; otherwise, false. - - - - - Gets or sets a value indicating whether this s engine is currently starting. - - - true if this s engine is starting; otherwise, false. - - - - - Turns this s radio on or off - - - - - Sets this s radio station. - - - - - Gets or sets this s speed. - - - The speed in m/s. - - - - - Gets the speed the drive wheels are turning at, This is the value used for the dashboard speedometers(after being converted to mph). - - - - - Gets the acceleration of this . - - - - - Gets or sets the current RPM of this . - - - The current RPM between 0.0f and 1.0f. - - - - - Gets the current gear this is using. - - - - - Gets the steering angle of this . - - - The steering angle in degrees. - - - - - Gets or sets the steering scale of this . - - - - - Gets a value indicating whether this has forks. - - - true if this has forks; otherwise, false. - - - - - Sets a value indicating whether this has an alarm set. - - - true if this has an alarm set; otherwise, false. - - - - - Gets a value indicating whether this is sounding its alarm. - - - true if this is sounding its alarm; otherwise, false. - - - - - Gets or sets time left before this alarm stops. - If greater than zero, the vehicle alarm will be sounding. - the value is up to 65534. - - - The time left before this alarm stops. - - - - - Starts sounding the alarm on this . - - - - - Gets a value indicating whether this has a siren. - - - true if this has a siren; otherwise, false. - - - - - Gets or sets a value indicating whether this has its siren turned on. - - - true if this has its siren turned on; otherwise, false. - - - - - Sets a value indicating whether the siren on this plays sounds. - - - true if the siren on this plays sounds; otherwise, false. - - - - - Sounds the horn on this . - - The duration to sound the horn for. - - - - Gets or sets a value indicating whether this is wanted by the police. - - - true if this is wanted by the police; otherwise, false. - - - - - Gets or sets a value indicating whether peds can use this for cover. - - - true if peds can use this for cover; otherwise, false. - - - - - Gets or sets a value indicating whether this drops money when destroyed. - - - true if this drops money when destroyed; otherwise, false. - - - - - Gets or sets a value indicating whether this was previously owned by a . - - - true if this was previously owned by a ; otherwise, false. - - - - - Gets or sets a value indicating whether this needs to be hotwired to start. - - - true if this needs to be hotwired to start; otherwise, false. - - - - - Gets or sets a value indicating whether this has its lights on. - - - true if this has its lights on; otherwise, false. - - - - - Gets or sets a value indicating whether this has its high beams on. - - - true if this has its high beams on; otherwise, false. - - - - - Gets or sets a value indicating whether this has its interior lights on. - - - true if this has its interior lights on; otherwise, false. - - - - - Gets or sets a value indicating whether this has its search light on. - - - true if this has its search light on; otherwise, false. - - - - - Gets or sets a value indicating whether this has its taxi light on. - - - true if this has its taxi light on; otherwise, false. - - - - - Gets or sets a value indicating whether this has its left indicator light on. - - - true if this has its left indicator light on; otherwise, false. - - - - - Gets or sets a value indicating whether this has its right indicator light on. - - - true if this has its right indicator light on; otherwise, false. - - - - - Sets a value indicating whether the Handbrake on this is forced on. - - - true if the Handbrake on this is forced on; otherwise, false. - - - - - Gets or sets a value indicating whether this has its brake light on. - - - true if this has its brake light on; otherwise, false. - - - - - Gets whether or not the engine is on fire and losing health rapdily. - - - - - Determines whether this exists. - - true if this exists; otherwise, false - - - - Determines whether the exists. - - The to check. - true if the exists; otherwise, false - - - - Gets or sets the current date and time in the GTA World. - - - The current date and time. - - - - - Gets or sets the current time of day in the GTA World. - - - The current time of day - - - - - Sets a value indicating whether lights in the should be rendered. - - - true if blackout; otherwise, false. - - - - - Gets or sets the current Cloud Hat. - - - - - Gets or sets the current Cloud Hat opacity. On a scale of 0.0 to 1.0. - - - - - Gets or sets the weather. - - - The weather. - - - - - Gets or sets the next weather. - - - The next weather. - - - - - Gets or sets the weather transition. - - - The weather transition. - - - - - Transitions to weather. Duration is 45f in most scripts. - - The weather. - The duration. - - - - Sets the gravity level for all objects. - - - The gravity level: - 9.8f - Default gravity. - 2.4f - Moon gravity. - 0.1f - Very low gravity. - 0.0f - No gravity. - - - - - Gets or sets the rendering camera. - - - The rendering . - - - Setting to null sets the rendering to . - - - - - Destroys all user created s. - - - - - Gets or sets the waypoint position. - - The coordinates of the Waypoint - - Returns an empty if a waypoint hasn't been set - If the game engine cant extract height information the Z component will be 0.0f - - - - - Gets the waypoint blip. - - The coordinates of the Waypoint - - Returns null if a waypoint hasn't been set - - - - - Removes the waypoint. - - - - - Gets the straight line distance between 2 positions. - - The origin. - The destination. - The distance - - - - Calculates the travel distance using roads and paths between 2 positions. - - The origin. - The destination. - The travel distance - - - - Gets the height of the ground at a given position. - - The position. - The height measured in meters - - - - Gets the height of the ground at a given position. - - The position. - The height measured in meters - - - - Gets an array of all the s on the map with a given . - - The blip types to include, leave blank to get all s. - - - - Gets an array of all the s on the map. - - - - - Gets an array of all the s on the map. - - - - - Gets an array of all the s on the map. - - - - - Gets an array of all the s on the map. - - - - - Gets the closest to a given position in the World. - - - The position to check against. - The spatials to check. - The closest to the - - - - Gets the closest to a given position in the World ignoring height. - - - The position to check against. - The spatials to check. - The closest to the - - - - Gets the nearest safe coordinate to position a . - - The position to check around. - if set to true Only find positions on the sidewalk. - The flags. - - - - Gets the next position on the street where a can be placed. - - The position to check around. - if set to true only find positions that dont already have a vehicle in them. - - - - Gets the next position on the street where a can be placed. - - The position to check around. - if set to true only find positions that dont already have a vehicle in them. - - - - Gets the next position on the street where a can be placed. - - The position to check around. - - - - Gets the next position on the street where a can be placed. - - The position to check around. - - - - Gets the localized name of the a zone in the map. - - The position on the map. - - - - Gets the localized name of the a zone in the map. - - The position on the map. - - - - Gets the display name of the a zone in the map. - Use to convert to the localized name. - - The position on the map. - - - - Gets the display name of the a zone in the map. - Use to convert to the localized name. - - The position on the map. - - - - Creates a at the given position on the map. - - The position of the blip on the map. - - - - Creates a for a circular area at the given position on the map. - - The position of the blip on the map. - The radius of the area on the map. - - - - Creates a , use to switch to this camera - - The position of the camera. - The rotation of the camera. - The field of view of the camera. - - - - Spawns a of the given at the position and heading specified. - - The of the . - The position to spawn the at. - The heading of the . - returns null if the could not be spawned - - - - Spawns a of a random at the position specified. - - The position to spawn the at. - - - - Spawns a of the given at the position and heading specified. - - The of the . - The position to spawn the at. - The heading of the . - returns null if the could not be spawned - - - - Spawns a of a random at the position specified. - - The position to spawn the at. - The heading of the . - returns null if the could not be spawned - - - - Spawns a of the given at the position specified. - - The of the . - The position to spawn the at. - if set to true the will have physics; otherwise, it will be static. - if set to true place the prop on the ground nearest to the . - returns null if the could not be spawned - - - - Spawns a of the given at the position specified. - - The of the . - The position to spawn the at. - The rotation of the . - if set to true the will have physics; otherwise, it will be static. - if set to true place the prop on the ground nearest to the . - returns null if the could not be spawned - - - - Spawns a of the given at the position specified without any offset. - - The of the . - The position to spawn the at. - if set to true the will have physics; otherwise, it will be static. - returns null if the could not be spawned - - - - Spawns a of the given at the position specified without any offset. - - The of the . - The position to spawn the at. - The rotation of the . - if set to true the will have physics; otherwise, it will be static. - returns null if the could not be spawned - - - - Creates a in the world. - - The to display inside the . - The position in the World. - The position in the world where this should point. - The radius of the . - The color of the . - returns null if the could not be created - - - - Creates a in the world. - - The to display inside the . - The position in the World. - The position in the world where this should point. - The radius of the . - The color of the . - returns null if the could not be created - - - - Spawns a . - - The type of . - The position of the . - The rotation of the . - The length of the . - The minimum length of the . - if set to true the will break if shot. - - - - Fires a single bullet in the world - - Where the bullet is fired from. - Where the bullet is fired to. - The who fired the bullet, leave null for no one. - The weapon that the bullet is fired from. - The damage the bullet will cause. - The speed, only affects projectile weapons, leave -1 for default. - - - - Creates an explosion in the world - - The position of the explosion. - The type of explosion. - The radius of the explosion. - The amount of camera shake to apply to nearby cameras. - The who caused the explosion, leave null if no one caused the explosion. - if set to true explosion can be heard. - if set to true explosion is invisible. - - - - Creates a with the given name. - - The name of the relationship group. - - - - Creates a raycast between 2 points. - - The source of the raycast. - The target of the raycast. - What type of objects the raycast should intersect with. - Specify an that the raycast should ignore, leave null for no entities ignored. - - - - Creates a raycast between 2 points. - - The source of the raycast. - The direction of the raycast. - How far the raycast should go out to. - What type of objects the raycast should intersect with. - Specify an that the raycast should ignore, leave null for no entities ignored. - - - - Creates a 3D raycast between 2 points. - - The source of the raycast. - The target of the raycast. - The radius of the raycast. - What type of objects the raycast should intersect with. - Specify an that the raycast should ignore, leave null for no entities ignored. - - - - Creates a 3D raycast between 2 points. - - The source of the raycast. - The direction of the raycast. - The radius of the raycast. - How far the raycast should go out to. - What type of objects the raycast should intersect with. - Specify an that the raycast should ignore, leave null for no entities ignored. - - - - Determines where the crosshair intersects with the world. - - A containing information about where the crosshair intersects with the world. - - - - Determines where the crosshair intersects with the world. - - Prevent the raycast detecting a specific . - A containing information about where the crosshair intersects with the world. - - - - Draws a marker in the world, this needs to be done on a per frame basis - - The type of marker. - The position of the marker. - The direction the marker points in. - The rotation of the marker. - The amount to scale the marker by. - The color of the marker. - if set to true the marker will bob up and down. - if set to true the marker will always face the camera, regardless of its rotation. - if set to true rotates only on the y axis(heading). - Name of texture dictionary to load the texture from, leave null for no texture in the marker. - Name of texture inside the dictionary to load the texture from, leave null for no texture in the marker. - if set to true draw on any that intersects the marker. - - - - Draws light around a region. - - The position to center the light around. - The color of the light. - How far the light should extend to. - The intensity: 0.0f being no intensity, 1.0f being full intensity. - - - - Stops all particle effects in a range. - - The position in the world to stop particle effects. - The maximum distance from the to stop particle effects. - - - - Provides fast reading and writing of generic structures to a memory location using IL emitted functions. - - - - - Retrieve a pointer to the passed generic structure type. This is achieved by emitting a to retrieve a pointer to the structure. - - - - A pointer to the provided structure in memory. - - - - - Loads the generic value type from a pointer. This is achieved by emitting a that returns the value in the memory location as a . - The equivalent non-generic C# code: - - unsafe MyStruct ReadFromPointer(byte* pointer) - { - return *(MyStruct*)pointer; - } - - - Any value/structure type - Unsafe pointer to memory to load the value from - The newly loaded value - - - - Writes the generic value type to the location specified by a pointer. This is achieved by emitting a that copies the value from the referenced structure into the specified memory location. - There is no exact equivalent possible in C#, the closest possible (generates the same IL) is the following code: - - unsafe void WriteToPointer(ref SharedHeader dest, ref SharedHeader src) - { - dest = src; - } - - - - - - - - - Retrieve the cached size of a structure - - - - Caches the size by type - - - - - Reads a number of elements from a memory location into the provided buffer starting at the specified index. - - The structure type - The destination buffer. - The source memory location. - The start index within . - The number of elements to read. - - - - Writes a number of elements to a memory location from the provided buffer starting at the specified index. - - The structure type - The destination memory location. - The source buffer. - The start index within . - The number of elements to write. - - - - Emits optimized IL for the reading and writing of structures to/from memory. - For a 32-byte structure with 1 million iterations: - The method performs approx. 20x faster than - (8ms vs 160ms), and about 1.6x slower than the non-generic equivalent (8ms vs 5ms) - The method performs approx. 8x faster than - (4ms vs 34ms). - - - - - - Delegate that returns a pointer to the provided structure. Use with extreme caution. - - - - - - - Delegate for loading a structure from the specified memory address - - - - - - - Delegate for writing a structure to the specified memory address - - - - - - - The delegate for the generated IL to retrieve a pointer to the structure - - - - - The delegate for the generated IL to retrieve a structure from a specified memory address. - - - - - The delegate for the generated IL to store a structure at the specified memory address. - - - - - Cached size of T as determined by . - - - - - Performs once of type compatibility check. - - Thrown if the type T is incompatible - - - - The value for which all absolute numbers smaller than are considered equal to zero. - - - - - A value specifying the approximation of π which is 180 degrees. - - - - - A value specifying the approximation of 2π which is 360 degrees. - - - - - A value specifying the approximation of π/2 which is 90 degrees. - - - - - A value specifying the approximation of π/4 which is 45 degrees. - - - - - Checks if a and b are almost equals, taking into account the magnitude of floating point numbers (unlike method). See Remarks. - See remarks. - - The left value to compare. - The right value to compare. - true if a almost equal to b, false otherwise - - The code is using the technique described by Bruce Dawson in - Comparing Floating point numbers 2012 edition. - - - - - Determines whether the specified value is close to zero (0.0f). - - The floating value. - true if the specified value is close to zero (0.0f); otherwise, false. - - - - Determines whether the specified value is close to one (1.0f). - - The floating value. - true if the specified value is close to one (1.0f); otherwise, false. - - - - Checks if a - b are almost equals within a float epsilon. - - The left value to compare. - The right value to compare. - Epsilon value - true if a almost equal to b within a float epsilon, false otherwise - - - - Converts revolutions to degrees. - - The value to convert. - The converted value. - - - - Converts revolutions to radians. - - The value to convert. - The converted value. - - - - Converts revolutions to gradians. - - The value to convert. - The converted value. - - - - Converts degrees to revolutions. - - The value to convert. - The converted value. - - - - Converts degrees to radians. - - The value to convert. - The converted value. - - - - Converts radians to revolutions. - - The value to convert. - The converted value. - - - - Converts radians to gradians. - - The value to convert. - The converted value. - - - - Converts gradians to revolutions. - - The value to convert. - The converted value. - - - - Converts gradians to degrees. - - The value to convert. - The converted value. - - - - Converts gradians to radians. - - The value to convert. - The converted value. - - - - Converts radians to degrees. - - The value to convert. - The converted value. - - - - Clamps the specified value. - - The value. - The min. - The max. - The result of clamping a value between min and max - - - - Clamps the specified value. - - The value. - The min. - The max. - The result of clamping a value between min and max - - - - Interpolates between two values using a linear function by a given amount. - - - See http://www.encyclopediaofmath.org/index.php/Linear_interpolation and - http://fgiesen.wordpress.com/2012/08/15/linear-interpolation-past-present-and-future/ - - Value to interpolate from. - Value to interpolate to. - Interpolation amount. - The result of linear interpolation of values based on the amount. - - - - Interpolates between two values using a linear function by a given amount. - - - See http://www.encyclopediaofmath.org/index.php/Linear_interpolation and - http://fgiesen.wordpress.com/2012/08/15/linear-interpolation-past-present-and-future/ - - Value to interpolate from. - Value to interpolate to. - Interpolation amount. - The result of linear interpolation of values based on the amount. - - - - Interpolates between two values using a linear function by a given amount. - - - See http://www.encyclopediaofmath.org/index.php/Linear_interpolation and - http://fgiesen.wordpress.com/2012/08/15/linear-interpolation-past-present-and-future/ - - Value to interpolate from. - Value to interpolate to. - Interpolation amount. - The result of linear interpolation of values based on the amount. - - - - Performs smooth (cubic Hermite) interpolation between 0 and 1. - - - See https://en.wikipedia.org/wiki/Smoothstep - - Value between 0 and 1 indicating interpolation amount. - - - - Performs a smooth(er) interpolation between 0 and 1 with 1st and 2nd order derivatives of zero at endpoints. - - - See https://en.wikipedia.org/wiki/Smoothstep - - Value between 0 and 1 indicating interpolation amount. - - - - Calculates the modulo of the specified value. - - The value. - The modulo. - The result of the modulo applied to value - - - - Calculates the modulo 2*PI of the specified value. - - The value. - The result of the modulo applied to value - - - - Wraps the specified value into a range [min, max] - - The value to wrap. - The min. - The max. - Result of the wrapping. - Is thrown when is greater than . - - - - Wraps the specified value into a range [min, max[ - - The value. - The min. - The max. - Result of the wrapping. - Is thrown when is greater than . - - - - Gauss function. - - Curve amplitude. - Position X. - Position Y - Radius X. - Radius Y. - Curve sigma X. - Curve sigma Y. - The result of Gaussian function. - - - - Gauss function. - - Curve amplitude. - Position X. - Position Y - Radius X. - Radius Y. - Curve sigma X. - Curve sigma Y. - The result of Gaussian function. - - - - Represents a 4x4 mathematical matrix. - - - - - A with all of its components set to zero. - - - - - The identity . - - - - - Value at row 1 column 1 of the matrix. - - - - - Value at row 1 column 2 of the matrix. - - - - - Value at row 1 column 3 of the matrix. - - - - - Value at row 1 column 4 of the matrix. - - - - - Value at row 2 column 1 of the matrix. - - - - - Value at row 2 column 2 of the matrix. - - - - - Value at row 2 column 3 of the matrix. - - - - - Value at row 2 column 4 of the matrix. - - - - - Value at row 3 column 1 of the matrix. - - - - - Value at row 3 column 2 of the matrix. - - - - - Value at row 3 column 3 of the matrix. - - - - - Value at row 3 column 4 of the matrix. - - - - - Value at row 4 column 1 of the matrix. - - - - - Value at row 4 column 2 of the matrix. - - - - - Value at row 4 column 3 of the matrix. - - - - - Value at row 4 column 4 of the matrix. - - - - - Gets or sets the up of the matrix; that is M21, M22, and M23. - - - - - Gets or sets the down of the matrix; that is -M21, -M22, and -M23. - - - - - Gets or sets the right of the matrix; that is M11, M12, and M13. - - - - - Gets or sets the left of the matrix; that is -M11, -M12, and -M13. - - - - - Gets or sets the forward of the matrix; that is -M31, -M32, and -M33. - - - - - Gets or sets the backward of the matrix; that is M31, M32, and M33. - - - - - Initializes a new instance of the struct. - - The value that will be assigned to all components. - - - - Initializes a new instance of the struct. - - The value to assign at row 1 column 1 of the matrix. - The value to assign at row 1 column 2 of the matrix. - The value to assign at row 1 column 3 of the matrix. - The value to assign at row 1 column 4 of the matrix. - The value to assign at row 2 column 1 of the matrix. - The value to assign at row 2 column 2 of the matrix. - The value to assign at row 2 column 3 of the matrix. - The value to assign at row 2 column 4 of the matrix. - The value to assign at row 3 column 1 of the matrix. - The value to assign at row 3 column 2 of the matrix. - The value to assign at row 3 column 3 of the matrix. - The value to assign at row 3 column 4 of the matrix. - The value to assign at row 4 column 1 of the matrix. - The value to assign at row 4 column 2 of the matrix. - The value to assign at row 4 column 3 of the matrix. - The value to assign at row 4 column 4 of the matrix. - - - - Initializes a new instance of the struct. - - The values to assign to the components of the matrix. This must be an array with sixteen elements. - Thrown when is null. - Thrown when contains more or less than sixteen elements. - - - - Gets or sets the first row in the matrix; that is M11, M12, M13, and M14. - - - - - Gets or sets the second row in the matrix; that is M21, M22, M23, and M24. - - - - - Gets or sets the third row in the matrix; that is M31, M32, M33, and M34. - - - - - Gets or sets the fourth row in the matrix; that is M41, M42, M43, and M44. - - - - - Gets or sets the first column in the matrix; that is M11, M21, M31, and M41. - - - - - Gets or sets the second column in the matrix; that is M12, M22, M32, and M42. - - - - - Gets or sets the third column in the matrix; that is M13, M23, M33, and M43. - - - - - Gets or sets the fourth column in the matrix; that is M14, M24, M34, and M44. - - - - - Gets or sets the translation of the matrix; that is M41, M42, and M43. - - - - - Gets or sets the scale of the matrix; that is M11, M22, and M33. - - - - - Gets a value indicating whether this instance is an identity matrix. - - - true if this instance is an identity matrix; otherwise, false. - - - - - Gets or sets the component at the specified index. - - The value of the matrix component, depending on the index. - The zero-based index of the component to access. - The value of the component at the specified index. - Thrown when the is out of the range [0, 15]. - - - - Gets or sets the component at the specified index. - - The value of the matrix component, depending on the index. - The row of the matrix to access. - The column of the matrix to access. - The value of the component at the specified index. - Thrown when the or is out of the range [0, 3]. - - - - Calculates the determinant of the matrix. - - The determinant of the matrix. - - - - Inverts the matrix. - - - - - Transposes the matrix. - - - - - Orthogonalizes the specified matrix. - - - Orthogonalization is the process of making all rows orthogonal to each other. This - means that any given row in the matrix will be orthogonal to any other given row in the - matrix. - Because this method uses the modified Gram-Schmidt process, the resulting matrix - tends to be numerically unstable. The numeric stability decreases according to the rows - so that the first row is the most stable and the last row is the least stable. - This operation is performed on the rows of the matrix rather than the columns. - If you wish for this operation to be performed on the columns, first transpose the - input and than transpose the output. - - - - - Orthonormalizes the specified matrix. - - - Orthonormalization is the process of making all rows and columns orthogonal to each - other and making all rows and columns of unit length. This means that any given row will - be orthogonal to any other given row and any given column will be orthogonal to any other - given column. Any given row will not be orthogonal to any given column. Every row and every - column will be of unit length. - Because this method uses the modified Gram-Schmidt process, the resulting matrix - tends to be numerically unstable. The numeric stability decreases according to the rows - so that the first row is the most stable and the last row is the least stable. - This operation is performed on the rows of the matrix rather than the columns. - If you wish for this operation to be performed on the columns, first transpose the - input and than transpose the output. - - - - - Decomposes a matrix into an orthonormalized matrix Q and a right triangular matrix R. - - When the method completes, contains the orthonormalized matrix of the decomposition. - When the method completes, contains the right triangular matrix of the decomposition. - - - - Decomposes a matrix into a lower triangular matrix L and an orthonormalized matrix Q. - - When the method completes, contains the lower triangular matrix of the decomposition. - When the method completes, contains the orthonormalized matrix of the decomposition. - - - - Decomposes a matrix into a scale, rotation, and translation. - - When the method completes, contains the scaling component of the decomposed matrix. - When the method completes, contains the rotation component of the decomposed matrix. - When the method completes, contains the translation component of the decomposed matrix. - - This method is designed to decompose an SRT transformation matrix only. - - - - - Decomposes a uniform scale matrix into a scale, rotation, and translation. - A uniform scale matrix has the same scale in every axis. - - When the method completes, contains the scaling component of the decomposed matrix. - When the method completes, contains the rotation component of the decomposed matrix. - When the method completes, contains the translation component of the decomposed matrix. - - This method is designed to decompose only an SRT transformation matrix that has the same scale in every axis. - - - - - Exchanges two rows in the matrix. - - The first row to exchange. This is an index of the row starting at zero. - The second row to exchange. This is an index of the row starting at zero. - - - - Exchanges two columns in the matrix. - - The first column to exchange. This is an index of the column starting at zero. - The second column to exchange. This is an index of the column starting at zero. - - - - Creates an array containing the elements of the matrix. - - A sixteen-element array containing the components of the matrix. - - - - Determines the sum of two matrices. - - The first matrix to add. - The second matrix to add. - When the method completes, contains the sum of the two matrices. - - - - Determines the sum of two matrices. - - The first matrix to add. - The second matrix to add. - The sum of the two matrices. - - - - Determines the difference between two matrices. - - The first matrix to subtract. - The second matrix to subtract. - When the method completes, contains the difference between the two matrices. - - - - Determines the difference between two matrices. - - The first matrix to subtract. - The second matrix to subtract. - The difference between the two matrices. - - - - Scales a matrix by the given value. - - The matrix to scale. - The amount by which to scale. - When the method completes, contains the scaled matrix. - - - - Scales a matrix by the given value. - - The matrix to scale. - The amount by which to scale. - The scaled matrix. - - - - Determines the product of two matrices. - - The first matrix to multiply. - The second matrix to multiply. - The product of the two matrices. - - - - Determines the product of two matrices. - - The first matrix to multiply. - The second matrix to multiply. - The product of the two matrices. - - - - Scales a matrix by the given value. - - The matrix to scale. - The amount by which to scale. - When the method completes, contains the scaled matrix. - - - - Scales a matrix by the given value. - - The matrix to scale. - The amount by which to scale. - The scaled matrix. - - - - Determines the quotient of two matrices. - - The first matrix to divide. - The second matrix to divide. - When the method completes, contains the quotient of the two matrices. - - - - Determines the quotient of two matrices. - - The first matrix to divide. - The second matrix to divide. - The quotient of the two matrices. - - - - Performs the exponential operation on a matrix. - - The matrix to perform the operation on. - The exponent to raise the matrix to. - When the method completes, contains the exponential matrix. - Thrown when the is negative. - - - - Performs the exponential operation on a matrix. - - The matrix to perform the operation on. - The exponent to raise the matrix to. - The exponential matrix. - Thrown when the is negative. - - - - Negates a matrix. - - The matrix to be negated. - When the method completes, contains the negated matrix. - - - - Negates a matrix. - - The matrix to be negated. - The negated matrix. - - - - Performs a linear interpolation between two matrices. - - Start matrix. - End matrix. - Value between 0 and 1 indicating the weight of . - When the method completes, contains the linear interpolation of the two matrices. - - Passing a value of 0 will cause to be returned; a value of 1 will cause to be returned. - - - - - Performs a linear interpolation between two matrices. - - Start matrix. - End matrix. - Value between 0 and 1 indicating the weight of . - The linear interpolation of the two matrices. - - Passing a value of 0 will cause to be returned; a value of 1 will cause to be returned. - - - - - Performs a cubic interpolation between two matrices. - - Start matrix. - End matrix. - Value between 0 and 1 indicating the weight of . - When the method completes, contains the cubic interpolation of the two matrices. - - - - Performs a cubic interpolation between two matrices. - - Start matrix. - End matrix. - Value between 0 and 1 indicating the weight of . - The cubic interpolation of the two matrices. - - - - Calculates the transpose of the specified matrix. - - The matrix whose transpose is to be calculated. - When the method completes, contains the transpose of the specified matrix. - - - - Calculates the transpose of the specified matrix. - - The matrix whose transpose is to be calculated. - When the method completes, contains the transpose of the specified matrix. - - - - Calculates the transpose of the specified matrix. - - The matrix whose transpose is to be calculated. - The transpose of the specified matrix. - - - - Calculates the inverse of the specified matrix. - - The matrix whose inverse is to be calculated. - When the method completes, contains the inverse of the specified matrix. - - - - Calculates the inverse of the specified matrix. - - The matrix whose inverse is to be calculated. - The inverse of the specified matrix. - - - - Orthogonalizes the specified matrix. - - The matrix to orthogonalize. - When the method completes, contains the orthogonalized matrix. - - Orthogonalization is the process of making all rows orthogonal to each other. This - means that any given row in the matrix will be orthogonal to any other given row in the - matrix. - Because this method uses the modified Gram-Schmidt process, the resulting matrix - tends to be numerically unstable. The numeric stability decreases according to the rows - so that the first row is the most stable and the last row is the least stable. - This operation is performed on the rows of the matrix rather than the columns. - If you wish for this operation to be performed on the columns, first transpose the - input and than transpose the output. - - - - - Orthogonalizes the specified matrix. - - The matrix to orthogonalize. - The orthogonalized matrix. - - Orthogonalization is the process of making all rows orthogonal to each other. This - means that any given row in the matrix will be orthogonal to any other given row in the - matrix. - Because this method uses the modified Gram-Schmidt process, the resulting matrix - tends to be numerically unstable. The numeric stability decreases according to the rows - so that the first row is the most stable and the last row is the least stable. - This operation is performed on the rows of the matrix rather than the columns. - If you wish for this operation to be performed on the columns, first transpose the - input and than transpose the output. - - - - - Orthonormalizes the specified matrix. - - The matrix to orthonormalize. - When the method completes, contains the orthonormalized matrix. - - Orthonormalization is the process of making all rows and columns orthogonal to each - other and making all rows and columns of unit length. This means that any given row will - be orthogonal to any other given row and any given column will be orthogonal to any other - given column. Any given row will not be orthogonal to any given column. Every row and every - column will be of unit length. - Because this method uses the modified Gram-Schmidt process, the resulting matrix - tends to be numerically unstable. The numeric stability decreases according to the rows - so that the first row is the most stable and the last row is the least stable. - This operation is performed on the rows of the matrix rather than the columns. - If you wish for this operation to be performed on the columns, first transpose the - input and than transpose the output. - - - - - Orthonormalizes the specified matrix. - - The matrix to orthonormalize. - The orthonormalized matrix. - - Orthonormalization is the process of making all rows and columns orthogonal to each - other and making all rows and columns of unit length. This means that any given row will - be orthogonal to any other given row and any given column will be orthogonal to any other - given column. Any given row will not be orthogonal to any given column. Every row and every - column will be of unit length. - Because this method uses the modified Gram-Schmidt process, the resulting matrix - tends to be numerically unstable. The numeric stability decreases according to the rows - so that the first row is the most stable and the last row is the least stable. - This operation is performed on the rows of the matrix rather than the columns. - If you wish for this operation to be performed on the columns, first transpose the - input and than transpose the output. - - - - - Brings the matrix into upper triangular form using elementary row operations. - - The matrix to put into upper triangular form. - When the method completes, contains the upper triangular matrix. - - If the matrix is not invertible (i.e. its determinant is zero) than the result of this - method may produce Single.Nan and Single.Inf values. When the matrix represents a system - of linear equations, than this often means that either no solution exists or an infinite - number of solutions exist. - - - - - Brings the matrix into upper triangular form using elementary row operations. - - The matrix to put into upper triangular form. - The upper triangular matrix. - - If the matrix is not invertible (i.e. its determinant is zero) than the result of this - method may produce Single.Nan and Single.Inf values. When the matrix represents a system - of linear equations, than this often means that either no solution exists or an infinite - number of solutions exist. - - - - - Brings the matrix into lower triangular form using elementary row operations. - - The matrix to put into lower triangular form. - When the method completes, contains the lower triangular matrix. - - If the matrix is not invertible (i.e. its determinant is zero) than the result of this - method may produce Single.Nan and Single.Inf values. When the matrix represents a system - of linear equations, than this often means that either no solution exists or an infinite - number of solutions exist. - - - - - Brings the matrix into lower triangular form using elementary row operations. - - The matrix to put into lower triangular form. - The lower triangular matrix. - - If the matrix is not invertible (i.e. its determinant is zero) than the result of this - method may produce Single.Nan and Single.Inf values. When the matrix represents a system - of linear equations, than this often means that either no solution exists or an infinite - number of solutions exist. - - - - - Brings the matrix into row echelon form using elementary row operations; - - The matrix to put into row echelon form. - When the method completes, contains the row echelon form of the matrix. - - - - Brings the matrix into row echelon form using elementary row operations; - - The matrix to put into row echelon form. - When the method completes, contains the row echelon form of the matrix. - - - - Brings the matrix into reduced row echelon form using elementary row operations. - - The matrix to put into reduced row echelon form. - The fifth column of the matrix. - When the method completes, contains the resultant matrix after the operation. - When the method completes, contains the resultant fifth column of the matrix. - - The fifth column is often called the augmented part of the matrix. This is because the fifth - column is really just an extension of the matrix so that there is a place to put all of the - non-zero components after the operation is complete. - Often times the resultant matrix will the identity matrix or a matrix similar to the identity - matrix. Sometimes, however, that is not possible and numbers other than zero and one may appear. - This method can be used to solve systems of linear equations. Upon completion of this method, - the will contain the solution for the system. It is up to the user - to analyze both the input and the result to determine if a solution really exists. - - - - - Creates a left-handed spherical billboard that rotates around a specified object position. - - The position of the object around which the billboard will rotate. - The position of the camera. - The up vector of the camera. - The forward vector of the camera. - When the method completes, contains the created billboard matrix. - - - - Creates a left-handed spherical billboard that rotates around a specified object position. - - The position of the object around which the billboard will rotate. - The position of the camera. - The up vector of the camera. - The forward vector of the camera. - The created billboard matrix. - - - - Creates a right-handed spherical billboard that rotates around a specified object position. - - The position of the object around which the billboard will rotate. - The position of the camera. - The up vector of the camera. - The forward vector of the camera. - When the method completes, contains the created billboard matrix. - - - - Creates a right-handed spherical billboard that rotates around a specified object position. - - The position of the object around which the billboard will rotate. - The position of the camera. - The up vector of the camera. - The forward vector of the camera. - The created billboard matrix. - - - - Creates a left-handed, look-at matrix. - - The position of the viewer's eye. - The camera look-at target. - The camera's up vector. - When the method completes, contains the created look-at matrix. - - - - Creates a left-handed, look-at matrix. - - The position of the viewer's eye. - The camera look-at target. - The camera's up vector. - The created look-at matrix. - - - - Creates a right-handed, look-at matrix. - - The position of the viewer's eye. - The camera look-at target. - The camera's up vector. - When the method completes, contains the created look-at matrix. - - - - Creates a right-handed, look-at matrix. - - The position of the viewer's eye. - The camera look-at target. - The camera's up vector. - The created look-at matrix. - - - - Creates a left-handed, orthographic projection matrix. - - Width of the viewing volume. - Height of the viewing volume. - Minimum z-value of the viewing volume. - Maximum z-value of the viewing volume. - When the method completes, contains the created projection matrix. - - - - Creates a left-handed, orthographic projection matrix. - - Width of the viewing volume. - Height of the viewing volume. - Minimum z-value of the viewing volume. - Maximum z-value of the viewing volume. - The created projection matrix. - - - - Creates a right-handed, orthographic projection matrix. - - Width of the viewing volume. - Height of the viewing volume. - Minimum z-value of the viewing volume. - Maximum z-value of the viewing volume. - When the method completes, contains the created projection matrix. - - - - Creates a right-handed, orthographic projection matrix. - - Width of the viewing volume. - Height of the viewing volume. - Minimum z-value of the viewing volume. - Maximum z-value of the viewing volume. - The created projection matrix. - - - - Creates a left-handed, customized orthographic projection matrix. - - Minimum x-value of the viewing volume. - Maximum x-value of the viewing volume. - Minimum y-value of the viewing volume. - Maximum y-value of the viewing volume. - Minimum z-value of the viewing volume. - Maximum z-value of the viewing volume. - When the method completes, contains the created projection matrix. - - - - Creates a left-handed, customized orthographic projection matrix. - - Minimum x-value of the viewing volume. - Maximum x-value of the viewing volume. - Minimum y-value of the viewing volume. - Maximum y-value of the viewing volume. - Minimum z-value of the viewing volume. - Maximum z-value of the viewing volume. - The created projection matrix. - - - - Creates a right-handed, customized orthographic projection matrix. - - Minimum x-value of the viewing volume. - Maximum x-value of the viewing volume. - Minimum y-value of the viewing volume. - Maximum y-value of the viewing volume. - Minimum z-value of the viewing volume. - Maximum z-value of the viewing volume. - When the method completes, contains the created projection matrix. - - - - Creates a right-handed, customized orthographic projection matrix. - - Minimum x-value of the viewing volume. - Maximum x-value of the viewing volume. - Minimum y-value of the viewing volume. - Maximum y-value of the viewing volume. - Minimum z-value of the viewing volume. - Maximum z-value of the viewing volume. - The created projection matrix. - - - - Creates a left-handed, perspective projection matrix. - - Width of the viewing volume. - Height of the viewing volume. - Minimum z-value of the viewing volume. - Maximum z-value of the viewing volume. - When the method completes, contains the created projection matrix. - - - - Creates a left-handed, perspective projection matrix. - - Width of the viewing volume. - Height of the viewing volume. - Minimum z-value of the viewing volume. - Maximum z-value of the viewing volume. - The created projection matrix. - - - - Creates a right-handed, perspective projection matrix. - - Width of the viewing volume. - Height of the viewing volume. - Minimum z-value of the viewing volume. - Maximum z-value of the viewing volume. - When the method completes, contains the created projection matrix. - - - - Creates a right-handed, perspective projection matrix. - - Width of the viewing volume. - Height of the viewing volume. - Minimum z-value of the viewing volume. - Maximum z-value of the viewing volume. - The created projection matrix. - - - - Creates a left-handed, perspective projection matrix based on a field of view. - - Field of view in the y direction, in radians. - Aspect ratio, defined as view space width divided by height. - Minimum z-value of the viewing volume. - Maximum z-value of the viewing volume. - When the method completes, contains the created projection matrix. - - - - Creates a left-handed, perspective projection matrix based on a field of view. - - Field of view in the y direction, in radians. - Aspect ratio, defined as view space width divided by height. - Minimum z-value of the viewing volume. - Maximum z-value of the viewing volume. - The created projection matrix. - - - - Creates a right-handed, perspective projection matrix based on a field of view. - - Field of view in the y direction, in radians. - Aspect ratio, defined as view space width divided by height. - Minimum z-value of the viewing volume. - Maximum z-value of the viewing volume. - When the method completes, contains the created projection matrix. - - - - Creates a right-handed, perspective projection matrix based on a field of view. - - Field of view in the y direction, in radians. - Aspect ratio, defined as view space width divided by height. - Minimum z-value of the viewing volume. - Maximum z-value of the viewing volume. - The created projection matrix. - - - - Creates a left-handed, customized perspective projection matrix. - - Minimum x-value of the viewing volume. - Maximum x-value of the viewing volume. - Minimum y-value of the viewing volume. - Maximum y-value of the viewing volume. - Minimum z-value of the viewing volume. - Maximum z-value of the viewing volume. - When the method completes, contains the created projection matrix. - - - - Creates a left-handed, customized perspective projection matrix. - - Minimum x-value of the viewing volume. - Maximum x-value of the viewing volume. - Minimum y-value of the viewing volume. - Maximum y-value of the viewing volume. - Minimum z-value of the viewing volume. - Maximum z-value of the viewing volume. - The created projection matrix. - - - - Creates a right-handed, customized perspective projection matrix. - - Minimum x-value of the viewing volume. - Maximum x-value of the viewing volume. - Minimum y-value of the viewing volume. - Maximum y-value of the viewing volume. - Minimum z-value of the viewing volume. - Maximum z-value of the viewing volume. - When the method completes, contains the created projection matrix. - - - - Creates a right-handed, customized perspective projection matrix. - - Minimum x-value of the viewing volume. - Maximum x-value of the viewing volume. - Minimum y-value of the viewing volume. - Maximum y-value of the viewing volume. - Minimum z-value of the viewing volume. - Maximum z-value of the viewing volume. - The created projection matrix. - - - - Creates a matrix that scales along the x-axis, y-axis, and y-axis. - - Scaling factor for all three axes. - When the method completes, contains the created scaling matrix. - - - - Creates a matrix that scales along the x-axis, y-axis, and y-axis. - - Scaling factor for all three axes. - The created scaling matrix. - - - - Creates a matrix that scales along the x-axis, y-axis, and y-axis. - - Scaling factor that is applied along the x-axis. - Scaling factor that is applied along the y-axis. - Scaling factor that is applied along the z-axis. - When the method completes, contains the created scaling matrix. - - - - Creates a matrix that scales along the x-axis, y-axis, and y-axis. - - Scaling factor that is applied along the x-axis. - Scaling factor that is applied along the y-axis. - Scaling factor that is applied along the z-axis. - The created scaling matrix. - - - - Creates a matrix that uniformly scales along all three axis. - - The uniform scale that is applied along all axis. - When the method completes, contains the created scaling matrix. - - - - Creates a matrix that uniformly scales along all three axis. - - The uniform scale that is applied along all axis. - The created scaling matrix. - - - - Creates a matrix that rotates around the x-axis. - - Angle of rotation in radians. Angles are measured clockwise when looking along the rotation axis toward the origin. - When the method completes, contains the created rotation matrix. - - - - Creates a matrix that rotates around the x-axis. - - Angle of rotation in radians. Angles are measured clockwise when looking along the rotation axis toward the origin. - The created rotation matrix. - - - - Creates a matrix that rotates around the y-axis. - - Angle of rotation in radians. Angles are measured clockwise when looking along the rotation axis toward the origin. - When the method completes, contains the created rotation matrix. - - - - Creates a matrix that rotates around the y-axis. - - Angle of rotation in radians. Angles are measured clockwise when looking along the rotation axis toward the origin. - The created rotation matrix. - - - - Creates a matrix that rotates around the z-axis. - - Angle of rotation in radians. Angles are measured clockwise when looking along the rotation axis toward the origin. - When the method completes, contains the created rotation matrix. - - - - Creates a matrix that rotates around the z-axis. - - Angle of rotation in radians. Angles are measured clockwise when looking along the rotation axis toward the origin. - The created rotation matrix. - - - - Creates a matrix that rotates around an arbitrary axis. - - The axis around which to rotate. This parameter is assumed to be normalized. - Angle of rotation in radians. Angles are measured clockwise when looking along the rotation axis toward the origin. - When the method completes, contains the created rotation matrix. - - - - Creates a matrix that rotates around an arbitrary axis. - - The axis around which to rotate. This parameter is assumed to be normalized. - Angle of rotation in radians. Angles are measured clockwise when looking along the rotation axis toward the origin. - The created rotation matrix. - - - - Creates a rotation matrix from a quaternion. - - The quaternion to use to build the matrix. - The created rotation matrix. - - - - Creates a rotation matrix from a quaternion. - - The quaternion to use to build the matrix. - The created rotation matrix. - - - - Creates a rotation matrix with a specified yaw, pitch, and roll. - - Yaw around the y-axis, in radians. - Pitch around the x-axis, in radians. - Roll around the z-axis, in radians. - When the method completes, contains the created rotation matrix. - - - - Creates a rotation matrix with a specified yaw, pitch, and roll. - - Yaw around the y-axis, in radians. - Pitch around the x-axis, in radians. - Roll around the z-axis, in radians. - The created rotation matrix. - - - - Creates a translation matrix using the specified offsets. - - The offset for all three coordinate planes. - When the method completes, contains the created translation matrix. - - - - Creates a translation matrix using the specified offsets. - - The offset for all three coordinate planes. - The created translation matrix. - - - - Creates a translation matrix using the specified offsets. - - X-coordinate offset. - Y-coordinate offset. - Z-coordinate offset. - When the method completes, contains the created translation matrix. - - - - Creates a translation matrix using the specified offsets. - - X-coordinate offset. - Y-coordinate offset. - Z-coordinate offset. - The created translation matrix. - - - - Creates a skew/shear matrix by means of a translation vector, a rotation vector, and a rotation angle. - shearing is performed in the direction of translation vector, where translation vector and rotation vector define the shearing plane. - The effect is such that the skewed rotation vector has the specified angle with rotation itself. - - The rotation angle. - The rotation vector - The translation vector - Contains the created skew/shear matrix. - - - - Creates a 3D affine transformation matrix. - - Scaling factor. - The rotation of the transformation. - The translation factor of the transformation. - When the method completes, contains the created affine transformation matrix. - - - - Creates a 3D affine transformation matrix. - - Scaling factor. - The rotation of the transformation. - The translation factor of the transformation. - The created affine transformation matrix. - - - - Creates a 3D affine transformation matrix. - - Scaling factor. - The center of the rotation. - The rotation of the transformation. - The translation factor of the transformation. - When the method completes, contains the created affine transformation matrix. - - - - Creates a 3D affine transformation matrix. - - Scaling factor. - The center of the rotation. - The rotation of the transformation. - The translation factor of the transformation. - The created affine transformation matrix. - - - - Creates a 2D affine transformation matrix. - - Scaling factor. - The rotation of the transformation. - The translation factor of the transformation. - When the method completes, contains the created affine transformation matrix. - - - - Creates a 2D affine transformation matrix. - - Scaling factor. - The rotation of the transformation. - The translation factor of the transformation. - The created affine transformation matrix. - - - - Creates a 2D affine transformation matrix. - - Scaling factor. - The center of the rotation. - The rotation of the transformation. - The translation factor of the transformation. - When the method completes, contains the created affine transformation matrix. - - - - Creates a 2D affine transformation matrix. - - Scaling factor. - The center of the rotation. - The rotation of the transformation. - The translation factor of the transformation. - The created affine transformation matrix. - - - - Creates a transformation matrix. - - Center point of the scaling operation. - Scaling rotation amount. - Scaling factor. - The center of the rotation. - The rotation of the transformation. - The translation factor of the transformation. - When the method completes, contains the created transformation matrix. - - - - Creates a transformation matrix. - - Center point of the scaling operation. - Scaling rotation amount. - Scaling factor. - The center of the rotation. - The rotation of the transformation. - The translation factor of the transformation. - The created transformation matrix. - - - - Creates a 2D transformation matrix. - - Center point of the scaling operation. - Scaling rotation amount. - Scaling factor. - The center of the rotation. - The rotation of the transformation. - The translation factor of the transformation. - When the method completes, contains the created transformation matrix. - - - - Creates a 2D transformation matrix. - - Center point of the scaling operation. - Scaling rotation amount. - Scaling factor. - The center of the rotation. - The rotation of the transformation. - The translation factor of the transformation. - The created transformation matrix. - - - - Adds two matrices. - - The first matrix to add. - The second matrix to add. - The sum of the two matrices. - - - - Assert a matrix (return it unchanged). - - The matrix to assert (unchanged). - The asserted (unchanged) matrix. - - - - Subtracts two matrices. - - The first matrix to subtract. - The second matrix to subtract. - The difference between the two matrices. - - - - Negates a matrix. - - The matrix to negate. - The negated matrix. - - - - Scales a matrix by a given value. - - The matrix to scale. - The amount by which to scale. - The scaled matrix. - - - - Scales a matrix by a given value. - - The matrix to scale. - The amount by which to scale. - The scaled matrix. - - - - Multiplies two matrices. - - The first matrix to multiply. - The second matrix to multiply. - The product of the two matrices. - - - - Scales a matrix by a given value. - - The matrix to scale. - The amount by which to scale. - The scaled matrix. - - - - Divides two matrices. - - The first matrix to divide. - The second matrix to divide. - The quotient of the two matrices. - - - - Tests for equality between two objects. - - The first value to compare. - The second value to compare. - true if has the same value as ; otherwise, false. - - - - Tests for inequality between two objects. - - The first value to compare. - The second value to compare. - true if has a different value than ; otherwise, false. - - - - Returns a that represents this instance. - - - A that represents this instance. - - - - - Returns a that represents this instance. - - The format. - - A that represents this instance. - - - - - Returns a that represents this instance. - - The format provider. - - A that represents this instance. - - - - - Returns a that represents this instance. - - The format. - The format provider. - - A that represents this instance. - - - - - Returns a hash code for this instance. - - - A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. - - - - - Determines whether the specified is equal to this instance. - - The to compare with this instance. - - true if the specified is equal to this instance; otherwise, false. - - - - - Determines whether the specified is equal to this instance. - - The to compare with this instance. - - true if the specified is equal to this instance; otherwise, false. - - - - - Determines whether the specified is equal to this instance. - - The to compare with this instance. - - true if the specified is equal to this instance; otherwise, false. - - - - - Represents a 3x3 Matrix ( contains only Scale and Rotation ). - - - - - A with all of its components set to zero. - - - - - The identity . - - - - - Value at row 1 column 1 of the Matrix3x3. - - - - - Value at row 1 column 2 of the Matrix3x3. - - - - - Value at row 1 column 3 of the Matrix3x3. - - - - - Value at row 2 column 1 of the Matrix3x3. - - - - - Value at row 2 column 2 of the Matrix3x3. - - - - - Value at row 2 column 3 of the Matrix3x3. - - - - - Value at row 3 column 1 of the Matrix3x3. - - - - - Value at row 3 column 2 of the Matrix3x3. - - - - - Value at row 3 column 3 of the Matrix3x3. - - - - - Initializes a new instance of the struct. - - The value that will be assigned to all components. - - - - Initializes a new instance of the struct. - - The value to assign at row 1 column 1 of the Matrix3x3. - The value to assign at row 1 column 2 of the Matrix3x3. - The value to assign at row 1 column 3 of the Matrix3x3. - The value to assign at row 2 column 1 of the Matrix3x3. - The value to assign at row 2 column 2 of the Matrix3x3. - The value to assign at row 2 column 3 of the Matrix3x3. - The value to assign at row 3 column 1 of the Matrix3x3. - The value to assign at row 3 column 2 of the Matrix3x3. - The value to assign at row 3 column 3 of the Matrix3x3. - - - - Initializes a new instance of the struct. - - The values to assign to the components of the Matrix3x3. This must be an array with sixteen elements. - Thrown when is null. - Thrown when contains more or less than sixteen elements. - - - - Gets or sets the first row in the Matrix3x3; that is M11, M12, M13 - - - - - Gets or sets the second row in the Matrix3x3; that is M21, M22, M23 - - - - - Gets or sets the third row in the Matrix3x3; that is M31, M32, M33 - - - - - Gets or sets the first column in the Matrix3x3; that is M11, M21, M31 - - - - - Gets or sets the second column in the Matrix3x3; that is M12, M22, M32 - - - - - Gets or sets the third column in the Matrix3x3; that is M13, M23, M33 - - - - - Gets or sets the scale of the Matrix3x3; that is M11, M22, and M33. - - - - - Gets a value indicating whether this instance is an identity Matrix3x3. - - - true if this instance is an identity Matrix3x3; otherwise, false. - - - - - Gets or sets the component at the specified index. - - The value of the Matrix3x3 component, depending on the index. - The zero-based index of the component to access. - The value of the component at the specified index. - Thrown when the is out of the range [0, 15]. - - - - Gets or sets the component at the specified index. - - The value of the Matrix3x3 component, depending on the index. - The row of the Matrix3x3 to access. - The column of the Matrix3x3 to access. - The value of the component at the specified index. - Thrown when the or is out of the range [0, 3]. - - - - Calculates the determinant of the Matrix3x3. - - The determinant of the Matrix3x3. - - - - Inverts the Matrix3x3. - - - - - Transposes the Matrix3x3. - - - - - Orthogonalizes the specified Matrix3x3. - - - Orthogonalization is the process of making all rows orthogonal to each other. This - means that any given row in the Matrix3x3 will be orthogonal to any other given row in the - Matrix3x3. - Because this method uses the modified Gram-Schmidt process, the resulting Matrix3x3 - tends to be numerically unstable. The numeric stability decreases according to the rows - so that the first row is the most stable and the last row is the least stable. - This operation is performed on the rows of the Matrix3x3 rather than the columns. - If you wish for this operation to be performed on the columns, first transpose the - input and than transpose the output. - - - - - Orthonormalizes the specified Matrix3x3. - - - Orthonormalization is the process of making all rows and columns orthogonal to each - other and making all rows and columns of unit length. This means that any given row will - be orthogonal to any other given row and any given column will be orthogonal to any other - given column. Any given row will not be orthogonal to any given column. Every row and every - column will be of unit length. - Because this method uses the modified Gram-Schmidt process, the resulting Matrix3x3 - tends to be numerically unstable. The numeric stability decreases according to the rows - so that the first row is the most stable and the last row is the least stable. - This operation is performed on the rows of the Matrix3x3 rather than the columns. - If you wish for this operation to be performed on the columns, first transpose the - input and than transpose the output. - - - - - Decomposes a Matrix3x3 into an orthonormalized Matrix3x3 Q and a right triangular Matrix3x3 R. - - When the method completes, contains the orthonormalized Matrix3x3 of the decomposition. - When the method completes, contains the right triangular Matrix3x3 of the decomposition. - - - - Decomposes a Matrix3x3 into a lower triangular Matrix3x3 L and an orthonormalized Matrix3x3 Q. - - When the method completes, contains the lower triangular Matrix3x3 of the decomposition. - When the method completes, contains the orthonormalized Matrix3x3 of the decomposition. - - - - Decomposes a Matrix3x3 into a scale, rotation, and translation. - - When the method completes, contains the scaling component of the decomposed Matrix3x3. - When the method completes, contains the rotation component of the decomposed Matrix3x3. - - This method is designed to decompose an SRT transformation Matrix3x3 only. - - - - - Decomposes a uniform scale matrix into a scale, rotation, and translation. - A uniform scale matrix has the same scale in every axis. - - When the method completes, contains the scaling component of the decomposed matrix. - When the method completes, contains the rotation component of the decomposed matrix. - - This method is designed to decompose only an SRT transformation matrix that has the same scale in every axis. - - - - - Exchanges two rows in the Matrix3x3. - - The first row to exchange. This is an index of the row starting at zero. - The second row to exchange. This is an index of the row starting at zero. - - - - Exchanges two columns in the Matrix3x3. - - The first column to exchange. This is an index of the column starting at zero. - The second column to exchange. This is an index of the column starting at zero. - - - - Creates an array containing the elements of the Matrix3x3. - - A 9-element array containing the components of the Matrix3x3. - - - - Determines the sum of two matrices. - - The first Matrix3x3 to add. - The second Matrix3x3 to add. - When the method completes, contains the sum of the two matrices. - - - - Determines the sum of two matrices. - - The first Matrix3x3 to add. - The second Matrix3x3 to add. - The sum of the two matrices. - - - - Determines the difference between two matrices. - - The first Matrix3x3 to subtract. - The second Matrix3x3 to subtract. - When the method completes, contains the difference between the two matrices. - - - - Determines the difference between two matrices. - - The first Matrix3x3 to subtract. - The second Matrix3x3 to subtract. - The difference between the two matrices. - - - - Scales a Matrix3x3 by the given value. - - The Matrix3x3 to scale. - The amount by which to scale. - When the method completes, contains the scaled Matrix3x3. - - - - Scales a Matrix3x3 by the given value. - - The Matrix3x3 to scale. - The amount by which to scale. - The scaled Matrix3x3. - - - - Determines the product of two matrices. - - The first Matrix3x3 to multiply. - The second Matrix3x3 to multiply. - The product of the two matrices. - - - - Determines the product of two matrices. - - The first Matrix3x3 to multiply. - The second Matrix3x3 to multiply. - The product of the two matrices. - - - - Scales a Matrix3x3 by the given value. - - The Matrix3x3 to scale. - The amount by which to scale. - When the method completes, contains the scaled Matrix3x3. - - - - Scales a Matrix3x3 by the given value. - - The Matrix3x3 to scale. - The amount by which to scale. - The scaled Matrix3x3. - - - - Determines the quotient of two matrices. - - The first Matrix3x3 to divide. - The second Matrix3x3 to divide. - When the method completes, contains the quotient of the two matrices. - - - - Determines the quotient of two matrices. - - The first Matrix3x3 to divide. - The second Matrix3x3 to divide. - The quotient of the two matrices. - - - - Performs the exponential operation on a Matrix3x3. - - The Matrix3x3 to perform the operation on. - The exponent to raise the Matrix3x3 to. - When the method completes, contains the exponential Matrix3x3. - Thrown when the is negative. - - - - Performs the exponential operation on a Matrix3x3. - - The Matrix3x3 to perform the operation on. - The exponent to raise the Matrix3x3 to. - The exponential Matrix3x3. - Thrown when the is negative. - - - - Negates a Matrix3x3. - - The Matrix3x3 to be negated. - When the method completes, contains the negated Matrix3x3. - - - - Negates a Matrix3x3. - - The Matrix3x3 to be negated. - The negated Matrix3x3. - - - - Performs a linear interpolation between two matrices. - - Start Matrix3x3. - End Matrix3x3. - Value between 0 and 1 indicating the weight of . - When the method completes, contains the linear interpolation of the two matrices. - - Passing a value of 0 will cause to be returned; a value of 1 will cause to be returned. - - - - - Performs a linear interpolation between two matrices. - - Start Matrix3x3. - End Matrix3x3. - Value between 0 and 1 indicating the weight of . - The linear interpolation of the two matrices. - - Passing a value of 0 will cause to be returned; a value of 1 will cause to be returned. - - - - - Performs a cubic interpolation between two matrices. - - Start Matrix3x3. - End Matrix3x3. - Value between 0 and 1 indicating the weight of . - When the method completes, contains the cubic interpolation of the two matrices. - - - - Performs a cubic interpolation between two matrices. - - Start Matrix3x3. - End Matrix3x3. - Value between 0 and 1 indicating the weight of . - The cubic interpolation of the two matrices. - - - - Calculates the transpose of the specified Matrix3x3. - - The Matrix3x3 whose transpose is to be calculated. - When the method completes, contains the transpose of the specified Matrix3x3. - - - - Calculates the transpose of the specified Matrix3x3. - - The Matrix3x3 whose transpose is to be calculated. - When the method completes, contains the transpose of the specified Matrix3x3. - - - - Calculates the transpose of the specified Matrix3x3. - - The Matrix3x3 whose transpose is to be calculated. - The transpose of the specified Matrix3x3. - - - - Calculates the inverse of the specified Matrix3x3. - - The Matrix3x3 whose inverse is to be calculated. - When the method completes, contains the inverse of the specified Matrix3x3. - - - - Calculates the inverse of the specified Matrix3x3. - - The Matrix3x3 whose inverse is to be calculated. - The inverse of the specified Matrix3x3. - - - - Orthogonalizes the specified Matrix3x3. - - The Matrix3x3 to orthogonalize. - When the method completes, contains the orthogonalized Matrix3x3. - - Orthogonalization is the process of making all rows orthogonal to each other. This - means that any given row in the Matrix3x3 will be orthogonal to any other given row in the - Matrix3x3. - Because this method uses the modified Gram-Schmidt process, the resulting Matrix3x3 - tends to be numerically unstable. The numeric stability decreases according to the rows - so that the first row is the most stable and the last row is the least stable. - This operation is performed on the rows of the Matrix3x3 rather than the columns. - If you wish for this operation to be performed on the columns, first transpose the - input and than transpose the output. - - - - - Orthogonalizes the specified Matrix3x3. - - The Matrix3x3 to orthogonalize. - The orthogonalized Matrix3x3. - - Orthogonalization is the process of making all rows orthogonal to each other. This - means that any given row in the Matrix3x3 will be orthogonal to any other given row in the - Matrix3x3. - Because this method uses the modified Gram-Schmidt process, the resulting Matrix3x3 - tends to be numerically unstable. The numeric stability decreases according to the rows - so that the first row is the most stable and the last row is the least stable. - This operation is performed on the rows of the Matrix3x3 rather than the columns. - If you wish for this operation to be performed on the columns, first transpose the - input and than transpose the output. - - - - - Orthonormalizes the specified Matrix3x3. - - The Matrix3x3 to orthonormalize. - When the method completes, contains the orthonormalized Matrix3x3. - - Orthonormalization is the process of making all rows and columns orthogonal to each - other and making all rows and columns of unit length. This means that any given row will - be orthogonal to any other given row and any given column will be orthogonal to any other - given column. Any given row will not be orthogonal to any given column. Every row and every - column will be of unit length. - Because this method uses the modified Gram-Schmidt process, the resulting Matrix3x3 - tends to be numerically unstable. The numeric stability decreases according to the rows - so that the first row is the most stable and the last row is the least stable. - This operation is performed on the rows of the Matrix3x3 rather than the columns. - If you wish for this operation to be performed on the columns, first transpose the - input and than transpose the output. - - - - - Orthonormalizes the specified Matrix3x3. - - The Matrix3x3 to orthonormalize. - The orthonormalized Matrix3x3. - - Orthonormalization is the process of making all rows and columns orthogonal to each - other and making all rows and columns of unit length. This means that any given row will - be orthogonal to any other given row and any given column will be orthogonal to any other - given column. Any given row will not be orthogonal to any given column. Every row and every - column will be of unit length. - Because this method uses the modified Gram-Schmidt process, the resulting Matrix3x3 - tends to be numerically unstable. The numeric stability decreases according to the rows - so that the first row is the most stable and the last row is the least stable. - This operation is performed on the rows of the Matrix3x3 rather than the columns. - If you wish for this operation to be performed on the columns, first transpose the - input and than transpose the output. - - - - - Brings the Matrix3x3 into upper triangular form using elementary row operations. - - The Matrix3x3 to put into upper triangular form. - When the method completes, contains the upper triangular Matrix3x3. - - If the Matrix3x3 is not invertible (i.e. its determinant is zero) than the result of this - method may produce Single.Nan and Single.Inf values. When the Matrix3x3 represents a system - of linear equations, than this often means that either no solution exists or an infinite - number of solutions exist. - - - - - Brings the Matrix3x3 into upper triangular form using elementary row operations. - - The Matrix3x3 to put into upper triangular form. - The upper triangular Matrix3x3. - - If the Matrix3x3 is not invertible (i.e. its determinant is zero) than the result of this - method may produce Single.Nan and Single.Inf values. When the Matrix3x3 represents a system - of linear equations, than this often means that either no solution exists or an infinite - number of solutions exist. - - - - - Brings the Matrix3x3 into lower triangular form using elementary row operations. - - The Matrix3x3 to put into lower triangular form. - When the method completes, contains the lower triangular Matrix3x3. - - If the Matrix3x3 is not invertible (i.e. its determinant is zero) than the result of this - method may produce Single.Nan and Single.Inf values. When the Matrix3x3 represents a system - of linear equations, than this often means that either no solution exists or an infinite - number of solutions exist. - - - - - Brings the Matrix3x3 into lower triangular form using elementary row operations. - - The Matrix3x3 to put into lower triangular form. - The lower triangular Matrix3x3. - - If the Matrix3x3 is not invertible (i.e. its determinant is zero) than the result of this - method may produce Single.Nan and Single.Inf values. When the Matrix3x3 represents a system - of linear equations, than this often means that either no solution exists or an infinite - number of solutions exist. - - - - - Brings the Matrix3x3 into row echelon form using elementary row operations; - - The Matrix3x3 to put into row echelon form. - When the method completes, contains the row echelon form of the Matrix3x3. - - - - Brings the Matrix3x3 into row echelon form using elementary row operations; - - The Matrix3x3 to put into row echelon form. - When the method completes, contains the row echelon form of the Matrix3x3. - - - - Creates a left-handed spherical billboard that rotates around a specified object position. - - The position of the object around which the billboard will rotate. - The position of the camera. - The up vector of the camera. - The forward vector of the camera. - When the method completes, contains the created billboard Matrix3x3. - - - - Creates a left-handed spherical billboard that rotates around a specified object position. - - The position of the object around which the billboard will rotate. - The position of the camera. - The up vector of the camera. - The forward vector of the camera. - The created billboard Matrix3x3. - - - - Creates a right-handed spherical billboard that rotates around a specified object position. - - The position of the object around which the billboard will rotate. - The position of the camera. - The up vector of the camera. - The forward vector of the camera. - When the method completes, contains the created billboard Matrix3x3. - - - - Creates a right-handed spherical billboard that rotates around a specified object position. - - The position of the object around which the billboard will rotate. - The position of the camera. - The up vector of the camera. - The forward vector of the camera. - The created billboard Matrix3x3. - - - - Creates a left-handed, look-at Matrix3x3. - - The position of the viewer's eye. - The camera look-at target. - The camera's up vector. - When the method completes, contains the created look-at Matrix3x3. - - - - Creates a left-handed, look-at Matrix3x3. - - The position of the viewer's eye. - The camera look-at target. - The camera's up vector. - The created look-at Matrix3x3. - - - - Creates a right-handed, look-at Matrix3x3. - - The position of the viewer's eye. - The camera look-at target. - The camera's up vector. - When the method completes, contains the created look-at Matrix3x3. - - - - Creates a right-handed, look-at Matrix3x3. - - The position of the viewer's eye. - The camera look-at target. - The camera's up vector. - The created look-at Matrix3x3. - - - - Creates a Matrix3x3 that scales along the x-axis, y-axis, and y-axis. - - Scaling factor for all three axes. - When the method completes, contains the created scaling Matrix3x3. - - - - Creates a Matrix3x3 that scales along the x-axis, y-axis, and y-axis. - - Scaling factor for all three axes. - The created scaling Matrix3x3. - - - - Creates a Matrix3x3 that scales along the x-axis, y-axis, and y-axis. - - Scaling factor that is applied along the x-axis. - Scaling factor that is applied along the y-axis. - Scaling factor that is applied along the z-axis. - When the method completes, contains the created scaling Matrix3x3. - - - - Creates a Matrix3x3 that scales along the x-axis, y-axis, and y-axis. - - Scaling factor that is applied along the x-axis. - Scaling factor that is applied along the y-axis. - Scaling factor that is applied along the z-axis. - The created scaling Matrix3x3. - - - - Creates a Matrix3x3 that uniformly scales along all three axis. - - The uniform scale that is applied along all axis. - When the method completes, contains the created scaling Matrix3x3. - - - - Creates a Matrix3x3 that uniformly scales along all three axis. - - The uniform scale that is applied along all axis. - The created scaling Matrix3x3. - - - - Creates a Matrix3x3 that rotates around the x-axis. - - Angle of rotation in radians. Angles are measured clockwise when looking along the rotation axis toward the origin. - When the method completes, contains the created rotation Matrix3x3. - - - - Creates a Matrix3x3 that rotates around the x-axis. - - Angle of rotation in radians. Angles are measured clockwise when looking along the rotation axis toward the origin. - The created rotation Matrix3x3. - - - - Creates a Matrix3x3 that rotates around the y-axis. - - Angle of rotation in radians. Angles are measured clockwise when looking along the rotation axis toward the origin. - When the method completes, contains the created rotation Matrix3x3. - - - - Creates a Matrix3x3 that rotates around the y-axis. - - Angle of rotation in radians. Angles are measured clockwise when looking along the rotation axis toward the origin. - The created rotation Matrix3x3. - - - - Creates a Matrix3x3 that rotates around the z-axis. - - Angle of rotation in radians. Angles are measured clockwise when looking along the rotation axis toward the origin. - When the method completes, contains the created rotation Matrix3x3. - - - - Creates a Matrix3x3 that rotates around the z-axis. - - Angle of rotation in radians. Angles are measured clockwise when looking along the rotation axis toward the origin. - The created rotation Matrix3x3. - - - - Creates a Matrix3x3 that rotates around an arbitrary axis. - - The axis around which to rotate. This parameter is assumed to be normalized. - Angle of rotation in radians. Angles are measured clockwise when looking along the rotation axis toward the origin. - When the method completes, contains the created rotation Matrix3x3. - - - - Creates a Matrix3x3 that rotates around an arbitrary axis. - - The axis around which to rotate. This parameter is assumed to be normalized. - Angle of rotation in radians. Angles are measured clockwise when looking along the rotation axis toward the origin. - The created rotation Matrix3x3. - - - - Creates a rotation Matrix3x3 from a quaternion. - - The quaternion to use to build the Matrix3x3. - The created rotation Matrix3x3. - - - - Creates a rotation Matrix3x3 from a quaternion. - - The quaternion to use to build the Matrix3x3. - The created rotation Matrix3x3. - - - - Creates a rotation Matrix3x3 with a specified yaw, pitch, and roll. - - Yaw around the y-axis, in radians. - Pitch around the x-axis, in radians. - Roll around the z-axis, in radians. - When the method completes, contains the created rotation Matrix3x3. - - - - Creates a rotation Matrix3x3 with a specified yaw, pitch, and roll. - - Yaw around the y-axis, in radians. - Pitch around the x-axis, in radians. - Roll around the z-axis, in radians. - The created rotation Matrix3x3. - - - - Adds two matrices. - - The first Matrix3x3 to add. - The second Matrix3x3 to add. - The sum of the two matrices. - - - - Assert a Matrix3x3 (return it unchanged). - - The Matrix3x3 to assert (unchanged). - The asserted (unchanged) Matrix3x3. - - - - Subtracts two matrices. - - The first Matrix3x3 to subtract. - The second Matrix3x3 to subtract. - The difference between the two matrices. - - - - Negates a Matrix3x3. - - The Matrix3x3 to negate. - The negated Matrix3x3. - - - - Scales a Matrix3x3 by a given value. - - The Matrix3x3 to scale. - The amount by which to scale. - The scaled Matrix3x3. - - - - Scales a Matrix3x3 by a given value. - - The Matrix3x3 to scale. - The amount by which to scale. - The scaled Matrix3x3. - - - - Multiplies two matrices. - - The first Matrix3x3 to multiply. - The second Matrix3x3 to multiply. - The product of the two matrices. - - - - Scales a Matrix3x3 by a given value. - - The Matrix3x3 to scale. - The amount by which to scale. - The scaled Matrix3x3. - - - - Divides two matrices. - - The first Matrix3x3 to divide. - The second Matrix3x3 to divide. - The quotient of the two matrices. - - - - Tests for equality between two objects. - - The first value to compare. - The second value to compare. - true if has the same value as ; otherwise, false. - - - - Tests for inequality between two objects. - - The first value to compare. - The second value to compare. - true if has a different value than ; otherwise, false. - - - - Convert the 3x3 Matrix to a 4x4 Matrix. - - A 4x4 Matrix with zero translation and M44=1 - - - - Convert the 4x4 Matrix to a 3x3 Matrix. - - A 3x3 Matrix - - - - Returns a that represents this instance. - - - A that represents this instance. - - - - - Returns a that represents this instance. - - The format. - - A that represents this instance. - - - - - Returns a that represents this instance. - - The format provider. - - A that represents this instance. - - - - - Returns a that represents this instance. - - The format. - The format provider. - - A that represents this instance. - - - - - Returns a hash code for this instance. - - - A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. - - - - - Determines whether the specified is equal to this instance. - - The to compare with this instance. - - true if the specified is equal to this instance; otherwise, false. - - - - - Determines whether the specified is equal to this instance. - - The to compare with this instance. - - true if the specified is equal to this instance; otherwise, false. - - - - - Determines whether the specified are equal. - - - - - Determines whether the specified is equal to this instance. - - The to compare with this instance. - - true if the specified is equal to this instance; otherwise, false. - - - - - Represents a four dimensional mathematical quaternion. - - - - - A with all of its components set to zero. - - - - - A with all of its components set to one. - - - - - The identity (0, 0, 0, 1). - - - - - The X component of the quaternion. - - - - - The Y component of the quaternion. - - - - - The Z component of the quaternion. - - - - - The W component of the quaternion. - - - - - Initializes a new instance of the struct. - - The value that will be assigned to all components. - - - - Initializes a new instance of the struct. - - A vector containing the values with which to initialize the components. - - - - Initializes a new instance of the struct. - - A vector containing the values with which to initialize the X, Y, and Z components. - Initial value for the W component of the quaternion. - - - - Initializes a new instance of the struct. - - A vector containing the values with which to initialize the X and Y components. - Initial value for the Z component of the quaternion. - Initial value for the W component of the quaternion. - - - - Initializes a new instance of the struct. - - Initial value for the X component of the quaternion. - Initial value for the Y component of the quaternion. - Initial value for the Z component of the quaternion. - Initial value for the W component of the quaternion. - - - - Initializes a new instance of the struct. - - The values to assign to the X, Y, Z, and W components of the quaternion. This must be an array with four elements. - Thrown when is null. - Thrown when contains more or less than four elements. - - - - Gets a value indicating whether this instance is equivalent to the identity quaternion. - - - true if this instance is an identity quaternion; otherwise, false. - - - - - Gets a value indicting whether this instance is normalized. - - - - - Gets the angle of the quaternion. - - The quaternion's angle. - - - - Gets the axis components of the quaternion. - - The axis components of the quaternion. - - - - Gets or sets the component at the specified index. - - The value of the X, Y, Z, or W component, depending on the index. - The index of the component to access. Use 0 for the X component, 1 for the Y component, 2 for the Z component, and 3 for the W component. - The value of the component at the specified index. - Thrown when the is out of the range [0, 3]. - - - - Conjugates the quaternion. - - - - - Conjugates and renormalizes the quaternion. - - - - - Calculates the length of the quaternion. - - The length of the quaternion. - - may be preferred when only the relative length is needed - and speed is of the essence. - - - - - Calculates the squared length of the quaternion. - - The squared length of the quaternion. - - This method may be preferred to when only a relative length is needed - and speed is of the essence. - - - - - Converts the quaternion into a unit quaternion. - - - - - Creates an array containing the elements of the quaternion. - - A four-element array containing the components of the quaternion. - - - - Adds two quaternions. - - The first quaternion to add. - The second quaternion to add. - When the method completes, contains the sum of the two quaternions. - - - - Adds two quaternions. - - The first quaternion to add. - The second quaternion to add. - The sum of the two quaternions. - - - - Subtracts two quaternions. - - The first quaternion to subtract. - The second quaternion to subtract. - When the method completes, contains the difference of the two quaternions. - - - - Subtracts two quaternions. - - The first quaternion to subtract. - The second quaternion to subtract. - The difference of the two quaternions. - - - - Scales a quaternion by the given value. - - The quaternion to scale. - The amount by which to scale the quaternion. - When the method completes, contains the scaled quaternion. - - - - Scales a quaternion by the given value. - - The quaternion to scale. - The amount by which to scale the quaternion. - The scaled quaternion. - - - - Multiplies a quaternion by another. - - The first quaternion to multiply. - The second quaternion to multiply. - When the method completes, contains the multiplied quaternion. - - - - Multiplies a quaternion by another. - - The first quaternion to multiply. - The second quaternion to multiply. - The multiplied quaternion. - - - - Reverses the direction of a given quaternion. - - The quaternion to negate. - When the method completes, contains a quaternion facing in the opposite direction. - - - - Reverses the direction of a given quaternion. - - The quaternion to negate. - A quaternion facing in the opposite direction. - - - - Returns a containing the 4D Cartesian coordinates of a point specified in Barycentric coordinates relative to a 2D triangle. - - A containing the 4D Cartesian coordinates of vertex 1 of the triangle. - A containing the 4D Cartesian coordinates of vertex 2 of the triangle. - A containing the 4D Cartesian coordinates of vertex 3 of the triangle. - Barycentric coordinate b2, which expresses the weighting factor toward vertex 2 (specified in ). - Barycentric coordinate b3, which expresses the weighting factor toward vertex 3 (specified in ). - When the method completes, contains a new containing the 4D Cartesian coordinates of the specified point. - - - - Returns a containing the 4D Cartesian coordinates of a point specified in Barycentric coordinates relative to a 2D triangle. - - A containing the 4D Cartesian coordinates of vertex 1 of the triangle. - A containing the 4D Cartesian coordinates of vertex 2 of the triangle. - A containing the 4D Cartesian coordinates of vertex 3 of the triangle. - Barycentric coordinate b2, which expresses the weighting factor toward vertex 2 (specified in ). - Barycentric coordinate b3, which expresses the weighting factor toward vertex 3 (specified in ). - A new containing the 4D Cartesian coordinates of the specified point. - - - - Conjugates a quaternion. - - The quaternion to conjugate. - When the method completes, contains the conjugated quaternion. - - - - Conjugates a quaternion. - - The quaternion to conjugate. - The conjugated quaternion. - - - - Calculates the dot product of two quaternions. - - First source quaternion. - Second source quaternion. - When the method completes, contains the dot product of the two quaternions. - - - - Calculates the dot product of two quaternions. - - First source quaternion. - Second source quaternion. - The dot product of the two quaternions. - - - - Exponentiates a quaternion. - - The quaternion to exponentiate. - When the method completes, contains the exponentiated quaternion. - - - - Exponentiates a quaternion. - - The quaternion to exponentiate. - The exponentiated quaternion. - - - - Conjugates and renormalizes the quaternion. - - The quaternion to conjugate and renormalize. - When the method completes, contains the conjugated and renormalized quaternion. - - - - Conjugates and renormalizes the quaternion. - - The quaternion to conjugate and renormalize. - The conjugated and renormalized quaternion. - - - - Performs a linear interpolation between two quaternions. - - Start quaternion. - End quaternion. - Value between 0 and 1 indicating the weight of . - When the method completes, contains the linear interpolation of the two quaternions. - - This method performs the linear interpolation based on the following formula. - start + (end - start) * amount - Passing a value of 0 will cause to be returned; a value of 1 will cause to be returned. - - - - - Performs a linear interpolation between two quaternion. - - Start quaternion. - End quaternion. - Value between 0 and 1 indicating the weight of . - The linear interpolation of the two quaternions. - - This method performs the linear interpolation based on the following formula. - start + (end - start) * amount - Passing a value of 0 will cause to be returned; a value of 1 will cause to be returned. - - - - - Calculates the natural logarithm of the specified quaternion. - - The quaternion whose logarithm will be calculated. - When the method completes, contains the natural logarithm of the quaternion. - - - - Calculates the natural logarithm of the specified quaternion. - - The quaternion whose logarithm will be calculated. - The natural logarithm of the quaternion. - - - - Converts the quaternion into a unit quaternion. - - The quaternion to normalize. - When the method completes, contains the normalized quaternion. - - - - Converts the quaternion into a unit quaternion. - - The quaternion to normalize. - The normalized quaternion. - - - - Creates a quaternion given a rotation and an axis. - - The axis of rotation. - The angle of rotation. - When the method completes, contains the newly created quaternion. - - - - Creates a quaternion given a rotation and an axis. - - The axis of rotation. - The angle of rotation. - The newly created quaternion. - - - - Creates a quaternion given a rotation matrix. - - The rotation matrix. - When the method completes, contains the newly created quaternion. - - - - Creates a quaternion given a rotation matrix. - - The rotation matrix. - When the method completes, contains the newly created quaternion. - - - - Creates a left-handed, look-at quaternion. - - The position of the viewer's eye. - The camera look-at target. - The camera's up vector. - When the method completes, contains the created look-at quaternion. - - - - Creates a left-handed, look-at quaternion. - - The position of the viewer's eye. - The camera look-at target. - The camera's up vector. - The created look-at quaternion. - - - - Creates a left-handed, look-at quaternion. - - The camera's forward direction. - The camera's up vector. - When the method completes, contains the created look-at quaternion. - - - - Creates a left-handed, look-at quaternion. - - The camera's forward direction. - The camera's up vector. - The created look-at quaternion. - - - - Creates a right-handed, look-at quaternion. - - The position of the viewer's eye. - The camera look-at target. - The camera's up vector. - When the method completes, contains the created look-at quaternion. - - - - Creates a right-handed, look-at quaternion. - - The position of the viewer's eye. - The camera look-at target. - The camera's up vector. - The created look-at quaternion. - - - - Creates a right-handed, look-at quaternion. - - The camera's forward direction. - The camera's up vector. - When the method completes, contains the created look-at quaternion. - - - - Creates a right-handed, look-at quaternion. - - The camera's forward direction. - The camera's up vector. - The created look-at quaternion. - - - - Creates a left-handed spherical billboard that rotates around a specified object position. - - The position of the object around which the billboard will rotate. - The position of the camera. - The up vector of the camera. - The forward vector of the camera. - When the method completes, contains the created billboard quaternion. - - - - Creates a left-handed spherical billboard that rotates around a specified object position. - - The position of the object around which the billboard will rotate. - The position of the camera. - The up vector of the camera. - The forward vector of the camera. - The created billboard quaternion. - - - - Creates a right-handed spherical billboard that rotates around a specified object position. - - The position of the object around which the billboard will rotate. - The position of the camera. - The up vector of the camera. - The forward vector of the camera. - When the method completes, contains the created billboard quaternion. - - - - Creates a right-handed spherical billboard that rotates around a specified object position. - - The position of the object around which the billboard will rotate. - The position of the camera. - The up vector of the camera. - The forward vector of the camera. - The created billboard quaternion. - - - - Creates a quaternion given a rotation matrix. - - The rotation matrix. - The newly created quaternion. - - - - Creates a quaternion given a yaw, pitch, and roll value. - - The yaw of rotation. - The pitch of rotation. - The roll of rotation. - When the method completes, contains the newly created quaternion. - - - - Creates a quaternion given a yaw, pitch, and roll value. - - The yaw of rotation. - The pitch of rotation. - The roll of rotation. - The newly created quaternion. - - - - Interpolates between two quaternions, using spherical linear interpolation. - - Start quaternion. - End quaternion. - Value between 0 and 1 indicating the weight of . - When the method completes, contains the spherical linear interpolation of the two quaternions. - - - - Interpolates between two quaternions, using spherical linear interpolation. - - Start quaternion. - End quaternion. - Value between 0 and 1 indicating the weight of . - The spherical linear interpolation of the two quaternions. - - - - Interpolates between quaternions, using spherical quadrangle interpolation. - - First source quaternion. - Second source quaternion. - Third source quaternion. - Fourth source quaternion. - Value between 0 and 1 indicating the weight of interpolation. - When the method completes, contains the spherical quadrangle interpolation of the quaternions. - - - - Interpolates between quaternions, using spherical quadrangle interpolation. - - First source quaternion. - Second source quaternion. - Third source quaternion. - Fourth source quaternion. - Value between 0 and 1 indicating the weight of interpolation. - The spherical quadrangle interpolation of the quaternions. - - - - Sets up control points for spherical quadrangle interpolation. - - First source quaternion. - Second source quaternion. - Third source quaternion. - Fourth source quaternion. - An array of three quaternions that represent control points for spherical quadrangle interpolation. - - - - Adds two quaternions. - - The first quaternion to add. - The second quaternion to add. - The sum of the two quaternions. - - - - Subtracts two quaternions. - - The first quaternion to subtract. - The second quaternion to subtract. - The difference of the two quaternions. - - - - Reverses the direction of a given quaternion. - - The quaternion to negate. - A quaternion facing in the opposite direction. - - - - Scales a quaternion by the given value. - - The quaternion to scale. - The amount by which to scale the quaternion. - The scaled quaternion. - - - - Scales a quaternion by the given value. - - The quaternion to scale. - The amount by which to scale the quaternion. - The scaled quaternion. - - - - Multiplies a quaternion by another. - - The first quaternion to multiply. - The second quaternion to multiply. - The multiplied quaternion. - - - - Tests for equality between two objects. - - The first value to compare. - The second value to compare. - true if has the same value as ; otherwise, false. - - - - Tests for inequality between two objects. - - The first value to compare. - The second value to compare. - true if has a different value than ; otherwise, false. - - - - Returns a that represents this instance. - - - A that represents this instance. - - - - - Returns a that represents this instance. - - The format. - - A that represents this instance. - - - - - Returns a that represents this instance. - - The format provider. - - A that represents this instance. - - - - - Returns a that represents this instance. - - The format. - The format provider. - - A that represents this instance. - - - - - Returns a hash code for this instance. - - - A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. - - - - - Determines whether the specified is equal to this instance. - - The to compare with this instance. - - true if the specified is equal to this instance; otherwise, false. - - - - - Determines whether the specified is equal to this instance. - - The to compare with this instance. - - true if the specified is equal to this instance; otherwise, false. - - - - - Determines whether the specified is equal to this instance. - - The to compare with this instance. - - true if the specified is equal to this instance; otherwise, false. - - - - - Represents a two dimensional mathematical vector. - - - - - A with all of its components set to zero. - - - - - The X unit (1, 0). - - - - - The Y unit (0, 1). - - - - - A with all of its components set to one. - - - - - The X component of the vector. - - - - - The Y component of the vector. - - - - - Initializes a new instance of the struct. - - The value that will be assigned to all components. - - - - Initializes a new instance of the struct. - - Initial value for the X component of the vector. - Initial value for the Y component of the vector. - - - - Initializes a new instance of the struct. - - The values to assign to the X and Y components of the vector. This must be an array with two elements. - Thrown when is null. - Thrown when contains more or less than two elements. - - - - Gets a value indicting whether this instance is normalized. - - - - - Gets a value indicting whether this vector is zero - - - - - Gets or sets the component at the specified index. - - The value of the X or Y component, depending on the index. - The index of the component to access. Use 0 for the X component and 1 for the Y component. - The value of the component at the specified index. - Thrown when the is out of the range [0, 1]. - - - - Calculates the length of the vector. - - The length of the vector. - - may be preferred when only the relative length is needed - and speed is of the essence. - - - - - Calculates the squared length of the vector. - - The squared length of the vector. - - This method may be preferred to when only a relative length is needed - and speed is of the essence. - - - - - Converts the vector into a unit vector. - - - - - Creates an array containing the elements of the vector. - - A two-element array containing the components of the vector. - - - - Adds two vectors. - - The first vector to add. - The second vector to add. - When the method completes, contains the sum of the two vectors. - - - - Adds two vectors. - - The first vector to add. - The second vector to add. - The sum of the two vectors. - - - - Perform a component-wise addition - - The input vector - The scalar value to be added to elements - The vector with added scalar for each element. - - - - Perform a component-wise addition - - The input vector - The scalar value to be added to elements - The vector with added scalar for each element. - - - - Subtracts two vectors. - - The first vector to subtract. - The second vector to subtract. - When the method completes, contains the difference of the two vectors. - - - - Subtracts two vectors. - - The first vector to subtract. - The second vector to subtract. - The difference of the two vectors. - - - - Perform a component-wise subtraction - - The input vector - The scalar value to be subtraced from elements - The vector with subtracted scalar for each element. - - - - Perform a component-wise subtraction - - The input vector - The scalar value to be subtraced from elements - The vector with subtracted scalar for each element. - - - - Perform a component-wise subtraction - - The scalar value to be subtraced from elements - The input vector - The vector with subtracted scalar for each element. - - - - Perform a component-wise subtraction - - The scalar value to be subtraced from elements - The input vector - The vector with subtracted scalar for each element. - - - - Scales a vector by the given value. - - The vector to scale. - The amount by which to scale the vector. - When the method completes, contains the scaled vector. - - - - Scales a vector by the given value. - - The vector to scale. - The amount by which to scale the vector. - The scaled vector. - - - - Multiplies a vector with another by performing component-wise multiplication. - - The first vector to multiply. - The second vector to multiply. - When the method completes, contains the multiplied vector. - - - - Multiplies a vector with another by performing component-wise multiplication. - - The first vector to multiply. - The second vector to multiply. - The multiplied vector. - - - - Scales a vector by the given value. - - The vector to scale. - The amount by which to scale the vector. - When the method completes, contains the scaled vector. - - - - Scales a vector by the given value. - - The vector to scale. - The amount by which to scale the vector. - The scaled vector. - - - - Scales a vector by the given value. - - The amount by which to scale the vector. - The vector to scale. - When the method completes, contains the scaled vector. - - - - Scales a vector by the given value. - - The vector to scale. - The amount by which to scale the vector. - The scaled vector. - - - - Reverses the direction of a given vector. - - The vector to negate. - When the method completes, contains a vector facing in the opposite direction. - - - - Reverses the direction of a given vector. - - The vector to negate. - A vector facing in the opposite direction. - - - - Returns a containing the 2D Cartesian coordinates of a point specified in Barycentric coordinates relative to a 2D triangle. - - A containing the 2D Cartesian coordinates of vertex 1 of the triangle. - A containing the 2D Cartesian coordinates of vertex 2 of the triangle. - A containing the 2D Cartesian coordinates of vertex 3 of the triangle. - Barycentric coordinate b2, which expresses the weighting factor toward vertex 2 (specified in ). - Barycentric coordinate b3, which expresses the weighting factor toward vertex 3 (specified in ). - When the method completes, contains the 2D Cartesian coordinates of the specified point. - - - - Returns a containing the 2D Cartesian coordinates of a point specified in Barycentric coordinates relative to a 2D triangle. - - A containing the 2D Cartesian coordinates of vertex 1 of the triangle. - A containing the 2D Cartesian coordinates of vertex 2 of the triangle. - A containing the 2D Cartesian coordinates of vertex 3 of the triangle. - Barycentric coordinate b2, which expresses the weighting factor toward vertex 2 (specified in ). - Barycentric coordinate b3, which expresses the weighting factor toward vertex 3 (specified in ). - A new containing the 2D Cartesian coordinates of the specified point. - - - - Restricts a value to be within a specified range. - - The value to clamp. - The minimum value. - The maximum value. - When the method completes, contains the clamped value. - - - - Restricts a value to be within a specified range. - - The value to clamp. - The minimum value. - The maximum value. - The clamped value. - - - - Saturates this instance in the range [0,1] - - - - - Calculates the distance between two vectors. - - The first vector. - The second vector. - When the method completes, contains the distance between the two vectors. - - may be preferred when only the relative distance is needed - and speed is of the essence. - - - - - Calculates the distance between two vectors. - - The first vector. - The second vector. - The distance between the two vectors. - - may be preferred when only the relative distance is needed - and speed is of the essence. - - - - - Calculates the squared distance between two vectors. - - The first vector. - The second vector - When the method completes, contains the squared distance between the two vectors. - Distance squared is the value before taking the square root. - Distance squared can often be used in place of distance if relative comparisons are being made. - For example, consider three points A, B, and C. To determine whether B or C is further from A, - compare the distance between A and B to the distance between A and C. Calculating the two distances - involves two square roots, which are computationally expensive. However, using distance squared - provides the same information and avoids calculating two square roots. - - - - - Calculates the squared distance between two vectors. - - The first vector. - The second vector. - The squared distance between the two vectors. - Distance squared is the value before taking the square root. - Distance squared can often be used in place of distance if relative comparisons are being made. - For example, consider three points A, B, and C. To determine whether B or C is further from A, - compare the distance between A and B to the distance between A and C. Calculating the two distances - involves two square roots, which are computationally expensive. However, using distance squared - provides the same information and avoids calculating two square roots. - - - - - Calculates the dot product of two vectors. - - First source vector. - Second source vector. - When the method completes, contains the dot product of the two vectors. - - - - Calculates the dot product of two vectors. - - First source vector. - Second source vector. - The dot product of the two vectors. - - - - Converts the vector into a unit vector. - - The vector to normalize. - When the method completes, contains the normalized vector. - - - - Converts the vector into a unit vector. - - The vector to normalize. - The normalized vector. - - - - Performs a linear interpolation between two vectors. - - Start vector. - End vector. - Value between 0 and 1 indicating the weight of . - When the method completes, contains the linear interpolation of the two vectors. - - Passing a value of 0 will cause to be returned; a value of 1 will cause to be returned. - - - - - Performs a linear interpolation between two vectors. - - Start vector. - End vector. - Value between 0 and 1 indicating the weight of . - The linear interpolation of the two vectors. - - Passing a value of 0 will cause to be returned; a value of 1 will cause to be returned. - - - - - Performs a cubic interpolation between two vectors. - - Start vector. - End vector. - Value between 0 and 1 indicating the weight of . - When the method completes, contains the cubic interpolation of the two vectors. - - - - Performs a cubic interpolation between two vectors. - - Start vector. - End vector. - Value between 0 and 1 indicating the weight of . - The cubic interpolation of the two vectors. - - - - Performs a Hermite spline interpolation. - - First source position vector. - First source tangent vector. - Second source position vector. - Second source tangent vector. - Weighting factor. - When the method completes, contains the result of the Hermite spline interpolation. - - - - Performs a Hermite spline interpolation. - - First source position vector. - First source tangent vector. - Second source position vector. - Second source tangent vector. - Weighting factor. - The result of the Hermite spline interpolation. - - - - Performs a Catmull-Rom interpolation using the specified positions. - - The first position in the interpolation. - The second position in the interpolation. - The third position in the interpolation. - The fourth position in the interpolation. - Weighting factor. - When the method completes, contains the result of the Catmull-Rom interpolation. - - - - Performs a Catmull-Rom interpolation using the specified positions. - - The first position in the interpolation. - The second position in the interpolation. - The third position in the interpolation. - The fourth position in the interpolation. - Weighting factor. - A vector that is the result of the Catmull-Rom interpolation. - - - - Returns a vector containing the largest components of the specified vectors. - - The first source vector. - The second source vector. - When the method completes, contains an new vector composed of the largest components of the source vectors. - - - - Returns a vector containing the largest components of the specified vectors. - - The first source vector. - The second source vector. - A vector containing the largest components of the source vectors. - - - - Returns a vector containing the smallest components of the specified vectors. - - The first source vector. - The second source vector. - When the method completes, contains an new vector composed of the smallest components of the source vectors. - - - - Returns a vector containing the smallest components of the specified vectors. - - The first source vector. - The second source vector. - A vector containing the smallest components of the source vectors. - - - - Returns the reflection of a vector off a surface that has the specified normal. - - The source vector. - Normal of the surface. - When the method completes, contains the reflected vector. - Reflect only gives the direction of a reflection off a surface, it does not determine - whether the original vector was close enough to the surface to hit it. - - - - Returns the reflection of a vector off a surface that has the specified normal. - - The source vector. - Normal of the surface. - The reflected vector. - Reflect only gives the direction of a reflection off a surface, it does not determine - whether the original vector was close enough to the surface to hit it. - - - - Orthogonalizes a list of vectors. - - The list of orthogonalized vectors. - The list of vectors to orthogonalize. - - Orthogonalization is the process of making all vectors orthogonal to each other. This - means that any given vector in the list will be orthogonal to any other given vector in the - list. - Because this method uses the modified Gram-Schmidt process, the resulting vectors - tend to be numerically unstable. The numeric stability decreases according to the vectors - position in the list so that the first vector is the most stable and the last vector is the - least stable. - - Thrown when or is null. - Thrown when is shorter in length than . - - - - Orthonormalizes a list of vectors. - - The list of orthonormalized vectors. - The list of vectors to orthonormalize. - - Orthonormalization is the process of making all vectors orthogonal to each - other and making all vectors of unit length. This means that any given vector will - be orthogonal to any other given vector in the list. - Because this method uses the modified Gram-Schmidt process, the resulting vectors - tend to be numerically unstable. The numeric stability decreases according to the vectors - position in the list so that the first vector is the most stable and the last vector is the - least stable. - - Thrown when or is null. - Thrown when is shorter in length than . - - - - Transforms a 2D vector by the given rotation. - - The vector to rotate. - The rotation to apply. - When the method completes, contains the transformed . - - - - Transforms a 2D vector by the given rotation. - - The vector to rotate. - The rotation to apply. - The transformed . - - - - Transforms an array of vectors by the given rotation. - - The array of vectors to transform. - The rotation to apply. - The array for which the transformed vectors are stored. - This array may be the same array as . - Thrown when or is null. - Thrown when is shorter in length than . - - - - Transforms a 2D vector by the given . - - The source vector. - The transformation . - When the method completes, contains the transformed . - - - - Transforms a 2D vector by the given . - - The source vector. - The transformation . - The transformed . - - - - Transforms an array of 2D vectors by the given . - - The array of vectors to transform. - The transformation . - The array for which the transformed vectors are stored. - Thrown when or is null. - Thrown when is shorter in length than . - - - - Performs a coordinate transformation using the given . - - The coordinate vector to transform. - The transformation . - When the method completes, contains the transformed coordinates. - - A coordinate transform performs the transformation with the assumption that the w component - is one. The four dimensional vector obtained from the transformation operation has each - component in the vector divided by the w component. This forces the w component to be one and - therefore makes the vector homogeneous. The homogeneous vector is often preferred when working - with coordinates as the w component can safely be ignored. - - - - - Performs a coordinate transformation using the given . - - The coordinate vector to transform. - The transformation . - The transformed coordinates. - - A coordinate transform performs the transformation with the assumption that the w component - is one. The four dimensional vector obtained from the transformation operation has each - component in the vector divided by the w component. This forces the w component to be one and - therefore makes the vector homogeneous. The homogeneous vector is often preferred when working - with coordinates as the w component can safely be ignored. - - - - - Performs a coordinate transformation on an array of vectors using the given . - - The array of coordinate vectors to transform. - The transformation . - The array for which the transformed vectors are stored. - This array may be the same array as . - Thrown when or is null. - Thrown when is shorter in length than . - - A coordinate transform performs the transformation with the assumption that the w component - is one. The four dimensional vector obtained from the transformation operation has each - component in the vector divided by the w component. This forces the w component to be one and - therefore makes the vector homogeneous. The homogeneous vector is often preferred when working - with coordinates as the w component can safely be ignored. - - - - - Performs a normal transformation using the given . - - The normal vector to transform. - The transformation . - When the method completes, contains the transformed normal. - - A normal transform performs the transformation with the assumption that the w component - is zero. This causes the fourth row and fourth column of the matrix to be unused. The - end result is a vector that is not translated, but all other transformation properties - apply. This is often preferred for normal vectors as normals purely represent direction - rather than location because normal vectors should not be translated. - - - - - Performs a normal transformation using the given . - - The normal vector to transform. - The transformation . - The transformed normal. - - A normal transform performs the transformation with the assumption that the w component - is zero. This causes the fourth row and fourth column of the matrix to be unused. The - end result is a vector that is not translated, but all other transformation properties - apply. This is often preferred for normal vectors as normals purely represent direction - rather than location because normal vectors should not be translated. - - - - - Performs a normal transformation on an array of vectors using the given . - - The array of normal vectors to transform. - The transformation . - The array for which the transformed vectors are stored. - This array may be the same array as . - Thrown when or is null. - Thrown when is shorter in length than . - - A normal transform performs the transformation with the assumption that the w component - is zero. This causes the fourth row and fourth column of the matrix to be unused. The - end result is a vector that is not translated, but all other transformation properties - apply. This is often preferred for normal vectors as normals purely represent direction - rather than location because normal vectors should not be translated. - - - - - Adds two vectors. - - The first vector to add. - The second vector to add. - The sum of the two vectors. - - - - Multiplies a vector with another by performing component-wise multiplication equivalent to . - - The first vector to multiply. - The second vector to multiply. - The multiplication of the two vectors. - - - - Assert a vector (return it unchanged). - - The vector to assert (unchanged). - The asserted (unchanged) vector. - - - - Subtracts two vectors. - - The first vector to subtract. - The second vector to subtract. - The difference of the two vectors. - - - - Reverses the direction of a given vector. - - The vector to negate. - A vector facing in the opposite direction. - - - - Scales a vector by the given value. - - The vector to scale. - The amount by which to scale the vector. - The scaled vector. - - - - Scales a vector by the given value. - - The vector to scale. - The amount by which to scale the vector. - The scaled vector. - - - - Scales a vector by the given value. - - The vector to scale. - The amount by which to scale the vector. - The scaled vector. - - - - Scales a vector by the given value. - - The amount by which to scale the vector. - The vector to scale. - The scaled vector. - - - - Scales a vector by the given value. - - The vector to scale. - The amount by which to scale the vector. - The scaled vector. - - - - Perform a component-wise addition - - The input vector. - The scalar value to be added on elements - The vector with added scalar for each element. - - - - Perform a component-wise addition - - The input vector. - The scalar value to be added on elements - The vector with added scalar for each element. - - - - Perform a component-wise subtraction - - The input vector. - The scalar value to be subtraced from elements - The vector with subtraced scalar from each element. - - - - Perform a component-wise subtraction - - The input vector. - The scalar value to be subtraced from elements - The vector with subtraced scalar from each element. - - - - Tests for equality between two objects. - - The first value to compare. - The second value to compare. - true if has the same value as ; otherwise, false. - - - - Tests for inequality between two objects. - - The first value to compare. - The second value to compare. - true if has a different value than ; otherwise, false. - - - - Performs an explicit conversion from to . - - The value. - The result of the conversion. - - - - Performs an explicit conversion from to . - - The value. - The result of the conversion. - - - - Returns a that represents this instance. - - - A that represents this instance. - - - - - Returns a that represents this instance. - - The format. - - A that represents this instance. - - - - - Returns a that represents this instance. - - The format provider. - - A that represents this instance. - - - - - Returns a that represents this instance. - - The format. - The format provider. - - A that represents this instance. - - - - - Returns a hash code for this instance. - - - A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. - - - - - Determines whether the specified is equal to this instance. - - The to compare with this instance. - - true if the specified is equal to this instance; otherwise, false. - - - - - Determines whether the specified is equal to this instance. - - The to compare with this instance. - - true if the specified is equal to this instance; otherwise, false. - - - - - Determines whether the specified is equal to this instance. - - The to compare with this instance. - - true if the specified is equal to this instance; otherwise, false. - - - - - Represents a three dimensional mathematical vector. - - - - - A with all of its components set to zero. - - - - - The X unit (1, 0, 0). - - - - - The Y unit (0, 1, 0). - - - - - The Z unit (0, 0, 1). - - - - - A with all of its components set to one. - - - - - A unit designating up (0, 1, 0). - - - - - A unit designating down (0, -1, 0). - - - - - A unit designating left (-1, 0, 0). - - - - - A unit designating right (1, 0, 0). - - - - - A unit designating forward in a right-handed coordinate system (0, 0, -1). - - - - - A unit designating forward in a left-handed coordinate system (0, 0, 1). - - - - - A unit designating backward in a right-handed coordinate system (0, 0, 1). - - - - - A unit designating backward in a left-handed coordinate system (0, 0, -1). - - - - - The X component of the vector. - - - - - The Y component of the vector. - - - - - The Z component of the vector. - - - - - Initializes a new instance of the struct. - - The value that will be assigned to all components. - - - - Initializes a new instance of the struct. - - Initial value for the X component of the vector. - Initial value for the Y component of the vector. - Initial value for the Z component of the vector. - - - - Initializes a new instance of the struct. - - A vector containing the values with which to initialize the X and Y components. - Initial value for the Z component of the vector. - - - - Initializes a new instance of the struct. - - The values to assign to the X, Y, and Z components of the vector. This must be an array with three elements. - Thrown when is null. - Thrown when contains more or less than three elements. - - - - Gets a value indicting whether this instance is normalized. - - - - - Gets a value indicting whether this vector is zero - - - - - Gets or sets the component at the specified index. - - The value of the X, Y, or Z component, depending on the index. - The index of the component to access. Use 0 for the X component, 1 for the Y component, and 2 for the Z component. - The value of the component at the specified index. - Thrown when the is out of the range [0, 2]. - - - - Calculates the length of the vector. - - The length of the vector. - - may be preferred when only the relative length is needed - and speed is of the essence. - - - - - Calculates the squared length of the vector. - - The squared length of the vector. - - This method may be preferred to when only a relative length is needed - and speed is of the essence. - - - - - Converts the vector into a unit vector. - - - - - Creates an array containing the elements of the vector. - - A three-element array containing the components of the vector. - - - - Adds two vectors. - - The first vector to add. - The second vector to add. - When the method completes, contains the sum of the two vectors. - - - - Adds two vectors. - - The first vector to add. - The second vector to add. - The sum of the two vectors. - - - - Perform a component-wise addition - - The input vector - The scalar value to be added to elements - The vector with added scalar for each element. - - - - Perform a component-wise addition - - The input vector - The scalar value to be added to elements - The vector with added scalar for each element. - - - - Subtracts two vectors. - - The first vector to subtract. - The second vector to subtract. - When the method completes, contains the difference of the two vectors. - - - - Subtracts two vectors. - - The first vector to subtract. - The second vector to subtract. - The difference of the two vectors. - - - - Perform a component-wise subtraction - - The input vector - The scalar value to be subtraced from elements - The vector with subtracted scalar for each element. - - - - Perform a component-wise subtraction - - The input vector - The scalar value to be subtraced from elements - The vector with subtracted scalar for each element. - - - - Perform a component-wise subtraction - - The scalar value to be subtraced from elements - The input vector. - The vector with subtracted scalar for each element. - - - - Perform a component-wise subtraction - - The scalar value to be subtraced from elements - The input vector. - The vector with subtracted scalar for each element. - - - - Scales a vector by the given value. - - The vector to scale. - The amount by which to scale the vector. - When the method completes, contains the scaled vector. - - - - Scales a vector by the given value. - - The vector to scale. - The amount by which to scale the vector. - The scaled vector. - - - - Multiply a vector with another by performing component-wise multiplication. - - The first vector to multiply. - The second vector to multiply. - When the method completes, contains the multiplied vector. - - - - Multiply a vector with another by performing component-wise multiplication. - - The first vector to Multiply. - The second vector to multiply. - The multiplied vector. - - - - Scales a vector by the given value. - - The vector to scale. - The amount by which to scale the vector. - When the method completes, contains the scaled vector. - - - - Scales a vector by the given value. - - The vector to scale. - The amount by which to scale the vector. - The scaled vector. - - - - Scales a vector by the given value. - - The amount by which to scale the vector. - The vector to scale. - When the method completes, contains the scaled vector. - - - - Scales a vector by the given value. - - The vector to scale. - The amount by which to scale the vector. - The scaled vector. - - - - Reverses the direction of a given vector. - - The vector to negate. - When the method completes, contains a vector facing in the opposite direction. - - - - Reverses the direction of a given vector. - - The vector to negate. - A vector facing in the opposite direction. - - - - Returns a containing the 3D Cartesian coordinates of a point specified in Barycentric coordinates relative to a 3D triangle. - - A containing the 3D Cartesian coordinates of vertex 1 of the triangle. - A containing the 3D Cartesian coordinates of vertex 2 of the triangle. - A containing the 3D Cartesian coordinates of vertex 3 of the triangle. - Barycentric coordinate b2, which expresses the weighting factor toward vertex 2 (specified in ). - Barycentric coordinate b3, which expresses the weighting factor toward vertex 3 (specified in ). - When the method completes, contains the 3D Cartesian coordinates of the specified point. - - - - Returns a containing the 3D Cartesian coordinates of a point specified in Barycentric coordinates relative to a 3D triangle. - - A containing the 3D Cartesian coordinates of vertex 1 of the triangle. - A containing the 3D Cartesian coordinates of vertex 2 of the triangle. - A containing the 3D Cartesian coordinates of vertex 3 of the triangle. - Barycentric coordinate b2, which expresses the weighting factor toward vertex 2 (specified in ). - Barycentric coordinate b3, which expresses the weighting factor toward vertex 3 (specified in ). - A new containing the 3D Cartesian coordinates of the specified point. - - - - Restricts a value to be within a specified range. - - The value to clamp. - The minimum value. - The maximum value. - When the method completes, contains the clamped value. - - - - Restricts a value to be within a specified range. - - The value to clamp. - The minimum value. - The maximum value. - The clamped value. - - - - Calculates the cross product of two vectors. - - First source vector. - Second source vector. - When the method completes, contains he cross product of the two vectors. - - - - Calculates the cross product of two vectors. - - First source vector. - Second source vector. - The cross product of the two vectors. - - - - Calculates the distance between two vectors. - - The first vector. - The second vector. - When the method completes, contains the distance between the two vectors. - - may be preferred when only the relative distance is needed - and speed is of the essence. - - - - - Calculates the distance between two vectors. - - The first vector. - The second vector. - The distance between the two vectors. - - may be preferred when only the relative distance is needed - and speed is of the essence. - - - - - Calculates the squared distance between two vectors. - - The first vector. - The second vector. - When the method completes, contains the squared distance between the two vectors. - Distance squared is the value before taking the square root. - Distance squared can often be used in place of distance if relative comparisons are being made. - For example, consider three points A, B, and C. To determine whether B or C is further from A, - compare the distance between A and B to the distance between A and C. Calculating the two distances - involves two square roots, which are computationally expensive. However, using distance squared - provides the same information and avoids calculating two square roots. - - - - - Calculates the squared distance between two vectors. - - The first vector. - The second vector. - The squared distance between the two vectors. - Distance squared is the value before taking the square root. - Distance squared can often be used in place of distance if relative comparisons are being made. - For example, consider three points A, B, and C. To determine whether B or C is further from A, - compare the distance between A and B to the distance between A and C. Calculating the two distances - involves two square roots, which are computationally expensive. However, using distance squared - provides the same information and avoids calculating two square roots. - - - - - Tests whether one 3D vector is near another 3D vector. - - The left vector. - The right vector. - The epsilon. - true if left and right are near another 3D, false otherwise - - - - Tests whether one 3D vector is near another 3D vector. - - The left vector. - The right vector. - The epsilon. - true if left and right are near another 3D, false otherwise - - - - Calculates the dot product of two vectors. - - First source vector. - Second source vector. - When the method completes, contains the dot product of the two vectors. - - - - Calculates the dot product of two vectors. - - First source vector. - Second source vector. - The dot product of the two vectors. - - - - Converts the vector into a unit vector. - - The vector to normalize. - When the method completes, contains the normalized vector. - - - - Converts the vector into a unit vector. - - The vector to normalize. - The normalized vector. - - - - Performs a linear interpolation between two vectors. - - Start vector. - End vector. - Value between 0 and 1 indicating the weight of . - When the method completes, contains the linear interpolation of the two vectors. - - Passing a value of 0 will cause to be returned; a value of 1 will cause to be returned. - - - - - Performs a linear interpolation between two vectors. - - Start vector. - End vector. - Value between 0 and 1 indicating the weight of . - The linear interpolation of the two vectors. - - Passing a value of 0 will cause to be returned; a value of 1 will cause to be returned. - - - - - Performs a cubic interpolation between two vectors. - - Start vector. - End vector. - Value between 0 and 1 indicating the weight of . - When the method completes, contains the cubic interpolation of the two vectors. - - - - Performs a cubic interpolation between two vectors. - - Start vector. - End vector. - Value between 0 and 1 indicating the weight of . - The cubic interpolation of the two vectors. - - - - Performs a Hermite spline interpolation. - - First source position vector. - First source tangent vector. - Second source position vector. - Second source tangent vector. - Weighting factor. - When the method completes, contains the result of the Hermite spline interpolation. - - - - Performs a Hermite spline interpolation. - - First source position vector. - First source tangent vector. - Second source position vector. - Second source tangent vector. - Weighting factor. - The result of the Hermite spline interpolation. - - - - Performs a Catmull-Rom interpolation using the specified positions. - - The first position in the interpolation. - The second position in the interpolation. - The third position in the interpolation. - The fourth position in the interpolation. - Weighting factor. - When the method completes, contains the result of the Catmull-Rom interpolation. - - - - Performs a Catmull-Rom interpolation using the specified positions. - - The first position in the interpolation. - The second position in the interpolation. - The third position in the interpolation. - The fourth position in the interpolation. - Weighting factor. - A vector that is the result of the Catmull-Rom interpolation. - - - - Returns a vector containing the largest components of the specified vectors. - - The first source vector. - The second source vector. - When the method completes, contains an new vector composed of the largest components of the source vectors. - - - - Returns a vector containing the largest components of the specified vectors. - - The first source vector. - The second source vector. - A vector containing the largest components of the source vectors. - - - - Returns a vector containing the smallest components of the specified vectors. - - The first source vector. - The second source vector. - When the method completes, contains an new vector composed of the smallest components of the source vectors. - - - - Returns a vector containing the smallest components of the specified vectors. - - The first source vector. - The second source vector. - A vector containing the smallest components of the source vectors. - - - - Projects a 3D vector from object space into screen space. - - The vector to project. - The X position of the viewport. - The Y position of the viewport. - The width of the viewport. - The height of the viewport. - The minimum depth of the viewport. - The maximum depth of the viewport. - The combined world-view-projection matrix. - When the method completes, contains the vector in screen space. - - - - Projects a 3D vector from object space into screen space. - - The vector to project. - The X position of the viewport. - The Y position of the viewport. - The width of the viewport. - The height of the viewport. - The minimum depth of the viewport. - The maximum depth of the viewport. - The combined world-view-projection matrix. - The vector in screen space. - - - - Projects a 3D vector from screen space into object space. - - The vector to project. - The X position of the viewport. - The Y position of the viewport. - The width of the viewport. - The height of the viewport. - The minimum depth of the viewport. - The maximum depth of the viewport. - The combined world-view-projection matrix. - When the method completes, contains the vector in object space. - - - - Projects a 3D vector from screen space into object space. - - The vector to project. - The X position of the viewport. - The Y position of the viewport. - The width of the viewport. - The height of the viewport. - The minimum depth of the viewport. - The maximum depth of the viewport. - The combined world-view-projection matrix. - The vector in object space. - - - - Returns the reflection of a vector off a surface that has the specified normal. - - The source vector. - Normal of the surface. - When the method completes, contains the reflected vector. - Reflect only gives the direction of a reflection off a surface, it does not determine - whether the original vector was close enough to the surface to hit it. - - - - Returns the reflection of a vector off a surface that has the specified normal. - - The source vector. - Normal of the surface. - The reflected vector. - Reflect only gives the direction of a reflection off a surface, it does not determine - whether the original vector was close enough to the surface to hit it. - - - - Orthogonalizes a list of vectors. - - The list of orthogonalized vectors. - The list of vectors to orthogonalize. - - Orthogonalization is the process of making all vectors orthogonal to each other. This - means that any given vector in the list will be orthogonal to any other given vector in the - list. - Because this method uses the modified Gram-Schmidt process, the resulting vectors - tend to be numerically unstable. The numeric stability decreases according to the vectors - position in the list so that the first vector is the most stable and the last vector is the - least stable. - - Thrown when or is null. - Thrown when is shorter in length than . - - - - Orthonormalizes a list of vectors. - - The list of orthonormalized vectors. - The list of vectors to orthonormalize. - - Orthonormalization is the process of making all vectors orthogonal to each - other and making all vectors of unit length. This means that any given vector will - be orthogonal to any other given vector in the list. - Because this method uses the modified Gram-Schmidt process, the resulting vectors - tend to be numerically unstable. The numeric stability decreases according to the vectors - position in the list so that the first vector is the most stable and the last vector is the - least stable. - - Thrown when or is null. - Thrown when is shorter in length than . - - - - Transforms a 3D vector by the given rotation. - - The vector to rotate. - The rotation to apply. - When the method completes, contains the transformed . - - - - Transforms a 3D vector by the given rotation. - - The vector to rotate. - The rotation to apply. - The transformed . - - - - Transforms an array of vectors by the given rotation. - - The array of vectors to transform. - The rotation to apply. - The array for which the transformed vectors are stored. - This array may be the same array as . - Thrown when or is null. - Thrown when is shorter in length than . - - - - Transforms a 3D vector by the given . - - The source vector. - The transformation . - When the method completes, contains the transformed . - - - - Transforms a 3D vector by the given . - - The source vector. - The transformation . - The transformed . - - - - Transforms a 3D vector by the given . - - The source vector. - The transformation . - When the method completes, contains the transformed . - - - - Transforms a 3D vector by the given . - - The source vector. - The transformation . - When the method completes, contains the transformed . - - - - Transforms a 3D vector by the given . - - The source vector. - The transformation . - The transformed . - - - - Transforms an array of 3D vectors by the given . - - The array of vectors to transform. - The transformation . - The array for which the transformed vectors are stored. - Thrown when or is null. - Thrown when is shorter in length than . - - - - Performs a coordinate transformation using the given . - - The coordinate vector to transform. - The transformation . - When the method completes, contains the transformed coordinates. - - A coordinate transform performs the transformation with the assumption that the w component - is one. The four dimensional vector obtained from the transformation operation has each - component in the vector divided by the w component. This forces the w component to be one and - therefore makes the vector homogeneous. The homogeneous vector is often preferred when working - with coordinates as the w component can safely be ignored. - - - - - Performs a coordinate transformation using the given . - - The coordinate vector to transform. - The transformation . - The transformed coordinates. - - A coordinate transform performs the transformation with the assumption that the w component - is one. The four dimensional vector obtained from the transformation operation has each - component in the vector divided by the w component. This forces the w component to be one and - therefore makes the vector homogeneous. The homogeneous vector is often preferred when working - with coordinates as the w component can safely be ignored. - - - - - Performs a coordinate transformation on an array of vectors using the given . - - The array of coordinate vectors to transform. - The transformation . - The array for which the transformed vectors are stored. - This array may be the same array as . - Thrown when or is null. - Thrown when is shorter in length than . - - A coordinate transform performs the transformation with the assumption that the w component - is one. The four dimensional vector obtained from the transformation operation has each - component in the vector divided by the w component. This forces the w component to be one and - therefore makes the vector homogeneous. The homogeneous vector is often preferred when working - with coordinates as the w component can safely be ignored. - - - - - Performs a normal transformation using the given . - - The normal vector to transform. - The transformation . - When the method completes, contains the transformed normal. - - A normal transform performs the transformation with the assumption that the w component - is zero. This causes the fourth row and fourth column of the matrix to be unused. The - end result is a vector that is not translated, but all other transformation properties - apply. This is often preferred for normal vectors as normals purely represent direction - rather than location because normal vectors should not be translated. - - - - - Performs a normal transformation using the given . - - The normal vector to transform. - The transformation . - The transformed normal. - - A normal transform performs the transformation with the assumption that the w component - is zero. This causes the fourth row and fourth column of the matrix to be unused. The - end result is a vector that is not translated, but all other transformation properties - apply. This is often preferred for normal vectors as normals purely represent direction - rather than location because normal vectors should not be translated. - - - - - Performs a normal transformation on an array of vectors using the given . - - The array of normal vectors to transform. - The transformation . - The array for which the transformed vectors are stored. - This array may be the same array as . - Thrown when or is null. - Thrown when is shorter in length than . - - A normal transform performs the transformation with the assumption that the w component - is zero. This causes the fourth row and fourth column of the matrix to be unused. The - end result is a vector that is not translated, but all other transformation properties - apply. This is often preferred for normal vectors as normals purely represent direction - rather than location because normal vectors should not be translated. - - - - - Adds two vectors. - - The first vector to add. - The second vector to add. - The sum of the two vectors. - - - - Multiplies a vector with another by performing component-wise multiplication equivalent to . - - The first vector to multiply. - The second vector to multiply. - The multiplication of the two vectors. - - - - Assert a vector (return it unchanged). - - The vector to assert (unchanged). - The asserted (unchanged) vector. - - - - Subtracts two vectors. - - The first vector to subtract. - The second vector to subtract. - The difference of the two vectors. - - - - Reverses the direction of a given vector. - - The vector to negate. - A vector facing in the opposite direction. - - - - Scales a vector by the given value. - - The vector to scale. - The amount by which to scale the vector. - The scaled vector. - - - - Scales a vector by the given value. - - The vector to scale. - The amount by which to scale the vector. - The scaled vector. - - - - Scales a vector by the given value. - - The vector to scale. - The amount by which to scale the vector. - The scaled vector. - - - - Scales a vector by the given value. - - The amount by which to scale the vector. - The vector to scale. - The scaled vector. - - - - Scales a vector by the given value. - - The vector to scale. - The amount by which to scale the vector. - The scaled vector. - - - - Perform a component-wise addition - - The input vector. - The scalar value to be added on elements - The vector with added scalar for each element. - - - - Perform a component-wise addition - - The input vector. - The scalar value to be added on elements - The vector with added scalar for each element. - - - - Perform a component-wise subtraction - - The input vector. - The scalar value to be subtraced from elements - The vector with added scalar from each element. - - - - Perform a component-wise subtraction - - The input vector. - The scalar value to be subtraced from elements - The vector with subtraced scalar from each element. - - - - Tests for equality between two objects. - - The first value to compare. - The second value to compare. - true if has the same value as ; otherwise, false. - - - - Tests for inequality between two objects. - - The first value to compare. - The second value to compare. - true if has a different value than ; otherwise, false. - - - - Performs an explicit conversion from to . - - The value. - The result of the conversion. - - - - Performs an explicit conversion from to . - - The value. - The result of the conversion. - - - - Returns a that represents this instance. - - - A that represents this instance. - - - - - Returns a that represents this instance. - - The format. - - A that represents this instance. - - - - - Returns a that represents this instance. - - The format provider. - - A that represents this instance. - - - - - Returns a that represents this instance. - - The format. - The format provider. - - A that represents this instance. - - - - - Returns a hash code for this instance. - - - A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. - - - - - Determines whether the specified is equal to this instance. - - The to compare with this instance. - - true if the specified is equal to this instance; otherwise, false. - - - - - Determines whether the specified is equal to this instance. - - The to compare with this instance. - - true if the specified is equal to this instance; otherwise, false. - - - - - Determines whether the specified is equal to this instance. - - The to compare with this instance. - - true if the specified is equal to this instance; otherwise, false. - - - - - Represents a four dimensional mathematical vector. - - - - - A with all of its components set to zero. - - - - - The X unit (1, 0, 0, 0). - - - - - The Y unit (0, 1, 0, 0). - - - - - The Z unit (0, 0, 1, 0). - - - - - The W unit (0, 0, 0, 1). - - - - - A with all of its components set to one. - - - - - The X component of the vector. - - - - - The Y component of the vector. - - - - - The Z component of the vector. - - - - - The W component of the vector. - - - - - Initializes a new instance of the struct. - - The value that will be assigned to all components. - - - - Initializes a new instance of the struct. - - Initial value for the X component of the vector. - Initial value for the Y component of the vector. - Initial value for the Z component of the vector. - Initial value for the W component of the vector. - - - - Initializes a new instance of the struct. - - A vector containing the values with which to initialize the X, Y, and Z components. - Initial value for the W component of the vector. - - - - Initializes a new instance of the struct. - - A vector containing the values with which to initialize the X and Y components. - Initial value for the Z component of the vector. - Initial value for the W component of the vector. - - - - Initializes a new instance of the struct. - - The values to assign to the X, Y, Z, and W components of the vector. This must be an array with four elements. - Thrown when is null. - Thrown when contains more or less than four elements. - - - - Gets a value indicting whether this instance is normalized. - - - - - Gets a value indicting whether this vector is zero - - - - - Gets or sets the component at the specified index. - - The value of the X, Y, Z, or W component, depending on the index. - The index of the component to access. Use 0 for the X component, 1 for the Y component, 2 for the Z component, and 3 for the W component. - The value of the component at the specified index. - Thrown when the is out of the range [0, 3]. - - - - Calculates the length of the vector. - - The length of the vector. - - may be preferred when only the relative length is needed - and speed is of the essence. - - - - - Calculates the squared length of the vector. - - The squared length of the vector. - - This method may be preferred to when only a relative length is needed - and speed is of the essence. - - - - - Converts the vector into a unit vector. - - - - - Creates an array containing the elements of the vector. - - A four-element array containing the components of the vector. - - - - Adds two vectors. - - The first vector to add. - The second vector to add. - When the method completes, contains the sum of the two vectors. - - - - Adds two vectors. - - The first vector to add. - The second vector to add. - The sum of the two vectors. - - - - Perform a component-wise addition - - The input vector - The scalar value to be added to elements - The vector with added scalar for each element. - - - - Perform a component-wise addition - - The input vector - The scalar value to be added to elements - The vector with added scalar for each element. - - - - Subtracts two vectors. - - The first vector to subtract. - The second vector to subtract. - When the method completes, contains the difference of the two vectors. - - - - Subtracts two vectors. - - The first vector to subtract. - The second vector to subtract. - The difference of the two vectors. - - - - Perform a component-wise subtraction - - The input vector - The scalar value to be subtraced from elements - The vector with subtracted scalar for each element. - - - - Perform a component-wise subtraction - - The input vector - The scalar value to be subtraced from elements - The vector with subtracted scalar for each element. - - - - Perform a component-wise subtraction - - The scalar value to be subtraced from elements - The input vector. - The vector with subtracted scalar for each element. - - - - Perform a component-wise subtraction - - The scalar value to be subtraced from elements - The input vector. - The vector with subtracted scalar for each element. - - - - Scales a vector by the given value. - - The vector to scale. - The amount by which to scale the vector. - When the method completes, contains the scaled vector. - - - - Scales a vector by the given value. - - The vector to scale. - The amount by which to scale the vector. - The scaled vector. - - - - Multiplies a vector with another by performing component-wise multiplication. - - The first vector to multiply. - The second vector to multiply. - When the method completes, contains the multiplied vector. - - - - Multiplies a vector with another by performing component-wise multiplication. - - The first vector to multiply. - The second vector to multiply. - The multiplied vector. - - - - Scales a vector by the given value. - - The vector to scale. - The amount by which to scale the vector. - When the method completes, contains the scaled vector. - - - - Scales a vector by the given value. - - The vector to scale. - The amount by which to scale the vector. - The scaled vector. - - - - Scales a vector by the given value. - - The amount by which to scale the vector. - The vector to scale. - When the method completes, contains the scaled vector. - - - - Scales a vector by the given value. - - The vector to scale. - The amount by which to scale the vector. - The scaled vector. - - - - Reverses the direction of a given vector. - - The vector to negate. - When the method completes, contains a vector facing in the opposite direction. - - - - Reverses the direction of a given vector. - - The vector to negate. - A vector facing in the opposite direction. - - - - Returns a containing the 4D Cartesian coordinates of a point specified in Barycentric coordinates relative to a 4D triangle. - - A containing the 4D Cartesian coordinates of vertex 1 of the triangle. - A containing the 4D Cartesian coordinates of vertex 2 of the triangle. - A containing the 4D Cartesian coordinates of vertex 3 of the triangle. - Barycentric coordinate b2, which expresses the weighting factor toward vertex 2 (specified in ). - Barycentric coordinate b3, which expresses the weighting factor toward vertex 3 (specified in ). - When the method completes, contains the 4D Cartesian coordinates of the specified point. - - - - Returns a containing the 4D Cartesian coordinates of a point specified in Barycentric coordinates relative to a 4D triangle. - - A containing the 4D Cartesian coordinates of vertex 1 of the triangle. - A containing the 4D Cartesian coordinates of vertex 2 of the triangle. - A containing the 4D Cartesian coordinates of vertex 3 of the triangle. - Barycentric coordinate b2, which expresses the weighting factor toward vertex 2 (specified in ). - Barycentric coordinate b3, which expresses the weighting factor toward vertex 3 (specified in ). - A new containing the 4D Cartesian coordinates of the specified point. - - - - Restricts a value to be within a specified range. - - The value to clamp. - The minimum value. - The maximum value. - When the method completes, contains the clamped value. - - - - Restricts a value to be within a specified range. - - The value to clamp. - The minimum value. - The maximum value. - The clamped value. - - - - Calculates the distance between two vectors. - - The first vector. - The second vector. - When the method completes, contains the distance between the two vectors. - - may be preferred when only the relative distance is needed - and speed is of the essence. - - - - - Calculates the distance between two vectors. - - The first vector. - The second vector. - The distance between the two vectors. - - may be preferred when only the relative distance is needed - and speed is of the essence. - - - - - Calculates the squared distance between two vectors. - - The first vector. - The second vector. - When the method completes, contains the squared distance between the two vectors. - Distance squared is the value before taking the square root. - Distance squared can often be used in place of distance if relative comparisons are being made. - For example, consider three points A, B, and C. To determine whether B or C is further from A, - compare the distance between A and B to the distance between A and C. Calculating the two distances - involves two square roots, which are computationally expensive. However, using distance squared - provides the same information and avoids calculating two square roots. - - - - - Calculates the squared distance between two vectors. - - The first vector. - The second vector. - The squared distance between the two vectors. - Distance squared is the value before taking the square root. - Distance squared can often be used in place of distance if relative comparisons are being made. - For example, consider three points A, B, and C. To determine whether B or C is further from A, - compare the distance between A and B to the distance between A and C. Calculating the two distances - involves two square roots, which are computationally expensive. However, using distance squared - provides the same information and avoids calculating two square roots. - - - - - Calculates the dot product of two vectors. - - First source vector - Second source vector. - When the method completes, contains the dot product of the two vectors. - - - - Calculates the dot product of two vectors. - - First source vector. - Second source vector. - The dot product of the two vectors. - - - - Converts the vector into a unit vector. - - The vector to normalize. - When the method completes, contains the normalized vector. - - - - Converts the vector into a unit vector. - - The vector to normalize. - The normalized vector. - - - - Performs a linear interpolation between two vectors. - - Start vector. - End vector. - Value between 0 and 1 indicating the weight of . - When the method completes, contains the linear interpolation of the two vectors. - - Passing a value of 0 will cause to be returned; a value of 1 will cause to be returned. - - - - - Performs a linear interpolation between two vectors. - - Start vector. - End vector. - Value between 0 and 1 indicating the weight of . - The linear interpolation of the two vectors. - - Passing a value of 0 will cause to be returned; a value of 1 will cause to be returned. - - - - - Performs a cubic interpolation between two vectors. - - Start vector. - End vector. - Value between 0 and 1 indicating the weight of . - When the method completes, contains the cubic interpolation of the two vectors. - - - - Performs a cubic interpolation between two vectors. - - Start vector. - End vector. - Value between 0 and 1 indicating the weight of . - The cubic interpolation of the two vectors. - - - - Performs a Hermite spline interpolation. - - First source position vector. - First source tangent vector. - Second source position vector. - Second source tangent vector. - Weighting factor. - When the method completes, contains the result of the Hermite spline interpolation. - - - - Performs a Hermite spline interpolation. - - First source position vector. - First source tangent vector. - Second source position vector. - Second source tangent vector. - Weighting factor. - The result of the Hermite spline interpolation. - - - - Performs a Catmull-Rom interpolation using the specified positions. - - The first position in the interpolation. - The second position in the interpolation. - The third position in the interpolation. - The fourth position in the interpolation. - Weighting factor. - When the method completes, contains the result of the Catmull-Rom interpolation. - - - - Performs a Catmull-Rom interpolation using the specified positions. - - The first position in the interpolation. - The second position in the interpolation. - The third position in the interpolation. - The fourth position in the interpolation. - Weighting factor. - A vector that is the result of the Catmull-Rom interpolation. - - - - Returns a vector containing the largest components of the specified vectors. - - The first source vector. - The second source vector. - When the method completes, contains an new vector composed of the largest components of the source vectors. - - - - Returns a vector containing the largest components of the specified vectors. - - The first source vector. - The second source vector. - A vector containing the largest components of the source vectors. - - - - Returns a vector containing the smallest components of the specified vectors. - - The first source vector. - The second source vector. - When the method completes, contains an new vector composed of the smallest components of the source vectors. - - - - Returns a vector containing the smallest components of the specified vectors. - - The first source vector. - The second source vector. - A vector containing the smallest components of the source vectors. - - - - Orthogonalizes a list of vectors. - - The list of orthogonalized vectors. - The list of vectors to orthogonalize. - - Orthogonalization is the process of making all vectors orthogonal to each other. This - means that any given vector in the list will be orthogonal to any other given vector in the - list. - Because this method uses the modified Gram-Schmidt process, the resulting vectors - tend to be numerically unstable. The numeric stability decreases according to the vectors - position in the list so that the first vector is the most stable and the last vector is the - least stable. - - Thrown when or is null. - Thrown when is shorter in length than . - - - - Orthonormalizes a list of vectors. - - The list of orthonormalized vectors. - The list of vectors to orthonormalize. - - Orthonormalization is the process of making all vectors orthogonal to each - other and making all vectors of unit length. This means that any given vector will - be orthogonal to any other given vector in the list. - Because this method uses the modified Gram-Schmidt process, the resulting vectors - tend to be numerically unstable. The numeric stability decreases according to the vectors - position in the list so that the first vector is the most stable and the last vector is the - least stable. - - Thrown when or is null. - Thrown when is shorter in length than . - - - - Transforms a 4D vector by the given rotation. - - The vector to rotate. - The rotation to apply. - When the method completes, contains the transformed . - - - - Transforms a 4D vector by the given rotation. - - The vector to rotate. - The rotation to apply. - The transformed . - - - - Transforms an array of vectors by the given rotation. - - The array of vectors to transform. - The rotation to apply. - The array for which the transformed vectors are stored. - This array may be the same array as . - Thrown when or is null. - Thrown when is shorter in length than . - - - - Transforms a 4D vector by the given . - - The source vector. - The transformation . - When the method completes, contains the transformed . - - - - Transforms a 4D vector by the given . - - The source vector. - The transformation . - The transformed . - - - - Transforms an array of 4D vectors by the given . - - The array of vectors to transform. - The transformation . - The array for which the transformed vectors are stored. - This array may be the same array as . - Thrown when or is null. - Thrown when is shorter in length than . - - - - Adds two vectors. - - The first vector to add. - The second vector to add. - The sum of the two vectors. - - - - Multiplies a vector with another by performing component-wise multiplication equivalent to . - - The first vector to multiply. - The second vector to multiply. - The multiplication of the two vectors. - - - - Assert a vector (return it unchanged). - - The vector to assert (unchanged). - The asserted (unchanged) vector. - - - - Subtracts two vectors. - - The first vector to subtract. - The second vector to subtract. - The difference of the two vectors. - - - - Reverses the direction of a given vector. - - The vector to negate. - A vector facing in the opposite direction. - - - - Scales a vector by the given value. - - The vector to scale. - The amount by which to scale the vector. - The scaled vector. - - - - Scales a vector by the given value. - - The vector to scale. - The amount by which to scale the vector. - The scaled vector. - - - - Scales a vector by the given value. - - The vector to scale. - The amount by which to scale the vector. - The scaled vector. - - - - Scales a vector by the given value. - - The amount by which to scale the vector. - The vector to scale. - The scaled vector. - - - - Scales a vector by the given value. - - The vector to scale. - The amount by which to scale the vector. - The scaled vector. - - - - Perform a component-wise addition - - The input vector. - The scalar value to be added on elements - The vector with added scalar for each element. - - - - Perform a component-wise addition - - The input vector. - The scalar value to be added on elements - The vector with added scalar for each element. - - - - Perform a component-wise subtraction - - The input vector. - The scalar value to be subtraced from elements - The vector with subtraced scalar from each element. - - - - Perform a component-wise subtraction - - The input vector. - The scalar value to be subtraced from elements - The vector with subtraced scalar from each element. - - - - Tests for equality between two objects. - - The first value to compare. - The second value to compare. - true if has the same value as ; otherwise, false. - - - - Tests for inequality between two objects. - - The first value to compare. - The second value to compare. - true if has a different value than ; otherwise, false. - - - - Performs an explicit conversion from to . - - The value. - The result of the conversion. - - - - Performs an explicit conversion from to . - - The value. - The result of the conversion. - - - - Returns a that represents this instance. - - - A that represents this instance. - - - - - Returns a that represents this instance. - - The format. - - A that represents this instance. - - - - - Returns a that represents this instance. - - The format provider. - - A that represents this instance. - - - - - Returns a that represents this instance. - - The format. - The format provider. - - A that represents this instance. - - - - - Returns a hash code for this instance. - - - A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. - - - - - Determines whether the specified is equal to this instance. - - The to compare with this instance. - - true if the specified is equal to this instance; otherwise, false. - - - - - Determines whether the specified is equal to this instance. - - The to compare with this instance. - - true if the specified is equal to this instance; otherwise, false. - - - - - Determines whether the specified is equal to this instance. - - The to compare with this instance. - - true if the specified is equal to this instance; otherwise, false. - - - - - Returns arccos value of p0. - - - - - Does stuff like this: - gyazo.com/7fcb78ea3520e3dbc5b2c0c0f3712617 - Example: - int GetHash = GET_HASH_KEY("fe_menu_version_corona_lobby"); - ACTIVATE_FRONTEND_MENU(GetHash, 0, -1); - BOOL p1 is a toggle to define the game in pause. - int p2 is unknown but -1 always works, not sure why though. - [30/03/2017] ins1de : - the int p2 is actually a component variable. When the pause menu is visible, it opens the tab related to it. - Example : Function.Call(Hash.ACTIVATE_FRONTEND_MENU,-1171018317, 0, 42); - Result : Opens the "Online" tab without pausing the menu, with -1 it opens the map. - - - - - seems to be frequently used with the NETWORK::NET_TO_x natives, particularly with vehicles. It is often the only ROPE:: native in a script. - - - - - Same as SET_PED_ARMOUR, but ADDS 'amount' to the armor the Ped already has. - - - - - Creates a blip for the specified coordinates. You can use `SET_BLIP_` natives to change the blip. - - - - - Returns red ( default ) blip attached to entity. - Example: - Blip blip; //Put this outside your case or option - blip = UI::ADD_BLIP_FOR_ENTITY(YourPedOrBodyguardName); - UI::SET_BLIP_AS_FRIENDLY(blip, true); - - - - - I filled p1-p6 (the floats) as they are as other natives with 6 floats in a row are similar and I see no other method. So if a test from anyone proves them wrong please correct. - p7 (length) determines the length of the spline, affects camera path and duration of transition between previous node and this one - p8 big values ~100 will slow down the camera movement before reaching this node - p9 != 0 seems to override the rotation/pitch (bool?) - - - - - decal types: - public enum DecalTypes - { - splatters_blood = 1010, - splatters_blood_dir = 1015, - splatters_blood_mist = 1017, - splatters_mud = 1020, - splatters_paint = 1030, - splatters_water = 1040, - splatters_water_hydrant = 1050, - splatters_blood2 = 1110, - weapImpact_metal = 4010, - weapImpact_concrete = 4020, - weapImpact_mattress = 4030, - weapImpact_mud = 4032, - weapImpact_wood = 4050, - weapImpact_sand = 4053, - weapImpact_cardboard = 4040, - weapImpact_melee_glass = 4100, - weapImpact_glass_blood = 4102, - weapImpact_glass_blood2 = 4104, - weapImpact_shotgun_paper = 4200, - weapImpact_shotgun_mattress, - weapImpact_shotgun_metal, - weapImpact_shotgun_wood, - weapImpact_shotgun_dirt, - weapImpact_shotgun_tvscreen, - weapImpact_shotgun_tvscreen2, - weapImpact_shotgun_tvscreen3, - weapImpact_melee_concrete = 4310, - weapImpact_melee_wood = 4312, - weapImpact_melee_metal = 4314, - burn1 = 4421, - burn2, - burn3, - burn4, - burn5, - bang_concrete_bang = 5000, - bang_concrete_bang2, - bang_bullet_bang, - bang_bullet_bang2 = 5004, - bang_glass = 5031, - bang_glass2, - solidPool_water = 9000, - solidPool_blood, - solidPool_oil, - solidPool_petrol, - solidPool_mud, - porousPool_water, - porousPool_blood, - porousPool_oil, - porousPool_petrol, - porousPool_mud, - porousPool_water_ped_drip, - liquidTrail_water = 9050 - } - - - - - Example: - GRAPHICS::ADD_ENTITY_ICON(a_0, "MP_Arrow"); - I tried this and nothing happened... - - - - - BOOL isAudible = If explosion makes a sound. - BOOL isInvisible = If the explosion is invisible or not. - this native is missing a new argument: noDamage - nodamage = false: damage || nodamage = true: no damage - enum ExplosionTypes - { - EXPLOSION_GRENADE, - EXPLOSION_GRENADELAUNCHER, - EXPLOSION_STICKYBOMB, - EXPLOSION_MOLOTOV, - EXPLOSION_ROCKET, - EXPLOSION_TANKSHELL, - EXPLOSION_HI_OCTANE, - EXPLOSION_CAR, - EXPLOSION_PLANE, - EXPLOSION_PETROL_PUMP, - EXPLOSION_BIKE, - EXPLOSION_DIR_STEAM, - EXPLOSION_DIR_FLAME, - EXPLOSION_DIR_WATER_HYDRANT, - EXPLOSION_DIR_GAS_CANISTER, - EXPLOSION_BOAT, - EXPLOSION_SHIP_DESTROY, - EXPLOSION_TRUCK, - EXPLOSION_BULLET, - EXPLOSION_SMOKEGRENADELAUNCHER, - EXPLOSION_SMOKEGRENADE, - EXPLOSION_BZGAS, - EXPLOSION_FLARE, - EXPLOSION_GAS_CANISTER, - EXPLOSION_EXTINGUISHER, - EXPLOSION_PROGRAMMABLEAR, - EXPLOSION_TRAIN, - EXPLOSION_BARREL, - EXPLOSION_PROPANE, - EXPLOSION_BLIMP, - EXPLOSION_DIR_FLAME_EXPLODE, - EXPLOSION_TANKER, - EXPLOSION_PLANE_ROCKET, - EXPLOSION_VEHICLE_BULLET, - EXPLOSION_GAS_TANK, - EXPLOSION_BIRD_CRAP - }; - - - - - - - - - - Returns the index of the newly created hospital spawn point. - p3 might be radius? - - - - - NOTE: ones that are -1, 0 - 35 are determined by a function where it gets a TextLabel from a global then runs, - _GET_TEXT_SUBSTRING and depending on what the result is it goes in check order of 0 - 9 then A - Z then z (lowercase). So it will then return 0 - 35 or -1 if it's 'z'. The func to handle that ^^ is func_67 in dialog_handler.c atleast in TU27 Xbox360 scripts. - p0 is -1, 0 - p1 is a char or string (whatever you wanna call it) - p2 is Global 10597 + i * 6. 'i' is a while(i < 70) loop - p3 is again -1, 0 - 35 - p4 is again -1, 0 - 35 - p5 is either 0 or 1 (bool ?) - p6 is either 0 or 1 (The func to determine this is bool) - p7 is either 0 or 1 (The func to determine this is bool) - p8 is either 0 or 1 (The func to determine this is bool) - p9 is 0 - 3 (Determined by func_60 in dialogue_handler.c) - p10 is either 0 or 1 (The func to determine this is bool) - p11 is either 0 or 1 (The func to determine this is bool) - p12 is unknown as in TU27 X360 scripts it only goes to p11. - - - - - Loads a minimap overlay from a GFx file in the current resource. - - - - - hash collision? - - - - - enum ExplosionTypes - { - EXPLOSION_GRENADE, - EXPLOSION_GRENADELAUNCHER, - EXPLOSION_STICKYBOMB, - EXPLOSION_MOLOTOV, - EXPLOSION_ROCKET, - EXPLOSION_TANKSHELL, - EXPLOSION_HI_OCTANE, - EXPLOSION_CAR, - EXPLOSION_PLANE, - EXPLOSION_PETROL_PUMP, - EXPLOSION_BIKE, - EXPLOSION_DIR_STEAM, - EXPLOSION_DIR_FLAME, - EXPLOSION_DIR_WATER_HYDRANT, - EXPLOSION_DIR_GAS_CANISTER, - EXPLOSION_BOAT, - EXPLOSION_SHIP_DESTROY, - EXPLOSION_TRUCK, - EXPLOSION_BULLET, - EXPLOSION_SMOKEGRENADELAUNCHER, - EXPLOSION_SMOKEGRENADE, - EXPLOSION_BZGAS, - EXPLOSION_FLARE, - EXPLOSION_GAS_CANISTER, - EXPLOSION_EXTINGUISHER, - EXPLOSION_PROGRAMMABLEAR, - EXPLOSION_TRAIN, - EXPLOSION_BARREL, - EXPLOSION_PROPANE, - EXPLOSION_BLIMP, - EXPLOSION_DIR_FLAME_EXPLODE, - EXPLOSION_TANKER, - EXPLOSION_PLANE_ROCKET, - EXPLOSION_VEHICLE_BULLET, - EXPLOSION_GAS_TANK, - EXPLOSION_BIRD_CRAP - }; - BOOL isAudible = If explosion makes a sound. - BOOL isInvisible = If the explosion is invisible or not. - - - - - Example: - AI::ADD_PATROL_ROUTE_NODE(2, "WORLD_HUMAN_GUARD_STAND", -193.4915, -2378.864990234375, 10.9719, -193.4915, -2378.864990234375, 10.9719, 3000); - p0 is between 0 and 4 in the scripts. - p1 is "WORLD_HUMAN_GUARD_STAND" or "StandGuard". - p2, p3 and p4 is only one parameter sometimes in the scripts. Most likely a Vector3 hence p2, p3 and p4 are coordinates. - Examples: - AI::ADD_PATROL_ROUTE_NODE(1, "WORLD_HUMAN_GUARD_STAND", l_739[7 -- [[3]] ], 0.0, 0.0, 0.0, 0); - AI::ADD_PATROL_ROUTE_NODE(1, "WORLD_HUMAN_GUARD_STAND", l_B0[17 -- [[44]] ]._f3, l_B0[17 -- [[44]] ]._f3, 2000); - p5, p6 and p7 are for example set to: 1599.0406494140625, 2713.392578125, 44.4309. - p8 is an int, often random set to for example: GAMEPLAY::GET_RANDOM_INT_IN_RANGE(5000, 10000). - - - - - 4 calls in the b617d scripts. The only one with p0 and p2 in clear text: - AUDIO::ADD_PED_TO_CONVERSATION(5, l_AF, "DINAPOLI"); - ================================================= - One of the 2 calls in dialogue_handler.c p0 is in a while-loop, and so is determined to also possibly be 0 - 15. - Based on it asking if does_entity_exist for the global I have determined that p1 is, in fact, the ped, but could be wrong. - - - - - Can't select void. This function returns nothing. The hash of the created relationship group is output in the second parameter. - - - - - Experimental natives, please do not use in a live environment. - - - - - Creates a rope at the specific position, that extends in the specified direction when not attached to any entities. - __ - Add_Rope(pos.x,pos.y,pos.z,0.0,0.0,0.0,20.0,4,20.0,1.0,0.0,false,false,false,5.0,false,NULL) - When attached, Position<vector> does not matter - When attached, Angle<vector> does not matter - Rope Type: - 4 and bellow is a thick rope - 5 and up are small metal wires - 0 crashes the game - Max_length - Rope is forced to this length, generally best to keep this the same as your rope length. - Rigid - If max length is zero, and this is set to false the rope will become rigid (it will force a specific distance, what ever length is, between the objects). - breakable - Whether or not shooting the rope will break it. - unkPtr - unknown ptr, always 0 in orig scripts - __ - Lengths can be calculated like so: - float distance = abs(x1 - x2) + abs(y1 - y2) + abs(z1 - z2); // Rope length - NOTES: - Rope does NOT interact with anything you attach it to, in some cases it make interact with the world AFTER it breaks (seems to occur if you set the type to -1). - Rope will sometimes contract and fall to the ground like you'd expect it to, but since it doesn't interact with the world the effect is just jaring. - - - - - BRAIN::ADD_SCRIPT_TO_RANDOM_PED("pb_prostitute", ${s_f_y_hooker_01}, 100, 0); - ----- - Hardcoded to not work in Multiplayer. - ------ - Which I'm sure can easily be bypassed by nop'ing the branch preventing it from working if you are in multiplayer lol. Which would still be pointless since you don't need this to make peds do what you wish. - - - - - duration is float here - Event types- camx.me/gtav/tasks/shockingevents.txt - - - - - duration is float here - Event types - camx.me/gtav/tasks/shockingevents.txt - - - - - Adds an arbitrary string as a text component placeholder, replacing `~a~` in the current text command's text label. - - See the documentation on text formatting for more information. - - - - - It adds the localized text of the specified GXT entry name. Eg. if the argument is GET_HASH_KEY("ES_HELP"), adds "Continue". Just uses a text labels hash key - - - - - Adds a timer (e.g. "00:00:00:000"). The appearance of the timer depends on the flags, which needs more research. - - - - - This native (along with 0x5F68520888E69014 and 0x6C188BE134E074AA) do not actually filter anything. They simply add the provided text (as of 944) - - - - - Hash collision! - _IS_MP_GAMER_TAG_ACTIVE_2 - - - - - x, y, z: offset in world coords from some entity. - - - - - Example from michael2 script. - CAM::ANIMATED_SHAKE_CAM(l_5069, "shake_cam_all@", "light", "", 1f); - - - - - damages a ped with the given amount - ---- - armorFirst means it will damage/lower the armor first before damaging the player. - setting damageAmount to a negative amount will cause the player or the armor (depending on armorFirst) to be healed by damageAmount instead. - - - - - Documented here: - gtaforums.com/topic/885669-precisely-define-object-physics/ - gtaforums.com/topic/887362-apply-forces-and-momentums-to-entityobject/ - forceFlags: - First bit (lowest): Strong force flag, factor 100 - Second bit: Unkown flag - Third bit: Momentum flag=1 (vector (x,y,z) is a momentum, more research needed) - If higher bits are unequal 0 the function doesn't applay any forces at all. - (As integer possible values are 0-7) - 0: weak force - 1: strong force - 2: same as 0 (2nd bit?) - 3: same as 1 - 4: weak momentum - 5: strong momentum - 6: same as 4 - 7: same as 5 - isDirectionRel: vector defined in local (body-fixed) coordinate frame - isForceRel: if true the force gets multiplied with the objects mass (this is why it was known as highForce) and different objects will have the same acceleration. - - - - - Found one occurence in re_crashrescue.c4 - PED::APPLY_PED_BLOOD(l_4B, 3, 0.0, 0.0, 0.0, "wound_sheet"); - - - - - APPLY_PED_DAMAGE_DECAL(ped, 1, 0.5f, 0.513f, 0f, 1f, unk, 0, 0, "blushing"); - - - - - Damage Packs: - "SCR_TrevorTreeBang" - "HOSPITAL_0" - "HOSPITAL_1" - "HOSPITAL_2" - "HOSPITAL_3" - "HOSPITAL_4" - "HOSPITAL_5" - "HOSPITAL_6" - "HOSPITAL_7" - "HOSPITAL_8" - "HOSPITAL_9" - "SCR_Dumpster" - "BigHitByVehicle" - "SCR_Finale_Michael_Face" - "SCR_Franklin_finb" - "SCR_Finale_Michael" - "SCR_Franklin_finb2" - "Explosion_Med" - "SCR_Torture" - "SCR_TracySplash" - "Skin_Melee_0" - Additional damage packs: - gist.github.com/alexguirre/f3f47f75ddcf617f416f3c8a55ae2227 - - - - - Called in the gamescripts like: - APP::APP_SET_APP("car"); - APP::APP_SET_APP("dog"); - - - - - Appears to return false if any window is broken. - - - - - Returns false if every seat is occupied. - - - - - is this like strcmp?? - - - - - Returns arcsin value of p0. - - - - - Routes: "1_FIBStairs", "2_FIBStairs", "3_FIBStairs", "4_FIBStairs", "5_FIBStairs", "5_TowardsFire", "6a_FIBStairs", "7_FIBStairs", "8_FIBStairs", "Aprtmnt_1", "AssAfterLift", "ATM_1", "coroner2", "coroner_stairs", "f5_jimmy1", "fame1", "family5b", "family5c", "Family5d", "family5d", "FIB_Glass1", "FIB_Glass2", "FIB_Glass3", "finaBroute1A", "finalb1st", "finalB1sta", "finalbround", "finalbroute2", "Hairdresser1", "jan_foyet_ft_door", "Jo_3", "Lemar1", "Lemar2", "mansion_1", "Mansion_1", "pols_1", "pols_2", "pols_3", "pols_4", "pols_5", "pols_6", "pols_7", "pols_8", "Pro_S1", "Pro_S1a", "Pro_S2", "Towards_case", "trev_steps", "tunrs1", "tunrs2", "tunrs3", "Wave01457s" - - - - - Returns arctan value of p0. - - - - - Last param determines if its relative to the Entity - - - - - Attaches entity 1 to entity 2. - - - - - Attaches entity1 to bone (boneIndex) of entity2. - boneIndex - this is different to boneID, use GET_PED_BONE_INDEX to get the index from the ID. use the index for attaching to specific bones. entity1 will be attached to entity2's centre if bone index given doesn't correspond to bone indexes for that entity type. - useSoftPinning - when 2 entities with collision collide and form into a ball they will break the attachment of the entity that they were attached to. Or when an entity is attached far away and then the resets. - collision - controls collision between the two entities (FALSE disables collision). - isPed - pitch doesnt work when false and roll will only work on negative numbers (only peds) - vertexIndex - position of vertex - fixedRot - if false it ignores entity vector - - - - - breakForce is the amount of force required to break the bond. - fixedRot - if false it ignores entity vector - p15 - is 1 or 0 in scripts - unknoun what it does - collision - controls collision between the two entities (FALSE disables collision). - teleport - do not teleport entity to be attached to the position of the bone Index of the target entity (if 1, entity will not be teleported to target bone) - p18 - is always 2 in scripts. - ------------------------- - teleport is not exactly "doNotTeleport". What it actually does is the following: - if true, entities will be attached as if loosely tethered, up to the maximum offset position specified. Almost as if attached by an invisible rope. - if false, entities will be attached in a fixed position as specified in the offset position. - When p15 = true, it seems to force teleport to false. - It also lets the Rotation params actually work. - - - - - The position supplied can be anywhere, and the entity should anchor relative to that point from it's origin. - - - - - Might be more appropriate in AUDIO? - - - - - HookOffset defines where the hook is attached. leave at 0 for default attachment. - When using the tow truck online, this is not used (set a breakpoint and never called during tow truck attachment) - - - - - Push a function from the Scaleform onto the stack - - - - - clears a print text command with this text - - - - - Used to be known as _SET_TEXT_COMPONENT_FORMAT - - - - - The following were found in the decompiled script files: - STRING, TWOSTRINGS, NUMBER, PERCENTAGE, FO_TWO_NUM, ESMINDOLLA, ESDOLLA, MTPHPER_XPNO, AHD_DIST, CMOD_STAT_0, CMOD_STAT_1, CMOD_STAT_2, CMOD_STAT_3, DFLT_MNU_OPT, F3A_TRAFDEST, ES_HELP_SOC3 - ESDOLLA - ESMINDOLLA - cash (negative) - Used to be known as _SET_TEXT_ENTRY - - - - - nothin doin. - BOOL Message(char* text) - { - BEGIN_TEXT_COMMAND_IS_MESSAGE_DISPLAYED("STRING"); - ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(text); - return END_TEXT_COMMAND_IS_MESSAGE_DISPLAYED(); - } - - - - - BOOL IsContextActive(char *ctx) - { - BEGIN_TEXT_COMMAND_IS_THIS_HELP_MESSAGE_BEING_DISPLAYED(ctx); - return END_TEXT_COMMAND_IS_THIS_HELP_MESSAGE_BEING_DISPLAYED(0); - } - - - - - Used to be known as _SET_TEXT_ENTRY_2 - void ShowSubtitle(char *text) - { - BEGIN_TEXT_COMMAND_PRINT("STRING"); - ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(text); - END_TEXT_COMMAND_PRINT(2000, 1); - } - - - - - Previously called _BEGIN_TEXT_COMPONENT - Called prior to adding a text component to the UI. After doing so, GRAPHICS::END_TEXT_COMMAND_SCALEFORM_STRING is called. - Examples: - GRAPHICS::BEGIN_TEXT_COMMAND_SCALEFORM_STRING("NUMBER"); - UI::ADD_TEXT_COMPONENT_INTEGER(GAMEPLAY::ABSI(a_1)); - GRAPHICS::END_TEXT_COMMAND_SCALEFORM_STRING(); - GRAPHICS::BEGIN_TEXT_COMMAND_SCALEFORM_STRING("STRING"); - UI::_ADD_TEXT_COMPONENT_STRING(a_2); - GRAPHICS::END_TEXT_COMMAND_SCALEFORM_STRING(); - GRAPHICS::BEGIN_TEXT_COMMAND_SCALEFORM_STRING("STRTNM2"); - UI::_0x17299B63C7683A2B(v_3); - UI::_0x17299B63C7683A2B(v_4); - GRAPHICS::END_TEXT_COMMAND_SCALEFORM_STRING(); - GRAPHICS::BEGIN_TEXT_COMMAND_SCALEFORM_STRING("STRTNM1"); - UI::_0x17299B63C7683A2B(v_3); - GRAPHICS::END_TEXT_COMMAND_SCALEFORM_STRING(); - - - - - Starts a text command to change the name of a blip displayed in the pause menu. - - This should be paired with [`END_TEXT_COMMAND_SET_BLIP_NAME`](#_0xBC38B49BCB83BC9B), once adding all required text components. - - - - - Plays the siren sound of a vehicle which is otherwise activated when fastly double-pressing the horn key. - Only works on vehicles with a police siren. - - - - - Calculates the travel distance between a set of points. - Doesn't seem to correlate with distance on gps sometimes. - - - - - This is similar to the PushScaleformMovieFunction natives, except it calls in the `TIMELINE` of a minimap overlay. - - - - - Calls the Scaleform function. - - - - - Cancels the currently executing event. - - - - - All music event names found in the b617d scripts: pastebin.com/GnYt0R3P - - - - - Prevents the ped from going limp. - [Example: Can prevent peds from falling when standing on moving vehicles.] - - - - - This one is weird and seems to return a TRUE state regardless of whether the phone is visible on screen or tucked away. - I can confirm the above. This function is hard-coded to always return 1. - - - - - if (CAN_REGISTER_MISSION_ENTITIES(20, 20, 20, 10)) - { - } - - - - - modelHash (p1) was always 0 in R* scripts - - - - - this returns if you can use the weapon while using a parachute - - - - - Does something similar to INTERIOR::DISABLE_INTERIOR - - - - - I'm guessing this rounds a float value up to the next whole number, and FLOOR rounds it down - - - - - hash collision??? - - - - - b2 and/or b3 maybe got something to do with keeping values from the last ped. Both of them set to 1 works great. <br/><br/>Examples from the decompiled scripts:<br/><br/>PLAYER::CHANGE_PLAYER_PED(PLAYER::PLAYER_ID(), l_5C0[4 -- [[14]] ], 0, 1);<br/>PLAYER::CHANGE_PLAYER_PED(PLAYER::PLAYER_ID(), a_0[a_0._f7 -- [[1]] ], a_2, 0);<br/><br/><br/>===========================================================<br/>The only way I ever got this to work in GTA Online once is by setting both to 0, 0. However, when you switch from your online character to whomever, your character will start walking away 'as if you left the game.' If from there you attempt to call this native once more to switch back to you online ped. You will freeze or if you try changing to another ped. I've tried all posibilities so far.<br/>1, 1 (Freeze), 0, 0(Works Once), 1, 0 & 0, 1 (Freeze). Note of course trying to call this on another online player will crash. Anyone have any idea if implementing a blr within the xex itself on a possible check if it would prevent this freezing?<br/>=========================================================== - - - - - Removes broken glass particles. - - - - - List of component/props ID - gtaxscripting.blogspot.com/2016/04/gta-v-peds-component-and-props.html - - - - - This function also has a p2, unknown. Signature AUDIO::CLEAR_AMBIENT_ZONE_STATE(char* zoneName, bool p1, Any p2); - Still needs more research. - Here are the names I've found: pastebin.com/AfA0Qjyv - New Ambient Zone List (Combind with old): pastebin.com/h8BsKgUD -DasChaos - - - - - Example: CLEAR_AREA(0, 0, 0, 30, true, false, false, false); - - - - - I looked through the PC scripts that this site provides you with a link to find. It shows the last param mainly uses, (0, 2, 6, 16, and 17) so I am going to assume it is a type of flag. - - - - - Example: CLEAR_AREA_OF_PEDS(0, 0, 0, 10000, 1); - - - - - Example: CLEAR_AREA_OF_VEHICLES(0, 0, 0, 10000, false, false, false, false, false); - - - - - This sets bit [offset] of [address] to off. - Example: - GAMEPLAY::CLEAR_BIT(&bitAddress, 1); - To check if this bit has been enabled: - GAMEPLAY::IS_BIT_SET(bitAddress, 1); // will return 0 afterwards - - - - - Resets the screen's draw-origin which was changed by the function GRAPHICS::SET_DRAW_ORIGIN(...) back to x=0,y=0. - See GRAPHICS::SET_DRAW_ORIGIN(...) for further information. - - - - - p0 looks like int in script - - - - - Clears the GPS flags. Only the script that originally called SET_GPS_FLAGS can clear them. - Doesn't seem like the flags are actually read by the game at all. - - - - - Somehow related to changing ped's clothes. - - - - - p1: from 0 to 5 in the b617d scripts. - p2: "blushing" and "ALL" found in the b617d scripts. - - - - - List of component/props ID - gtaxscripting.blogspot.com/2016/04/gta-v-peds-component-and-props.html - - - - - Removes the scubagear (for mp male: component id: 8, drawableId: 123, textureId: any) from peds. Does not play the 'remove scuba gear' animation, but instantly removes it. - - - - - Immediately stops the pedestrian from whatever it's doing. They stop fighting, animations, etc. they forget what they were doing. - - - - - It clears the wetness of the selected Ped/Player. Clothes have to be wet to notice the difference. - - - - - This executes at the same as speed as PLAYER::SET_PLAYER_WANTED_LEVEL(player, 0, false); - PLAYER::GET_PLAYER_WANTED_LEVEL(player); executes in less than half the time. Which means that it's worth first checking if the wanted level needs to be cleared before clearing. However, this is mostly about good code practice and can important in other situations. The difference in time in this example is negligible. - - - - - Only used once in the decompiled scripts. Seems to be related to scripted vehicle generators. - Modified example from "am_imp_exp.c4", line 6418: - -- [[ popSchedules[0] = ZONE::GET_ZONE_POPSCHEDULE(ZONE::GET_ZONE_AT_COORDS(891.3, 807.9, 188.1)); - etc. - ]] - STREAMING::SET_MODEL_AS_NO_LONGER_NEEDED(vehicleHash); - ZONE::CLEAR_POPSCHEDULE_OVERRIDE_VEHICLE_MODEL(popSchedules[index]); - - - - - Clears the relationship between two groups. This should be called twice (once for each group). - Relationship types: - 0 = Companion - 1 = Respect - 2 = Like - 3 = Neutral - 4 = Dislike - 5 = Hate - 255 = Pedestrians - (Credits: Inco) - Example: - PED::CLEAR_RELATIONSHIP_BETWEEN_GROUPS(2, l_1017, 0xA49E591C); - PED::CLEAR_RELATIONSHIP_BETWEEN_GROUPS(2, 0xA49E591C, l_1017); - - - - - p0: found arguments in the b617d scripts: pastebin.com/X5akCN7z - - - - - thisScriptCheck - can be destroyed if it belongs to the calling script. - Example of Cloning Your Player: - CLONE_PED(PLAYER_PED_ID(), GET_ENTITY_HEADING(PLAYER_PED_ID()), 0, 1); - - - - - What exactly is the difference? What does this exactly do by chance? - ^ Copies ped's components and props to targetPed. - --------------------------------------------------------------------------------- - | Internally has a 3rd param (bool) which is set to true by default | - - - - - Commits the backing pixels to the specified runtime texture. - - - - - Compares two strings up to a specified number of characters. - Parameters: - str1 - String to be compared. - str2 - String to be compared. - matchCase - Comparison will be case-sensitive. - maxLength - Maximum number of characters to compare. A value of -1 indicates an infinite length. - Returns: - A value indicating the relationship between the strings: - <0 - The first non-matching character in 'str1' is less than the one in 'str2'. (e.g. 'A' < 'B', so result = -1) - 0 - The contents of both strings are equal. - >0 - The first non-matching character in 'str1' is less than the one in 'str2'. (e.g. 'B' > 'A', so result = 1) - Examples: - GAMEPLAY::COMPARE_STRINGS("STRING", "string", false, -1); // 0; equal - GAMEPLAY::COMPARE_STRINGS("TESTING", "test", false, 4); // 0; equal - GAMEPLAY::COMPARE_STRINGS("R2D2", "R2xx", false, 2); // 0; equal - GAMEPLAY::COMPARE_STRINGS("foo", "bar", false, -1); // 4; 'f' > 'b' - GAMEPLAY::COMPARE_STRINGS("A", "A", true, 1); // 0; equal - When comparing case-sensitive strings, lower-case characters are greater than upper-case characters: - GAMEPLAY::COMPARE_STRINGS("A", "a", true, 1); // -1; 'A' < 'a' - GAMEPLAY::COMPARE_STRINGS("a", "A", true, 1); // 1; 'a' > 'A' - - - - - Works for vehicles with a retractable landing gear - landing gear states: - 0: Deployed - 1: Closing - 2: Opening - 3: Retracted - - - - - Forces the ped to use the mounted weapon. - Returns false if task is not possible. - - - - - Used for doing money drop - Pickup hashes: pastebin.com/8EuSv2r1 - - - - - "DEFAULT_SCRIPTED_CAMERA" - "DEFAULT_ANIMATED_CAMERA" - "DEFAULT_SPLINE_CAMERA" - "DEFAULT_SCRIPTED_FLY_CAMERA" - "TIMED_SPLINE_CAMERA" - - - - - CAM::_GET_GAMEPLAY_CAM_COORDS can be used instead of posX,Y,Z - CAM::_GET_GAMEPLAY_CAM_ROT can be used instead of rotX,Y,Z - CAM::_80EC114669DAEFF4() can be used instead of p7 (Possible p7 is FOV parameter. ) - p8 ??? - p9 uses 2 by default - - - - - camName is always set to "DEFAULT_SCRIPTED_CAMERA" in Rockstar's scripts. - ------------ - Camera names found in the b617d scripts: - "DEFAULT_ANIMATED_CAMERA" - "DEFAULT_SCRIPTED_CAMERA" - "DEFAULT_SCRIPTED_FLY_CAMERA" - "DEFAULT_SPLINE_CAMERA" - ------------ - Side Note: It seems p8 is basically to represent what would be the bool p1 within CREATE_CAM native. As well as the p9 since it's always 2 in scripts seems to represent what would be the last param within SET_CAM_ROT native which normally would be 2. - - - - - Creates a checkpoint. Returns the handle of the checkpoint. - 20/03/17 : Attention, checkpoints are already handled by the game itself, so you must not loop it like markers. - Parameters: - * type - The type of checkpoint to create. See below for a list of checkpoint types. - * pos1 - The position of the checkpoint. - * pos2 - The position of the next checkpoint to point to. - * radius - The radius of the checkpoint. - * color - The color of the checkpoint. - * reserved - Special parameter, see below for details. Usually set to 0 in the scripts. - Checkpoint types: - 0-4---------Cylinder: 1 arrow, 2 arrow, 3 arrows, CycleArrow, Checker - 5-9---------Cylinder: 1 arrow, 2 arrow, 3 arrows, CycleArrow, Checker - 10-14-------Ring: 1 arrow, 2 arrow, 3 arrows, CycleArrow, Checker - 15-19-------1 arrow, 2 arrow, 3 arrows, CycleArrow, Checker - 20-24-------Cylinder: 1 arrow, 2 arrow, 3 arrows, CycleArrow, Checker - 25-29-------Cylinder: 1 arrow, 2 arrow, 3 arrows, CycleArrow, Checker - 30-34-------Cylinder: 1 arrow, 2 arrow, 3 arrows, CycleArrow, Checker - 35-38-------Ring: Airplane Up, Left, Right, UpsideDown - 39----------? - 40----------Ring: just a ring - 41----------? - 42-44-------Cylinder w/ number (uses 'reserved' parameter) - 45-47-------Cylinder no arrow or number - If using type 42-44, reserved sets number / number and shape to display - 0-99------------Just numbers (0-99) - 100-109-----------------Arrow (0-9) - 110-119------------Two arrows (0-9) - 120-129----------Three arrows (0-9) - 130-139----------------Circle (0-9) - 140-149------------CycleArrow (0-9) - 150-159----------------Circle (0-9) - 160-169----Circle w/ pointer (0-9) - 170-179-------Perforated ring (0-9) - 180-189----------------Sphere (0-9) - - - - - Creates a DUI browser. This can be used to draw on a runtime texture using CREATE_RUNTIME_TEXTURE_FROM_DUI_HANDLE. - - - - - Creates a new ped group. - Groups can contain up to 8 peds. - The parameter is unused. - Returns a handle to the created group, or 0 if a group couldn't be created. - - - - - enum IncidentTypes - { - FireDepartment = 3, - Paramedics = 5, - Police = 7, - PedsInCavalcades = 11, - Merryweather = 14 - }; - As for the 'police' incident, it will call police cars to you, but unlike PedsInCavalcades & Merryweather they won't start shooting at you unless you shoot first or shoot at them. The top 2 however seem to cancel theirselves if there is noone dead around you or a fire. I only figured them out as I found out the 3rd param is definately the amountOfPeople and they called incident 3 in scripts with 4 people (which the firetruck has) and incident 5 with 2 people (which the ambulence has). The 4 param I cant say is radius, but for the pedsInCavalcades and Merryweather R* uses 0.0f and for the top 3 (Emergency Services) they use 3.0f. - Side Note: It seems calling the pedsInCavalcades or Merryweather then removing it seems to break you from calling the EmergencyEvents and I also believe pedsInCavalcades. (The V cavalcades of course not IV). - Side Note 2: I say it breaks as if you call this proper, - if(CREATE_INCIDENT) etc it will return false if you do as I said above. - ===================================================== - - - - - p0 could be type (valueused in scripts: 14, 7, 5, 3, 11) - p1 is a return from get_player_ped() in am_gang_call.c, but player_ped_id() in other (non am) scripts. - p3 is usually 0f or 3f - ===================================================== - enum IncidentTypes - { - FireDepartment = 3, - Paramedics = 5, - Police = 7, - PedsInCavalcades = 11, - Merryweather = 14 - }; - As for the 'police' incident, it will call police cars to you, but unlike PedsInCavalcades & Merryweather they won't start shooting at you unless you shoot first or shoot at them. The top 2 however seem to cancel theirselves if there is noone dead around you or a fire. I only figured them out as I found out the 3rd param is definately the amountOfPeople and they called incident 3 in scripts with 4 people (which the firetruck has) and incident 5 with 2 people (which the ambulence has). The 4 param I cant say is radius, but for the pedsInCavalcades and Merryweather R* uses 0.0f and for the top 3 (Emergency Services) they use 3.0f. - Side Note: It seems calling the pedsInCavalcades or Merryweather then removing it seems to break you from calling the EmergencyEvents and I also believe pedsInCavalcades. (The V cavalcades of course not IV). - Side Note 2: I say it breaks as if you call this proper, - if(CREATE_INCIDENT) etc it will return false if you do as I said above. - ===================================================== - - - - - Train models HAVE TO be loaded (requested) before you use this. - For variation 15 - request: - freight - freightcar - freightgrain - freightcont1 - freightcont2 - freighttrailer - - - - - Creates a mobile phone of the specified type. - Possible phone types: - 0 - Default phone / Michael's phone - 1 - Trevor's phone - 2 - Franklin's phone - 4 - Prologue phone - These values represent bit flags, so a value of '3' would toggle Trevor and Franklin's phones together, causing unexpected behavior and most likely crash the game. - - - - - p5 = sets as true in scripts - Same as the comment for CREATE_MODEL_SWAP unless for some reason p5 affects it this only works with objects as well. - Network players do not see changes done with this. - - - - - Only works with objects! - Network players do not see changes done with this. - - - - - Spawns one or more money pickups. - x: The X-component of the world position to spawn the money pickups at. - y: The Y-component of the world position to spawn the money pickups at. - z: The Z-component of the world position to spawn the money pickups at. - value: The combined value of the pickups (in dollars). - amount: The number of pickups to spawn. - model: The model to use, or 0 for default money model. - Example: - CREATE_MONEY_PICKUPS(x, y, z, 1000, 3, 0x684a97ae); - Spawns 3 spray cans that'll collectively give $1000 when picked up. (Three spray cans, each giving $334, $334, $332 = $1000). - ============================================== - Max is 2000 in MP. So if you put the amount to 20, but the value to $400,000 eg. They will only be able to pickup 20 - $2,000 bags. So, $40,000 - - - - - Creates a new NaturalMotion message. - startImmediately: If set to true, the character will perform the message the moment it receives it by GIVE_PED_NM_MESSAGE. If false, the Ped will get the message but won't perform it yet. While it's a boolean value, if negative, the message will not be initialized. - messageId: The ID of the NaturalMotion message. - If a message already exists, this function does nothing. A message exists until the point it has been successfully dispatched by GIVE_PED_NM_MESSAGE. - - - - - thisScriptCheck - can be destroyed if it belongs to the calling script. - p5 - last parameter does not mean object handle is returned - maybe a quick view in disassembly will tell us what is actually does - ---------- - prop_tt_screenstatic (0xE2E039BC) is handled different. Not sure how yet but it I know it is. - - - - - thisScriptCheck - can be destroyed if it belongs to the calling script. - p5 - does not mean object handle is returned - maybe a quick view in disassembly will tell us what is actually does - ---------- - prop_tt_screenstatic (0xE2E039BC) is handled different. Not sure how yet but it I know it is. - - - - - thisScriptCheck - can be destroyed if it belongs to the calling script. - p7 - last parameter does not mean ped handle is returned - maybe a quick view in disassembly will tell us what is actually does - *Heading*: 0.0 - *Heading* is the Z axis spawn rotation of the ped 0->5th parameter. - Ped Types: - enum PedTypes - { - PED_TYPE_PLAYER_0,// michael - PED_TYPE_PLAYER_1,// franklin - PED_TYPE_NETWORK_PLAYER, // mp character - PED_TYPE_PLAYER_2,// trevor - PED_TYPE_CIVMALE, - PED_TYPE_CIVFEMALE, - PED_TYPE_COP, - PED_TYPE_GANG_ALBANIAN, - PED_TYPE_GANG_BIKER_1, - PED_TYPE_GANG_BIKER_2, - PED_TYPE_GANG_ITALIAN, - PED_TYPE_GANG_RUSSIAN, - PED_TYPE_GANG_RUSSIAN_2, - PED_TYPE_GANG_IRISH, - PED_TYPE_GANG_JAMAICAN, - PED_TYPE_GANG_AFRICAN_AMERICAN, - PED_TYPE_GANG_KOREAN, - PED_TYPE_GANG_CHINESE_JAPANESE, - PED_TYPE_GANG_PUERTO_RICAN, - PED_TYPE_DEALER, - PED_TYPE_MEDIC, - PED_TYPE_FIREMAN, - PED_TYPE_CRIMINAL, - PED_TYPE_BUM, - PED_TYPE_PROSTITUTE, - PED_TYPE_SPECIAL, - PED_TYPE_MISSION, - PED_TYPE_SWAT, - PED_TYPE_ANIMAL, - PED_TYPE_ARMY - }; - - - - - thisScriptCheck - can be destroyed if it belongs to the calling script. - p5 - last parameter does not mean ped handle is returned - maybe a quick view in disassembly will tell us what is actually does - Ped Types: - enum ePedType - { - PED_TYPE_PLAYER_0 = 0, - PED_TYPE_PLAYER_1 = 1, - PED_TYPE_PLAYER_2 = 3, - PED_TYPE_CIVMALE = 4, - PED_TYPE_CIVFEMALE = 5, - PED_TYPE_COP = 6, - PED_TYPE_UNKNOWN_7 = 7, - PED_TYPE_UNKNOWN_12 = 12, // gang member? - PED_TYPE_UNKNOWN_19 = 19, - PED_TYPE_MEDIC = 20, - PED_TYPE_FIREMAN = 21, - PED_TYPE_UNKNOWN_22 = 22, - PED_TYPE_UNKNOWN_25 = 25, - PED_TYPE_UNKNOWN_26 = 26, - PED_TYPE_SWAT = 27, - PED_TYPE_ANIMAL = 28, - PED_TYPE_ARMY = 29 - }; - - - - - Pickup hashes: pastebin.com/8EuSv2r1 - - - - - Pickup hashes: pastebin.com/8EuSv2r1 - flags: - 8 (1 << 3): place on ground - 512 (1 << 9): spin around - - - - - Drops the Hook/Magnet on a cargobob - state - enum eCargobobHook - { - CARGOBOB_HOOK = 0, - CARGOBOB_MAGNET = 1, - }; - - - - - Pickup hashes: pastebin.com/8EuSv2r1 - - - - - vb.net - Dim ped_handle As Integer - With Game.Player.Character - Dim pos As Vector3 = .Position + .ForwardVector * 3 - ped_handle = Native.Function.Call(Of Integer)(Hash.CREATE_RANDOM_PED, pos.X, pos.Y, pos.Z) - End With - Creates a Ped at the specified location, returns the Ped Handle. - Ped will not act until SET_PED_AS_NO_LONGER_NEEDED is called. - - - - - Creates a blank runtime texture. - - - - - Creates a runtime texture from a DUI handle. - - - - - Creates a runtime texture from the specified file in the current resource. - - - - - Creates a runtime texture dictionary with the specified name. - Example: - - ```lua - local txd = CreateRuntimeTxd('meow') - ``` - - - - - Creates a script vehicle generator at the given coordinates. Most parameters after the model hash are unknown. - Parameters: - a/w/s - Generator position - heading - Generator heading - p4 - Unknown (always 5.0) - p5 - Unknown (always 3.0) - modelHash - Vehicle model hash - p7/8/9/10 - Unknown (always -1) - p11 - Unknown (usually TRUE, only one instance of FALSE) - p12/13 - Unknown (always FALSE) - p14 - Unknown (usally FALSE, only two instances of TRUE) - p15 - Unknown (always TRUE) - p16 - Unknown (always -1) - Vector3 coords = GET_ENTITY_COORDS(PLAYER_PED_ID(), 0); CREATE_SCRIPT_VEHICLE_GENERATOR(coords.x, coords.y, coords.z, 1.0f, 5.0f, 3.0f, GET_HASH_KEY("adder"), -1. -1, -1, -1, -1, true, false, false, false, true, -1); - - - - - p6 always 2 (but it doesnt seem to matter...) - roll and pitch 0 - yaw to Ped.rotation - - - - - Creates a tracked point, useful for checking the visibility of a 3D point on screen. - - - - - thisScriptCheck - can be destroyed if it belongs to the calling script. - - - - - Now has 8 params. - - - - - some camera effect that is used in the drunk-cheat, and turned off (by setting it to 0.0) along with the shaking effects once the drunk cheat is disabled. - - - - - Example: - if (!DATAFILE::_BEDB96A7584AA8CF()) - { - if (!g_109E3) - { - if (((sub_d4f() == 2) == 0) && (!NETWORK::NETWORK_IS_GAME_IN_PROGRESS())) - { - if (NETWORK::NETWORK_IS_CLOUD_AVAILABLE()) - { - g_17A8B = 0; - } - if (!g_D52C) - { - sub_730(); - } - } - } - } - - - - - Returns whether or not the specified property is set for the entity. - - - - - Is property of that type. - enum eDecorType - { - DECOR_TYPE_FLOAT = 1, - DECOR_TYPE_BOOL, - DECOR_TYPE_INT, - DECOR_TYPE_UNK, - DECOR_TYPE_TIME - }; - - - - - Found this in standard_global_init.c4 line 1898 - void sub_523a() { - DECORATOR::DECOR_REGISTER("Player_Vehicle", 3); - DECORATOR::DECOR_REGISTER("PV_Slot", 3); - DECORATOR::DECOR_REGISTER("Previous_Owner", 3); - DECORATOR::DECOR_REGISTER("Sprayed_Vehicle_Decorator", 2); - DECORATOR::DECOR_REGISTER("Sprayed_Vehicle_Timer_Dec", 5); - DECORATOR::DECOR_REGISTER("Vehicle_Reward", 3); - DECORATOR::DECOR_REGISTER("Vehicle_Reward_Teams", 3); - DECORATOR::DECOR_REGISTER("Skill_Blocker", 2); - DECORATOR::DECOR_REGISTER("TargetPlayerForTeam", 3); - DECORATOR::DECOR_REGISTER("XP_Blocker", 2); - DECORATOR::DECOR_REGISTER("CrowdControlSetUp", 3); - DECORATOR::DECOR_REGISTER("Bought_Drugs", 2); - DECORATOR::DECOR_REGISTER("HeroinInPossession", 1); - DECORATOR::DECOR_REGISTER("CokeInPossession", 1); - DECORATOR::DECOR_REGISTER("WeedInPossession", 1); - DECORATOR::DECOR_REGISTER("MethInPossession", 1); - DECORATOR::DECOR_REGISTER("bombdec", 3); - DECORATOR::DECOR_REGISTER("bombdec1", 3); - DECORATOR::DECOR_REGISTER("bombowner", 3); - DECORATOR::DECOR_REGISTER("noPlateScan", 2); - DECORATOR::DECOR_REGISTER("prisonBreakBoss", 2); - DECORATOR::DECOR_REGISTER("cashondeadbody", 3); - DECORATOR::DECOR_REGISTER("MissionType", 3); - DECORATOR::DECOR_REGISTER("MatchId", 3); - DECORATOR::DECOR_REGISTER("TeamId", 3); - DECORATOR::DECOR_REGISTER("Not_Allow_As_Saved_Veh", 3); - DECORATOR::DECOR_REGISTER("Veh_Modded_By_Player", 3); - DECORATOR::DECOR_REGISTER("MPBitset", 3); - DECORATOR::DECOR_REGISTER("MC_EntityID", 3); - DECORATOR::DECOR_REGISTER("MC_ChasePedID", 3); - DECORATOR::DECOR_REGISTER("MC_Team0_VehDeliveredRules", 3); - DECORATOR::DECOR_REGISTER("MC_Team1_VehDeliveredRules", 3); - DECORATOR::DECOR_REGISTER("MC_Team2_VehDeliveredRules", 3); - DECORATOR::DECOR_REGISTER("MC_Team3_VehDeliveredRules", 3); - DECORATOR::DECOR_REGISTER("AttributeDamage", 3); - DECORATOR::DECOR_REGISTER("GangBackup", 3); - DECORATOR::DECOR_REGISTER("CreatedByPegasus", 2); - DECORATOR::DECOR_REGISTER("BeforeCorona_0", 2); - } - ----------------------------------------------------------------------- - Defines type of property for property name. - enum eDecorType - { - DECOR_TYPE_FLOAT = 1, - DECOR_TYPE_BOOL, - DECOR_TYPE_INT, - DECOR_TYPE_UNK, - DECOR_TYPE_TIME - }; - - - - - Called after all decorator type initializations. - - - - - This function sets metadata of type bool to specified entity. - - - - - Sets property to int. - - - - - Deletes the specified entity, then sets the handle pointed to by the pointer to NULL. - - - - - Delete an incident with a given id. - ======================================================= - Correction, I have change this to int, instead of int* - as it doesn't use a pointer to the createdIncident. - If you try it you will crash (or) freeze. - ======================================================= - - - - - Deletes the specified object, then sets the handle pointed to by the pointer to NULL. - meme. - - - - - From the b617d scripts: - AI::DELETE_PATROL_ROUTE("miss_merc0"); - AI::DELETE_PATROL_ROUTE("miss_merc1"); - AI::DELETE_PATROL_ROUTE("miss_merc2"); - AI::DELETE_PATROL_ROUTE("miss_dock"); - - - - - Deletes the specified ped, then sets the handle pointed to by the pointer to NULL. - - - - - Deletes a vehicle. - The vehicle must be a mission entity to delete, so call this before deleting: SET_ENTITY_AS_MISSION_ENTITY(vehicle, true, true); - eg how to use: - SET_ENTITY_AS_MISSION_ENTITY(vehicle, true, true); - DELETE_VEHICLE(&vehicle); - Deletes the specified vehicle, then sets the handle pointed to by the pointer to NULL. - - - - - BOOL param indicates whether the cam should be destroyed if it belongs to the calling script. - - - - - BOOL param indicates whether the cam should be destroyed if it belongs to the calling script. - - - - - Destroys a DUI browser. - - - - - Destroys the currently active mobile phone. - - - - - Hash collision - - - - - p1 and p2 have no effect - maybe a quick disassembly will tell us what they do - the statement below seems to be false. when I tried it with 2 vehicles: - if p2 is set to true, the both entities won't collide with the other until the distance between them is above 4 meters. - - - - - First two parameters swapped. Scripts verify that towTruck is the first parameter, not the second. - - - - - Public Sub detatchTrailer(vh1 As Vehicle) - Native.Function.Call(Hash.DETACH_VEHICLE_FROM_TRAILER, vh1) - End Sub - - - - - Hash collision!!! - Returns a blip handle. - - - - - control values and meaning: github.com/crosire/scripthookvdotnet/blob/dev_v3/source/scripting/Controls.cs - 0, 1 and 2 used in the scripts. 0 is by far the most common of them. - Control values from the decompiled scripts: 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27, - 28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,53,5 - 4,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78, - 79,80,81,82,85,86,87,88,89,90,91,92,93,95,96,97,98,99,100,101,102,103,105, - 107,108,109,110,111,112,113,114,115,116,117,118,119,123,126,129,130,131,132, - 133,134,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152, - 153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172 - ,177,187,188,189,190,195,196,199,200,201,202,203,205,207,208,209,211,212,213, 217,219,220,221,225,226,230,234,235,236,237,238,239,240,241,242,243,244,257, - 261,262,263,264,265,270,271,272,273,274,278,279,280,281,282,283,284,285,286, - 287,288,289,337. - Example: CONTROLS::DISABLE_CONTROL_ACTION(2, 19, true) disables the switching UI from appearing both when using a keyboard and Xbox 360 controller. Needs to be executed each frame. - Control group 1 and 0 gives the same results as 2. Same results for all players. - - - - - The game by default has 5 hospital respawn points. Disabling them all will cause the player to respawn at the last position they were. - Doesn't work.... - - - - - Example: - This removes the interior from the strip club and when trying to walk inside the player just falls: - INTERIOR::DISABLE_INTERIOR(118018, true); - - - - - hash collision??? - Don't think so. It fits alphabetically and it used with a plane in the scripts - Ailerons are responsible for the rolling motion of a plane. - - - - - Inhibits the player from using any method of combat including melee and firearms. - NOTE: Only disables the firing for one frame - - - - - Disables the spawn point at the police house on the specified index. - policeIndex: The police house index. - toggle: true to enable the spawn point, false to disable. - - - - - if set to true, prevents vehicle sirens from having sound, leaving only the lights. - HASH COLLISION !!! Please change to _SET_DISABLE_VEHICLE_SIREN_SOUND - ----- - SET_VEHICLE_HAS_* - - - - - how does this work? - - - - - "DISPLAY_CASH(false);" makes the cash amount render on the screen when appropriate - "DISPLAY_CASH(true);" disables cash amount rendering - - - - - The messages are localized strings. - Examples: - "No_bus_money" - "Enter_bus" - "Tour_help" - "LETTERS_HELP2" - "Dummy" - **The bool appears to always be false (if it even is a bool, as it's represented by a zero)** - -------- - p1 doesn't seem to make a difference, regardless of the state it's in. - picture of where on the screen this is displayed? - - - - - If Hud should be displayed - - - - - note, p0 is set to 6 for PC platform in at least 1 script, or to `unk::_get_ui_language_id() == 0` otherwise. - NOTE: windowTitle uses text labels, and an invalid value will display nothing. - Dr. Underscore: `UNK::_GET_UI_LANGUAGE_ID()` is now `UNK::_GET_CURRENT_LANGUAGE_ID()` - www.gtaforums.com/topic/788343-vrel-script-hook-v/?p=1067380474 - windowTitle's - ----------------- - CELL_EMAIL_BOD = "Enter your Eyefind message" - CELL_EMAIL_BODE = "Message too long. Try again" - CELL_EMAIL_BODF = "Forbidden message. Try again" - CELL_EMAIL_SOD = "Enter your Eyefind subject" - CELL_EMAIL_SODE = "Subject too long. Try again" - CELL_EMAIL_SODF = "Forbidden text. Try again" - CELL_EMASH_BOD = "Enter your Eyefind message" - CELL_EMASH_BODE = "Message too long. Try again" - CELL_EMASH_BODF = "Forbidden message. Try again" - CELL_EMASH_SOD = "Enter your Eyefind subject" - CELL_EMASH_SODE = "Subject too long. Try again" - CELL_EMASH_SODF = "Forbidden Text. Try again" - FMMC_KEY_TIP10 = "Enter Synopsis" - FMMC_KEY_TIP12 = "Enter Custom Team Name" - FMMC_KEY_TIP12F = "Forbidden Text. Try again" - FMMC_KEY_TIP12N = "Custom Team Name" - FMMC_KEY_TIP8 = "Enter Message" - FMMC_KEY_TIP8F = "Forbidden Text. Try again" - FMMC_KEY_TIP8FS = "Invalid Message. Try again" - FMMC_KEY_TIP8S = "Enter Message" - FMMC_KEY_TIP9 = "Enter Outfit Name" - FMMC_KEY_TIP9F = "Invalid Outfit Name. Try again" - FMMC_KEY_TIP9N = "Outfit Name" - PM_NAME_CHALL = "Enter Challenge Name" - - - - - If Minimap / Radar should be displayed. - - - - - Displays the crosshair for this frame. - - - - - Purpose of the BOOL currently unknown. - Both, true and false, work - - - - - Returns whether or not the passed camera handle exists. - - - - - Returns true only when the hook is active, will return false if the magnet is active - - - - - Checks via CVehicleModelInfo - - - - - p5 is usually 0. - - - - - Returns whether the ped's blip is controlled by the game. - It's the default blip you can see on enemies during freeroam in singleplayer (the one that fades out quickly). - - - - - Ptr is correct - - - - - Occurrences in the b617d scripts: - "ARMY_GUARD", - "ARMY_HELI", - "Cinema_Downtown", - "Cinema_Morningwood", - "Cinema_Textile", - "City_Banks", - "Countryside_Banks", - "DEALERSHIP", - "GRAPESEED_PLANES", - "KORTZ_SECURITY", - "LOST_BIKERS", - "LSA_Planes", - "LSA_Planes", - "MP_POLICE", - "Observatory_Bikers", - "POLICE_POUND1", - "POLICE_POUND2", - "POLICE_POUND3", - "POLICE_POUND4", - "POLICE_POUND5" - "QUARRY", - "SANDY_PLANES", - "SCRAP_SECURITY", - "SEW_MACHINE", - "SOLOMON_GATE", - "Triathlon_1_Start", - "Triathlon_2_Start", - "Triathlon_3_Start" - Sometimes used with IS_SCENARIO_GROUP_ENABLED: - if (AI::DOES_SCENARIO_GROUP_EXIST("Observatory_Bikers") && (!AI::IS_SCENARIO_GROUP_ENABLED("Observatory_Bikers"))) { - else if (AI::IS_SCENARIO_GROUP_ENABLED("BLIMP")) { - - - - - Checks if there is a cover point at position - - - - - For a full list, see here: pastebin.com/yLNWicUi - - - - - Checks if the passed gxt name exists in the game files. - - - - - Maximum amount of vehicles with vehicle stuck check appears to be 16. - - - - - Fades the screen in. - duration: The time the fade should take, in milliseconds. - - - - - Fades the screen out. - duration: The time the fade should take, in milliseconds. - - - - - x,y,z = start pos - x2,y2,z2 = end pos - Draw's a 3D Box between the two x,y,z coords. - -------------- - Keep in mind that the edges of the box do only align to the worlds base-vectors. Therefore something like rotation cannot be applied. That means this function is pretty much useless, unless you want a static unicolor box somewhere. - I recommend using a predefined function to call this. - [VB.NET] - Public Sub DrawBox(a As Vector3, b As Vector3, col As Color) - [Function].Call(Hash.DRAW_BOX,a.X, a.Y, a.Z,b.X, b.Y, b.Z,col.R, col.G, col.B, col.A) - End Sub - [C#] - public void DrawBox(Vector3 a, Vector3 b, Color col) - { - Function.Call(Hash.DRAW_BOX,a.X, a.Y, a.Z,b.X, b.Y, b.Z,col.R, col.G, col.B, col.A); - } - - - - - NOTE: Debugging functions are not present in the retail version of the game. - - - - - NOTE: Debugging functions are not present in the retail version of the game. - - - - - NOTE: Debugging functions are not present in the retail version of the game. - - - - - NOTE: Debugging functions are not present in the retail version of the game. - - - - - NOTE: Debugging functions are not present in the retail version of the game. - - - - - NOTE: Debugging functions are not present in the retail version of the game. - - - - - NOTE: Debugging functions are not present in the retail version of the game. - - - - - Draws a depth-tested line from one point to another. - ---------------- - x1, y1, z1 : Coordinates for the first point - x2, y2, z2 : Coordinates for the second point - r, g, b, alpha : Color with RGBA-Values - I recommend using a predefined function to call this. - [VB.NET] - Public Sub DrawLine(from As Vector3, [to] As Vector3, col As Color) - [Function].Call(Hash.DRAW_LINE, from.X, from.Y, from.Z, [to].X, [to].Y, [to].Z, col.R, col.G, col.B, col.A) - End Sub - [C#] - public void DrawLine(Vector3 from, Vector3 to, Color col) - { - Function.Call(Hash.DRAW_LINE, from.X, from.Y, from.Z, to.X, to.Y, to.Z, col.R, col.G, col.B, col.A); - } - - - - - Draws a marker with the specified appearance at the target location. This has to be called every frame, e.g. in a `Wait(0)` loop. - - Available marker types: - - <!-- - [...document.querySelectorAll('img')].filter(a => a.src.match(/100x100/)).map((a, i) => `| ${a.alt} | ${i} | ![${a.alt}](${a.src}) |`).join('\n') - https://forum.fivem.net/t/resource-available-markers/99384 - --> - - | NAME | ID | IMAGE | - | -------------------------------------- | --- | ------------------------------------------------------------------------------ | - | MarkerTypeUpsideDownCone | 0 | ![MarkerTypeUpsideDownCone](https://d.fivem.dev/marker_00.png) | - | MarkerTypeVerticalCylinder | 1 | ![MarkerTypeVerticalCylinder.1](https://d.fivem.dev/marker_01.png) | - | MarkerTypeThickChevronUp | 2 | ![MarkerTypeThickChevronUp](https://d.fivem.dev/marker_02.png) | - | MarkerTypeThinChevronUp | 3 | ![MarkerTypeThinChevronUp](https://d.fivem.dev/marker_03.png) | - | MarkerTypeCheckeredFlagRect | 4 | ![MarkerTypeCheckeredFlagRect](https://d.fivem.dev/marker_04.png) | - | MarkerTypeCheckeredFlagCircle | 5 | ![MarkerTypeCheckeredFlagCircle](https://d.fivem.dev/marker_05.png) | - | MarkerTypeVerticleCircle | 6 | ![MarkerTypeVerticleCircle](https://d.fivem.dev/marker_06.png) | - | MarkerTypePlaneModel | 7 | ![1](https://d.fivem.dev/marker_07.png) | - | MarkerTypeLostMCTransparent | 8 | ![MarkerTypeLostMCTransparent.1](https://d.fivem.dev/marker_08.png) | - | MarkerTypeLostMC | 9 | ![MarkerTypeLostMC.1](https://d.fivem.dev/marker_09.png) | - | MarkerTypeNumber0 | 10 | ![MarkerTypeNumber0](https://d.fivem.dev/marker_10.png) | - | MarkerTypeNumber1 | 11 | ![MarkerTypeNumber1](https://d.fivem.dev/marker_11.png) | - | MarkerTypeNumber2 | 12 | ![MarkerTypeNumber2](https://d.fivem.dev/marker_12.png) | - | MarkerTypeNumber3 | 13 | ![MarkerTypeNumber3](https://d.fivem.dev/marker_13.png) | - | MarkerTypeNumber4 | 14 | ![MarkerTypeNumber4](https://d.fivem.dev/marker_14.png) | - | MarkerTypeNumber5 | 15 | ![MarkerTypeNumber5](https://d.fivem.dev/marker_15.png) | - | MarkerTypeNumber6 | 16 | ![MarkerTypeNumber6](https://d.fivem.dev/marker_16.png) | - | MarkerTypeNumber7 | 17 | ![MarkerTypeNumber7](https://d.fivem.dev/marker_17.png) | - | MarkerTypeNumber8 | 18 | ![MarkerTypeNumber8](https://d.fivem.dev/marker_18.png) | - | MarkerTypeNumber9 | 19 | ![MarkerTypeNumber9](https://d.fivem.dev/marker_19.png) | - | MarkerTypeChevronUpx1 | 20 | ![MarkerTypeChevronUpx1](https://d.fivem.dev/marker_20.png) | - | MarkerTypeChevronUpx2 | 21 | ![MarkerTypeChevronUpx2](https://d.fivem.dev/marker_21.png) | - | MarkerTypeChevronUpx3 | 22 | ![MarkerTypeChevronUpx3](https://d.fivem.dev/marker_22.png) | - | MarkerTypeHorizontalCircleFat | 23 | ![MarkerTypeHorizontalCircleFat.1](https://d.fivem.dev/marker_23.png) | - | MarkerTypeReplayIcon | 24 | ![MarkerTypeReplayIcon](https://d.fivem.dev/marker_24.png) | - | MarkerTypeHorizontalCircleSkinny | 25 | ![MarkerTypeHorizontalCircleSkinny.1](https://d.fivem.dev/marker_25.png) | - | MarkerTypeHorizontalCircleSkinny_Arrow | 26 | ![MarkerTypeHorizontalCircleSkinny_Arrow.1](https://d.fivem.dev/marker_26.png) | - | MarkerTypeHorizontalSplitArrowCircle | 27 | ![MarkerTypeHorizontalSplitArrowCircle.1](https://d.fivem.dev/marker_27.png) | - | MarkerTypeDebugSphere | 28 | ![MarkerTypeDebugSphere](https://d.fivem.dev/marker_28.png) | - | MarkerTypeDollarSign | 29 | ![MarkerTypeDollarSign](https://d.fivem.dev/marker_29.png) | - | MarkerTypeHorizontalBars | 30 | ![MarkerTypeHorizontalBars](https://d.fivem.dev/marker_30.png) | - | MarkerTypeWolfHead | 31 | ![MarkerTypeWolfHead](https://d.fivem.dev/marker_31.png) | - | MarkerTypeQuestionMark | 32 | ![MarkerTypeQuestionMark](https://d.fivem.dev/marker_32.png) | - | MarkerTypePlaneSymbol | 33 | ![MarkerTypePlaneSymbol](https://d.fivem.dev/marker_33.png) | - | MarkerTypeHelicopterSymbol | 34 | ![MarkerTypeHelicopterSymbol](https://d.fivem.dev/marker_34.png) | - | MarkerTypeBoatSymbol | 35 | ![MarkerTypeBoatSymbol](https://d.fivem.dev/marker_35.png) | - | MarkerTypeCarSymbol | 36 | ![MarkerTypeCarSymbol](https://d.fivem.dev/marker_36.png) | - | MarkerTypeMotorcycleSymbol | 37 | ![MarkerTypeMotorcycleSymbol](https://d.fivem.dev/marker_37.png) | - | MarkerTypeBikeSymbol | 38 | ![MarkerTypeBikeSymbol](https://d.fivem.dev/marker_38.png) | - | MarkerTypeTruckSymbol | 39 | ![MarkerTypeTruckSymbol](https://d.fivem.dev/marker_39.png) | - | MarkerTypeParachuteSymbol | 40 | ![MarkerTypeParachuteSymbol](https://d.fivem.dev/marker_40.png) | - | ? | 41 | ![](https://d.fivem.dev/marker_41.png) | - | MarkerTypeSawbladeSymbol | 42 | ![](https://d.fivem.dev/marker_42.png) | - | ? | 43 | ![](https://d.fivem.dev/marker_43.png) | - - - - - x/y/z - Location of a vertex (in world coords), presumably. - ---------------- - x1, y1, z1 : Coordinates for the first point - x2, y2, z2 : Coordinates for the second point - x3, y3, z3 : Coordinates for the third point - r, g, b, alpha : Color with RGBA-Values - Keep in mind that only one side of the drawn triangle is visible: It's the side, in which the vector-product of the vectors heads to: (b-a)x(c-a) Or (b-a)x(c-b). - But be aware: The function seems to work somehow differently. I have trouble having them drawn in rotated orientation. Try it yourself and if you somehow succeed, please edit this and post your solution. - I recommend using a predefined function to call this. - [VB.NET] - Public Sub DrawPoly(a As Vector3, b As Vector3, c As Vector3, col As Color) - [Function].Call(Hash.DRAW_POLY, a.X, a.Y, a.Z, b.X, b.Y, b.Z, c.X, c.Y, c.Z, col.R, col.G, col.B, col.A) - End Sub - [C#] - public void DrawPoly(Vector3 a, Vector3 b, Vector3 c, Color col) - { - Function.Call(Hash.DRAW_POLY, a.X, a.Y, a.Z, b.X, b.Y, b.Z, c.X, c.Y, c.Z, col.R, col.G, col.B, col.A); - } - BTW: Intersecting triangles are not supported: They overlap in the order they were called. - - - - - Draws a rectangle on the screen. - -x: The relative X point of the center of the rectangle. (0.0-1.0, 0.0 is the left edge of the screen, 1.0 is the right edge of the screen) - -y: The relative Y point of the center of the rectangle. (0.0-1.0, 0.0 is the top edge of the screen, 1.0 is the bottom edge of the screen) - -width: The relative width of the rectangle. (0.0-1.0, 1.0 means the whole screen width) - -height: The relative height of the rectangle. (0.0-1.0, 1.0 means the whole screen height) - -R: Red part of the color. (0-255) - -G: Green part of the color. (0-255) - -B: Blue part of the color. (0-255) - -A: Alpha part of the color. (0-255, 0 means totally transparent, 255 means totally opaque) - The total number of rectangles to be drawn in one frame is apparently limited to 399. - - - - - GTA V Scaleforms Decompiled - pastebin.com/mmNdjX2k - - - - - sharpness goes from 0.0 to 1.0 - - - - - unk is not used so no need - - - - - Parameters: - * pos - coordinate where the spotlight is located - * dir - the direction vector the spotlight should aim at from its current position - * r,g,b - color of the spotlight - * distance - the maximum distance the light can reach - * brightness - the brightness of the light - * roundness - "smoothness" of the circle edge - * radius - the radius size of the spotlight - * falloff - the falloff size of the light's edge (example: www.i.imgur.com/DemAWeO.jpg) - Example in C# (spotlight aims at the closest vehicle): - Vector3 myPos = Game.Player.Character.Position; - Vehicle nearest = World.GetClosestVehicle(myPos , 1000f); - Vector3 destinationCoords = nearest.Position; - Vector3 dirVector = destinationCoords - myPos; - dirVector.Normalize(); - Function.Call(Hash.DRAW_SPOT_LIGHT, pos.X, pos.Y, pos.Z, dirVector.X, dirVector.Y, dirVector.Z, 255, 255, 255, 100.0f, 1f, 0.0f, 13.0f, 1f); - - - - - Draws a 2D sprite on the screen. - Parameters: - textureDict - Name of texture dictionary to load texture from (e.g. "CommonMenu", "MPWeaponsCommon", etc.) - textureName - Name of texture to load from texture dictionary (e.g. "last_team_standing_icon", "tennis_icon", etc.) - screenX/Y - Screen offset (0.5 = center) - scaleX/Y - Texture scaling. Negative values can be used to flip the texture on that axis. (0.5 = half) - heading - Texture rotation in degrees (default = 0.0) positive is clockwise, measured in degrees - red,green,blue - Sprite color (default = 255/255/255) - alpha - opacity level - - - - - All calls to this native are preceded by calls to GRAPHICS::_0x61BB1D9B3A95D802 and GRAPHICS::_0xC6372ECD45D73BCD, respectively. - "act_cinema.ysc", line 1483: - UI::SET_HUD_COMPONENT_POSITION(15, 0.0, -0.0375); - UI::SET_TEXT_RENDER_ID(l_AE); - GRAPHICS::_0x61BB1D9B3A95D802(4); - GRAPHICS::_0xC6372ECD45D73BCD(1); - if (GRAPHICS::_0x0AD973CA1E077B60(${movie_arthouse})) { - GRAPHICS::DRAW_TV_CHANNEL(0.5, 0.5, 0.7375, 1.0, 0.0, 255, 255, 255, 255); - } else { - GRAPHICS::DRAW_TV_CHANNEL(0.5, 0.5, 1.0, 1.0, 0.0, 255, 255, 255, 255); - } - "am_mp_property_int.ysc", line 102545: - if (ENTITY::DOES_ENTITY_EXIST(a_2._f3)) { - if (UI::IS_NAMED_RENDERTARGET_LINKED(ENTITY::GET_ENTITY_MODEL(a_2._f3))) { - UI::SET_TEXT_RENDER_ID(a_2._f1); - GRAPHICS::_0x61BB1D9B3A95D802(4); - GRAPHICS::_0xC6372ECD45D73BCD(1); - GRAPHICS::DRAW_TV_CHANNEL(0.5, 0.5, 1.0, 1.0, 0.0, 255, 255, 255, 255); - if (GRAPHICS::GET_TV_CHANNEL() == -1) { - sub_a8fa5(a_2, 1); - } else { - sub_a8fa5(a_2, 1); - GRAPHICS::ATTACH_TV_AUDIO_TO_ENTITY(a_2._f3); - } - UI::SET_TEXT_RENDER_ID(UI::GET_DEFAULT_SCRIPT_RENDERTARGET_RENDER_ID()); - } - } - - - - - Creates cartoon effect when Michel smokes the weed - - - - - control values and meaning: github.com/crosire/scripthookvdotnet/blob/dev_v3/source/scripting/Control.cs - and - wiki.fivem.net/wiki/Controls - 0, 1 and 2 used in the scripts. - Control values from the decompiled scripts: - 0,1,2,3,4,5,6,8,9,10,11,14,15,16,17,19,21,22,24,25,26,30,31,32,33,34,35,36, - 37,44,46,47,59,60,65,68,69,70,71,72,73,74,75,76,79,80,81,82,86,95,98,99,100 - ,101,114,140,141,143,172,173,174,175,176,177,178,179,180,181,187,188,189,19 - 0,195,196,197,198,199,201,202,203,204,205,206,207,208,209,210,217,218,219,2 - 20,221,225,228,229,230,231,234,235,236,237,238,239,240,241,242,245,246,257, - 261,262,263,264,286,287,288,289,337,338,339,340,341,342,343 - INPUTGROUP_MOVE - INPUTGROUP_LOOK - INPUTGROUP_WHEEL - INPUTGROUP_CELLPHONE_NAVIGATE - INPUTGROUP_CELLPHONE_NAVIGATE_UD - INPUTGROUP_CELLPHONE_NAVIGATE_LR - INPUTGROUP_FRONTEND_DPAD_ALL - INPUTGROUP_FRONTEND_DPAD_UD - INPUTGROUP_FRONTEND_DPAD_LR - INPUTGROUP_FRONTEND_LSTICK_ALL - INPUTGROUP_FRONTEND_RSTICK_ALL - INPUTGROUP_FRONTEND_GENERIC_UD - INPUTGROUP_FRONTEND_GENERIC_LR - INPUTGROUP_FRONTEND_GENERIC_ALL - INPUTGROUP_FRONTEND_BUMPERS - INPUTGROUP_FRONTEND_TRIGGERS - INPUTGROUP_FRONTEND_STICKS - INPUTGROUP_SCRIPT_DPAD_ALL - INPUTGROUP_SCRIPT_DPAD_UD - INPUTGROUP_SCRIPT_DPAD_LR - INPUTGROUP_SCRIPT_LSTICK_ALL - INPUTGROUP_SCRIPT_RSTICK_ALL - INPUTGROUP_SCRIPT_BUMPERS - INPUTGROUP_SCRIPT_TRIGGERS - INPUTGROUP_WEAPON_WHEEL_CYCLE - INPUTGROUP_FLY - INPUTGROUP_SUB - INPUTGROUP_VEH_MOVE_ALL - INPUTGROUP_CURSOR - INPUTGROUP_CURSOR_SCROLL - INPUTGROUP_SNIPER_ZOOM_SECONDARY - INPUTGROUP_VEH_HYDRAULICS_CONTROL - Took those in IDA Pro.Not sure in which order they go - - - - - Please change back to _0x4895BDEA16E7C080 (hash collision) - - - - - Directly from R*: - enum eDispatchType : UINT16 - { - DT_PoliceAutomobile = 1, - DT_PoliceHelicopter = 2, - DT_FireDepartment = 3, - DT_SwatAutomobile = 4, - DT_AmbulanceDepartment = 5, - DT_PoliceRiders = 6, - DT_PoliceVehicleRequest = 7, - DT_PoliceRoadBlock = 8, - DT_PoliceAutomobileWaitPulledOver = 9, - DT_PoliceAutomobileWaitCruising = 10, - DT_Gangs = 11, - DT_SwatHelicopter = 12, - DT_PoliceBoat = 13, - DT_ArmyVehicle = 14, - DT_BikerBackup = 15 - }; - By making toggle false it disables the dispatch. - curious if this is what they used when you toggled on and off cops in a GTA IV freemode you hosted. Sad they got rid of the option to make a private session without cops. - Also on x360 seems with or without neverWanted on, setting these to all false in SP of course doesn't seem to work. I would understand getting stars, but cops are still dispatched and combat you. - - - - - Enables laser sight on any weapon. - It doesn't work. Neither on tick nor OnKeyDown - - - - - #4 - - - - - Makes the ped jump around like they're in a tennis match - - - - - Pops and calls the Scaleform function on the stack - - - - - Clear the current srl and stop rendering the area selected by PrefetchSrl and started with BeginSrl. - - - - - ----------- - p3 (duration in MS) was previously mentioned as "shape", but with some more testing it seems that it's more likely to be a duration in MS. (Tested this when not calling it every tick, but instead only once and let it display for the specified duration). - -1 seems to be default delay (around 3 seconds), 5000 (ms) seems to be the max. Anything > 5000 will still result in 5 seconds of display time. - Old p3 (shape) description: "shape goes from -1 to 50 (may be more)." - -------------- - p0 is always 0. - Example: - void FloatingHelpText(char* text) - { - BEGIN_TEXT_COMMAND_DISPLAY_HELP("STRING"); - ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(text); - END_TEXT_COMMAND_DISPLAY_HELP (0, 0, 1, -1); - } - Image: - - imgbin.org/images/26209.jpg - more inputs/icons: - - pastebin.com/nqNYWMSB - Used to be known as _DISPLAY_HELP_TEXT_FROM_STRING_LABEL - - - - - After applying the properties to the text (See UI::SET_TEXT_), this will draw the text in the applied position. Also 0.0f < x, y < 1.0f, percentage of the axis. - Used to be known as _DRAW_TEXT - - - - - Draws the subtitle at middle center of the screen. - int duration = time in milliseconds to show text on screen before disappearing - drawImmediately = If true, the text will be drawn immediately, if false, the text will be drawn after the previous subtitle has finished - Used to be known as _DRAW_SUBTITLE_TIMED - - - - - Previously called _END_TEXT_COMPONENT - - - - - Finalizes a text command started with [`BEGIN_TEXT_COMMAND_SET_BLIP_NAME`](#_0xF9113A30DE5C6670), setting the name - of the specified blip. - - - - - This native is not implemented. - - - - - This native is not implemented. - - - - - This native is not implemented. - - - - - This native is not implemented. - - - - - Forces the ped to fall back and kills it. - It doesn't really explode the ped's head but it kills the ped - - - - - WEAPON::EXPLODE_PROJECTILES(PLAYER::PLAYER_PED_ID(), func_221(0x00000003), 0x00000001); - - - - - Explodes a selected vehicle. - Vehicle vehicle = Vehicle you want to explode. - BOOL isAudible = If explosion makes a sound. - BOOL isInvisible = If the explosion is invisible or not. - First BOOL does not give any visual explosion, the vehicle just falls apart completely but slowly and starts to burn. - - - - - Fades nearby decals within the range specified - - - - - Hardcoded to not work in SP. - - - - - In the script "player_scene_t_bbfight.c4": - "if (ENTITY::FIND_ANIM_EVENT_PHASE(&l_16E, &l_19F[v_4 -- [[16]] ], v_9, &v_A, &v_B))" - -- &l_16E (p0) is requested as an anim dictionary earlier in the script. - -- &l_19F[v_4 -- [[16]] ] (p1) is used in other natives in the script as the "animation" param. - -- v_9 (p2) is instantiated as "victim_fall"; I'm guessing that's another anim - --v_A and v_B (p3 & p4) are both set as -1.0, but v_A is used immediately after this native for: - "if (v_A < ENTITY::GET_ENTITY_ANIM_CURRENT_TIME(...))" - Both v_A and v_B are seemingly used to contain both Vector3's and floats, so I can't say what either really is other than that they are both output parameters. p4 looks more like a *Vector3 though - -alphazolam - Animations list : www.los-santos-multiplayer.com/dev.airdancer?cxt=anim - - - - - Finds a position ahead of the player by predicting the players next actions. - The positions match path finding node positions. - When roads diverge, the position may rapidly change between two or more positions. This is due to the engine not being certain of which path the player will take. - ======================================================= - I may sort this with alter research, but if someone - already knows please tell what the difference in - X2, Y2, Z2 is. I doubt it's rotation. Is it like - checkpoints where X1, Y1, Z1 is your/a position and - X2, Y2, Z2 is a given position ahead of that position? - ======================================================= - - - - - If set to true ability bar will flash - - - - - adds a short flash to the Radar/Minimap - Usage: UI.FLASH_MINIMAP_DISPLAY - - - - - used with 1,2,8,64,128 in the scripts - - - - - PLAYER::FORCE_CLEANUP_FOR_ALL_THREADS_WITH_THIS_NAME("pb_prostitute", 1); // Found in decompilation - - - - - Based on carmod_shop script decompile this takes a vehicle parameter. It is called when repair is done on initial enter. - - - - - Some motionstate hashes are - 0xec17e58 (standing idle), 0xbac0f10b (nothing?), 0x3f67c6af (aiming with pistol 2-h), 0x422d7a25 (stealth), 0xbd8817db, 0x916e828c - and those for the strings - "motionstate_idle", "motionstate_walk", "motionstate_run", "motionstate_actionmode_idle", and "motionstate_actionmode_walk". - Regarding p2, p3 and p4: Most common is 0, 0, 0); followed by 0, 1, 0); and 1, 1, 0); in the scripts. p4 is very rarely something other than 0. - [31/03/2017] ins1de : - enum MotionState - { - StopRunning = -530524, - StopWalking = -668482597, - Idle = 247561816, // 1, 1, 0 - Idl2 = -1871534317, - SkyDive =-1161760501, // 0, 1, 0 - Stealth = 1110276645, - Sprint = -1115154469, - Swim = -1855028596, - Unknown1 = 1063765679, - Unknown2 = -633298724, - } - - - - - Forces the particular room in an interior to load incase not teleporting into the portal. - - - - - No, this should be called SET_ENTITY_KINEMATIC. It does more than just "freeze" it's position. - ^Rockstar Devs named it like that, Now cry about it. - - - - - Usage example: - Public Function GenerateDirectionsToCoord(Pos As Vector3) As Tuple(Of String, Single, Single) - Dim f4, f5, f6 As New OutputArgument() - Native.Function.Call(Hash.GENERATE_DIRECTIONS_TO_COORD, Pos.X, Pos.Y, Pos.Z, True, f4, f5, f6) - Dim direction As String = f4.GetResult(Of Single)() - Return New Tuple(Of String, Single, Single)(direction.Substring(0, 1), f5.GetResult(Of Single)(), f6.GetResult(Of Single)()) - End Function - p3 I use 1 - direction: - 0 = You Have Arrived - 1 = Recalculating Route, Please make a u-turn where safe - 2 = Please Proceed the Highlighted Route - 3 = In (distToNxJunction) Turn Left - 4 = In (distToNxJunction) Turn Right - 5 = In (distToNxJunction) Go Straight - 6 = In (distToNxJunction) Keep Left - 7 = In (distToNxJunction) Keep Right - 8 = In (distToNxJunction) Join the freeway - 9 = In (distToNxJunction) Exit Freeway - return value set to 0 always - - - - - WEAPON::GET_AMMO_IN_PED_WEAPON(PLAYER::PLAYER_PED_ID(), a_0) - From decompiled scripts - Returns total ammo in weapon - GTALua Example : - natives.WEAPON.GET_AMMO_IN_PED_WEAPON(plyPed, WeaponHash) - - - - - Returns the degree of angle between (x1, y1) and (x2, y2) lines in 2D coordinate system. - - - - - Animations list : www.los-santos-multiplayer.com/dev.airdancer?cxt=anim - - - - - Animations list : www.los-santos-multiplayer.com/dev.airdancer?cxt=anim - - - - - p1 is always 0 in the scripts. - - - - - Returns the Blip handle of given Entity. - - - - - - - - - - This function is hard-coded to always return 0. - - - - - Returns a value based on what the blip is attached to - 1 - 2 - 3 - 4 - 5 - 6 - 7 - - - - - Blips Images + IDs: - gtaxscripting.blogspot.com/2016/05/gta-v-blips-id-and-image.html - - - - - Returns the world matrix of the specified camera. To turn this into a view matrix, calculate the inverse. - - - - - The last parameter, as in other "ROT" methods, is usually 2. - - - - - I named the beginning from Any to BOOL as this native is used in an if statement as well. - Big surprise it returns an int. - - - - - I'm pretty sure the parameter is the camera as usual, but I am not certain so I'm going to leave it as is. - - - - - Can use this with SET_CAM_SPLINE_PHASE to set the float it this native returns. - (returns 1.0f when no nodes has been added, reached end of non existing spline) - - - - - Gets the current day of the week. - 0: Sunday - 1: Monday - 2: Tuesday - 3: Wednesday - 4: Thursday - 5: Friday - 6: Saturday - - - - - Gets the current ingame hour, expressed without zeros. (09:34 will be represented as 9) - - - - - Gets the current ingame clock minute. - - - - - Gets the current ingame clock second. Note that ingame clock seconds change really fast since a day in GTA is only 48 minutes in real life. - - - - - Returns TRUE if it found something. FALSE if not. - - - - - Get the closest vehicle node to a given position, unknown1 = 3.0, unknown2 = 0 - - - - - Has 8 params in the latest patches. - isMission - if true doesn't return mission objects - - - - - Gets the closest ped in a radius. - Ped Types: - Any ped = -1 - Player = 1 - Male = 4 - Female = 5 - Cop = 6 - Human = 26 - SWAT = 27 - Animal = 28 - Army = 29 - ------------------ - P4 P5 P7 P8 - 1 0 x x = return nearest walking Ped - 1 x 0 x = return nearest walking Ped - x 1 1 x = return Ped you are using - 0 0 x x = no effect - 0 x 0 x = no effect - x = can be 1 or 0. Does not have any obvious changes. - This function does not return ped who is: - 1. Standing still - 2. Driving - 3. Fleeing - 4. Attacking - This function only work if the ped is: - 1. walking normally. - 2. waiting to cross a road. - Note: PED::GET_PED_NEARBY_PEDS works for more peds. - - - - - p1 seems to be always 1.0f in the scripts - - - - - Example usage - VEHICLE::GET_CLOSEST_VEHICLE(x, y, z, radius, hash, unknown leave at 70) - x, y, z: Position to get closest vehicle to. - radius: Max radius to get a vehicle. - modelHash: Limit to vehicles with this model. 0 for any. - flags: The bitwise flags altering the function's behaviour. - Does not return police cars or helicopters. - It seems to return police cars for me, does not seem to return helicopters, planes or boats for some reason - Only returns non police cars and motorbikes with the flag set to 70 and modelHash to 0. ModelHash seems to always be 0 when not a modelHash in the scripts, as stated above. - These flags were found in the b617d scripts: 0,2,4,6,7,23,127,260,2146,2175,12294,16384,16386,20503,32768,67590,67711,98309,100359. - Converted to binary, each bit probably represents a flag as explained regarding another native here: gtaforums.com/topic/822314-guide-driving-styles - Conversion of found flags to binary: pastebin.com/kghNFkRi - At exactly 16384 which is 0100000000000000 in binary and 4000 in hexadecimal only planes are returned. - It's probably more convenient to use worldGetAllVehicles(int *arr, int arrSize) and check the shortest distance yourself and sort if you want by checking the vehicle type with for example VEHICLE::IS_THIS_MODEL_A_BOAT - ------------------------------------------------------------------------- - Conclusion: This native is not worth trying to use. Use something like this instead: pastebin.com/xiFdXa7h - - - - - FYI: When falling through the map (or however you got under it) you will respawn when your player ped's height is <= -200.0 meters (I think you all know this) and when in a vehicle you will actually respawn at the closest vehicle node. - ---------- - Vector3 nodePos; - GET_CLOSEST_VEHICLE_NODE(x,y,z,&nodePos,...) - p4 is either 0, 1 or 8. 1 means any path/road. 0 means node in the middle of the closest main (asphalt) road. - p5, p6 are always the same: - 0x40400000 (3.0), 0 - p5 can also be 100.0 and p6 can be 2.5: - PATHFIND::GET_CLOSEST_VEHICLE_NODE(a_0, &v_5, v_9, 100.0, 2.5) - Known node types: simple path/asphalt road, only asphalt road, water, under the map at always the same coords. - The node types follows a pattern. For example, every fourth node is of the type water i.e. 3, 7, 11, 15, 19, 23, 27, 31, 35, 39... 239. Could not see any difference between nodes within certain types. - Starting at 2, every fourth node is under the map, always same coords. - Same with only asphalt road (0, 4, 8, etc) and simple path/asphalt road (1, 5, 9, etc). - gtaforums.com/topic/843561-pathfind-node-types - - - - - p5, p6 and p7 seems to be about the same as p4, p5 and p6 for GET_CLOSEST_VEHICLE_NODE. p6 and/or p7 has something to do with finding a node on the same path/road and same direction(at least for this native, something to do with the heading maybe). Edit this when you find out more. - p5 is either 1 or 12. 1 means any path/road. 12, 8, 0 means node in the middle of the closest main (asphalt) road. - p6 is always 3.0 - p7 is always 0. - Known node types: simple path/asphalt road, only asphalt road, water, under the map at always the same coords. - The node types follows a pattern. For example, every fourth node is of the type water i.e. 3, 7, 11, 15, 19, 23, 27, 31, 35, 39... 239. Could not see any difference between nodes within certain types. - Starting at 2, every fourth node is under the map, always same coords. - Same with only asphalt road (0, 4, 8, etc) and simple path/asphalt road (1, 5, 9, etc). - gtaforums.com/topic/843561-pathfind-node-types - Example of usage, moving vehicle to closest path/road: - Vector3 coords = ENTITY::GET_ENTITY_COORDS(playerVeh, true); - Vector3 closestVehicleNodeCoords; - float roadHeading; - PATHFIND::GET_CLOSEST_VEHICLE_NODE_WITH_HEADING(coords.x, coords.y, coords.z, &closestVehicleNodeCoords, &roadHeading, 1, 3, 0); - ENTITY::SET_ENTITY_HEADING(playerVeh, roadHeading); - ENTITY::SET_ENTITY_COORDS(playerVeh, closestVehicleNodeCoords.x, closestVehicleNodeCoords.y, closestVehicleNodeCoords.z, 1, 0, 0, 1); - VEHICLE::SET_VEHICLE_ON_GROUND_PROPERLY(playerVeh); - ------------------------------------------------------------------ - C# Example (ins1de) : pastebin.com/fxtMWAHD - - - - - Returns POSIX timestamp. - - Renamed from `_GET_POSIX_TIME` to `GET_CLOUD_TIME_AS_INT` because of conflicting native names ([`0xDA488F299A5B164E`](#_0xDA488F299A5B164E)) - - - - - p0: Ped Handle - p1: int i | 0 <= i <= 27 - p1 probably refers to the attributes configured in combatbehavior.meta. There are 13. Example: - <BlindFireChance value="0.1"/> - <WeaponShootRateModifier value="1.0"/> - <TimeBetweenBurstsInCover value="1.25"/> - <BurstDurationInCover value="2.0"/> - <TimeBetweenPeeks value="10.0"/> - <WeaponAccuracy value="0.18"/> - <FightProficiency value="0.8"/> - <StrafeWhenMovingChance value="1.0"/> - <WalkWhenStrafingChance value="0.0"/> - <AttackWindowDistanceForCover value="55.0"/> - <TimeToInvalidateInjuredTarget value="9.0"/> - <TriggerChargeTime_Near value="4.0"/> - <TriggerChargeTime_Far value="10.0"/> - -------------Confirmed by editing combatbehavior.meta: - p1: - 0=BlindFireChance - 1=BurstDurationInCover - 3=TimeBetweenBurstsInCover - 4=TimeBetweenPeeks - 5=StrafeWhenMovingChance - 8=WalkWhenStrafingChance - 11=AttackWindowDistanceForCover - 12=TimeToInvalidateInjuredTarget - 16=OptimalCoverDistance - - - - - formerly called _GET_CONTROL_ACTION_NAME incorrectly - p2 appears to always be true. - p2 is unused variable in function. - EG: - GET_CONTROL_INSTRUCTIONAL_BUTTON (2, 201, 1) -- [[INPUT_FRONTEND_ACCEPT (e.g. Enter button)]] - GET_CONTROL_INSTRUCTIONAL_BUTTON (2, 202, 1) -- [[INPUT_FRONTEND_CANCEL (e.g. ESC button)]] - GET_CONTROL_INSTRUCTIONAL_BUTTON (2, 51, 1) -- [[INPUT_CONTEXT (e.g. E button)]] - gtaforums.com/topic/819070-c-draw-instructional-buttons-scaleform-movie/#entry1068197378 - 0, 1 and 2 used in the scripts. 0 is by far the most common of them. - - - - - Returns the value of CONTROLS::GET_CONTROL_VALUE Normalized (ie a real number value between -1 and 1) - 0, 1 and 2 used in the scripts. 0 is by far the most common of them. - - - - - 0, 1 and 2 used in the scripts. 0 is by far the most common of them. - - - - - 0 -> up - 1 -> lowering down - 2 -> down - 3 -> raising up - enum RoofState - { - ROOFSTATE_UP = 0; - ROOFSTATE_LOWERING, - ROOFSTATE_DOWN, - ROOFSTATE_RAISING - }; - - - - - Example in VB - Public Shared Function GetVehicleCurrentWeapon(Ped As Ped) As Integer - Dim arg As New OutputArgument() - Native.Function.Call(Hash.GET_CURRENT_PED_VEHICLE_WEAPON, Ped, arg) - Return arg.GetResult(Of Integer)() - End Function - Usage: - If GetVehicleCurrentWeapon(Game.Player.Character) = -821520672 Then ...Do something - Note: -821520672 = VEHICLE_WEAPON_PLANE_ROCKET - - - - - The return value seems to indicate returns true if the hash of the weapon object weapon equals the weapon hash. - p2 seems to be 1 most of the time. - p2 is not implemented - disassembly said that? - ------ - yes on disassembly p2 it seems not implemented i just have: - bool __fastcall sub_7FF6C56CE684(__int64 a1, _DWORD *a2) - Found At: 7ff6c56ce684 - - - - - Returns the name of the currently executing resource. - - - - - Returns the peer address of the remote game server that the user is currently connected to. - - - - - This function is hard-coded to always return 1. - - - - - control - c# works with (int)GTA.Control.CursorY / (int)GTA.Control.CursorX and returns the mouse movement (additive). - 0, 1 and 2 used in the scripts. 0 is by far the most common of them. - - - - - Returns model name of vehicle in all caps. Needs to be displayed through localizing text natives to get proper display name. - ----------------------------------------------------------------------------------------------------------------------------------------- - While often the case, this does not simply return the model name of the vehicle (which could be hashed to return the model hash). Variations of the same vehicle may also use the same display name. - ----------------------------------------------------------------------------------------------------------------------------------------- - Returns "CARNOTFOUND" if the hash doesn't match a vehicle hash. - Using UI::_GET_LABEL_TEXT, you can get the localized name. - For a full list, see here: pastebin.com/wvpyS4kS (pastebin.com/dA3TbkZw) - - - - - Returns the distance between two three-dimensional points, optionally ignoring the Z values. - - You'll most likely want to use your language's native vector functionality instead. - - - - - dlcVehicleIndex takes a number from 0 - GET_NUM_DLC_VEHICLES() - 1. - outData is a struct of 3 8-byte items. - The Second item in the struct *(Hash *)(outData + 1) is the vehicle hash. - - - - - dlcVehicleIndex is 0 to GET_NUM_DLC_VEHICLS() - - - - - p0 seems to be the weapon index - p1 seems to be the weapon component index - struct DlcComponentData{ - int attachBone; - int padding1; - int bActiveByDefault; - int padding2; - int unk; - int padding3; - int componentHash; - int padding4; - int unk2; - int padding5; - int componentCost; - int padding6; - char nameLabel[64]; - char descLabel[64]; - }; - - - - - dlcWeaponIndex takes a number from 0 - GET_NUM_DLC_WEAPONS() - 1. - struct DlcWeaponData - { - int emptyCheck; //use DLC1::_IS_DLC_DATA_EMPTY on this - int padding1; - int weaponHash; - int padding2; - int unk; - int padding3; - int weaponCost; - int padding4; - int ammoCost; - int padding5; - int ammoType; - int padding6; - int defaultClipSize; - int padding7; - char nameLabel[64]; - char descLabel[64]; - char desc2Label[64]; // usually "the" + name - char upperCaseNameLabel[64]; - }; - - - - - Returns the NUI window handle for a specified DUI browser object. - - - - - Returns a float value representing animation's current playtime with respect to its total playtime. This value increasing in a range from [0 to 1] and wrap back to 0 when it reach 1. - Example: - 0.000000 - mark the starting of animation. - 0.500000 - mark the midpoint of the animation. - 1.000000 - mark the end of animation. - Animations list : www.los-santos-multiplayer.com/dev.airdancer?cxt=anim - - - - - Returns a float value representing animation's total playtime in milliseconds. - Example: - GET_ENTITY_ANIM_TOTAL_TIME(PLAYER_ID(),"amb@world_human_yoga@female@base","base_b") - return 20800.000000 - Animations list : www.los-santos-multiplayer.com/dev.airdancer?cxt=anim - - - - - Returns the index of the bone. If the bone was not found, -1 will be returned. - list: - pastebin.com/D7JMnX1g - BoneNames: - chassis, - windscreen, - seat_pside_r, - seat_dside_r, - bodyshell, - suspension_lm, - suspension_lr, - platelight, - attach_female, - attach_male, - bonnet, - boot, - chassis_dummy, //Center of the dummy - chassis_Control, //Not found yet - door_dside_f, //Door left, front - door_dside_r, //Door left, back - door_pside_f, //Door right, front - door_pside_r, //Door right, back - Gun_GripR, - windscreen_f, - platelight, //Position where the light above the numberplate is located - VFX_Emitter, - window_lf, //Window left, front - window_lr, //Window left, back - window_rf, //Window right, front - window_rr, //Window right, back - engine, //Position of the engine - gun_ammo, - ROPE_ATTATCH, //Not misspelled. In script "finale_heist2b.c4". - wheel_lf, //Wheel left, front - wheel_lr, //Wheel left, back - wheel_rf, //Wheel right, front - wheel_rr, //Wheel right, back - exhaust, //Exhaust. shows only the position of the stock-exhaust - overheat, //A position on the engine(not exactly sure, how to name it) - misc_e, //Not a car-bone. - seat_dside_f, //Driver-seat - seat_pside_f, //Seat next to driver - Gun_Nuzzle, - seat_r - I doubt that the function is case-sensitive, since I found a "Chassis" and a "chassis". - Just tested: Definitely not case-sensitive. - - - - - Gets the current coordinates for a specified entity. - - - - - Gets the entity's forward vector. - - - - - Gets the X-component of the entity's forward vector. - - - - - Gets the Y-component of the entity's forward vector. - - - - - Returns the heading of the entity in degrees. Also know as the "Yaw" of an entity. - - - - - Returns an integer value of entity's current health. - Example of range for ped: - - Player [0 to 200] - - Ped [100 to 200] - - Vehicle [0 to 1000] - - Object [0 to 1000] - Health is actually a float value but this native casts it to int. - In order to get the actual value, do: - float health = *(float *)(entityAddress + 0x280); - - - - - Return height (z-dimension) above ground. - Example: The pilot in a titan plane is 1.844176 above ground. - How can i convert it to meters? - Everything seems to be in meters, probably this too. - - - - - Returns the LOD distance of an entity. - - - - - Return an integer value of entity's maximum health. - Example: - - Player = 200 - - - - - Returns the model hash from the entity - Sometimes throws an exception, idk what causes it though. - - - - - Returns TRUE if it found an entity in your crosshair within range of your weapon. Assigns the handle of the target to the *entity that you pass it. - Returns false if no entity found. - - - - - Gets an entity's population type. - - **Valid population types:** - - ```cpp - enum ePopulationType - { - POPTYPE_UNKNOWN = 0, - POPTYPE_RANDOM_PERMANENT, - POPTYPE_RANDOM_PARKED, - POPTYPE_RANDOM_PATROL, - POPTYPE_RANDOM_SCENARIO, - POPTYPE_RANDOM_AMBIENT, - POPTYPE_PERMANENT, - POPTYPE_MISSION, - POPTYPE_REPLAY, - POPTYPE_CACHE, - POPTYPE_TOOL - }; - ``` - - - - - w is the correct parameter name! - - - - - Displays the current ROLL axis of the entity [-180.0000/180.0000+] - (Sideways Roll) such as a vehicle tipped on its side - - - - - rotationOrder refers to the order yaw pitch roll is applied - value ranges from 0 to 5. What you use for rotationOrder when getting must be the same as rotationOrder when setting the rotation. - Unsure what value corresponds to what rotation order, more testing will be needed for that. - ------ - rotationOrder is usually 2 in scripts - ------ - ENTITY::GET_ENTITY_ROTATION(Any p0, false or true); - if false than return from -180 to 180 - if true than return from -90 to 90 - --- - As said above, the value of p1 affects the outcome. R* uses 1 and 2 instead of 0 and 1, so I marked it as an int. - What it returns is the yaw on the z part of the vector, which makes sense considering R* considers z as vertical. Here's a picture for those of you who don't understand pitch, yaw, and roll: - www.allstar.fiu.edu/aero/images/pic5-1.gif - I don't know why it returns a Vec3, but sometimes the values x and y go negative, yet they're always zero. Just use GET_ENTITY_PITCH and GET_ENTITY_ROLL for pitch and roll. - - - - - ANGULAR_VELOCITY* - - - - - All ambient entities in-world seem to have the same value for the second argument (Any *script), depending on when the scripthook was activated/re-activated. I've seen numbers from ~5 to almost 70 when the value was translated with to_string. The function return value seems to always be 0. - - - - - result is in meters per second - ------------------------------------------------------------ - So would the conversion to mph and km/h, be along the lines of this. - float speed = GET_ENTITY_SPEED(veh); - float kmh = (speed * 3.6); - float mph = (speed * 2.236936); - - - - - Relative can be used for getting speed relative to the frame of the vehicle, to determine for example, if you are going in reverse (-y speed) or not (+y speed). - - - - - Get how much of the entity is submerged. 1.0f is whole entity. - - - - - Returns: - 0 = no entity - 1 = ped - 2 = vehicle - 3 = object - This is weird, because in memory atleast on xbox360 it stores it from testing with a variety of (ped, vehicle, and objects). - 03 - 04 - 05 - The above is more then likely true for the native's return, but if you were to skip using the native it's a bit weird it returns different results. - - - - - the unit is m/s along each axis - GET_ENTITY_VELOCITY(aEntity) is the same as GET_ENTITY_SPEED_VECTOR(aEntity,false) - - - - - eventGroup: 0 = CEventGroupScriptAI, 1 = CEventGroupScriptNetwork - - - - - eventGroup: 0 = CEventGroupScriptAI, 1 = CEventGroupScriptNetwork - - - - - eventGroup: 0 = CEventGroupScriptAI, 1 = CEventGroupScriptNetwork - - - - - 8 = waypoint - - - - - Returns - 0 - Third Person Close - 1 - Third Person Mid - 2 - Third Person Far - 4 - First Person - - - - - Returns the type of camera: - 0 - Third Person Close - 1 - Third Person Mid - 2 - Third Person Far - 4 - First Person - - - - - p0 dosen't seem to change much, I tried it with 0, 1, 2: - 0-Pitch(X): -70.000092 - 0-Roll(Y): -0.000001 - 0-Yaw(Z): -43.886459 - 1-Pitch(X): -70.000092 - 1-Roll(Y): -0.000001 - 1-Yaw(Z): -43.886463 - 2-Pitch(X): -70.000092 - 2-Roll(Y): -0.000002 - 2-Yaw(Z): -43.886467 - - - - - Gets the ground elevation at the specified position. Note that if the specified position is below ground level, the function will output zero! - x: Position on the X-axis to get ground elevation at. - y: Position on the Y-axis to get ground elevation at. - z: Position on the Z-axis to get ground elevation at. - groundZ: The ground elevation at the specified position. - unk: Nearly always 0, very rarely 1 in the scripts. - - - - - p1 may be a BOOL representing whether or not the group even exists - - - - - Gets the (case-insensitive, lower-cased) hash value for the passed string. This uses the 'Jenkins one-at-a-time' hashing - algorithm. - - - - - Returns a hash representing which part of the map the given coords are located. - Possible return values: - (Hash of) city -> -289320599 - (Hash of) countryside -> 2072609373 - C# Example : - Ped player = Game.Player.Character; - Hash h = Function.Call<Hash>(Hash.GET_HASH_OF_MAP_AREA_AT_COORDS, player.Position.X, player.Position.Y, player.Position.Z); - - - - - dx = x1 - dy = y1 - - - - - HUD colors and their values: pastebin.com/d9aHPbXN - - - - - x1, y1, z1 -- Coords of your ped model - x2, y2, z2 -- Coords of the ped you want to switch to - - - - - Returns interior ID from specified coordinates. If coordinates are outside, then it returns 0. - Example for VB.NET - Dim interiorID As Integer = Native.Function.Call(Of Integer)(Hash.GET_INTERIOR_AT_COORDS, X, Y, Z) - - - - - Returns the interior ID representing the requested interior at that location (if found?). The supplied interior string is not the same as the one used to load the interior. - Use: INTERIOR::UNPIN_INTERIOR(INTERIOR::GET_INTERIOR_AT_COORDS_WITH_TYPE(x, y, z, interior)) - Interior types include: "V_Michael", "V_Franklins", "V_Franklinshouse", etc.. you can find them in the scripts. - Not a very useful native as you could just use GET_INTERIOR_AT_COORDS instead and get the same result, without even having to specify the interior type. - - - - - Returns the handle of the interior that the entity is in. Returns 0 if outside. - - - - - Returns the group ID of the specified interior. For example, regular interiors have group 0, subway interiors have group 1. There are a few other groups too. - - - - - false = Any resolution < 1280x720 - true = Any resolution >= 1280x720 - - - - - From the driver's perspective, is the left headlight broken. - - - - - Hash collision - - - - - gadgetHash - was always 0xFBAB5776 ("GADGET_PARACHUTE"). - - - - - From the driver's perspective, is the right headlight broken. - - - - - from docks_heistb.c4: - AI::GET_IS_TASK_ACTIVE(PLAYER::PLAYER_PED_ID(), 2)) - Known Tasks: pastebin.com/2gFqJ3Px - - - - - Returns true when in a vehicle, false whilst entering/exiting. - - - - - Check if Vehicle Secondary is avaliable for customize - - - - - For a full list, see here: pastebin.com/Tp0XpBMN - - - - - Setting Aspect Ratio Manually in game will return: - false - for Narrow format Aspect Ratios (3:2, 4:3, 5:4, etc. ) - true - for Wide format Aspect Ratios (5:3, 16:9, 16:10, etc. ) - Setting Aspect Ratio to "Auto" in game will return "false" or "true" based on the actual set Resolution Ratio. - - - - - Seems to do the exact same as INTERIOR::GET_ROOM_KEY_FROM_ENTITY - - - - - ``` - Landing gear states: - 0: Deployed - 1: Closing (Retracting) - 3: Opening (Deploying) - 4: Retracted - ``` - - Landing gear state 2 is never used. - - - - - Not exactly sure on this one, but here's a snippet of code: - if (PED::IS_PED_IN_ANY_VEHICLE(PLAYER::PLAYER_PED_ID(), 0)) { - v_2 = PED::GET_VEHICLE_PED_IS_IN(PLAYER::PLAYER_PED_ID(), 0); - } else { - v_2 = VEHICLE::_B2D06FAEDE65B577(); - } - - - - - Returns the length of the string passed (much like strlen). - - - - - Returns the string length of the string from the gxt string . - - - - - Second Param = LiveryIndex - example - int count = VEHICLE::GET_VEHICLE_LIVERY_COUNT(veh); - for (int i = 0; i < count; i++) - { - char* LiveryName = VEHICLE::GET_LIVERY_NAME(veh, i); - } - this example will work fine to fetch all names - for example for Sanchez we get - SANC_LV1 - SANC_LV2 - SANC_LV3 - SANC_LV4 - SANC_LV5 - Use _GET_LABEL_TEXT, to get the localized livery name. - ----------- - NOTE: You may need to set the vehicle's modKit to 0 by using this function: SET_VEHICLE_MOD_KIT() before getting the name, otherwise this native may return NULL. - dev-c.com/nativedb/func/info/1f2aa07f00b3217a - - - - - Gets local system time as year, month, day, hour, minute and second. - Example usage: - int year; - int month; - int day; - int hour; - int minute; - int second; - or use std::tm struct - TIME::GET_LOCAL_TIME(&year, &month, &day, &hour, &minute, &second); - - - - - This function is hard-coded to always return 0. - Limit is 96, see _GET_MAXIMUM_NUMBER_OF_PHOTOS_2 (0xDC54A7AF8B3A14EF). - - - - - p2 is mostly 1 in the scripts. - - - - - Gets the maximum wanted level the player can get. - Ranges from 0 to 5. - - - - - Gets the dimensions of a model. - Calculate (maximum - minimum) to get the size, in which case, Y will be how long the model is. - Vector3 GetDimensions(Hash model) - { - Vector3 right, left; - GET_MODEL_DIMENSIONS(model, &right, &left); - return Vector3::Subtract(left, right); - } - Example from the scripts: GAMEPLAY::GET_MODEL_DIMENSIONS(ENTITY::GET_ENTITY_MODEL(PLAYER::PLAYER_PED_ID()), &v_1A, &v_17); - - - - - Returns the name for the type of vehicle mod(Armour, engine etc) - ----------- - for some reason this native seems unreliable: sometimes returns NULL, and when retval != NULL the string can be empty - - - - - Returns the text label of a mod type for a given vehicle - Use _GET_LABEL_TEXT to get the part name in the game's language - - - - - Function just returns 0 - void __fastcall ped__get_mount(NativeContext *a1) - { - NativeContext *v1; // rbx@1 - v1 = a1; - GetAddressOfPedFromScriptHandle(a1->Args->Arg1); - v1->Returns->Item1= 0; - } - - - - - AIRP = Los Santos International Airport - ALAMO = Alamo Sea - ALTA = Alta - ARMYB = Fort Zancudo - BANHAMC = Banham Canyon Dr - BANNING = Banning - BEACH = Vespucci Beach - BHAMCA = Banham Canyon - BRADP = Braddock Pass - BRADT = Braddock Tunnel - BURTON = Burton - CALAFB = Calafia Bridge - CANNY = Raton Canyon - CCREAK = Cassidy Creek - CHAMH = Chamberlain Hills - CHIL = Vinewood Hills - CHU = Chumash - CMSW = Chiliad Mountain State Wilderness - CYPRE = Cypress Flats - DAVIS = Davis - DELBE = Del Perro Beach - DELPE = Del Perro - DELSOL = La Puerta - DESRT = Grand Senora Desert - DOWNT = Downtown - DTVINE = Downtown Vinewood - EAST_V = East Vinewood - EBURO = El Burro Heights - ELGORL = El Gordo Lighthouse - ELYSIAN = Elysian Island - GALFISH = Galilee - GOLF = GWC and Golfing Society - GRAPES = Grapeseed - GREATC = Great Chaparral - HARMO = Harmony - HAWICK = Hawick - HORS = Vinewood Racetrack - HUMLAB = Humane Labs and Research - JAIL = Bolingbroke Penitentiary - KOREAT = Little Seoul - LACT = Land Act Reservoir - LAGO = Lago Zancudo - LDAM = Land Act Dam - LEGSQU = Legion Square - LMESA = La Mesa - LOSPUER = La Puerta - MIRR = Mirror Park - MORN = Morningwood - MOVIE = Richards Majestic - MTCHIL = Mount Chiliad - MTGORDO = Mount Gordo - MTJOSE = Mount Josiah - MURRI = Murrieta Heights - NCHU = North Chumash - NOOSE = N.O.O.S.E - OCEANA = Pacific Ocean - PALCOV = Paleto Cove - PALETO = Paleto Bay - PALFOR = Paleto Forest - PALHIGH = Palomino Highlands - PALMPOW = Palmer-Taylor Power Station - PBLUFF = Pacific Bluffs - PBOX = Pillbox Hill - PROCOB = Procopio Beach - RANCHO = Rancho - RGLEN = Richman Glen - RICHM = Richman - ROCKF = Rockford Hills - RTRAK = Redwood Lights Track - SANAND = San Andreas - SANCHIA = San Chianski Mountain Range - SANDY = Sandy Shores - SKID = Mission Row - SLAB = Stab City - STAD = Maze Bank Arena - STRAW = Strawberry - TATAMO = Tataviam Mountains - TERMINA = Terminal - TEXTI = Textile City - TONGVAH = Tongva Hills - TONGVAV = Tongva Valley - VCANA = Vespucci Canals - VESP = Vespucci - VINE = Vinewood - WINDF = Ron Alternates Wind Farm - WVINE = West Vinewood - ZANCUDO = Zancudo River - ZP_ORT = Port of South Los Santos - ZQ_UAR = Davis Quartz - - - - - Looks like the last parameter returns true if the path has been calculated, while the first returns the remaining distance to the end of the path. - Return value of native is the same as GET_NAVMESH_ROUTE_RESULT - Looks like the native returns an int for the path's state: - 1 - ??? - 2 - 3 - Finished Generating - - - - - See GET_NAVMESH_ROUTE_DISTANCE_REMAINING for more details. - - - - - Could this be used alongside either, - SET_NETWORK_ID_EXISTS_ON_ALL_MACHINES or _SET_NETWORK_ID_SYNC_TO_PLAYER to make it so other players can hear the sound while online? It'd be a bit troll-fun to be able to play the Zancudo UFO creepy sounds globally. - - - - - Returns weather name hash - - - - - See gtaforums.com/topic/843561-pathfind-node-types for node type info. 0 = paved road only, 1 = any road, 3 = water - p10 always equal 0x40400000 - p11 always equal 0 - - - - - Returns the id. - - - - - Get the nth closest vehicle node and its heading. (unknown2 = 9, unknown3 = 3.0, unknown4 = 2.5) - - - - - eventGroup: 0 = CEventGroupScriptAI, 1 = CEventGroupScriptNetwork - - - - - List of component/props ID - gtaxscripting.blogspot.com/2016/04/gta-v-peds-component-and-props.html - - - - - List of component/props ID - gtaxscripting.blogspot.com/2016/04/gta-v-peds-component-and-props.html - - - - - Need to check behavior when drawableId = -1 - - Doofy.Ass - Why this function doesn't work and return nill value? - GET_NUMBER_OF_PED_PROP_TEXTURE_VARIATIONS(PLAYER.PLAYER_PED_ID(), 0, 5) - tick: scripts/addins/menu_execute.lua:51: attempt to call field 'GET_NUMBER_OF_PED_PROP_TEXTURE_VARIATIONS' (a nil value) - List of component/props ID - gtaxscripting.blogspot.com/2016/04/gta-v-peds-component-and-props.html - - - - - List of component/props ID - gtaxscripting.blogspot.com/2016/04/gta-v-peds-component-and-props.html - - - - - Actually number of color combinations - - - - - Returns the number of *types* of licence plates, enumerated below in SET_VEHICLE_NUMBER_PLATE_TEXT_INDEX. - - - - - Gets the total number of DLC weapons. - - - - - Allowed Values from 0 - DLC1::GET_NUM_DLC_WEAPONS() - - - - - p0 appears to be for MP - - - - - p0 appears to be for MP - - - - - p0 appears to be for MP - - - - - Gets the amount of metadata values with the specified key existing in the specified resource's manifest. - See also: [Resource manifest](https://docs.fivem.net/resources/manifest/) - - - - - Returns how many possible mods a vehicle has for a given mod type - - - - - Simply returns whatever is passed to it (Regardless of whether the handle is valid or not). - - - - - Converts world coords (posX - Z) to coords relative to the entity - Example: - posX = 50 - posY = 1000 - posZ = 60 - Entity's coords are: x=30, y=1000, z=60. - All three returned coords will then be in range of [-20,20] depending on rotation of the entity. - - - - - Offset values are relative to the entity. - x = left/right - y = forward/backward - z = up/down - - - - - Returns NULL unless UPDATE_ONSCREEN_KEYBOARD() returns 1 in the same tick. - - - - - Returns: - 5 - 10 - 15 - 20 - 25 - 30 - 35 - - - - - gtaforums.com/topic/885580-ped-headshotmugshot-txd/ - - - - - Returns the ped's alertness (0-3). - Values : - 0 : Neutral - 1 : Heard something (gun shot, hit, etc) - 2 : Knows (the origin of the event) - 3 : Fully alerted (is facing the event?) - If the Ped does not exist, returns -1. - - - - - Returns an ammo type hash, which is defined in AmmoInfo. - - - - - from fm_mission_controller.c4 (variable names changed for clarity): - int groupID = PLAYER::GET_PLAYER_GROUP(PLAYER::PLAYER_ID()); - PED::GET_GROUP_SIZE(group, &unused, &groupSize); - if (groupSize >= 1) { - . . . . for (int memberNumber = 0; memberNumber < groupSize; memberNumber++) { - . . . . . . . . Ped ped1 = PED::GET_PED_AS_GROUP_MEMBER(groupID, memberNumber); - . . . . . . . . //and so on - - - - - Gets the position of the specified bone of the specified ped. - ped: The ped to get the position of a bone from. - boneId: The ID of the bone to get the position from. This is NOT the index. - offsetX: The X-component of the offset to add to the position relative to the bone's rotation. - offsetY: The Y-component of the offset to add to the position relative to the bone's rotation. - offsetZ: The Z-component of the offset to add to the position relative to the bone's rotation. - - - - - Bone ID enum: pastebin.com/3pz17QGd - - - - - Returns the hash of the weapon/model/object that killed the ped. - - - - - p2 is always 1 in the scripts. - if (GET_PED_CONFIG_FLAG(ped, 78, 1)) - = returns true if ped is aiming/shooting a gun - - - - - Ids - 1 - 2 - 3 - 4 - 5 - 6 - 7 - ------ - 8 - Accessories 1 - 9 - Accessories 2 - 10 - 11 - Auxiliary parts for torso - - - - - Gets the offset the specified ped has moved since the previous tick. - If worldSpace is false, the returned offset is relative to the ped. That is, if the ped has moved 1 meter right and 5 meters forward, it'll return 1,5,0. - If worldSpace is true, the returned offset is relative to the world. That is, if the ped has moved 1 meter on the X axis and 5 meters on the Y axis, it'll return 1,5,0. - - - - - A getter for [\_SET_PED_EYE_COLOR](#_0x50B56988B170AFDF). Returns -1 if fails to get. - - - - - A getter for [\_SET_PED_FACE_FEATURE](#_0x71A5C1DBA060049E). Returns 0.0 if fails to get. - - - - - hash collision??? - - - - - Returns the group id of which the specified ped is a member of. - - - - - A getter for [SET_PED_HEAD_OVERLAY](#_0x48F44967FA05CC1E) and [\_SET_PED_HEAD_OVERLAY_COLOR](#_0x497BF74A7B9CB952) natives. - - - - - Simply returns whatever is passed to it (Regardless of whether the handle is valid or not). - - - - - -1 (driver) <= index < GET_VEHICLE_MAX_NUMBER_OF_PASSENGERS(vehicle) - - - - - Pretty sure outBone is an int. - - - - - Pass ped. Pass address of Vector3. - The coord will be put into the Vector3. - The return will determine whether there was a coord found or not. - - - - - sizeAndPeds - is a pointer to an array. The array is filled with peds found nearby the ped supplied to the first argument. - ignore - ped type to ignore - Return value is the number of peds found and added to the array passed. - ----------------------------------- - To make this work in most menu bases at least in C++ do it like so, - Formatted Example: pastebin.com/D8an9wwp - ----------------------------------- - Example: gtaforums.com/topic/789788-function-args-to-pedget-ped-nearby-peds/?p=1067386687 - Here's the right way to do it (console and pc): - pastebin.com/SsFej963 - - - - - Returns size of array, passed into the second variable. - See below for usage information. - This function actually requires a struct, where the first value is the maximum number of elements to return. Here is a sample of how I was able to get it to work correctly, without yet knowing the struct format. - //Setup the array - const int numElements = 10; - const int arrSize = numElements * 2 + 2; - Any veh[arrSize]; - //0 index is the size of the array - veh[0] = numElements; - int count = PED::GET_PED_NEARBY_VEHICLES(PLAYER::PLAYER_PED_ID(), veh); - if (veh != NULL) - { - //Simple loop to go through results - for (int i = 0; i < count; i++) - { - int offsettedID = i * 2 + 2; - //Make sure it exists - if (veh[offsettedID] != NULL && ENTITY::DOES_ENTITY_EXIST(veh[offsettedID])) - { - //Do something - } - } - } - Here's the right way to do it (console and pc): - pastebin.com/SsFej963 - - - - - List of component/props ID - gtaxscripting.blogspot.com/2016/04/gta-v-peds-component-and-props.html - - - - - -1: no landing - 0: landing on both feet - 1: stumbling - 2: rolling - 3: ragdoll - - - - - Returns: - -1: Normal - 0: Wearing parachute on back - 1: Parachute opening - 2: Parachute open - 3: Falling to doom (e.g. after exiting parachute) - Normal means no parachute? - - - - - List of component/props ID - gtaxscripting.blogspot.com/2016/04/gta-v-peds-component-and-props.html - - - - - List of component/props ID - gtaxscripting.blogspot.com/2016/04/gta-v-peds-component-and-props.html - - - - - Returns the Entity (Ped, Vehicle, or ?Object?) that killed the 'ped' - Is best to check if the Ped is dead before asking for its killer. - - - - - Returns whether the entity is in stealth mode - - - - - List of component/props ID - gtaxscripting.blogspot.com/2016/04/gta-v-peds-component-and-props.html - - - - - Ped Types: (ordered by return priority) - Michael = 0 - Franklin = 1 - Trevor = 2 - Army = 29 - Animal = 28 - SWAT = 27 - LSFD = 21 - Paramedic = 20 - Cop = 6 - Male = 4 - Female = 5 - Human = 26 - Note/Exception - hc_gunman : 4 // Mix male and female - hc_hacker : 4 // Mix male and female - mp_f_misty_01 : 4 // Female character - s_f_y_ranger_01 : 5 // Ranger - s_m_y_ranger_01 : 4 // Ranger - s_m_y_uscg_01 : 6 // US Coast Guard - - - - - Returns the progress percent to current waypoint. - - - - - Alternative: GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID(), 1); - - - - - Returns the group ID the player is member of. - - - - - Called 5 times in the scripts. All occurrences found in b617d, sorted alphabetically and identical lines removed: - AUDIO::GET_PLAYER_HEADSET_SOUND_ALTERNATE("INOUT", 0.0); - AUDIO::GET_PLAYER_HEADSET_SOUND_ALTERNATE("INOUT", 1.0); - - - - - Returns the same as PLAYER_ID and NETWORK_PLAYER_ID_TO_INT - - - - - Returns the Player's Invincible status. - This function will always return false if 0x733A643B5B0C53C1 is used to set the invincibility status. To always get the correct result, use this: - bool IsPlayerInvincible(Player player) - { - auto addr = getScriptHandleBaseAddress(GET_PLAYER_PED(player)); - if (addr) - { - DWORD flag = *(DWORD *)(addr + 0x188); - return ((flag & (1 << 8)) != 0) || ((flag & (1 << 9)) != 0); - } - return false; - } - ============================================================ - This has bothered me for too long, whoever may come across this, where did anyone ever come up with this made up hash? 0x733A643B5B0C53C1 I've looked all over old hash list, and this nativedb I can not find that PC hash anywhere. What native name is it now or was it? - - - - - Returns the players name - - - - - Tints: - None = -1, - Rainbow = 0, - Red = 1, - SeasideStripes = 2, - WidowMaker = 3, - Patriot = 4, - Blue = 5, - Black = 6, - Hornet = 7, - AirFocce = 8, - Desert = 9, - Shadow = 10, - HighAltitude = 11, - Airbone = 12, - Sunrise = 13, - - - - - Gets the ped for a specified player index. - - - - - Does the same like PLAYER::GET_PLAYER_PED<br/> - - - - - Returns 255 (radio off index) if the function fails. - - - - - Returns active radio station name - - - - - Tints: - None = -1, - Rainbow = 0, - Red = 1, - SeasideStripes = 2, - WidowMaker = 3, - Patriot = 4, - Blue = 5, - Black = 6, - Hornet = 7, - AirFocce = 8, - Desert = 9, - Shadow = 10, - HighAltitude = 11, - Airbone = 12, - Sunrise = 13, - - - - - Returns RGB color of the player - - - - - Assigns the handle of locked-on melee target to *entity that you pass it. - Returns false if no entity found. - - - - - Gets the player's team. - Does nothing in singleplayer. - - - - - p1 is some kind of tolerance - - - - - Gets system time as year, month, day, hour, minute and second. - Example usage: - int year; - int month; - int day; - int hour; - int minute; - int second; - TIME::GET_POSIX_TIME(&year, &month, &day, &hour, &minute, &second); - - - - - Returns current weather name hash - - - - - gtaforums.com/topic/799843-stats-profile-settings/ - - - - - Returns String with radio station name. - - - - - Another extremely useful native. - You can use it simply like: - if (GAMEPLAY::GET_RANDOM_INT_IN_RANGE(0, 2)) - - - - - Gets a random ped in the x/y/zRadius near the x/y/z coordinates passed. - Ped Types: - Any = -1 - Player = 1 - Male = 4 - Female = 5 - Cop = 6 - Human = 26 - SWAT = 27 - Animal = 28 - Army = 29 - - - - - Gets a random vehicle in a sphere at the specified position, of the specified radius. - x: The X-component of the position of the sphere. - y: The Y-component of the position of the sphere. - z: The Z-component of the position of the sphere. - radius: The radius of the sphere. Max is 9999.9004. - modelHash: The vehicle model to limit the selection to. Pass 0 for any model. - flags: The bitwise flags that modifies the behaviour of this function. - - - - - Not present in the retail version! It's just a nullsub. - p0 always true (except in one case) - p1 a random vehicle hash loaded in memory - p2 0 if success, -1 if failed - - - - - Returns all commands that are registered in the command system. - The data returned adheres to the following layout: - - ``` - [ - { - "name": "cmdlist" - }, - { - "name": "command1" - } - ] - ``` - - - - - Gets the relationship between two groups. This should be called twice (once for each group). - Relationship types: - 0 = Companion - 1 = Respect - 2 = Like - 3 = Neutral - 4 = Dislike - 5 = Hate - 255 = Pedestrians - Example: - PED::GET_RELATIONSHIP_BETWEEN_GROUPS(l_1017, 0xA49E591C); - PED::GET_RELATIONSHIP_BETWEEN_GROUPS(0xA49E591C, l_1017); - - - - - Gets the relationship between two peds. This should be called twice (once for each ped). - Relationship types: - 0 = Companion - 1 = Respect - 2 = Like - 3 = Neutral - 4 = Dislike - 5 = Hate - 255 = Pedestrians - (Credits: Inco) - Example: - PED::GET_RELATIONSHIP_BETWEEN_PEDS(2, l_1017, 0xA49E591C); - PED::GET_RELATIONSHIP_BETWEEN_PEDS(2, 0xA49E591C, l_1017); - - - - - Gets the metadata value at a specified key/index from a resource's manifest. - See also: [Resource manifest](https://docs.fivem.net/resources/manifest/) - - - - - Returns the current state of the specified resource. - - - - - Gets the room hash key from the room that the specified entity is in. Each room in every interior has a unique key. Returns 0 if the entity is outside. - - - - - Gets the height of the specified runtime texture. - - - - - Gets the row pitch of the specified runtime texture, for use when creating data for `SET_RUNTIME_TEXTURE_ARGB_DATA`. - - - - - Gets the width of the specified runtime texture. - - - - - When onGround == true outPosition is a position located on the nearest pavement. - When a safe coord could not be found the result of a function is false and outPosition == Vector3.Zero. - In the scripts these flags are used: 0, 14, 12, 16, 20, 21, 28. 0 is most commonly used, then 16. - 16 works for me, 0 crashed the script. - - - - - Gets the scale of safe zone. if the safe zone size scale is max, it will return 1.0. - - - - - Convert a world coordinate into its relative screen coordinate. (WorldToScreen) - Returns a boolean; whether or not the operation was successful. It will return false if the coordinates given are not visible to the rendering camera. - For .NET users... - VB: - Public Shared Function World3DToScreen2d(pos as vector3) As Vector2 - Dim x2dp, y2dp As New Native.OutputArgument - Native.Function.Call(Of Boolean)(Native.Hash.GET_SCREEN_COORD_FROM_WORLD_COORD , pos.x, pos.y, pos.z, x2dp, y2dp) - Return New Vector2(x2dp.GetResult(Of Single), y2dp.GetResult(Of Single)) - End Function - C#: - Vector2 World3DToScreen2d(Vector3 pos) - { - var x2dp = new OutputArgument(); - var y2dp = new OutputArgument(); - Function.Call<bool>(Hash.GET_SCREEN_COORD_FROM_WORLD_COORD , pos.X, pos.Y, pos.Z, x2dp, y2dp); - return new Vector2(x2dp.GetResult<float>(), y2dp.GetResult<float>()); - } - //USE VERY SMALL VALUES FOR THE SCALE OF RECTS/TEXT because it is dramatically larger on screen than in 3D, e.g '0.05' small. - Used to be called _WORLD3D_TO_SCREEN2D - I thought we lost you from the scene forever. It does seem however that calling SET_DRAW_ORIGIN then your natives, then ending it. Seems to work better for certain things such as keeping boxes around people for a predator missile e.g. - - - - - int screenresx,screenresy; - GET_SCREEN_RESOLUTION(&screenresx,&screenresy); - Hardcoded to always return 1280 x 720 - - - - - Gets the status of a script-assigned task. The hash does not seem to match the actual native name, but is assigned hardcoded from the executable during task creation. - Statuses are specific to tasks, in addition '7' means the specified task is not assigned to the ped. - A few hashes found in the executable (although not a complete list) can be found at pastebin.com/R9iK6M9W as it was too long for this wiki. - - - - - Returns the hash of the weapon. - var num7 = WEAPON::GET_SELECTED_PED_WEAPON(num4); - sub_27D3(num7); - switch (num7) - { - case 0x24B17070: - Also see WEAPON::GET_CURRENT_PED_WEAPON. Difference? - ------------------------------------------------------------------------- - The difference is that GET_SELECTED_PED_WEAPON simply returns the ped's current weapon hash but GET_CURRENT_PED_WEAPON also checks the weapon object and returns true if the hash of the weapon object equals the weapon hash - - - - - returned values: - 0 to 7 = task that's currently in progress, 0 meaning the first one. - - - - - Parameters: - rayHandle - Ray Handle from a casted ray, as returned by CAST_RAY_POINT_TO_POINT - hit - Where to store whether or not it hit anything. False is when the ray reached its destination. - endCoords - Where to store the world-coords of where the ray was stopped (by hitting its desired max range or by colliding with an entity/the map) - surfaceNormal - Where to store the surface-normal coords (NOT relative to the game world) of where the entity was hit by the ray - entityHit - Where to store the handle of the entity hit by the ray - Returns: - Result? Some type of enum. - NOTE: To get the offset-coords of where the ray hit relative to the entity that it hit (which is NOT the same as surfaceNormal), you can use these two natives: - Vector3 offset = ENTITY::GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(entityHit, endCoords.x, endCoords.y, endCoords.z); - Vector3 entitySpotCoords = ENTITY::GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(entityHit, offset.x, offset.y, offset.z); - Use ENTITY::GET_ENTITY_TYPE(entityHit) to quickly distinguish what type of entity you hit (ped/vehicle/object - 1/2/3) - - - - - struct Outfit_s - { - int mask, torso, pants, parachute, shoes, misc1, tops1, armour, crew, tops2, hat, glasses, earpiece; - int maskTexture, torsoTexture, pantsTexture, parachuteTexture, shoesTexture, misc1Texture, tops1Texture, - armourTexture, crewTexture, tops2Texture, hatTexture, glassesTexture, earpieceTexture; - }; - - - - - locked is 0 if no door is found - locked is 0 if door is unlocked - locked is 1 if door is found and unlocked. - ------------- - the locked bool is either 0(unlocked)(false) or 1(locked)(true) - - - - - Determines the name of the street which is the closest to the given coordinates. - x,y,z - the coordinates of the street - streetName - returns a hash to the name of the street the coords are on - crossingRoad - if the coordinates are on an intersection, a hash to the name of the crossing road - Note: the names are returned as hashes, the strings can be returned using the function UI::GET_STREET_NAME_FROM_HASH_KEY. - - - - - This functions converts the hash of a street name into a readable string. - For how to get the hashes, see PATHFIND::GET_STREET_NAME_AT_COORD. - - - - - Returns the texture resolution of the passed texture dict+name. - Note: Most texture resolutions are doubled compared to the console version of the game. - - - - - Only use for this in the PC scripts is: - if (GRAPHICS::GET_TIMECYCLE_MODIFIER_INDEX() != -1) - For a full list, see here: pastebin.com/cnk7FTF2 - can someone update this pastebin??? - - - - - Previously named, '_FORMAT_TIME' for people who can't find it's uses in decompiled scripts. - - - - - Subtracts the second argument from the first. - - - - - Adds the first argument to the second. - - - - - Returns the time since the character was arrested in (ms) milliseconds. - example - var time = Function.call<int>(Hash.GET_TIME_SINCE_LAST_ARREST(); - UI.DrawSubtitle(time.ToString()); - if player has not been arrested, the int returned will be -1. - - - - - Returns the time since the character died in (ms) milliseconds. - example - var time = Function.call<int>(Hash.GET_TIME_SINCE_LAST_DEATH(); - UI.DrawSubtitle(time.ToString()); - if player has not died, the int returned will be -1. - - - - - Corrected p1. it's basically the 'carriage/trailer number'. So if the train has 3 trailers you'd call the native once with a var or 3 times with 1, 2, 3. - - - - - static - max acceleration - - - - - Returns attached vehicle (Vehicle in parameter must be cargobob) - - - - - Seems related to vehicle health, like the one in IV. - Max 1000, min 0. - Vehicle does not necessarily explode or become undrivable at 0. - - - - - iVar3 = get_vehicle_cause_of_destruction(uLocal_248[iVar2]); - if (iVar3 == joaat("weapon_stickybomb")) - { - func_171(726); - iLocal_260 = 1; - } - - - - - Returns an int - Vehicle Classes: - 0: Compacts - 1: Sedans - 2: SUVs - 3: Coupes - 4: Muscle - 5: Sports Classics - 6: Sports - 7: Super - 8: Motorcycles - 9: Off-road - 10: Industrial - 11: Utility - 12: Vans - 13: Cycles - 14: Boats - 15: Helicopters - 16: Planes - 17: Service - 18: Emergency - 19: Military - 20: Commercial - 21: Trains - char buffer[128]; - std::sprintf(buffer, "VEH_CLASS_%i", VEHICLE::GET_VEHICLE_CLASS(vehicle)); - char* className = UI::_GET_LABEL_TEXT(buffer); - - - - - For a full enum, see here : pastebin.com/i2GGAjY0 - char buffer[128]; - std::sprintf(buffer, "VEH_CLASS_%i", VEHICLE::GET_VEHICLE_CLASS_FROM_NAME (hash)); - char* className = UI::_GET_LABEL_TEXT(buffer); - - - - - What's this for? Primary and Secondary RGB have their own natives and this one doesn't seem specific. - - - - - Returns hash of default vehicle horn - Hash is stored in audVehicleAudioEntity - - - - - The only example I can find of this function in the scripts, is this: - struct _s = VEHICLE::GET_VEHICLE_DEFORMATION_AT_POS(rPtr((A_0) + 4), 1.21f, 6.15f, 0.3f); - ----------------------------------------------------------------------------------------------------------------------------------------- - PC scripts: - v_5 -- [[{3}]] = VEHICLE::GET_VEHICLE_DEFORMATION_AT_POS(a_0._f1, 1.21, 6.15, 0.3); - - - - - Dirt level 0..15 - - - - - example in vb: - Public Shared Function Get_Vehicle_Door_Angle(Vehicle As Vehicle, Door As VehicleDoor) As Single - Return Native.Function.Call(Of Single)(Hash.GET_VEHICLE_DOOR_ANGLE_RATIO, Vehicle.Handle, Door) - End Function - I'm Not MentaL - - - - - 2 seems to disable getting vehicle in modshop - - - - - Returns 1000.0 if the function is unable to get the address of the specified vehicle or if it's not a vehicle. - Minimum: -4000 - Maximum: 1000 - -4000: Engine is destroyed - 0 and below: Engine catches fire and health rapidly declines - 300: Engine is smoking and losing functionality - 1000: Engine is perfect - - - - - formerly known as _GET_VEHICLE_PAINT_FADE - The result is a value from 0-1, where 0 is fresh paint. - ----------------------------------------------------------------------- - The actual value isn't stored as a float but as an unsigned char (BYTE). - - - - - Returns the effective handling data of a vehicle as a floating-point value. - Example: `local fSteeringLock = GetVehicleHandlingFloat(vehicle, 'CHandlingData', 'fSteeringLock')` - - - - - Returns the effective handling data of a vehicle as an integer value. - Example: `local modelFlags = GetVehicleHandlingInt(vehicle, 'CHandlingData', 'strModelFlags')` - - - - - Returns the effective handling data of a vehicle as a vector value. - Example: `local inertiaMultiplier = GetVehicleHandlingVector(vehicle, 'CHandlingData', 'vecInertiaMultiplier')` - - - - - Simply returns whatever is passed to it (Regardless of whether the handle is valid or not). - - - - - Gets the vehicle indicator light state. 0 = off, 1 = left, 2 = right, 3 = both - - - - - -1 = no livery - - - - - Returns -1 if the vehicle has no livery - - - - - In b944, there are 50 (0 - 49) mod types. - Returns -1 if the vehicle mod is stock - - - - - Returns the acceleration of the specified model. - For a full list, see here: pastebin.com/GaN6vT4R - - - - - Returns max braking of the specified vehicle model. - For a full list, see here: pastebin.com/3N8DVbpG - - - - - Returns max traction of the specified vehicle model. - For a full list, see here: pastebin.com/ERnntVjK - - - - - Returns max number of passengers (including the driver) for the specified vehicle model. - For a full list, see here: pastebin.com/MdETCS1j - - - - - p3 seems to be the pearlescent highlight color. - Seems redondant with void GET_VEHICLE_EXTRA_COLOURS(Vehicle vehicle, int *pearlescentColor, int *wheelColor) - - - - - returns a string which is the codename of the vehicle's currently selected primary color - p1 is always 0 - - - - - returns a string which is the codename of the vehicle's currently selected secondary color - - - - - Returns true if the wheels are custom wheels - - - - - Calling this with an invalid node id, will crash the game. - Note that IS_VEHICLE_NODE_ID_VALID simply checks if nodeId is not zero. It does not actually ensure that the id is valid. - Eg. IS_VEHICLE_NODE_ID_VALID(1) will return true, but will crash when calling GET_VEHICLE_NODE_POSITION(). - sfink: This native returns a pointer to a packed Vector3 struct in the RAX register, as do the following natives: - AI::WAYPOINT_RECORDING_GET_COORD - ENTITY::GET_ENTITY_MATRIX - FIRE::GET_CLOSEST_FIRE_POS - GAMEPLAY::FIND_SPAWN_POINT_IN_DIRECTION - GAMEPLAY::GET_MODEL_DIMENSIONS - GAMEPLAY::OVERRIDE_SAVE_HOUSE - GAMEPLAY::_0x82FDE6A57EE4EE44 - GAMEPLAY::_0x8BDC7BFC57A81E76 - GAMEPLAY::_0x8D7A43EC6A5FEA45 - GAMEPLAY::_0xA4A0065E39C9F25C - GAMEPLAY::_0xDFB4138EEFED7B81 - MOBILE::GET_MOBILE_PHONE_POSITION - MOBILE::GET_MOBILE_PHONE_ROTATION - NETWORK::NETWORK_GET_RESPAWN_RESULT - OBJECT::_0x163F8B586BC95F2A - PATHFIND::GET_CLOSEST_MAJOR_VEHICLE_NODE - PATHFIND::GET_CLOSEST_ROAD - PATHFIND::GET_CLOSEST_VEHICLE_NODE - PATHFIND::GET_CLOSEST_VEHICLE_NODE_WITH_HEADING - PATHFIND::GET_NTH_CLOSEST_VEHICLE_NODE - PATHFIND::GET_NTH_CLOSEST_VEHICLE_NODE_FAVOUR_DIRECTION - PATHFIND::GET_NTH_CLOSEST_VEHICLE_NODE_WITH_HEADING - PATHFIND::GET_RANDOM_VEHICLE_NODE - PATHFIND::GET_SAFE_COORD_FOR_PED - PATHFIND::GET_VEHICLE_NODE_POSITION - PATHFIND::_0x16F46FB18C8009E4 - VEHICLE::_0xA4822F1CF23F4810 - VEHICLE::_0xDF7E3EEB29642C38 - WATER::TEST_PROBE_AGAINST_ALL_WATER - WATER::TEST_PROBE_AGAINST_WATER - WEAPON::GET_PED_LAST_WEAPON_IMPACT_COORD - WORLDPROBE::_0xFF6BE494C7987F34 - WORLDPROBE::_GET_RAYCAST_RESULT - - - - - MulleDK19: Gets the density and flags of the closest node to the specified position. - Density is a value between 0 and 15, indicating how busy the road is. - Flags is a bit field. - - - - - Gets the number of passengers, NOT including the driver. Use IS_VEHICLE_SEAT_FREE(Vehicle, -1) to also check for the driver - - - - - Returns the license plate text from a vehicle. 8 chars maximum. - - - - - Returns the PlateType of a vehicle - Blue_on_White_1 = 3, - Blue_on_White_2 = 0, - Blue_on_White_3 = 4, - Yellow_on_Blue = 2, - Yellow_on_Black = 1, - North_Yankton = 5, - - - - - Gets the vehicle the specified Ped is/was in depending on bool value. - [False = CurrentVehicle, True = LastVehicle] - - - - - Should be renamed GET_CAR_PED_IS_TRYING_TO_ENTER... - Because this works only for cars, not for helis, planes,motorcycles or bicycles... - From Calderon - This is what R* named it, deal with it. - - - - - Gets ID of vehicle player using. It means it can get ID at any interaction with vehicle. Enter\exit for example. And that means it is faster than GET_VEHICLE_PED_IS_IN but less safe. - - - - - 1000 is max health - Begins leaking gas at around 650 health - - - - - Gets the trailer of a vehicle and puts it into the trailer parameter. - - - - - List of known states: - - ``` - 1: Not wheeling. - 65: Vehicle is ready to do wheelie (burnouting). - 129: Vehicle is doing wheelie. - ``` - - - - - Gets speed of a wheel at the tyre. - Max number of wheels can be retrieved with the native GET_VEHICLE_NUMBER_OF_WHEELS. - - - - - Returns an int - Wheel Types: - 0: Sport - 1: Muscle - 2: Lowrider - 3: SUV - 4: Offroad - 5: Tuner - 6: Bike Wheels - 7: High End - Tested in Los Santos Customs - - - - - Returns the offset of the specified wheel relative to the wheel's axle center. - - - - - Remnant from GTA IV. Does nothing in GTA V. - - - - - Drft - - - - - This function set height to the value of z-axis of the water surface. - This function works with sea and lake. However it does not work with shallow rivers (e.g. raton canyon will return -100000.0f) - note: seems to return true when you are in water - - - - - Returns the model of any weapon. - Can also take an ammo hash? - sub_6663a(&l_115B, WEAPON::GET_WEAPONTYPE_MODEL(${ammo_rpg})); - - - - - // Returns the size of the default weapon component clip. - Use it like this: - char cClipSize[32]; - Hash cur; - if (WEAPON::GET_CURRENT_PED_WEAPON(playerPed, &cur, 1)) - { - if (WEAPON::IS_WEAPON_VALID(cur)) - { - int iClipSize = WEAPON::GET_WEAPON_CLIP_SIZE(cur); - sprintf_s(cClipSize, "ClipSize: %.d", iClipSize); - vDrawString(cClipSize, 0.5f, 0.5f); - } - } - - - - - 0=unknown (or incorrect weaponHash) - 1= no damage (flare,snowball, petrolcan) - 2=melee - 3=bullet - 4=force ragdoll fall - 5=explosive (RPG, Railgun, grenade) - 6=fire(molotov) - 8=fall(WEAPON_HELI_CRASH) - 10=electric - 11=barbed wire - 12=extinguisher - 13=gas - 14=water cannon(WEAPON_HIT_BY_WATER_CANNON) - - - - - // members should be aligned to 8 bytes by default but it's best to use alignas here, just to be sure - struct WeaponHudStatsData - { - alignas(8) uint8_t hudDamage; // 0x0000 - alignas(8) uint8_t hudSpeed; // 0x0008 - alignas(8) uint8_t hudCapacity; // 0x0010 - alignas(8) uint8_t hudAccuracy; // 0x0018 - alignas(8) uint8_t hudRange; // 0x0020 - }; - Usage: - WeaponHudStatsData data; - if (GET_WEAPON_HUD_STATS(weaponHash, (Any*)&data)) - { - // uint8_t damagePercentage = data.hudDamage etc... - } - - - - - Drops the current weapon and returns the object - Unknown behavior when unarmed. - - - - - Returns the coordinates of an entity-bone. - - - - - 'zoneName' corresponds to an entry in 'popzone.ipl'. - AIRP = Los Santos International Airport - ALAMO = Alamo Sea - ALTA = Alta - ARMYB = Fort Zancudo - BANHAMC = Banham Canyon Dr - BANNING = Banning - BEACH = Vespucci Beach - BHAMCA = Banham Canyon - BRADP = Braddock Pass - BRADT = Braddock Tunnel - BURTON = Burton - CALAFB = Calafia Bridge - CANNY = Raton Canyon - CCREAK = Cassidy Creek - CHAMH = Chamberlain Hills - CHIL = Vinewood Hills - CHU = Chumash - CMSW = Chiliad Mountain State Wilderness - CYPRE = Cypress Flats - DAVIS = Davis - DELBE = Del Perro Beach - DELPE = Del Perro - DELSOL = La Puerta - DESRT = Grand Senora Desert - DOWNT = Downtown - DTVINE = Downtown Vinewood - EAST_V = East Vinewood - EBURO = El Burro Heights - ELGORL = El Gordo Lighthouse - ELYSIAN = Elysian Island - GALFISH = Galilee - GOLF = GWC and Golfing Society - GRAPES = Grapeseed - GREATC = Great Chaparral - HARMO = Harmony - HAWICK = Hawick - HORS = Vinewood Racetrack - HUMLAB = Humane Labs and Research - JAIL = Bolingbroke Penitentiary - KOREAT = Little Seoul - LACT = Land Act Reservoir - LAGO = Lago Zancudo - LDAM = Land Act Dam - LEGSQU = Legion Square - LMESA = La Mesa - LOSPUER = La Puerta - MIRR = Mirror Park - MORN = Morningwood - MOVIE = Richards Majestic - MTCHIL = Mount Chiliad - MTGORDO = Mount Gordo - MTJOSE = Mount Josiah - MURRI = Murrieta Heights - NCHU = North Chumash - NOOSE = N.O.O.S.E - OCEANA = Pacific Ocean - PALCOV = Paleto Cove - PALETO = Paleto Bay - PALFOR = Paleto Forest - PALHIGH = Palomino Highlands - PALMPOW = Palmer-Taylor Power Station - PBLUFF = Pacific Bluffs - PBOX = Pillbox Hill - PROCOB = Procopio Beach - RANCHO = Rancho - RGLEN = Richman Glen - RICHM = Richman - ROCKF = Rockford Hills - RTRAK = Redwood Lights Track - SANAND = San Andreas - SANCHIA = San Chianski Mountain Range - SANDY = Sandy Shores - SKID = Mission Row - SLAB = Stab City - STAD = Maze Bank Arena - STRAW = Strawberry - TATAMO = Tataviam Mountains - TERMINA = Terminal - TEXTI = Textile City - TONGVAH = Tongva Hills - TONGVAV = Tongva Valley - VCANA = Vespucci Canals - VESP = Vespucci - VINE = Vinewood - WINDF = Ron Alternates Wind Farm - WVINE = West Vinewood - ZANCUDO = Zancudo River - ZP_ORT = Port of South Los Santos - ZQ_UAR = Davis Quartz - - - - - cellphone range 1- 5 used for signal bar in iFruit phone - - - - - Achievements from 0-57 - more achievements came with update 1.29 (freemode events update), I'd say that they now go to 60, but I'll need to check. - - - - - Gives a weapon to PED with a delay, example: - WEAPON::GIVE_DELAYED_WEAPON_TO_PED(PED::PLAYER_PED_ID(), GAMEPLAY::GET_HASH_KEY("WEAPON_PISTOL"), 1000, false) - ---------------------------------------------------------------------------------------------------------------------------------------- - Translation table: - pastebin.com/a39K8Nz8 - - - - - PoliceMotorcycleHelmet 1024 - RegularMotorcycleHelmet 4096 - FiremanHelmet 16384 - PilotHeadset 32768 - PilotHelmet 65536 - -- - p2 is generally 4096 or 16384 in the scripts. p1 varies between 1 and 0. - - - - - Sends the message that was created by a call to CREATE_NM_MESSAGE to the specified Ped. - If a message hasn't been created already, this function does nothing. - If the Ped is not ragdolled with Euphoria enabled, this function does nothing. - The following call can be used to ragdoll the Ped with Euphoria enabled: SET_PED_TO_RAGDOLL(ped, 4000, 5000, 1, 1, 1, 0); - Call order: - SET_PED_TO_RAGDOLL - CREATE_NM_MESSAGE - GIVE_PED_NM_MESSAGE - Multiple messages can be chained. Eg. to make the ped stagger and swing his arms around, the following calls can be made: - SET_PED_TO_RAGDOLL(ped, 4000, 5000, 1, 1, 1, 0); - CREATE_NM_MESSAGE(true, 0); // stopAllBehaviours - Stop all other behaviours, in case the Ped is already doing some Euphoria stuff. - GIVE_PED_NM_MESSAGE(ped); // Dispatch message to Ped. - CREATE_NM_MESSAGE(true, 1151); // staggerFall - Attempt to walk while falling. - GIVE_PED_NM_MESSAGE(ped); // Dispatch message to Ped. - CREATE_NM_MESSAGE(true, 372); // armsWindmill - Swing arms around. - GIVE_PED_NM_MESSAGE(ped); // Dispatch message to Ped. - - - - - p1 is either 1 or 2 in the PC scripts. - - - - - addonHash: - (use WEAPON::GET_WEAPON_COMPONENT_TYPE_MODEL() to get hash value) - ^ Wrong. - AddonHash is NOT a model hash, it's the weapon component hash. - ${component_at_ar_flsh}, ${component_at_ar_supp}, ${component_at_pi_flsh}, ${component_at_scope_large}, ${component_at_ar_supp_02} - - - - - isHidden - ???? - All weapon names (add to the list if something is missing), use GAMEPLAY::GET_HASH_KEY((char *)weaponNames[i]) to get get the hash: - static LPCSTR weaponNames[] = { - "WEAPON_KNIFE", "WEAPON_NIGHTSTICK", "WEAPON_HAMMER", "WEAPON_BAT", "WEAPON_GOLFCLUB", - "WEAPON_CROWBAR", "WEAPON_PISTOL", "WEAPON_COMBATPISTOL", "WEAPON_APPISTOL", "WEAPON_PISTOL50", - "WEAPON_MICROSMG", "WEAPON_SMG", "WEAPON_ASSAULTSMG", "WEAPON_ASSAULTRIFLE", - "WEAPON_CARBINERIFLE", "WEAPON_ADVANCEDRIFLE", "WEAPON_MG", "WEAPON_COMBATMG", "WEAPON_PUMPSHOTGUN", - "WEAPON_SAWNOFFSHOTGUN", "WEAPON_ASSAULTSHOTGUN", "WEAPON_BULLPUPSHOTGUN", "WEAPON_STUNGUN", "WEAPON_SNIPERRIFLE", - "WEAPON_HEAVYSNIPER", "WEAPON_GRENADELAUNCHER", "WEAPON_GRENADELAUNCHER_SMOKE", "WEAPON_RPG", "WEAPON_MINIGUN", - "WEAPON_GRENADE", "WEAPON_STICKYBOMB", "WEAPON_SMOKEGRENADE", "WEAPON_BZGAS", "WEAPON_MOLOTOV", - "WEAPON_FIREEXTINGUISHER", "WEAPON_PETROLCAN", "WEAPON_FLARE", "WEAPON_SNSPISTOL", "WEAPON_SPECIALCARBINE", - "WEAPON_HEAVYPISTOL", "WEAPON_BULLPUPRIFLE", "WEAPON_HOMINGLAUNCHER", "WEAPON_PROXMINE", "WEAPON_SNOWBALL", - "WEAPON_VINTAGEPISTOL", "WEAPON_DAGGER", "WEAPON_FIREWORK", "WEAPON_MUSKET", "WEAPON_MARKSMANRIFLE", - "WEAPON_HEAVYSHOTGUN", "WEAPON_GUSENBERG", "WEAPON_HATCHET", "WEAPON_RAILGUN", "WEAPON_COMBATPDW", - "WEAPON_KNUCKLE", "WEAPON_MARKSMANPISTOL", "WEAPON_FLASHLIGHT", "WEAPON_MACHETE", "WEAPON_MACHINEPISTOL", - "WEAPON_SWITCHBLADE", "WEAPON_REVOLVER", "WEAPON_COMPACTRIFLE", "WEAPON_DBSHOTGUN", "WEAPON_FLAREGUN", - "WEAPON_AUTOSHOTGUN", "WEAPON_BATTLEAXE", "WEAPON_COMPACTLAUNCHER", "WEAPON_MINISMG", "WEAPON_PIPEBOMB", - "WEAPON_POOLCUE", "WEAPON_SWEEPER", "WEAPON_WRENCH" - }; - ---------------------------------------------------------------------------------------------------------------------------------------- - Translation table: - pastebin.com/a39K8Nz8 - - - - - if (ENTITY::HAS_ANIM_EVENT_FIRED(PLAYER::PLAYER_PED_ID(), GAMEPLAY::GET_HASH_KEY("CreateObject"))) - - - - - Gets whether the specified animation set has finished loading. An animation set provides movement animations for a ped. See SET_PED_MOVEMENT_CLIPSET. - Animation set and clip set are synonymous. - - - - - p3 - possibly radius? - - - - - Alias for HAS_ANIM_SET_LOADED. - - - - - P3 is always 3 as far as i cant tell - Animations List : www.los-santos-multiplayer.com/dev.airdancer?cxt=anim - - - - - Entity 1 = Victim - Entity 2 = Attacker - p2 seems to always be 1 - - - - - It determines what weapons caused damage: - If youu want to define only a specific weapon, second parameter=weapon hash code, third parameter=0 - If you want to define any melee weapon, second parameter=0, third parameter=1. - If you want to identify any weapon (firearms, melee, rockets, etc.), second parameter=0, third parameter=2. - - - - - traceType is always 17 in the scripts. - There is other codes used for traceType: - 19 - in jewelry_prep1a - 126 - in am_hunt_the_beast - 256 & 287 - in fm_mission_controller - - - - - Has the entity1 got a clear line of sight to the other entity2 from the direction entity1 is facing. - This is one of the most CPU demanding BOOL natives in the game; avoid calling this in things like nested for-loops - - - - - Called on tick. - Tested with vehicles, returns true whenever the vehicle is touching any entity. - Note: for vehicles, the wheels can touch the ground and it will still return false, but if the body of the vehicle touches the ground, it will return true. - - - - - Returns whether or not the specific minimap overlay has loaded. - - - - - Checks if the specified model has loaded into memory. - - - - - assetName = For example "core" - - - - - It determines what weapons caused damage: - If you want to define only a specific weapon, second parameter=weapon hash code, third parameter=0 - If you want to define any melee weapon, second parameter=0, third parameter=1. - If you want to identify any weapon (firearms, melee, rockets, etc.), second parameter=0, third parameter=2. - - - - - p2 should be FALSE, otherwise it seems to always return FALSE - Bool does not check if the weapon is current equipped, unfortunately. - - - - - Gets the player's info and calls a function that checks the player's ped position. - Here's the decompiled function that checks the position: pastebin.com/ZdHG2E7n - - - - - Returns if a script has been loaded into the game. Used to see if a script was loaded after requesting. - For a full list, see here: pastebin.com/yLNWicUi - - - - - Checks if the specified gxt has loaded into the passed slot. - - - - - Third Parameter = unsure, but pretty sure it is weapon hash - --> get_hash_key("weapon_stickybomb") - Fourth Parameter = unsure, almost always -1 - - - - - I think this works, but seems to prohibit switching to other weapons (or accessing the weapon wheel) - - - - - Hides the players weapon during a cutscene. - - - - - Hash collision - If used with a Ped that has an AI blip as the first argument: - - if p1 is true, a view cone is displayed with the AI blip - - - - - Simply returns whatever is passed to it (Regardless of whether the handle is valid or not). - -------------------------------------------------------- - if (NETWORK::NETWORK_IS_PARTICIPANT_ACTIVE(PLAYER::INT_TO_PARTICIPANTINDEX(i))) - - - - - Simply returns whatever is passed to it (Regardless of whether the handle is valid or not). - - - - - Example: - bool playing = AUDIO::IS_ALARM_PLAYING("PORT_OF_LS_HEIST_FORT_ZANCUDO_ALARMS"); - - - - - Common in the scripts: - AUDIO::IS_AMBIENT_SPEECH_DISABLED(PLAYER::PLAYER_PED_ID()); - - - - - if (GAMEPLAY::IS_AUSSIE_VERSION()) { - sub_127a9(&l_31, 1024); // l_31 |= 1024 - l_129 = 3; - sub_129d2("AUSSIE VERSION IS TRUE!?!?!"); // DEBUG - } - Used to block some of the prostitute stuff due to laws in Australia. - - - - - <!-- Native implemented by Disquse. 0xFFF65C63 --> - - Returns true if the minimap is currently expanded. False if it's the normal minimap state. - Use [`IsBigmapFull`](#_0x66EE14B2) to check if the full map is currently revealed on the minimap. - - - - - <!-- Native implemented by Disquse. 0x66EE14B2 --> - - Returns true if the full map is currently revealed on the minimap. - Use [`IsBigmapActive`](#_0xFFF65C63) to check if the minimap is currently expanded or in it's normal state. - - - - - Returns bit's boolean state from [offset] of [address]. - Example: - GAMEPLAY::IS_BIT_SET(bitAddress, 1); - To enable and disable bits, see: - GAMEPLAY::SET_BIT(&bitAddress, 1); // enable - GAMEPLAY::CLEAR_BIT(&bitAddress, 1); // disable - - - - - Returns whether or not the passed camera handle is active. - - - - - Animations list : www.los-santos-multiplayer.com/dev.airdancer?cxt=anim - - - - - Control Groups: - enum InputGroups - { - INPUTGROUP_MOVE = 0, - INPUTGROUP_LOOK = 1, - INPUTGROUP_WHEEL = 2, - INPUTGROUP_CELLPHONE_NAVIGATE = 3, - INPUTGROUP_CELLPHONE_NAVIGATE_UD = 4, - INPUTGROUP_CELLPHONE_NAVIGATE_LR = 5, - INPUTGROUP_FRONTEND_DPAD_ALL = 6, - INPUTGROUP_FRONTEND_DPAD_UD = 7, - INPUTGROUP_FRONTEND_DPAD_LR = 8, - INPUTGROUP_FRONTEND_LSTICK_ALL = 9, - INPUTGROUP_FRONTEND_RSTICK_ALL = 10, - INPUTGROUP_FRONTEND_GENERIC_UD = 11, - INPUTGROUP_FRONTEND_GENERIC_LR = 12, - INPUTGROUP_FRONTEND_GENERIC_ALL = 13, - INPUTGROUP_FRONTEND_BUMPERS = 14, - INPUTGROUP_FRONTEND_TRIGGERS = 15, - INPUTGROUP_FRONTEND_STICKS = 16, - INPUTGROUP_SCRIPT_DPAD_ALL = 17, - INPUTGROUP_SCRIPT_DPAD_UD = 18, - INPUTGROUP_SCRIPT_DPAD_LR = 19, - INPUTGROUP_SCRIPT_LSTICK_ALL = 20, - INPUTGROUP_SCRIPT_RSTICK_ALL = 21, - INPUTGROUP_SCRIPT_BUMPERS = 22, - INPUTGROUP_SCRIPT_TRIGGERS = 23, - INPUTGROUP_WEAPON_WHEEL_CYCLE = 24, - INPUTGROUP_FLY = 25, - INPUTGROUP_SUB = 26, - INPUTGROUP_VEH_MOVE_ALL = 27, - INPUTGROUP_CURSOR = 28, - INPUTGROUP_CURSOR_SCROLL = 29, - INPUTGROUP_SNIPER_ZOOM_SECONDARY = 30, - INPUTGROUP_VEH_HYDRAULICS_CONTROL = 31, - MAX_INPUTGROUPS = 32, - INPUTGROUP_INVALID = 33 - }; - 0, 1 and 2 used in the scripts. - - - - - Returns whether a [control](https://docs.fivem.net/game-references/controls/) was newly pressed since the last check. - - - - - Returns whether a [control](https://docs.fivem.net/game-references/controls/) was newly released since the last check. - - - - - Returns whether a [control](https://docs.fivem.net/game-references/controls/) is currently pressed. - - - - - Returns whether a [control](https://docs.fivem.net/game-references/controls/) is currently _not_ pressed. - - - - - xyz - relative to the world origin. - - - - - Usage: - public bool isCopInRange(Vector3 Location, float Range) - { - return Function.Call<bool>(Hash.IS_COP_PED_IN_AREA_3D, Location.X - Range, Location.Y - Range, Location.Z - Range, Location.X + Range, Location.Y + Range, Location.Z + Range); - } - - - - - 0, 1 and 2 used in the scripts. 0 is by far the most common of them. - - - - - 0, 1 and 2 used in the scripts. 0 is by far the most common of them. - - - - - 0, 1 and 2 used in the scripts. 0 is by far the most common of them. - - - - - Example: - DLC2::IS_DLC_PRESENT($\mpbusiness2\); - ($ = gethashkey) - bruteforce these: - 0xB119F6D - 0x96F02EE6 - - - - - Use _GET_VEHICLE_MOD_DATA for modData - - - - - Returns whether or not a browser is created for a specified DUI browser object. - - - - - Gets whether or not this is the CitizenFX server. - - - - - XBOX ONE - MulleDK19: This function is hard-coded to always return 0. - - - - - Checks if entity is within x/y/zSize distance of x/y/z. - Last three are unknown ints, almost always p7 = 0, p8 = 1, p9 = 0 - - - - - Checks if entity1 is within the box defined by x/y/zSize of entity2. - Last three parameters are almost alwasy p5 = 0, p6 = 1, p7 = 0 - - - - - Creates a spherical cone at origin that extends to surface with the angle specified. Then returns true if the entity is inside the spherical cone - Angle is measured in degrees. - These values are constant, most likely bogus: - p8 = 0, p9 = 1, p10 = 0 - This method can also take two float<3> instead of 6 floats. - - - - - Returns true if the entity is in between the minimum and maximum values for the 2d screen coords. - This means that it will return true even if the entity is behind a wall for example, as long as you're looking at their location. - Chipping - - - - - See also PED::IS_SCRIPTED_SCENARIO_PED_USING_CONDITIONAL_ANIM 0x6EC47A344923E1ED 0x3C30B447 - Taken from ENTITY::IS_ENTITY_PLAYING_ANIM(PLAYER::PLAYER_PED_ID(), "creatures@shark@move", "attack_player", 3) - p4 is always 3 in the scripts. - Animations list : www.los-santos-multiplayer.com/dev.airdancer?cxt=anim - taskFlag: - 2 - Check synchronized scene - - - - - A static ped will not react to natives like "APPLY_FORCE_TO_ENTITY" or "SET_ENTITY_VELOCITY" and oftentimes will not react to task-natives like "AI::TASK_COMBAT_PED". The only way I know of to make one of these peds react is to ragdoll them (or sometimes to use CLEAR_PED_TASKS_IMMEDIATELY(). Static peds include almost all far-away peds, beach-combers, peds in certain scenarios, peds crossing a crosswalk, peds walking to get back into their cars, and others. If anyone knows how to make a ped non-static without ragdolling them, please edit this with the solution. - ^ Attach a phCollider to the ped. - - - - - // add this to your CSS to view code with formatting intact. - // pre + hr + p { white-space: pre; } // - - bool isEntityUpright(Entity e, float angle) { - bool bIsUpright; // bl@1 - CDynamicEntity* pEntity; // rdi@1 - bIsUpright = 0; - pEntity = getEntityAddressIfPhysical(e); - if (pEntity) { - bIsUpright = 0; - if (pEntity->Matrix.up.z >= cosf(angle * 0.017453292)) // radians(angle) - bIsUpright = 1; - } - return bIsUpright; - } - - - - - This function is hard-coded to always return 0. - - - - - Examples when this function will return 0 are: - - During busted screen. - - When player is coming out from a hospital. - - When player is coming out from a police station. - - - - - Hardcoded to return 1 - - - - - Doesn't appear to work, use IS_HELP_MESSAGE_BEING_DISPLAYED instead - - - - - Checks whether the horn of a vehicle is currently played. - - - - - Full list of components below - HUD = 0; - HUD_WANTED_STARS = 1; - HUD_WEAPON_ICON = 2; - HUD_CASH = 3; - HUD_MP_CASH = 4; - HUD_MP_MESSAGE = 5; - HUD_VEHICLE_NAME = 6; - HUD_AREA_NAME = 7; - HUD_VEHICLE_CLASS = 8; - HUD_STREET_NAME = 9; - HUD_HELP_TEXT = 10; - HUD_FLOATING_HELP_TEXT_1 = 11; - HUD_FLOATING_HELP_TEXT_2 = 12; - HUD_CASH_CHANGE = 13; - HUD_RETICLE = 14; - HUD_SUBTITLE_TEXT = 15; - HUD_RADIO_STATIONS = 16; - HUD_SAVING_GAME = 17; - HUD_GAME_STREAM = 18; - HUD_WEAPON_WHEEL = 19; - HUD_WEAPON_WHEEL_STATS = 20; - MAX_HUD_COMPONENTS = 21; - MAX_HUD_WEAPONS = 22; - MAX_SCRIPTED_HUD_COMPONENTS = 141; - - - - - ======================================================= - Correction, I have change this to int, instead of int* - as it doesn't use a pointer to the createdIncident. - If you try it you will crash (or) freeze. - ======================================================= - - - - - List of all IPLs: pastebin.com/iNGLY32D - - - - - Returns whether the specified model represents a vehicle. - - - - - Check if model is in cdimage(rpf) - - - - - Returns whether the specified model exists in the game. - - - - - Returns whether navmesh for the region is loaded. The region is a rectangular prism defined by it's top left deepest corner to it's bottom right shallowest corner. - If you can re-word this so it makes more sense, please do. I'm horrible with words sometimes... - - - - - hash collision. - Definitely a hash collision, has something do to with your local player, not a vehicle - - - - - PS4 - MulleDK19: This function is hard-coded to always return 0. - Force67: I patched return result and got this : i.imgur.com/hUn7zSj.jpg - translate please? - - - - - MulleDK19: This function is hard-coded to always return 1. - - - - - gtaforums.com/topic/885580-ped-headshotmugshot-txd/ - - - - - gtaforums.com/topic/885580-ped-headshotmugshot-txd/ - - - - - p1 is anywhere from 4 to 7 in the scripts. Might be a weapon wheel group? - ^It's kinda like that. - 7 returns true if you are equipped with any weapon except your fists. - 6 returns true if you are equipped with any weapon except melee weapons. - 5 returns true if you are equipped with any weapon except the Explosives weapon group. - 4 returns true if you are equipped with any weapon except Explosives weapon group AND melee weapons. - 3 returns true if you are equipped with either Explosives or Melee weapons (the exact opposite of 4). - 2 returns true only if you are equipped with any weapon from the Explosives weapon group. - 1 returns true only if you are equipped with any Melee weapon. - 0 never returns true. - Note: When I say "Explosives weapon group", it does not include the Jerry can and Fire Extinguisher. - - - - - Returns true if the given ped has a valid pointer to CPlayerInfo in its CPed class. That's it. - - - - - This function is hard-coded to always return 0. - - - - - p1 is always 0 - - - - - Checks if the component variation is valid, this works great for randomizing components using loops. - List of component/props ID - gtaxscripting.blogspot.com/2016/04/gta-v-peds-component-and-props.html - - - - - l - - - - - This native returns a true or false value. - Ped ped = The ped whose weapon you want to check. - - - - - Seems to consistently return true if the ped is dead. - p1 is always passed 1 in the scripts. - I suggest to remove "OR_DYING" part, because it does not detect dying phase. - That's what the devs call it, cry about it. - lol - that's a good meme right there. - - - - - Presumably returns the Entity that the Ped is currently diving out of the way of. - var num3; - if (PED::IS_PED_EVASIVE_DIVING(A_0, &num3) != 0) - if (ENTITY::IS_ENTITY_A_VEHICLE(num3) != 0) - - - - - angle is ped's view cone - - - - - Gets a value indicating whether this ped's health is below its fatally injured threshold. The default threshold is 100. - If the handle is invalid, the function returns true. - - - - - Returns true/false if the ped is/isn't humanoid. - - - - - Returns whether the specified ped is hurt. - - - - - Gets a value indicating whether this ped's health is below its injured threshold. - The default threshold is 100. - - - - - Returns whether the specified ped is in any vehicle. If `atGetIn` is set to true, also returns true if the ped is - currently in the process of entering a vehicle (a specific stage check for `CTaskEnterVehicle`). - - - - - Checks to see if ped and target are in combat with eachother. Only goes one-way: if target is engaged in combat with ped but ped has not yet reacted, the function will return false until ped starts fighting back. - p1 is usually 0 in the scripts because it gets the ped id during the task sequence. For instance: PED::IS_PED_IN_COMBAT(l_42E[4 -- [[14]] ], PLAYER::PLAYER_PED_ID()) // armenian2.ct4: 43794 - - - - - p1 is nearly always 0 in the scripts. - - - - - Notes: The function only returns true while the ped is: - A.) Swinging a random melee attack (including pistol-whipping) - B.) Reacting to being hit by a melee attack (including pistol-whipping) - C.) Is locked-on to an enemy (arms up, strafing/skipping in the default fighting-stance, ready to dodge+counter). - You don't have to be holding the melee-targetting button to be in this stance; you stay in it by default for a few seconds after swinging at someone. If you do a sprinting punch, it returns true for the duration of the punch animation and then returns false again, even if you've punched and made-angry many peds - - - - - Gets a value indicating whether the specified ped is in the specified vehicle. - If 'atGetIn' is false, the function will not return true until the ped is sitting in the vehicle and is about to close the door. If it's true, the function returns true the moment the ped starts to get onto the seat (after opening the door). Eg. if false, and the ped is getting into a submersible, the function will not return true until the ped has descended down into the submersible and gotten into the seat, while if it's true, it'll return true the moment the hatch has been opened and the ped is about to descend into the submersible. - - - - - returns true is the ped is on the ground whining like a little female dog from a gunshot wound - - - - - Returns true/false if the ped is/isn't male. - - - - - Same function call as PED::GET_MOUNT, aka just returns 0 - - - - - Gets a value indicating whether the specified ped is on top of any vehicle. - Return 1 when ped is on vehicle. - Return 0 when ped is not on a vehicle. - - - - - If the ped handle passed through the parenthesis is in a ragdoll state this will return true. - - - - - Returns whether the specified ped is reloading. - - - - - Returns whether the specified ped is shooting. - - - - - Detect if ped is in any vehicle - [True/False] - - - - - Detect if ped is sitting in the specified vehicle - [True/False] - - - - - Returns true if the ped doesn't do any movement. If the ped is being pushed forwards by using APPLY_FORCE_TO_ENTITY for example, the function returns false. - - - - - What's strafing? - - - - - Definition of vaulting? - - - - - Probably checks whether the ped has finished reloading or not and if the current weapon is not being switched to another. - - - - - Returns true if the ped passed through the parenthesis is wearing a helmet. - - - - - Return true while player is being arrested / busted. - If atArresting is set to 1, this function will return 1 when player is being arrested (while player is putting his hand up, but still have control) - If atArresting is set to 0, this function will return 1 only when the busted screen is shown. - - - - - Returns TRUE if the player ('s ped) is climbing at the moment. - - - - - Can the player control himself, used to disable controls for player for things like a cutscene. - --- - You can't disable controls with this, use SET_PLAYER_CONTROL(...) for this. - - - - - Gets a value indicating whether the specified player is currently aiming freely. - - - - - Gets a value indicating whether the specified player is currently aiming freely at the specified entity. - - - - - this function is hard-coded to always return 0. - - - - - Returns TRUE if the game is in online mode and FALSE if in offline mode. - This is an alias for NETWORK_IS_SIGNED_ONLINE. - - - - - Checks whether the specified player has a Ped, the Ped is not dead, is not injured and is not arrested. - - - - - Returns true if the player is riding a train. - - - - - Returns true if the player is currently switching, false otherwise. - (When the camera is in the sky moving from Trevor to Franklin for example) - - - - - Gets a value indicating whether the specified position is on a road. - The vehicle parameter is not implemented (ignored). - - - - - Determines whether there is a projectile within the specified coordinates. The coordinates form a rectangle. - ownedByPlayer = only projectiles fired by the player will be detected. - - - - - Determines whether there is a projectile of a specific type within the specified coordinates. The coordinates form a rectangle. - Note: This native hasn't been tested yet. - - - - - MulleDK19: This function is hard-coded to always return 0. - - - - - Occurrences in the b617d scripts: - "ARMY_GUARD", - "ARMY_HELI", - "BLIMP", - "Cinema_Downtown", - "Cinema_Morningwood", - "Cinema_Textile", - "City_Banks", - "Countryside_Banks", - "DEALERSHIP", - "KORTZ_SECURITY", - "LSA_Planes", - "MP_POLICE", - "Observatory_Bikers", - "POLICE_POUND1", - "POLICE_POUND2", - "POLICE_POUND3", - "POLICE_POUND4", - "POLICE_POUND5", - "Rampage1", - "SANDY_PLANES", - "SCRAP_SECURITY", - "SEW_MACHINE", - "SOLOMON_GATE" - Sometimes used with DOES_SCENARIO_GROUP_EXIST: - if (AI::DOES_SCENARIO_GROUP_EXIST("Observatory_Bikers") && (!AI::IS_SCENARIO_GROUP_ENABLED("Observatory_Bikers"))) { - else if (AI::IS_SCENARIO_GROUP_ENABLED("BLIMP")) { - - - - - Occurrences in the b617d scripts: - "PROP_HUMAN_SEAT_CHAIR", - "WORLD_HUMAN_DRINKING", - "WORLD_HUMAN_HANG_OUT_STREET", - "WORLD_HUMAN_SMOKING", - "WORLD_MOUNTAIN_LION_WANDER", - "WORLD_HUMAN_DRINKING" - Sometimes used together with GAMEPLAY::IS_STRING_NULL_OR_EMPTY in the scripts. - scenarioType could be the same as scenarioName, used in for example AI::TASK_START_SCENARIO_AT_POSITION. - - - - - Animations list : www.los-santos-multiplayer.com/dev.airdancer?cxt=anim - - - - - In drunk_controller.c4, sub_309 - if (CAM::_C912AF078AF19212()) { - CAM::_1C9D7949FA533490(0); - } - What does "IS_SCRIPT_GLOBAL_SHAKING" mean..? :/ Is this a hash collision? - - - - - Some events that i found, not sure about them, but seems to have logic based on my tests: - '82 - dead body - '86 - '87 - '88 - shooting, fire extinguisher in use - '89 - '93 - ped using horn - '95 - ped receiving melee attack - '102 - living ped receiving shot - '104 - player thrown grenade, tear gas, smoke grenade, jerry can dropping gasoline - '105 - melee attack against veh - '106 - player running - '108 - vehicle theft - '112 - melee attack - '113 - veh rollover ped - '114 - dead ped receiving shot - '116 - aiming at ped - '121 - Here is full dump of shocking event types from the exe camx.me/gtav/tasks/shockingevents.txt - - - - - Determines whether there is a sniper bullet within the specified coordinates. The coordinates form a rectangle. - - - - - This function is hard-coded to always return 0. - - - - - Returns true when the srl from BeginSrl is loaded. - - - - - **Experimental**: This native may be altered or removed in future versions of CitizenFX without warning. - - Returns whether an asynchronous streaming file registration completed. - - - - - Returns true if a synchronized scene is running - - - - - Return whether tennis mode is active or not. - - - - - Returns true if the model is motorcycle or bycicle. - - - - - To check if the model is an amphibious car, see gtaforums.com/topic/717612-v-scriptnative-documentation-and-research/page-33#entry1069317363 (for build 944 and above only!) - - - - - Returns true if the two times are equal; otherwise returns false. - - - - - Subtracts the second argument from the first, then returns whether the result is negative. - - - - - Subtracts the first argument from the second, then returns whether the result is negative. - - - - - returns whether or not a ped is visible within your FOV, not this check auto's to false after a certain distance. - Target needs to be tracked.. won't work otherwise. - - - - - Return if interior is valid. - - - - - Scripts verify that towTruck is the first parameter, not the second. - - - - - Public Function isVehicleAttachedToTrailer(vh As Vehicle) As Boolean - Return Native.Function.Call(Of Boolean)(Hash.IS_VEHICLE_ATTACHED_TO_TRAILER, vh) - End Function - - - - - p1 is false almost always. - However, in launcher_carwash/carwash1/carwash2 scripts, p1 is true and is accompanied by DOES_VEHICLE_HAVE_ROOF - - - - - doorID starts at 0, not seeming to skip any numbers. Four door vehicles intuitively range from 0 to 3. - - - - - doorIndex: - 0 = Front Left Door - 1 = Front Right Door - 2 = Back Left Door - 3 = Back Right Door - 4 = Hood - 5 = Trunk - 6 = Trunk2 - - - - - p1 is always 0 in the scripts. - p1 = check if vehicle is on fire - - - - - Returns whether the specified vehicle is currently in a burnout. - vb.net - Public Function isVehicleInBurnout(vh As Vehicle) As Boolean - Return Native.Function.Call(Of Boolean)(Hash.IS_VEHICLE_IN_BURNOUT, vh) - End Function - - - - - garageName example "Michael - Beverly Hills" - For a full list, see here: pastebin.com/73VfwsmS - - - - - Returns true if the id is non zero. - - - - - Public Function isVehicleOnAllWheels(vh As Vehicle) As Boolean - Return Native.Function.Call(Of Boolean)(Hash.IS_VEHICLE_ON_ALL_WHEELS, vh) - End Function - - - - - Possibly: Returns whether the searchlight (found on police vehicles) is toggled on. - - - - - Has an additional BOOL parameter since version [???]. - Check if a vehicle seat is free. - -1 being the driver seat. - Use GET_VEHICLE_MAX_NUMBER_OF_PASSENGERS(vehicle) - 1 for last seat index. - - - - - MulleDK19: Returns true if the vehicle's speed is equal to, or less than 0.02 meters per second, or 0.05 meters per second, if the vehicle's handbrake is engaged. - - - - - is this for red lights only? more testing required. - - - - - p1 can be anywhere from 0 to 3 in the scripts. p2 is generally somewhere in the 1000 to 10000 range. - - - - - wheelID used for 4 wheelers seem to be (0, 1, 4, 5) - completely - is to check if tire completely gone from rim. - '0 = wheel_lf / bike, plane or jet front - '1 = wheel_rf - '2 = wheel_lm / in 6 wheels trailer, plane or jet is first one on left - '3 = wheel_rm / in 6 wheels trailer, plane or jet is first one on right - '4 = wheel_lr / bike rear / in 6 wheels trailer, plane or jet is last one on left - '5 = wheel_rr / in 6 wheels trailer, plane or jet is last one on right - '45 = 6 wheels trailer mid wheel left - '47 = 6 wheels trailer mid wheel right - - - - - must be called after TRACK_VEHICLE_VISIBILITY - it's not instant so probabilly must pass an 'update' to see correct result. - - - - - Gets whether the world point the calling script is registered to is within desired range of the player. - - - - - MulleDK19: This function is hard-coded to always return 0. - - - - - hash collision - - - - - List of component/props ID - gtaxscripting.blogspot.com/2016/04/gta-v-peds-component-and-props.html - - - - - 1 - - - - - Loads all path nodes. - If keepInMemory is true, all path nodes will be loaded and be kept in memory; otherwise, all path nodes will be loaded, but unloaded as the game sees fit. - - MulleDK19. - August 29, 2017: This native has been removed in v1180. - - - - - Reads the contents of a text file in a specified resource. - If executed on the client, this file has to be included in `files` in the resource manifest. - Example: `local data = LoadResourceFile("devtools", "data.json")` - - - - - Rope presets can be found in the gamefiles. One example is "ropeFamily3", it is NOT a hash but rather a string. - - - - - Example: - AUDIO::LOAD_STREAM("CAR_STEAL_1_PASSBY", "CAR_STEAL_1_SOUNDSET"); - All found occurrences in the b678d decompiled scripts: pastebin.com/3rma6w5w - Stream names often ends with "_MASTER", "_SMALL" or "_STREAM". Also "_IN", "_OUT" and numbers. - soundSet is often set to 0 in the scripts. These are common to end the soundSets: "_SOUNDS", "_SOUNDSET" and numbers. - - - - - Example: - AUDIO::LOAD_STREAM_WITH_START_OFFSET("STASH_TOXIN_STREAM", 2400, "FBI_05_SOUNDS"); - Only called a few times in the scripts. - - - - - Locks the minimap to the specified angle in integer degrees. - angle: The angle in whole degrees. If less than 0 or greater than 360, unlocks the angle. - - - - - Locks the minimap to the specified world position. - - - - - Sets the water height for a given position and radius. - - - - - Some of the tunable contexts used in the PC scripts: - - "BASE_GLOBALS" - - "MP_GLOBAL" - and some of the tunable names used in the PC scripts: - - "XP_MULTIPLIER" - - "CASH_MULTIPLIER" - - "ARMOUR_REWARD_GIFT" - - "TOGGLE_CREATORS_OFF" - - "MULTIPLAYER_DISABLED" - - - - - Some of the tunable contexts used in the PC scripts: - - "BASE_GLOBALS" - - "MP_GLOBAL" - - "MP_FM_RACES" - - "MP_FM_RACES_CAR" - - "MP_FM_RACES_SEA" - - "MP_FM_RACES_CAR" - - "MP_FM_RACES_AIR" - - "MP_FM_BASEJUMP" - - "MP_FM_RACES_CYCLE" - - "MP_FM_RACES_BIKE" - - "MP_FM_MISSIONS" - - "MP_FM_CONTACT" - - "MP_FM_RANDOM" - - "MP_FM_VERSUS" - - "MP_FM_LTS" - - "MP_FM_CAPTURE" - - "MP_FM_DM" - - "MP_FM_SURVIVAL" - - "MP_FM_GANG_ATTACK" - - "MP_FM_BASEJUMP" - - "MP_CNC_TEAM_COP" - - "MP_CNC_TEAM_VAGOS" - - "MP_CNC_TEAM_LOST" - and some of the tunable names used in the PC scripts: - - "XP_MULTIPLIER" - - "CASH_MULTIPLIER" - - "ARMOUR_REWARD_GIFT" - - "TOGGLE_CREATORS_OFF" - - - - - Some of the tunable contexts used in the PC scripts: - - "MP_FM_RACES" - - "MP_FM_RACES_CAR" - - "MP_FM_RACES_SEA" - - "MP_FM_RACES_CAR" - - "MP_FM_RACES_AIR" - - "MP_FM_BASEJUMP" - - "MP_FM_RACES_CYCLE" - - "MP_FM_RACES_BIKE" - - "MP_FM_MISSIONS" - - "MP_FM_CONTACT" - - "MP_FM_RANDOM" - - "MP_FM_VERSUS" - - "MP_FM_LTS" - - "MP_FM_CAPTURE" - - "MP_FM_DM" - - "MP_FM_SURVIVAL" - - "MP_FM_GANG_ATTACK" - - "MP_FM_BASEJUMP" - - "BASE_GLOBALS" - - "MP_GLOBAL" - and some of the tunable names used in the PC scripts: - - "XP_MULTIPLIER" - - "CASH_MULTIPLIER" - - "ARMOUR_REWARD_GIFT" - - "TOGGLE_CREATORS_OFF" - - - - - .. - - - - - This has arguments.. in PC scripts. - - - - - p1 = 0 (always) - p2 = 1 (always) - - - - - p1 is just an assumption. p2 was false and p3 was true. - - - - - The first parameter is the amount spent which is store in a global when this native is called. The global returns 10. Which is the price for both rides. - The last 3 parameters are, - 2,0,1 in the am_ferriswheel.c - 1,0,1 in the am_rollercoaster.c - - - - - p1 = 0 (always) - p2 = 1 (always) - - - - - 11 - Need to download tunables. - 12 - Need to download background script. - Returns 1 if the multiplayer is loaded, otherwhise 0. - - - - - BOOL DEBUG_MEMBRESHIP(int Param) - { - int membership; - networkHandleMgr handle; - NETWORK_HANDLE_FROM_PLAYER(iSelectedPlayer, &handle.netHandle, 13); - if (!_NETWORK_IS_CLAN_MEMBERSHIP_FINISHED_DOWNLOADING()) - { - if (NETWORK_CLAN_REMOTE_MEMBERSHIPS_ARE_IN_CACHE(&Param)) - { - if (NETWORK_CLAN_GET_MEMBERSHIP_COUNT(&Param) > 0) - { - if (NETWORK_CLAN_GET_MEMBERSHIP_VALID(&Param, 0)) - { - if (NETWORK_CLAN_GET_MEMBERSHIP(&Param, &membership, -1)) - { - _0xF633805A(&membership, 35, &handle.netHandle); - } - } - } - } - } - else - { - NETWORK_CLAN_DOWNLOAD_MEMBERSHIP(&handle.netHandle); - } - } - - - - - networkMembershipMgr memShip; - int maxMemship = _GET_NUM_MEMBERSHIP_DESC(); - for (int i = 0; i < maxMemship; i++) - { - NETWORK_CLAN_GET_MEMBERSHIP_DESC(&memShip.memHandle, i); - } - - - - - bufferSize is 35 in the scripts. - bufferSize is the elementCount of p0(desc), sizeof(p0) == 280 == p1*8 == 35 * 8, p2(netHandle) is obtained from NETWORK::NETWORK_HANDLE_FROM_PLAYER. And no, I can't explain why 35 * sizeof(int) == 280 and not 140, but I'll get back to you on that. - the answer is: because p0 an int64_t* / int64_t[35]. and FYI p2 is an int64_t[13] - pastebin.com/cSZniHak - - - - - returns netScene - this native is missing 2 params - float p10, float p11 - - - - - Note the 2nd parameters are always 1, 0. I have a feeling it deals with your money, wallet, bank. So when you delete the character it of course wipes the wallet cash at that time. So if that was the case, it would be eg, NETWORK_DELETE_CHARACTER(characterIndex, deleteWalletCash, deleteBankCash); - - - - - hash collision??? - I did this and I didn't see anything happening - int pindex; - for (int i = 0; i < 32; i++) - { - if (NETWORK_IS_PARTICIPANT_ACTIVE(INT_TO_PARTICIPANTINDEX(i))) - { - pindex = NETWORK_GET_PLAYER_INDEX(INT_TO_PARTICIPANTINDEX(i)); - NETWORK_DISABLE_INVINCIBLE_FLASHING(pindex, 1); - } - } - - - - - Some of the tunable contexts used in the PC scripts: - - "MP_FM_RACES" - - "MP_FM_RACES_CAR" - - "MP_FM_RACES_SEA" - - "MP_FM_RACES_CAR" - - "MP_FM_RACES_AIR" - - "MP_FM_BASEJUMP" - - "MP_FM_RACES_CYCLE" - - "MP_FM_RACES_BIKE" - - "MP_FM_MISSIONS" - - "MP_FM_CONTACT" - - "MP_FM_RANDOM" - - "MP_FM_VERSUS" - - "MP_FM_LTS" - - "MP_FM_CAPTURE" - - "MP_FM_DM" - - "MP_FM_SURVIVAL" - - "MP_FM_GANG_ATTACK" - - "MP_FM_BASEJUMP" - - "BASE_GLOBALS" - - "MP_GLOBAL" - and some of the tunable names used in the PC scripts: - - "XP_MULTIPLIER" - - "CASH_MULTIPLIER" - - "ARMOUR_REWARD_GIFT" - - "TOGGLE_CREATORS_OFF" - - - - - p2 is true 3/4 of the occurrences I found. - 'players' is the number of players for a session. On PS3/360 it's always 18. On PC it's 32. - - - - - DSPORT - - - - - Pretty sure this is actually a hash collision. - It should be NETWORK_EARN_FROM_A*** or NETWORK_EARN_FROM_B*** - ============================================================= - Not a hash collision, test it for yourself when finishing heist. - lackos; 2017.03.12 - - - - - Enough007: Adds an entry in the Network Transaction Log. - Max value for amount 2000 - - - - - Now has 9 parameters. - - - - - This merely adds an entry in the Network Transaction Log; - it does not grant cash to the player (on PC). - Max value for amount is 9999999. - - - - - Now has 8 params. - - - - - Pretty sure this is a hash collision - - - - - In the console script dumps, this is only referenced once. - NETWORK::NETWORK_EXPLODE_VEHICLE(vehicle, 1, 0, 0); - ^^^^^ That must be PC script dumps? In X360 Script Dumps it is reference a few times with 2 differences in the parameters. - Which as you see below is 1, 0, 0 + 1, 1, 0 + 1, 0, and a *param? - am_plane_takedown.c - network_explode_vehicle(net_to_veh(Local_40.imm_2), 1, 1, 0); - armenian2.c - network_explode_vehicle(Local_80[6 <2>], 1, 0, 0); - fm_horde_controler.c - network_explode_vehicle(net_to_veh(*uParam0), 1, 0, *uParam0); - fm_mission_controller.c, has 6 hits so not going to list them. - Side note, setting the first parameter to 0 seems to mute sound or so? - Seems it's like ADD_EXPLOSION, etc. the first 2 params. The 3rd atm no need to worry since it always seems to be 0. - - - - - state - 0 does 5 fades - state - 1 does 6 fades - native is missing third argument, also boolean, setting to 1 made vehicle fade in slower, probably "slow" as per NETWORK_FADE_OUT_ENTITY - - - - - normal - transition like when your coming out of LSC - slow - transition like when you walk into a mission - - - - - Returns the owner ID of the specified entity. - - - - - scriptName examples: - "freemode", "AM_CR_SecurityVan", ... - Most of the time, these values are used: - p1 = -1 - p2 = 0 - - - - - Retrieves the local player's NetworkHandle* and stores it in the given buffer. - * Currently unknown struct - - - - - On PC this is hardcoded to 250. - - - - - Returns the amount of players connected in the current session. Only works when connected to a session/server. - - - - - Returns the Player associated to a given Ped when in an online session. - - - - - Based on scripts such as in freemode.c how they call their vars vVar and fVar the 2nd and 3rd param it a Vector3 and Float, but the first is based on get_random_int_in_range.. - - - - - Returns the value of the tunable 0x9A82F2B. Usually 8000 iirc. - - - - - From what I can see in ida, I believe it retrieves the players online bank balance. - - - - - From what I understand, it retrieves STAT_WALLET_BALANCE for the specified character (-1 means use MPPLY_LAST_MP_CHAR) - - - - - Returns a NetworkHandle* from the specified member ID and stores it in a given buffer. - * Currently unknown struct - - - - - Returns a handle to networkHandle* from the specified player handle and stores it in a given buffer. - * Currently unknown struct - Example: - std::vector<UINT64> GetPlayerNetworkHandle(Player player) { - const int size = 13; - uint64_t *buffer = std::make_unique<uint64_t[]>(size).get(); - NETWORK::NETWORK_HANDLE_FROM_PLAYER(player, reinterpret_cast<int *>(buffer), 13); - for (int i = 0; i < size; i++) { - Log::Msg("networkhandle[%i]: %llx", i, buffer[i]); - } - std::vector<UINT64> result(buffer, buffer + sizeof(buffer)); - return result; - } - - - - - Returns a NetworkHandle* from the specified user ID and stores it in a given buffer. - * Currently unknown struct - - - - - From what I can tell it looks like it does the following: - - Creates/hosts a new transition to another online session, using this in FiveM will result in other players being disconencted from the server/preventing them from joining. This is most likely because I entered the wrong session parameters since they're pretty much all unknown right now. - - You also need to use `NetworkJoinTransition(Player player)` and `NetworkLaunchTransition()`. - - - - - //nothing doin - int Global_1837683 = GlobalVariable::Get(1837683); - int Global_1837683_f_404 = GlobalVariable::Get(1837683 + 404); - NETWORK_INVITE_GAMERS(&Global_1837683, Global_1837683_f_404, 0, 0); - - - - - This would be nice to see if someone is in party chat, but 2 sad notes. - 1) It only becomes true if said person is speaking in that party at the time. - 2) It will never, become true unless you are in that party with said person. - - - - - In scripts R* calls 'NETWORK_GET_FRIEND_NAME' in this param. - - - - - If you are host, returns true else returns false. - anyone know how to use this to find correct host? is possible? - go to a mission and it will set a host then search the host name using a program then find the pointer to the host name - - - - - Note according to IDA TU27 X360(Console), - This native & 'NETWORK_IS_PARTY_MEMBER' both jump to the same location. - Side note: This location just stops where it's at once jumped to. - Screenshot for side note, - h t t p ://i.imgur.com/m2ci1mF.png - h t t p://i.imgur.com/Z0Wx2B6.png - - - - - Note according to IDA TU27 X360(Console), - This native & 'NETWORK_IS_PARTY_MEMBER' both jump to the same location. - Side note: This location just stops where it's at once jumped to. - Screenshot for side note, - h t t p ://i.imgur.com/m2ci1mF.png - h t t p://i.imgur.com/Z0Wx2B6.png - - - - - This function is hard-coded to always return 0. - - - - - hash collision - - - - - returns true if someone is screaming or talking in a microphone - - - - - This checks if player is playing on gta online or not. - Please add an if and block your mod if this is "true". - - - - - Returns whether the player is signed into Social Club. - - - - - Returns whether the game is not in offline mode. - seemed not to work for some ppl - - - - - int handle[76]; - NETWORK_HANDLE_FROM_FRIEND(iSelectedPlayer, &handle[0], 13); - Player uVar2 = NETWORK_GET_PLAYER_FROM_GAMER_HANDLE(&handle[0]); - NETWORK_JOIN_TRANSITION(uVar2); - nothing doin. - - - - - Could possibly bypass being muted or automatically muted - - - - - Works in Singleplayer too. - Actually has a 4th param (BOOL) that sets byte_14273C46C (in b944) to whatever was passed to p3. - - - - - R* uses this to hear all player when spectating. - It allows you to hear other online players when their chat is on none, crew and or friends - - - - - Returns the name of a given player. Returns "**Invalid**" if CPlayerInfo of the given player cannot be retrieved or the player doesn't exist. - Does exactly the same as GET_PLAYER_NAME. - - - - - Sets [userID] to the user id of the given player. Returns "**Invalid**" if CPlayerInfo of the given player cannot be retrieved or the player doesn't exist. - - - - - Does exactly the same thing as PLAYER_ID() - - - - - Returns whether the player has been reported too often or not. - Example : griefing. - - - - - Checks if a specific value (BYTE) in CPlayerInfo is nonzero. - Returns always false in Singleplayer. - No longer used for dev checks since first mods were released on PS3 & 360. - R* now checks with the is_dlc_present native for the dlc hash 2532323046, - if that is present it will unlock dev stuff. - - - - - index - ------- - See function sub_1005 in am_boat_taxi.ysc - context - ---------- - "BACKUP_VAGOS" - "BACKUP_LOST" - "BACKUP_FAMILIES" - "HIRE_MUGGER" - "HIRE_MERCENARY" - "BUY_CARDROPOFF" - "HELI_PICKUP" - "BOAT_PICKUP" - "CLEAR_WANTED" - "HEAD_2_HEAD" - "CHALLENGE" - "SHARE_LAST_JOB" - "DEFAULT" - reason - --------- - "NOTREACHTARGET" - "TARGET_ESCAPE" - "DELIVERY_FAIL" - "NOT_USED" - "TEAM_QUIT" - "SERVER_ERROR" - "RECEIVE_LJ_L" - "CHALLENGE_PLAYER_LEFT" - "DEFAULT" - unk - ----- - Unknown bool value - - - - - sizeofVars is in bytes - - - - - This native start the download of tunables from R* cloud - - - - - hash collision?? - Not sure, but fits alphabetically - - - - - how can I increase the character limit on this native? - -------------------------------- - return - it's possible for it to have an error and return a value. One error is if it cannot find space to create the event it doesn't send the text and returns zero. It also returns 0 is the strlen is 0 or the strlen > 0x100 (I thought it was 64 so idk why it's checking 265. I may just be dumb :P ) There are other ways it could return 0 also but who the hell cares cuz it's very unlikely, but it returns a bool. - to the top guy, idk if it is possible. It is probably read a max of 64 characters on the recieving end so even if we did modify it to send more it probably wouldn't work. One of the other problems is that in part of the function it copies the string to the local stack which means we would have to change that to make it work. - - - - - the first arg seems to be the network player handle (&handle) and the second var is pretty much always "" and the third seems to be a number between 0 and ~10 and the 4th is is something like 0 to 5 and I guess the 5th is a bool cuz it is always 0 or 1 - does this send an invite to a player? - - - - - p0 is always false and p1 varies. - NETWORK_SESSION_END(0, 1) - NETWORK_SESSION_END(0, 0) - Results in: "Connection to session lost due to an unknown network error. Please return to Grand Theft Auto V and try again later." - - - - - unknown params - p0 = 0, 2, or 999 (The global is 999 by default.) - p1 = 0 (Always in every script it's found in atleast.) - p2 = 0, 3, or 4 (Based on a var that is determined by a function.) - p3 = maxPlayers (It's obvious in x360 scripts it's always 18) - p4 = 0 (Always in every script it's found in atleast.) - p5 = 0 or 1. (1 if network_can_enter_multiplayer, but set to 0 if other checks after that are passed.) - p5 is reset to 0 if, - Global_1315318 = 0 or Global_1315323 = 9 or 12 or (Global_1312629 = 0 && Global_1312631 = true/1) those are passed. - - - - - Does nothing in online but in offline it will cause the screen to fade to black. Nothing happens past then, the screen will sit at black until you restart GTA. Other stuff must be needed to actually host a session. - - - - - Does nothing in online but in offline it will cause the screen to fade to black. Nothing happens past then, the screen will sit at black until you restart GTA. Other stuff must be needed to actually host a session. - - - - - Loads up the map that is loaded when beeing in mission creator - Player gets placed in a mix between online/offline mode - p0 is always 2 in R* scripts. - Appears to be patched in gtav b757 (game gets terminated) alonside with most other network natives to prevent online modding ~ghost30812 - - - - - Only works when you are host. - - - - - //friendly fire toggle - - - - - hash collision??? - - - - - On PC it's a nullsub which means it does absolutely nothing. - Now that Discord supports Rich Presence, R* might finally implement this for PC. Or maybe in future games like RDR2, GTA VI... - - - - - p1 is always 0 - - - - - Example: - int playerHandle; - NETWORK_HANDLE_FROM_PLAYER(selectedPlayer, &playerHandle, 13); - NETWORK_SHOW_PROFILE_UI(&playerHandle); - - - - - Only used once in a script (am_contact_requests) - p1 = 0 - p2 = 1 - - - - - According to how I understood this in the freemode script alone, - The first parameter is determined by a function named, func_5749 within the freemode script which has a list of all the vehicles and a set price to return which some vehicles deals with globals as well. So the first parameter is basically the set in stone insurance cost it's gonna charge you for that specific vehicle model. - The second parameter whoever put it was right, they call GET_ENTITY_MODEL with the vehicle as the paremeter. - The third parameter is the network handle as they call their little struct<13> func or atleast how the script decompiled it to look which in lamens terms just returns the network handle of the previous owner based on DECOR_GET_INT(vehicle, "Previous_Owner"). - The fourth parameter is a bool that returns true/false depending on if your bank balance is greater then 0. - The fifth and last parameter is a bool that returns true/false depending on if you have the money for the car based on the cost returned by func_5749. In the freemode script eg, - bool hasTheMoney = NETWORKCASH::_GET_BANK_BALANCE() < carCost. - - - - - gets the entity id of a network id - - - - - gets the object id of a network id - - - - - gets the ped id of a network id - - - - - if (!sub_8f12("START LOAD SCENE SAFE")) { - if (CUTSCENE::GET_CUTSCENE_TIME() > 4178) { - STREAMING::_ACCFB4ACF53551B0(1973.845458984375, 3818.447265625, 32.43629837036133, 15.0, 2); - sub_8e9e("START LOAD SCENE SAFE", 1); - } - } - (Previously known as STREAMING::_NEW_LOAD_SCENE_START_SAFE) - - - - - Please change back to _0x444D8CF241EC25C5 (hash collision) - - - - - Lets objects spawn online simply do it like this: - int createdObject = OBJ_TO_NET(CREATE_OBJECT_NO_OFFSET(oball, pCoords.x, pCoords.y, pCoords.z, 1, 0, 0)); - - - - - patrolRoutes found in the b617d scripts: - "miss_Ass0", - "miss_Ass1", - "miss_Ass2", - "miss_Ass3", - "miss_Ass4", - "miss_Ass5", - "miss_Ass6", - "MISS_PATROL_6", - "MISS_PATROL_7", - "MISS_PATROL_8", - "MISS_PATROL_9", - "miss_Tower_01", - "miss_Tower_02", - "miss_Tower_03", - "miss_Tower_04", - "miss_Tower_05", - "miss_Tower_06", - "miss_Tower_07", - "miss_Tower_08", - "miss_Tower_10" - - - - - Max value for p1 is 15. - - - - - Only used once in the decompiled scripts. Seems to be related to scripted vehicle generators. - Modified example from "am_imp_exp.c4", line 6406: - -- [[ popSchedules[0] = ZONE::GET_ZONE_POPSCHEDULE(ZONE::GET_ZONE_AT_COORDS(891.3, 807.9, 188.1)); - etc. - ]] - ZONE::OVERRIDE_POPSCHEDULE_VEHICLE_MODEL(popSchedules[index], vehicleHash); - STREAMING::REQUEST_MODEL(vehicleHash); - - - - - Overrides the vehicle's horn hash. - - When changing this hash on a vehicle, [`_GET_VEHICLE_HORN_HASH`](#_0xACB5DCCA1EC76840) will **not** return the 'overwritten' hash. It will still always return the default horn hash (same as [`GET_VEHICLE_DEFAULT_HORN`](#_0x02165D55000219AC)). - - List of possible hashes (found in decompiled scripts): - - | signed | unsigned | hex | - | ------------: | -----------: | :----------: | - | `1604822495` | `1604822495` | `0x5FA7A5DF` | - | `-1262465009` | `3032502287` | `0xB4C0500F` | - | `-889553789` | `3405413507` | `0xCAFA7C83` | - | `-1557943086` | `2737024210` | `0xA323ACD2` | - | `-1318696617` | `2976270679` | `0xB1664957` | - | `-7740003` | `4287227293` | `0xFF89E59D` | - | `-1815146967` | `2479820329` | `0x93CF0E29` | - | `-339919356` | `3955047940` | `0xEBBD3E04` | - - Old description: - - ``` - vehicle - the vehicle whose horn should be overwritten - mute - p1 seems to be an option for muting the horn - p2 - maybe a horn id, since the function AUDIO::GET_VEHICLE_DEFAULT_HORN(veh) exists? - ``` - - - - - Return the local Participant ID - - - - - Return the local Participant ID. - This native is exactly the same as 'PARTICIPANT_ID' native. - - - - - gets the network id of a ped - - - - - Only 1 match. ob_sofa_michael. - PLAYER::PLAYER_ATTACH_VIRTUAL_BOUND(-804.5928f, 173.1801f, 71.68436f, 0f, 0f, 0.590625f, 1f, 0.7f);1.0.335.2, 1.0.350.1/2, 1.0.372.2, 1.0.393.2, 1.0.393.4, 1.0.463.1; - - - - - 1.0.335.2, 1.0.350.1/2, 1.0.372.2, 1.0.393.2, 1.0.393.4, 1.0.463.1; - - - - - This returns YOUR 'identity' as a Player type. - Always returns 0 in story mode. - - - - - Returns current player ped - - - - - Animations list : www.los-santos-multiplayer.com/dev.airdancer?cxt=anim - - - - - Atleast one time in a script for the zRot Rockstar uses GET_ENTITY_HEADING to help fill the parameter. - p9 is unknown at this time. - p10 throughout all the X360 Scripts is always 2. - Animations list : www.los-santos-multiplayer.com/dev.airdancer?cxt=anim - - - - - delta and bitset are guessed fields. They are based on the fact that most of the calls have 0 or nil field types passed in. - The only time bitset has a value is 0x4000 and the only time delta has a value is during stealth with usually <1.0f values. - Animations list : www.los-santos-multiplayer.com/dev.airdancer?cxt=anim - - - - - Look at facials@gen_male@base and facials@gen_female@base for some common facial animations. - !!!NOTE!!! - Unlike most animation natives, the animation comes BEFORE the animation dictionary here. So you could call e.g. - PLAY_FACIAL_ANIM(ped, "dead_1", "facials@gen_male@base") - - - - - Called 38 times in the scripts. There are 5 different audioNames used. - One unknown removed below. - AUDIO::PLAY_MISSION_COMPLETE_AUDIO("DEAD"); - AUDIO::PLAY_MISSION_COMPLETE_AUDIO("FRANKLIN_BIG_01"); - AUDIO::PLAY_MISSION_COMPLETE_AUDIO("GENERIC_FAILED"); - AUDIO::PLAY_MISSION_COMPLETE_AUDIO("TREVOR_SMALL_01"); - - - - - Needs another parameter [int p2]. The signature is PED::PLAY_PAIN(Ped ped, int painID, int p1, int p2); - Last 2 parameters always seem to be 0. - EX: Function.Call(Hash.PLAY_PAIN, TestPed, 6, 0, 0); - Known Pain IDs - ________________________ - 1 - Doesn't seem to do anything. Does NOT crash the game like previously said. (Latest patch) - 6 - Scream (Short) - 7 - Scared Scream (Kinda Long) - 8 - On Fire - - - - - All found occurrences in b617d, sorted alphabetically and identical lines removed: pastebin.com/RFb4GTny - AUDIO::PLAY_PED_RINGTONE("Remote_Ring", PLAYER::PLAYER_PED_ID(), 1); - AUDIO::PLAY_PED_RINGTONE("Dial_and_Remote_Ring", PLAYER::PLAYER_PED_ID(), 1); - - - - - Please change to void. (Does not return anything!) - Plays the given police radio message. - All found occurrences in b617d, sorted alphabetically and identical lines removed: pastebin.com/GBnsQ5hr - - - - - All found occurrences in b617d, sorted alphabetically and identical lines removed: pastebin.com/A8Ny8AHZ - - - - - All found occurrences in b617d, sorted alphabetically and identical lines removed: pastebin.com/eeFc5DiW - gtaforums.com/topic/795622-audio-for-mods - - - - - All found occurrences in b617d, sorted alphabetically and identical lines removed: pastebin.com/f2A7vTj0 - No changes made in b678d. - gtaforums.com/topic/795622-audio-for-mods - - - - - list: pastebin.com/DCeRiaLJ - All found occurrences in b617d, sorted alphabetically and identical lines removed: pastebin.com/0neZdsZ5 - - - - - Used with AUDIO::LOAD_STREAM - Example from finale_heist2b.c4: - AI::TASK_SYNCHRONIZED_SCENE(l_4C8[2 -- [[14]] ], l_4C8[2 -- [[14]] ]._f7, l_30A, "push_out_vault_l", 4.0, -1.5, 5, 713, 4.0, 0); - PED::SET_SYNCHRONIZED_SCENE_PHASE(l_4C8[2 -- [[14]] ]._f7, 0.0); - PED::_2208438012482A1A(l_4C8[2 -- [[14]] ], 0, 0); - PED::SET_PED_COMBAT_ATTRIBUTES(l_4C8[2 -- [[14]] ], 38, 1); - PED::SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(l_4C8[2 -- [[14]] ], 1); - if (AUDIO::LOAD_STREAM("Gold_Cart_Push_Anim_01", "BIG_SCORE_3B_SOUNDS")) { - AUDIO::PLAY_STREAM_FROM_OBJECT(l_36F[0 -- [[1]] ]); - } - - - - - Examples: - CAM::PLAY_SYNCHRONIZED_CAM_ANIM(l_2734, NETWORK::_02C40BF885C567B6(l_2739), "PLAYER_EXIT_L_CAM", "mp_doorbell"); - CAM::PLAY_SYNCHRONIZED_CAM_ANIM(l_F0D[7 -- [[1]] ], l_F4D[15 -- [[1]] ], "ah3b_attackheli_cam2", "missheistfbi3b_helicrash"); - Animations list : www.los-santos-multiplayer.com/dev.airdancer?cxt=anim - - - - - p4 and p7 are usually 1000.0f. - Animations list : www.los-santos-multiplayer.com/dev.airdancer?cxt=anim - - - - - Animations list : www.los-santos-multiplayer.com/dev.airdancer?cxt=anim - - - - - This native only comes up once. And in that one instance, p1 is "1". - - - - - p1 appears to only be "0" or "3". I personally use "0" as p1. - - - - - p5 always seems to be 1 i.e TRUE - - - - - Parameters p0-p5 seems correct. The bool p6 is unknown, but through every X360 script it's always 1. Please correct p0-p5 if any prove to be wrong. - - - - - spawns a few distant/out-of-sight peds, vehicles, animals etc each time it is called - - - - - This native is used to attribute the SRL that BeginSrl is going to load. This is usually used for 'in-game' cinematics (not cutscenes but camera stuff) instead of SetFocusArea because it loads a specific area of the map which is pretty useful when the camera moves from distant areas. - For instance, GTA:O opening cutscene. - - <https://pastebin.com/2EeKVeLA> : a list of SRL found in srllist.meta - <https://pastebin.com/zd9XYUWY> : here is the content of a SRL file opened with codewalker. - - - - - Example: - bool prepareAlarm = AUDIO::PREPARE_ALARM("PORT_OF_LS_HEIST_FORT_ZANCUDO_ALARMS"); - - - - - All music event names found in the b617d scripts: pastebin.com/GnYt0R3P - - - - - This isn't a hash collision. It is used to give the player cash via the CASH_GIFT stats. - - - - - Called to update entity attachments. - When using ATTACH_ENTITY_TO_ENTITY and using bone '0' then you set the first entity invisible. The attachments will mess up, use bone '-1' to fix that issue - - - - - **Experimental**: This native may be altered or removed in future versions of CitizenFX without warning. - - Registers a set of archetypes with the game engine. These should match `CBaseArchetypeDef` class information from the game. - - - - - Registered commands can be executed by entering them in the client console (this works for client side and server side registered commands). Or by entering them in the server console/through an RCON client (only works for server side registered commands). Or if you use a supported chat resource, like the default one provided in the cfx-server-data repository, then you can enter the command in chat by prefixing it with a `/`. - - Commands registered using this function can also be executed by resources, using the [`ExecuteCommand` native](#_0x561C060B). - - The restricted bool is not used on the client side. Permissions can only be checked on the server side, so if you want to limit your command with an ace permission automatically, make it a server command (by registering it in a server script). - - **Example result**: - - ![](https://i.imgur.com/TaCnG09.png) - - - - - **Experimental**: This native may be altered or removed in future versions of CitizenFX without warning. - - Registers a set of entities with the game engine. These should match `CEntityDef` class information from the game. - At this time, this function **should not be used in a live environment**. - - - - - Registers a specified .gfx file as GFx font library. - The .gfx file has to be registered with the streamer already. - - - - - Registers a specified font name for use with text draw commands. - - - - - Based on TASK_COMBAT_HATED_TARGETS_AROUND_PED, the parameters are likely similar (PedHandle, and area to attack in). - - - - - Registers a script for any object with a specific model hash. - BRAIN::REGISTER_OBJECT_SCRIPT_BRAIN("ob_telescope", ${prop_telescope_01}, 100, 4.0, -1, 9); - - - - - gtaforums.com/topic/885580-ped-headshotmugshot-txd/ - - - - - **Experimental**: This native may be altered or removed in future versions of CitizenFX without warning. - - Registers a dynamic streaming asset from the server with the GTA streaming module system. - - - - - **Experimental**: This native may be altered or removed in future versions of CitizenFX without warning. - - Registers a KVP value as an asset with the GTA streaming module system. This function currently won't work. - - - - - **Experimental**: This native may be altered or removed in future versions of CitizenFX without warning. - - Registers a file from an URL as a streaming asset in the GTA streaming subsystem. This will asynchronously register the asset, and caching is done based on the URL itself - cache headers are ignored. - - Use `IS_STREAMING_FILE_READY` to check if the asset has been registered successfully. - - - - - PED::REGISTER_TARGET(l_216, PLAYER::PLAYER_PED_ID()); from re_prisonbreak.txt. - l_216 = RECSBRobber1 - - - - - setting the last params to false it does that same so I would suggest its not a toggle - - - - - Pickup hashes: pastebin.com/8EuSv2r1 - - - - - p1 seems always to be 0 - - - - - Unloads the specified animation set. An animation set provides movement animations for a ped. See SET_PED_MOVEMENT_CLIPSET. - Animation set and clip set are synonymous. - - - - - In the C++ SDK, this seems not to work-- the blip isn't removed immediately. I use it for saving cars. - E.g.: - Ped pped = PLAYER::PLAYER_PED_ID(); - Vehicle v = PED::GET_VEHICLE_PED_IS_USING(pped); - Blip b = UI::ADD_BLIP_FOR_ENTITY(v); - works fine. - But later attempting to delete it with: - Blip b = UI::GET_BLIP_FROM_ENTITY(v); - if (UI::DOES_BLIP_EXIST(b)) UI::REMOVE_BLIP(&b); - doesn't work. And yes, doesn't work without the DOES_BLIP_EXIST check either. Also, if you attach multiple blips to the same thing (say, a vehicle), and that thing disappears, the blips randomly attach to other things (in my case, a vehicle). - Thus for me, UI::REMOVE_BLIP(&b) only works if there's one blip, (in my case) the vehicle is marked as no longer needed, you drive away from it and it eventually despawns, AND there is only one blip attached to it. I never intentionally attach multiple blips but if the user saves the car, this adds a blip. Then if they delete it, it is supposed to remove the blip, but it doesn't. Then they can immediately save it again, causing another blip to re-appear. - ------------- - Passing the address of the variable instead of the value works for me. - e.g. - int blip = UI::ADD_BLIP_FOR_ENTITY(ped); - UI::REMOVE_BLIP(&blip); - Remove blip will currently crash your game, just artificially remove the blip by setting the sprite to a id that is 'invisible'. - -- - It crashes my game. - - - - - Alias for REMOVE_ANIM_SET. - - - - - Removes all decals in range from a position, it includes the bullet holes, blood pools, petrol... - - - - - IPL list: pastebin.com/iNGLY32D - - - - - Removes multiplayer cash hud each frame - - - - - Ped will no longer get angry when you stay near him. - - - - - Judging purely from a quick disassembly, if the ped is in a vehicle, the ped will be deleted immediately. If not, it'll be marked as no longer needed. - very elegant.. - - - - - Retracts the hook on the cargobob. - Note: after you retract it the natives for dropping the hook no longer work - - - - - Experimental natives, please do not use in a live environment. - - - - - windowIndex: - 0 = Front Right Window - 1 = Front Left Window - 2 = Back Right Window - 3 = Back Left Window - - - - - For a full list, see here: pastebin.com/Tp0XpBMN - - - - - This native removes a specified weapon from your selected ped. - Weapon Hashes: pastebin.com/0wwDZgkF - Example: - C#: - Function.Call(Hash.REMOVE_WEAPON_FROM_PED, Game.Player.Character, 0x99B507EA); - C++: - WEAPON::REMOVE_WEAPON_FROM_PED(PLAYER::PLAYER_PED_ID(), 0x99B507EA); - The code above removes the knife from the player. - - - - - ease - smooth transition between the camera's positions - easeTime - Time in milliseconds for the transition to happen - If you have created a script (rendering) camera, and want to go back to the - character (gameplay) camera, call this native with render set to 0. - Setting ease to 1 will smooth the transition. - - - - - PLAYER::REPORT_CRIME(PLAYER::PLAYER_ID(), 37, PLAYER::GET_WANTED_LEVEL_THRESHOLD(1)); - From am_armybase.ysc.c4: - PLAYER::REPORT_CRIME(PLAYER::PLAYER_ID(4), 36, PLAYER::GET_WANTED_LEVEL_THRESHOLD(4)); - ----- - This was taken from the GTAV.exe v1.334. The function is called sub_140592CE8. For a full decompilation of the function, see here: pastebin.com/09qSMsN7 - ----- - crimeType: - 1: Firearms possession - 2: Person running a red light ("5-0-5") - 3: Reckless driver - 4: Speeding vehicle (a "5-10") - 5: Traffic violation (a "5-0-5") - 6: Motorcycle rider without a helmet - 7: Vehicle theft (a "5-0-3") - 8: Grand Theft Auto - 9: ??? - 10: ??? - 11: Assault on a civilian (a "2-40") - 12: Assault on an officer - 13: Assault with a deadly weapon (a "2-45") - 14: Officer shot (a "2-45") - 15: Pedestrian struck by a vehicle - 16: Officer struck by a vehicle - 17: Helicopter down (an "AC"?) - 18: Civilian on fire (a "2-40") - 19: Officer set on fire (a "10-99") - 20: Car on fire - 21: Air unit down (an "AC"?) - 22: An explosion (a "9-96") - 23: A stabbing (a "2-45") (also something else I couldn't understand) - 24: Officer stabbed (also something else I couldn't understand) - 25: Attack on a vehicle ("MDV"?) - 26: Damage to property - 27: Suspect threatening officer with a firearm - 28: Shots fired - 29: ??? - 30: ??? - 31: ??? - 32: ??? - 33: ??? - 34: A "2-45" - 35: ??? - 36: A "9-25" - 37: ??? - 38: ??? - 39: ??? - 40: ??? - 41: ??? - 42: ??? - 43: Possible disturbance - 44: Civilian in need of assistance - 45: ??? - 46: ??? - - - - - MulleDK19: Alias of REQUEST_COLLISION_AT_COORD. - - - - - Request a gxt into the passed slot. - - - - - All occurrences and usages found in b617d, sorted alphabetically and identical lines removed: pastebin.com/XZ1tmGEz - - - - - Starts loading the specified animation set. An animation set provides movement animations for a ped. See SET_PED_MOVEMENT_CLIPSET. - - - - - p1: usually 8 - Cutscene list: pastebin.com/Bbj7ANpQ - - - - - IPL list: pastebin.com/iNGLY32D - - - - - streaming::request_menu_ped_model(joaat("player_zero")); - iVar0 = ped::create_ped(25, joaat("player_zero"), cam::_get_gameplay_cam_coords(), 0f, 0, false); - entity::freeze_entity_position(iVar0, true); - ped::_0x4668d80430d6c299(iVar0); - ui::give_ped_to_pause_menu(iVar0, 1); - - - - - All occurrences and usages found in b617d: pastebin.com/NzZZ2Tmm - - - - - Request a model to be loaded into memory - Looking it the disassembly, it seems like it actually returns the model if it's already loaded. - - - - - assetName = For example "core" - From the b678d decompiled scripts: - STREAMING::REQUEST_NAMED_PTFX_ASSET("core_snow"); - STREAMING::REQUEST_NAMED_PTFX_ASSET("fm_mission_controler"); - STREAMING::REQUEST_NAMED_PTFX_ASSET("proj_xmas_firework"); - STREAMING::REQUEST_NAMED_PTFX_ASSET("scr_apartment_mp"); - STREAMING::REQUEST_NAMED_PTFX_ASSET("scr_biolab_heist"); - STREAMING::REQUEST_NAMED_PTFX_ASSET("scr_indep_fireworks"); - STREAMING::REQUEST_NAMED_PTFX_ASSET("scr_indep_parachute"); - STREAMING::REQUEST_NAMED_PTFX_ASSET("scr_indep_wheelsmoke"); - STREAMING::REQUEST_NAMED_PTFX_ASSET("scr_mp_cig_plane"); - STREAMING::REQUEST_NAMED_PTFX_ASSET("scr_mp_creator"); - STREAMING::REQUEST_NAMED_PTFX_ASSET("scr_mp_tankbattle"); - STREAMING::REQUEST_NAMED_PTFX_ASSET("scr_ornate_heist"); - STREAMING::REQUEST_NAMED_PTFX_ASSET("scr_prison_break_heist_station"); - - - - - maps script name (thread + 0xD0) by lookup via scriptfx.dat - does nothing when script name is empty - - - - - GTA V Scaleforms Decompiled - pastebin.com/mmNdjX2k - Gets a new native after almost every update. - Update 1.0.393.2 - 0x67D02A194A2FC2BD - Update 1.0.463.1 - 0xC97D787CE7726A2F - Update 1.0.505.2 - 0x36ECDA4DD9A3F08D - Update 1.0.573.1 - 0xE3C796DC28BC3254 - Update 1.0.678.1 - 0x2F14983962462691 - - - - - Also used by 0x67D02A194A2FC2BD - - - - - For a full list, see here: pastebin.com/yLNWicUi - - - - - All occurrences and usages found in b617d, sorted alphabetically and identical lines removed: pastebin.com/AkmDAVn6 - - - - - formerly _REQUEST_STREAMED_SCRIPT - - - - - last param seems to be unused in disassembly - - - - - REQUEST_VEHICLE_ASSET(GET_HASH_KEY(cargobob3), 3); - vehicle found that have asset's: - cargobob3 - submersible - blazer - - - - - In script files, seen as REQUEST_VEHICLE_RECORDING(1, "FBIs1UBER"); - - - - - For a full list, see here: pastebin.com/Tp0XpBMN - For a full list of the points, see here: goo.gl/wIH0vn - Max number of loaded recordings is 32. - - - - - Nearly every instance of p1 I found was 31. Nearly every instance of p2 I found was 0. - REQUEST_WEAPON_ASSET(iLocal_1888, 31, 26); - - - - - Resets the value for the last vehicle driven by the Ped. - - - - - If p1 is 0.0, I believe you are back to normal. - If p1 is 1.0, it looks like you can only rotate the ped, not walk. - Using the following code to reset back to normal - PED::RESET_PED_MOVEMENT_CLIPSET(PLAYER::PLAYER_PED_ID(), 0.0); - - - - - This function resets the alignment set using `SET_SCRIPT_GFX_ALIGN` and `SET_SCRIPT_GFX_ALIGN_PARAMS` to the default - values ('I', 'I'; 0, 0, 0, 0). This should be used after having used the aforementioned functions in order to not affect - any other scripts attempting to draw. - - - - - The inner function has a switch on the second parameter. It's the stuck timer index. - Here's some pseudo code I wrote for the inner function: - void __fastcall NATIVE_RESET_VEHICLE_STUCK_TIMER_INNER(CUnknown* unknownClassInVehicle, int timerIndex) - { - switch (timerIndex) - { - case 0: - unknownClassInVehicle->FirstStuckTimer = (WORD)0u; - case 1: - unknownClassInVehicle->SecondStuckTimer = (WORD)0u; - case 2: - unknownClassInVehicle->ThirdStuckTimer = (WORD)0u; - case 3: - unknownClassInVehicle->FourthStuckTimer = (WORD)0u; - case 4: - unknownClassInVehicle->FirstStuckTimer = (WORD)0u; - unknownClassInVehicle->SecondStuckTimer = (WORD)0u; - unknownClassInVehicle->ThirdStuckTimer = (WORD)0u; - unknownClassInVehicle->FourthStuckTimer = (WORD)0u; - break; - }; - } - - - - - Please change back to _0xBD12C5EEE184C33 (hash collision) - actual native starts with SET_RADAR_ZOOM_... - - - - - Before using this native click the native above and look at the decription. - Example: - int GetHash = Function.Call<int>(Hash.GET_HASH_KEY, "fe_menu_version_corona_lobby"); - Function.Call(Hash.ACTIVATE_FRONTEND_MENU, GetHash, 0, -1); - Function.Call(Hash.RESTART_FRONTEND_MENU(GetHash, -1); - This native refreshes the frontend menu. - p1 = Hash of Menu - p2 = Unknown but always works with -1. - - - - - This function will simply bring the dead person back to life. - Try not to use it alone, since using this function alone, will make peds fall through ground in hell(well for the most of the times). - Instead, before calling this function, you may want to declare the position, where your Resurrected ped to be spawn at.(For instance, Around 2 floats of Player's current position.) - Also, disabling any assigned task immediately helped in the number of scenarios, where If you want peds to perform certain decided tasks. - - - - - It will revive/cure the injured ped. The condition is ped must not be dead. - Upon setting and converting the health int, found, if health falls below 5, the ped will lay on the ground in pain(Maximum default health is 100). - This function is well suited there. - - - - - windowIndex: - 0 = Front Right Window - 1 = Front Left Window - 2 = Back Right Window - 3 = Back Left Window - - - - - Roll down all the windows of the vehicle passed through the first parameter. - - - - - 0 = Front Right Window - 1 = Front Left Window - 2 = Back Right Window - 3 = Back Left Window - - - - - Forces a rope to a certain length. - - - - - Loads rope textures for all ropes in the current scene. - - - - - Reset a rope to a certain length. - - - - - Unloads rope textures for all ropes in the current scene. - - - - - If bool Toggle = true so the mobile is hide to screen. - If bool Toggle = false so the mobile is show to screen. - - - - - Sends a message to the specific DUI root page. This is similar to SEND_NUI_MESSAGE. - - - - - Injects a 'mouse down' event for a DUI object. Coordinates are expected to be set using SEND_DUI_MOUSE_MOVE. - - - - - Injects a 'mouse move' event for a DUI object. Coordinates are in browser space. - - - - - Injects a 'mouse up' event for a DUI object. Coordinates are expected to be set using SEND_DUI_MOUSE_MOVE. - - - - - Injects a 'mouse wheel' event for a DUI object. - - - - - Sends a message to the `loadingScreen` NUI frame, which contains the HTML page referenced in `loadscreen` resources. - - - - - If 'value' is 50 and 'maxValue' is 100, the bar is halfway filled. - Same with 5/10, 2/4, etc. - - - - - Makes pedestrians sound their horn longer, faster and more agressive when they use their horn. - - - - - This can be between 1.0f - 14.9f - You can change the max in IDA from 15.0. I say 15.0 as the function blrs if what you input is greater than or equal to 15.0 hence why it's 14.9 max default. - On PC the multiplier can be between 0.0f and 50.0f (inclusive). - - - - - Most likely a hash collision - - - - - Audio List - gtaforums.com/topic/795622-audio-for-mods/ - All found occurrences in b617d, sorted alphabetically and identical lines removed: pastebin.com/FTeAj4yZ - Yes - - - - - All occurrences found in b617d, sorted alphabetically and identical lines removed: pastebin.com/WkXDGgQL - New Ambient Zone List (Combind with old): pastebin.com/h8BsKgUD -DasChaos - - - - - All occurrences found in b617d, sorted alphabetically and identical lines removed: pastebin.com/jYvw7N1S - New Ambient Zone List (Combind with old): pastebin.com/h8BsKgUD -DasChaos - - - - - mood can be 0 or 1 (it's not a boolean value!). Effects audio of the animal. - - - - - Does not affect weapons, particles, fire/explosions, flashlights or the sun. - - When set to true, all emissive textures (including ped components that have light effects), street lights, building lights, vehicle lights, etc will all be turned off. - - Used in Humane Labs Heist for EMP. - - - - - Possible flag names: - "ActivateSwitchWheelAudio" - "AllowAmbientSpeechInSlowMo" - "AllowCutsceneOverScreenFade" - "AllowForceRadioAfterRetune" - "AllowPainAndAmbientSpeechToPlayDuringCutscene" - "AllowPlayerAIOnMission" - "AllowPoliceScannerWhenPlayerHasNoControl" - "AllowRadioDuringSwitch" - "AllowRadioOverScreenFade" - "AllowScoreAndRadio" - "AllowScriptedSpeechInSlowMo" - "AvoidMissionCompleteDelay" - "DisableAbortConversationForDeathAndInjury" - "DisableAbortConversationForRagdoll" - "DisableBarks" - "DisableFlightMusic" - "DisableReplayScriptStreamRecording" - "EnableHeadsetBeep" - "ForceConversationInterrupt" - "ForceSeamlessRadioSwitch" - "ForceSniperAudio" - "FrontendRadioDisabled" - "HoldMissionCompleteWhenPrepared" - "IsDirectorModeActive" - "IsPlayerOnMissionForSpeech" - "ListenerReverbDisabled" - "LoadMPData" - "MobileRadioInGame" - "OnlyAllowScriptTriggerPoliceScanner" - "PlayMenuMusic" - "PoliceScannerDisabled" - "ScriptedConvListenerMaySpeak" - "SpeechDucksScore" - "SuppressPlayerScubaBreathing" - "WantedMusicDisabled" - "WantedMusicOnMission" - ------------------------------- - No added flag names between b393d and b573d, including b573d. - ####################################################################### - "IsDirectorModeActive" is an audio flag which will allow you to play speech infinitely without any pauses like in Director Mode. - ----------------------------------------------------------------------- - All flag IDs and hashes: - ID: 01 | Hash: 0x20A7858F - ID: 02 | Hash: 0xA11C2259 - ID: 03 | Hash: 0x08DE4700 - ID: 04 | Hash: 0x989F652F - ID: 05 | Hash: 0x3C9E76BA - ID: 06 | Hash: 0xA805FEB0 - ID: 07 | Hash: 0x4B94EA26 - ID: 08 | Hash: 0x803ACD34 - ID: 09 | Hash: 0x7C741226 - ID: 10 | Hash: 0x31DB9EBD - ID: 11 | Hash: 0xDF386F18 - ID: 12 | Hash: 0x669CED42 - ID: 13 | Hash: 0x51F22743 - ID: 14 | Hash: 0x2052B35C - ID: 15 | Hash: 0x071472DC - ID: 16 | Hash: 0xF9928BCC - ID: 17 | Hash: 0x7ADBDD48 - ID: 18 | Hash: 0xA959BA1A - ID: 19 | Hash: 0xBBE89B60 - ID: 20 | Hash: 0x87A08871 - ID: 21 | Hash: 0xED1057CE - ID: 22 | Hash: 0x1584AD7A - ID: 23 | Hash: 0x8582CFCB - ID: 24 | Hash: 0x7E5E2FB0 - ID: 25 | Hash: 0xAE4F72DB - ID: 26 | Hash: 0x5D16D1FA - ID: 27 | Hash: 0x06B2F4B8 - ID: 28 | Hash: 0x5D4CDC96 - ID: 29 | Hash: 0x8B5A48BA - ID: 30 | Hash: 0x98FBD539 - ID: 31 | Hash: 0xD8CB0473 - ID: 32 | Hash: 0x5CBB4874 - ID: 33 | Hash: 0x2E9F93A9 - ID: 34 | Hash: 0xD93BEA86 - ID: 35 | Hash: 0x92109B7D - ID: 36 | Hash: 0xB7EC9E4D - ID: 37 | Hash: 0xCABDBB1D - ID: 38 | Hash: 0xB3FD4A52 - ID: 39 | Hash: 0x370D94E5 - ID: 40 | Hash: 0xA0F7938F - ID: 41 | Hash: 0xCBE1CE81 - ID: 42 | Hash: 0xC27F1271 - ID: 43 | Hash: 0x9E3258EB - ID: 44 | Hash: 0x551CDA5B - ID: 45 | Hash: 0xCB6D663C - ID: 46 | Hash: 0x7DACE87F - ID: 47 | Hash: 0xF9DE416F - ID: 48 | Hash: 0x882E6E9E - ID: 49 | Hash: 0x16B447E7 - ID: 50 | Hash: 0xBD867739 - ID: 51 | Hash: 0xA3A58604 - ID: 52 | Hash: 0x7E046BBC - ID: 53 | Hash: 0xD95FDB98 - ID: 54 | Hash: 0x5842C0ED - ID: 55 | Hash: 0x285FECC6 - ID: 56 | Hash: 0x9351AC43 - ID: 57 | Hash: 0x50032E75 - ID: 58 | Hash: 0xAE6D0D59 - ID: 59 | Hash: 0xD6351785 - ID: 60 | Hash: 0xD25D71BC - ID: 61 | Hash: 0x1F7F6423 - ID: 62 | Hash: 0xE24C3AA6 - ID: 63 | Hash: 0xBFFDD2B7 - - - - - Toggles the big minimap state like in GTA:Online. - - To get the current state of the minimap, use [`GetBigmapActive`](#_0xF6AE18A7). - - - - - This sets bit [offset] of [address] to on. - The offsets used are different bits to be toggled on and off, typically there is only one address used in a script. - Example: - GAMEPLAY::SET_BIT(&bitAddress, 1); - To check if this bit has been enabled: - GAMEPLAY::IS_BIT_SET(bitAddress, 1); // will return 1 afterwards - Please note, this method may assign a value to [address] when used. - - - - - Sets alpha-channel for blip color. - Example: - Blip blip = UI::ADD_BLIP_FOR_ENTITY(entity); - UI::SET_BLIP_COLOUR(blip , 3); - UI::SET_BLIP_ALPHA(blip , 64); - - - - - false for enemy - true for friendly - - - - - Sets whether or not the specified blip should only be displayed when nearby, or on the minimap. - - - - - int index: - 1 = No Text on blip or Distance - 2 = Text on blip - 3 = No text, just distance - 4+ No Text on blip or distance - - - - - (Hex code are approximate) - 0: White (#fefefe) - 1: Red (#e03232) - 2: Green (#71cb71) - 3: Blue (#5db6e5) - 4: White (#fefefe) - 5: Taxi Yellow (#eec64e) - 6: Light Red (#c25050) - 7: Violet (#9c6eaf) - 8: Pink (#fe7ac3) - 9: Light Orange (#f59d79) - 10: Light Brown (#b18f83) - 11: Light Green (#8dcea7) - 12: Light Blue (Teal) (#70a8ae) - 13: Very Light Purple (#d3d1e7) - 14: Dark Purple (#8f7e98) - 15: Cyan (#6ac4bf) - 16: Light Yellow (#d5c398) - 17: Orange (#ea8e50) - 18: Light Blue (#97cae9) - 19: Dark Pink (#b26287) - 20: Dark Yellow (#8f8d79) - 21: Dark Orange (#a6755e) - 22: Light Gray (#afa8a8) - 23: Light Pink (#e78d9a) - 24: Lemon Green (#bbd65b) - 25: Forest Green (#0c7b56) - 26: Electric Blue (#7ac3fe) - 27: Bright Purple (#ab3ce6) - 28: Dark Taxi Yellow (#cda80c) - 29: Dark Blue (#4561ab) - 30: Dark Cyan (#29a5b8) - 31: Light Brown (#b89b7b) - 32: Very Light Blue (#c8e0fe) - 33: Light Yellow (#f0f096) - 34: Light Pink (#ed8ca1) - 35: Light Red (#f98a8a) - 36: Light Yellow (#fbeea5) - 37: White (#fefefe) - 38: Blue (#2c6db8) - 39: Light Gray (#9a9a9a) - 40: Dark Gray (#4c4c4c) - Certainly a lot more remaining. - - - - - **displayId Behaviour** <br> - 0 = Doesn't show up, ever, anywhere. <br> - 1 = Doesn't show up, ever, anywhere. <br> - 2 = Shows on both main map and minimap. (Selectable on map) <br> - 3 = Shows on main map only. (Selectable on map) <br> - 4 = Shows on main map only. (Selectable on map) <br> - 5 = Shows on minimap only. <br> - 6 = Shows on both main map and minimap. (Selectable on map) <br> - 7 = Doesn't show up, ever, anywhere. <br> - 8 = Shows on both main map and minimap. (Not selectable on map) <br> - 9 = Shows on minimap only. <br> - 10 = Shows on both main map and minimap. (Not selectable on map) <br> - Anything higher than 10 seems to be exactly the same as 10. <br> - <br> - Rockstar seem to only use 0, 2, 3, 4, 5 and 8 in the decompiled scripts. - - - - - Adds up after viewing multiple R* scripts. I believe that the duration is in miliseconds. - - - - - Doesn't work if the label text of gxtEntry is >= 80. - - - - - See this topic for more details : gtaforums.com/topic/717612-v-scriptnative-documentation-and-research/page-35?p=1069477935 - - - - - After some testing, looks like you need to use UI:CEIL() on the rotation (vehicle/ped heading) before using it there. - - - - - Enable / disable showing route for the Blip-object. - - - - - <!-- - _loc1_.map((name, idx) => `| ${idx} | ${name} | ![${name}](https://runtime.fivem.net/blips/${name}.svg) |`).join('\n') - --> - - Sets the displayed sprite for a specific blip. - - There's a [list of sprites](https://docs.fivem.net/game-references/blips/) on the FiveM documentation site. - - - - - works with AI::TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS to make a ped completely oblivious to all events going on around him - - - - - Set camera as active/inactive. - - - - - Previous declaration void SET_CAM_ACTIVE_WITH_INTERP(Cam camTo, Cam camFrom, int duration, BOOL easeLocation, BOOL easeRotation) is completely wrong. The last two params are integers not BOOLs... - - - - - Allows you to aim and shoot at the direction the camera is facing. - - - - - Sets the position of the cam. - - - - - NOTE: Debugging functions are not present in the retail version of the game. - - - - - Sets the field of view of the cam. - --------------------------------------------- - Min: 1.0f - Max: 130.0f - - - - - The native seems to only be called once. - The native is used as so, - CAM::SET_CAM_INHERIT_ROLL_VEHICLE(l_544, getElem(2, &l_525, 4)); - In the exile1 script. - - - - - Sets the rotation of the cam. - Last parameter unknown. - Last parameter seems to always be set to 2. - - - - - I named p1 as timeDuration as it is obvious. I'm assuming tho it is ran in ms(Milliseconds) as usual. - - - - - Setting ped to true allows the ped to shoot "friendlies". - p2 set to true when toggle is also true seams to make peds permanently unable to aim at, even if you set p2 back to false. - p1 = false & p2 = false for unable to aim at. - p1 = true & p2 = false for able to aim at. - - - - - Hardcoded to not work in multiplayer. - - - - - Sets the cylinder height of the checkpoint. - Parameters: - * nearHeight - The height of the checkpoint when inside of the radius. - * farHeight - The height of the checkpoint when outside of the radius. - * radius - The radius of the checkpoint. - - - - - Sets the checkpoint color. - - - - - p0 = 0/1 or true/false - It doesn't seems to work - - - - - SET_CLOCK_TIME(12, 34, 56); - - - - - combatType can be between 0-14. See GET_COMBAT_FLOAT below for a list of possible parameters. - - - - - All occurrences found in b617d, sorted alphabetically and identical lines removed: - AUDIO::SET_CUTSCENE_AUDIO_OVERRIDE("_AK"); - AUDIO::SET_CUTSCENE_AUDIO_OVERRIDE("_CUSTOM"); - AUDIO::SET_CUTSCENE_AUDIO_OVERRIDE("_TOOTHLESS"); - - - - - p3 could be heading. Needs more research. - - - - - Thanks R*! ;) - if ((l_161 == 0) || (l_161 == 2)) { - sub_2ea27("Trying to set Jimmy prop variation"); - CUTSCENE::_0546524ADE2E9723("Jimmy_Boston", 1, 0, 0, 0); - } - - - - - Only used twice in R* scripts - - - - - NOTE: Debugging functions are not present in the retail version of the game. - - - - - sometimes used used with NET_TO_OBJ - hash collision last 2 words - - - - - This native sets the app id for the discord rich presence implementation. - - - - - This native sets the image asset for the discord rich presence implementation. - - - - - This native sets the small image asset for the discord rich presence implementation. - - - - - This native sets the hover text of the small image asset for the discord rich presence implementation. - - - - - This native sets the hover text of the image asset for the discord rich presence implementation. - - - - - This is a NOP function. It does nothing at all. - - - - - Sets the on-screen drawing origin for draw-functions (which is normally x=0,y=0 in the upper left corner of the screen) to a world coordinate. - From now on, the screen coordinate which displays the given world coordinate on the screen is seen as x=0,y=0. - Example in C#: - Vector3 boneCoord = somePed.GetBoneCoord(Bone.SKEL_Head); - Function.Call(Hash.SET_DRAW_ORIGIN, boneCoord.X, boneCoord.Y, boneCoord.Z, 0); - Function.Call(Hash.DRAW_SPRITE, "helicopterhud", "hud_corner", -0.01, -0.015, 0.013, 0.013, 0.0, 255, 0, 0, 200); - Function.Call(Hash.DRAW_SPRITE, "helicopterhud", "hud_corner", 0.01, -0.015, 0.013, 0.013, 90.0, 255, 0, 0, 200); - Function.Call(Hash.DRAW_SPRITE, "helicopterhud", "hud_corner", -0.01, 0.015, 0.013, 0.013, 270.0, 255, 0, 0, 200); - Function.Call(Hash.DRAW_SPRITE, "helicopterhud", "hud_corner", 0.01, 0.015, 0.013, 0.013, 180.0, 255, 0, 0, 200); - Function.Call(Hash.CLEAR_DRAW_ORIGIN); - Result: www11.pic-upload.de/19.06.15/bkqohvil2uao.jpg - If the pedestrian starts walking around now, the sprites are always around her head, no matter where the head is displayed on the screen. - This function also effects the drawing of texts and other UI-elements. - The effect can be reset by calling GRAPHICS::CLEAR_DRAW_ORIGIN(). - - - - - For p1 & p2 (Ped, Vehicle). I could be wrong, as the only time this native is called in scripts is once and both are 0, but I assume this native will work like SET_MOUNTED_WEAPON_TARGET in which has the same exact amount of parameters and the 1st and last 3 parameters are right and the same for both natives. - - - - - The function specifically verifies the value is equal to, or less than 1.0f. If it is greater than 1.0f, the function does nothing at all. - - - - - range 0.0f - 1.0f - - - - - This native is used to set the driving style for specific ped. - Driving styles id seems to be: - 786468 - 262144 - 786469 - http://gtaforums.com/topic/822314-guide-driving-styles/ - - - - - Navigates the specified DUI browser to a different URL. - - - - - ped can not pull out a weapon when true - - - - - Enables diving motion when underwater. - - - - - skin - everything alpha except skin - Set entity alpha level. Ranging from 0 to 255 but chnages occur after every 20 percent (after every 51). - - - - - Animations list : www.los-santos-multiplayer.com/dev.airdancer?cxt=anim - - - - - Animations list : www.los-santos-multiplayer.com/dev.airdancer?cxt=anim - - - - - Makes the specified entity (ped, vehicle or object) persistent. Persistent entities will not automatically be removed by the engine. - p1 has no effect when either its on or off - maybe a quick disassembly will tell us what it does - p2 has no effect when either its on or off - maybe a quick disassembly will tell us what it does - - - - - Marks the specified entity (ped, vehicle or object) as no longer needed. - Entities marked as no longer needed, will be deleted as the engine sees fit. - - - - - Sets whether the entity can be targeted without being in line-of-sight. - - - - - p7 is always 1 in the scripts. Set to 1, an area around the destination coords for the moved entity is cleared from other entities. - Often ends with 1, 0, 0, 1); in the scripts. It works. - Axis - Invert Axis Flags - - - - - Axis - Invert Axis Flags - - - - - health >= 0 - - - - - Sets a ped or an object totally invincible. It doesn't take any kind of damage. Peds will not ragdoll on explosions and the tazer animation won't apply either. - If you use this for a ped and you want Ragdoll to stay enabled, then do: - *(DWORD *)(pedAddress + 0x188) |= (1 << 9); - Use this if you want to get the invincibility status: - bool IsPedInvincible(Ped ped) - { - auto addr = getScriptHandleBaseAddress(ped); - if (addr) - { - DWORD flag = *(DWORD *)(addr + 0x188); - return ((flag & (1 << 8)) != 0) || ((flag & (1 << 9)) != 0); - } - return false; - } - - - - - Certainly not the main usage of this native but when set to true for a Vehicle, it will prevent the vehicle to explode if it is spawned far away from the player. - - - - - I tried using this and I see nothing happening, what is this suppose to do? - - - - - I tried using this and I see nothing happening, what is this suppose to do? - - - - - LOD distance can be 0 to 0xFFFF (higher values will result in 0xFFFF) as it is actually stored as a 16-bit value (aka uint16_t). - - - - - For instance: ENTITY::SET_ENTITY_MAX_HEALTH(PLAYER::PLAYER_PED_ID(), 200); // director_mode.c4: 67849 - - - - - Calling this function, regardless of the "unknown" value, disabled collision between two entities. - Importance of entity1 and 2 order is unclear. - - - - - Enable / disable each type of damage. - -------------- - p7 is to to '1' in am_mp_property_ext/int: entity::set_entity_proofs(uParam0->f_19, true, true, true, true, true, true, 1, true); - - - - - w is the correct parameter name! - - - - - rotationOrder refers to the order yaw pitch roll is applied - value ranges from 0 to 5. What you use for rotationOrder when setting must be the same as rotationOrder when getting the rotation. - Unsure what value corresponds to what rotation order, more testing will be needed for that. - For the most part R* uses 1 or 2 as the order. - p5 is usually set as true - - - - - Example here: www.gtaforums.com/topic/830463-help-with-turning-lights-green-and-causing-peds-to-crash-into-each-other/#entry1068211340 - 0 = green - 1 = red - 2 = yellow - changing lights may not change the behavior of vehicles - - - - - Note that the third parameter(denoted as z) is "up and down" with positive ment. - - - - - unk was always 0. - - - - - In appcamera.c4, Line 106: - if (VEHICLE::IS_VEHICLE_DRIVEABLE(PED::SET_EXCLUSIVE_PHONE_RELATIONSHIPS(PLAYER::PLAYER_PED_ID()), 0)) - So return type could be a vehicle? - !Hash collision - gets the vehicle handle from ped which is about entering the vehicle! - sfink: agreed, 100% - Proper name is GET_VEHICLE_PED_IS_ENTERING - - - - - Groups found in the scripts used with this native: - "AMMUNATION", - "QUARRY", - "Triathlon_1", - "Triathlon_2", - "Triathlon_3" - - - - - Sets whether the game should fade in after the player dies or is arrested. - - - - - Sets whether the game should fade out after the player is arrested. - - - - - Sets whether the game should fade out after the player dies. - - - - - Sets a visually fake wanted level on the user interface. Used by Rockstar's scripts to "override" regular wanted levels and make custom ones while the real wanted level and multipliers are ignored. - Max is 6. Also the mini-map gets the red & blue flashing effect. - - - - - Purpose of p0 and p1 unknown. - - - - - It seems to make the entity's coords mark the point from which LOD-distances are measured. In my testing, setting a vehicle as the focus entity and moving that vehicle more than 300 distance units away from the player will make the level of detail around the player go down drastically (shadows disappear, textures go extremely low res, etc). The player seems to be the default focus entity. - - - - - From the b617d scripts: - CAM::SET_FOLLOW_PED_CAM_CUTSCENE_CHAT("FOLLOW_PED_ATTACHED_TO_ROPE_CAMERA", 0); - CAM::SET_FOLLOW_PED_CAM_CUTSCENE_CHAT("FOLLOW_PED_ON_EXILE1_LADDER_CAMERA", 1500); - CAM::SET_FOLLOW_PED_CAM_CUTSCENE_CHAT("FOLLOW_PED_SKY_DIVING_CAMERA", 0); - CAM::SET_FOLLOW_PED_CAM_CUTSCENE_CHAT("FOLLOW_PED_SKY_DIVING_CAMERA", 3000); - CAM::SET_FOLLOW_PED_CAM_CUTSCENE_CHAT("FOLLOW_PED_SKY_DIVING_FAMILY5_CAMERA", 0); - CAM::SET_FOLLOW_PED_CAM_CUTSCENE_CHAT("FOLLOW_PED_SKY_DIVING_CAMERA", 0); - - - - - Sets the type of Player camera: - 0 - Third Person Close - 1 - Third Person Mid - 2 - Third Person Far - 4 - First Person - - - - - Sets the type of Player camera in vehicles: - 0 - Third Person Close - 1 - Third Person Mid - 2 - Third Person Far - 4 - First Person - - - - - Sets some values in a vehicle gadget (tow arm, digger arm, etc.). Don't know which one though. - I've tested on the towtruck 1 & 2, Dock Lift (Crate Arm), Dozer, and such have no effect. However when used on a Forklift it sets the height of the forks. 0.0 = Lowest 1.0 = Highest. This is best to be used if you wanna pick-up a car since un-realistically on GTA V forklifts can't pick up much of anything due to vehicle mass. If you put this under a car then set it above 0.0 to a 'lifted-value' it will raise the car with no issue lol - - - - - Sets the camera position relative to heading in float from -360 to +360. - Heading is alwyas 0 in aiming camera. - - - - - Sets the camera pitch. - Parameters: - x = pitches the camera on the x axis. - Value2 = always seems to be hex 0x3F800000 (1.000000 float). - - - - - Sets the amplitude for the gameplay (i.e. 3rd or 1st) camera to shake. Used in script "drunk_controller.ysc.c4" to simulate making the player drunk. - - - - - Example C#: - Function.Call(Hash.SET_GAMEPLAY_COORD_HINT, position.X, position.Y, position.Z, hintDuration, 1500, 1000, 0); - The camera look-at is canceled if the user is already panning the camera around. - - - - - p6 & p7 - possibly length or time - - - - - Make sure to call this from the correct thread if you're using multiple threads because all other threads except the one which is calling SET_GAME_PAUSED will be paused which means you will lose control and the game remains in paused mode until you exit GTA5.exe - - - - - Needs to be looped! And yes, it does work and is not a hash collision. - Birds will try to reach the given height. - - - - - Only the script that originally called SET_GPS_FLAGS can set them again. Another script cannot set the flags, until the first script that called it has called CLEAR_GPS_FLAGS. - Doesn't seem like the flags are actually read by the game at all. - --------------- - Might be left-over from GTA IV. I kind of miss the *ding-dong* turn left in 2 meters lady lol. - - - - - level can be from 0 to 3 - 0: 9.8 - 1: 2.4 - 2: 0.1 - very low - 3: 0.0 - - - - - 0: Default - 1: Circle Around Leader - 2: Alternative Circle Around Leader - 3: Line, with Leader at center - - - - - Sets the range at which members will automatically leave the group. - - - - - Sets a global handling override for a specific vehicle class. The name is supposed to match the `handlingName` field from handling.meta. - Example: `SetHandlingField('AIRTUG', 'CHandlingData', 'fSteeringLock', 360.0)` - - - - - Sets a global handling override for a specific vehicle class. The name is supposed to match the `handlingName` field from handling.meta. - Example: `SetHandlingFloat('AIRTUG', 'CHandlingData', 'fSteeringLock', 360.0)` - - - - - Sets a global handling override for a specific vehicle class. The name is supposed to match the `handlingName` field from handling.meta. - - - - - Sets a global handling override for a specific vehicle class. The name is supposed to match the `handlingName` field from handling.meta. - Example: `SetHandlingVector('AIRTUG', 'CHandlingData', 'vecCentreOfMassOffset', vector3(0.0, 0.0, -5.0))` - - - - - Harcoded limit for radius is 30.0f - - - - - Equivalent of SET_HELI_BLADES_SPEED(vehicleHandle, 1.0f); - this native works on planes to? - - - - - Sets the speed of the helicopter blades in percentage of the full speed. - vehicleHandle: The helicopter. - speed: The speed in percentage, 0.0f being 0% and 1.0f being 100%. - - - - - Makes the ped ragdoll like when falling from a great height - - - - - No other indices work... - IK Index --------- - 1 = head - 3 = left arm - 4 = right arm - ------------------ - EntityLookAt can be null (0 handle) - - - - - Sets whether or not `SHUTDOWN_LOADING_SCREEN` automatically shuts down the NUI frame for the loading screen. If this is enabled, - you will have to manually invoke `SHUTDOWN_LOADING_SCREEN_NUI` whenever you want to hide the NUI loading screen. - - - - - If this is the correct name, what microphone? I know your TV isn't going to reach out and adjust your headset so.. - - - - - This native is used to toggle map components like the army base at the top of the map. - p2 appears to be always -1. - - An incomplete list of components ID: - - ``` - 0: Los Santos' air port yellow lift-off markers. - 1: Sandy Shore's air port yellow lift-off markers. - 2: Trevor's air port yellow lift-off markers. - 3: Unknown. - 4: Unknown. - 5: Unknown. - 6: Vespucci Beach lifeguard building. - 7: Unknown. - 8: Unknown. - 15: Army base. - ``` - - - - - Not much is known so far on what it does _exactly_. - All I know for sure is that it draws the specified hole ID on the pause menu map as well as on the mini-map/radar. This native also seems to change some other things related to the pause menu map's behaviour, for example: you can no longer set waypoints, the pause menu map starts up in a 'zoomed in' state. This native does not need to be executed every tick. - - You need to center the minimap manually as well as change/lock it's zoom and angle in order for it to appear correctly on the minimap. - You'll also need to use the `GOLF` scaleform in order to get the correct minmap border to show up. - - Use [`N_0x35edd5b2e3ff01c0()`](https://runtime.fivem.net/doc/reference.html#_0x35EDD5B2E3FF01C0) to reset the map when you no longer want to display any golf holes (you still need to unlock zoom, position and angle of the radar manually after calling this). - - - - - Sets the display info for a minimap overlay. - - - - - If true, the player can't save the game. - If the parameter is true, sets the mission flag to true, if the parameter is false, the function does nothing at all. - ^ also, if the mission flag is already set, the function does nothing at all - - - - - Takes a text label, gets the string (must not be longer than 600 chars, should not exceed 64 chars) and sets the name to that string. - p0 must be true. - - - - - p1 is always 0 - - - - - Last parameter is unknown and always zero. - - - - - The minimum/default is 500.0f. If you plan to make it bigger set it's position as well. Also this seems to need to be called in a loop as when you close the phone the scale is reset. If not in a loop you'd need to call it everytime before you re-open the phone. - - - - - Enables Radio on phone. - - - - - Unloads model from memory - - - - - Note: Look in decompiled scripts and the times that p1 and p2 aren't 0. They are filled with vars. If you look through out that script what other natives those vars are used in, you can tell p1 is a ped and p2 is a vehicle. Which most likely means if you want the mounted weapon to target a ped set targetVehicle to 0 or vice-versa. - - - - - Sets flag's sprite transparency. 0-255. - - - - - Ranges from 0 to 255. 0 is grey health bar, ~50 yellow, 200 purple. - - - - - Ranges from 0 to 255. 0 is grey health bar, ~50 yellow, 200 purple. - Should be enabled as flag (2). Has 0 opacity by default. - - This was _SET_MP_GAMER_TAG_HEALTH_BAR_COLOR, - - - - - enum MpGamerTagComponent - { - GAMER_NAME = 0, - CREW_TAG, - healthArmour, - BIG_TEXT, - AUDIO_ICON, - MP_USING_MENU, - MP_PASSIVE_MODE, - WANTED_STARS, - MP_DRIVER, - MP_CO_DRIVER, - MP_TAGGED, - GAMER_NAME_NEARBY, - ARROW, - MP_PACKAGES, - INV_IF_PED_FOLLOWING, - RANK_TEXT, - MP_TYPING - }; - - - - - displays wanted star above head - - - - - Whether or not another player is allowed to take control of the entity - - - - - Not used in the scripts. - Bullshit! It's used in spawn_activities - - - - - Enables Night Vision. - Example: - C#: Function.Call(Hash.SET_NIGHTVISION, true); - C++: GRAPHICS::SET_NIGHTVISION(true); - BOOL toggle: - true = turns night vision on for your player. - false = turns night vision off for your player. - - - - - This is an alias of SET_ENTITY_AS_NO_LONGER_NEEDED. - - - - - Adjust the physics parameters of a prop, or otherwise known as "object". This is useful for simulated gravity. - Other parameters seem to be unknown. - p2: seems to be weight and gravity related. Higher value makes the obj fall faster. Very sensitive? - p3: seems similar to p2 - p4: makes obj fall slower the higher the value - p5: similar to p4 - - - - - Appears to have an optional bool parameter that is unused in the scripts. - If you pass true, something will be set to zero. - - - - - p0 always seems to be 0 - duration in milliseconds - frequency should range from about 10 (slow vibration) to 255 (very fast) - appears to be a hash collision, though it does do what it says - example: - SET_PAD_SHAKE(0, 100, 200); - - - - - hash collision - - - - - only works on some fx's - p4 = 0 - - - - - Should be named SET_PARTICLE_FX_LOOPED_PROPERTY. "Evolution" doesn't make much sense... - -------- - p4 seems to be always 0. - Usage: - if (!GRAPHICS::DOES_PARTICLE_FX_LOOPED_EXIST(l_25C7)) { - l_25C7 = GRAPHICS::_DDE23F30CC5A0F03("scr_veh_plane_gen_damage", l_8B9, l_25C4, 0.0, 0.0, 0.0, ENTITY::_GET_ENTITY_BONE_INDEX(l_8B9, "exhaust"), 1.0, 0, 0, 0); - GRAPHICS::SET_PARTICLE_FX_LOOPED_EVOLUTION(l_25C7, "damage_smoke", 0.5, 0); - GRAPHICS::SET_PARTICLE_FX_LOOPED_EVOLUTION(l_25C7, "damage_fire", 0.2, 0); - } - - - - - Usage example for C#: - Function.Call(Hash.SET_PARTICLE_FX_NON_LOOPED_ALPHA, new InputArgument[] { 0.1f }); - Note: the argument alpha ranges from 0.0f-1.0f ! - - - - - only works on some fx's - - - - - accuracy = 0-100, 100 being perfectly accurate - - - - - value ranges from 0 to 3. - - - - - stance: - 0 = idle - 1 = walk - 2 = running - p5 = usually set to true - Animations list : www.los-santos-multiplayer.com/dev.airdancer?cxt=anim - - - - - Animations list : www.los-santos-multiplayer.com/dev.airdancer?cxt=anim - - - - - Sets the armor of the specified ped. - ped: The Ped to set the armor of. - amount: A value between 0 and 100 indicating the value to set the Ped's armor to. - - - - - Turns the desired ped into a cop. If you use this on the player ped, you will become almost invisible to cops dispatched for you. You will also report your own crimes, get a generic cop voice, get a cop-vision-cone on the radar, and you will be unable to shoot at other cops. SWAT and Army will still shoot at you. Toggling ped as "false" has no effect; you must change p0's ped model to disable the effect. - - - - - This is an alias of SET_ENTITY_AS_NO_LONGER_NEEDED. - - - - - 0 = can (bike) - 1 = can't (bike) - 2 = unk - 3 = unk - - - - - It simply makes the said ped to cower behind cover object(wall, desk, car) - Peds flee attributes must be set to not to flee, first. Else, most of the peds, will just flee from gunshot sounds or any other panic situations. - - - - - p2 usually 0 - - - - - This only will teleport the ped to the group leader if the group leader teleports (sets coords). - Only works in singleplayer - - - - - Overrides the ped's collision capsule radius for the current tick. - Must be called every tick to be effective. - Setting this to 0.001 will allow warping through some objects. - - - - - 100 would equal attack - less then 50ish would mean run away - Only the values 0, 1 and 2 occur in the decompiled scripts. Most likely refers directly to the values also described in combatbehaviour.meta: - 0: CA_Poor - 1: CA_Average - 2: CA_Professional - Tested this and got the same results as the first explanation here. Could not find any difference between 0, 1 and 2. - - - - - These combat attributes seem to be the same as the BehaviourFlags from combatbehaviour.meta. - So far, these are the equivalents found: - enum CombatAttributes - { - BF_CanUseCover = 0, - BF_CanUseVehicles = 1, - BF_CanDoDrivebys = 2, - BF_CanLeaveVehicle = 3, - BF_CanFightArmedPedsWhenNotArmed = 5, - BF_CanTauntInVehicle = 20, - BF_AlwaysFight = 46, - BF_IgnoreTrafficWhenDriving = 52, - BF_FreezeMovement = 292, - BF_PlayerCanUseFiringWeapons = 1424 - }; - 8 = ? - 9 = ? - 13 = ? - 14 ? - Research thread: gtaforums.com/topic/833391-researchguide-combat-behaviour-flags/ - - - - - 0 - Stationary (Will just stand in place) - 1 - Defensive (Will try to find cover and very likely to blind fire) - 2 - Offensive (Will attempt to charge at enemy but take cover as well) - 3 - Suicidal Offensive (Will try to flank enemy in a suicidal attack) - - - - - Only the values 0, 1 and 2 occur in the decompiled scripts. Most likely refers directly to the values also described as AttackRange in combatbehaviour.meta: - 0: CR_Near - 1: CR_Medium - 2: CR_Far - - - - - paletteId/palletColor - 0 to 3. - enum PedVariationData - { - PED_VARIATION_FACE = 0, - PED_VARIATION_HEAD = 1, - PED_VARIATION_HAIR = 2, - PED_VARIATION_TORSO = 3, - PED_VARIATION_LEGS = 4, - PED_VARIATION_HANDS = 5, - PED_VARIATION_FEET = 6, - PED_VARIATION_EYES = 7, - PED_VARIATION_ACCESSORIES = 8, - PED_VARIATION_TASKS = 9, - PED_VARIATION_TEXTURES = 10, - PED_VARIATION_TORSO2 = 11 - }; - Usage: - SET_PED_COMPONENT_VARIATION(playerPed, PED_VARIATION_FACE, GET_NUMBER_OF_PED_DRAWABLE_VARIATIONS(playerPed, PED_VARIATION_FACE), GET_NUMBER_OF_PED_TEXTURE_VARIATIONS(playerPed, PED_VARIATION_FACE, 0), 2); - List of component/props ID - gtaxscripting.blogspot.com/2016/04/gta-v-peds-component-and-props.html - - - - - Research help : pastebin.com/fPL1cSwB - New items added with underscore as first char - ----------------------------------------------------------------------- - enum PedConfigFlags - { - PED_FLAG_CAN_FLY_THRU_WINDSCREEN = 32, - PED_FLAG_DIES_BY_RAGDOLL = 33, - PED_FLAG_NO_COLLISION = 52, - _PED_FLAG_IS_SHOOTING = 58, - _PED_FLAG_IS_ON_GROUND = 60, - PED_FLAG_NO_COLLIDE = 62, - PED_FLAG_DEAD = 71, - PED_FLAG_IS_SNIPER_SCOPE_ACTIVE = 72, - PED_FLAG_SUPER_DEAD = 73, - _PED_FLAG_IS_IN_AIR = 76, - PED_FLAG_IS_AIMING = 78, - PED_FLAG_DRUNK = 100, - _PED_FLAG_IS_NOT_RAGDOLL_AND_NOT_PLAYING_ANIM = 104, - PED_FLAG_NO_PLAYER_MELEE = 122, - PED_FLAG_NM_MESSAGE_466 = 125, - PED_FLAG_INJURED_LIMP = 166, - PED_FLAG_INJURED_LIMP_2 = 170, - PED_FLAG_INJURED_DOWN = 187, - PED_FLAG_SHRINK = 223, - PED_FLAG_MELEE_COMBAT = 224, - _PED_FLAG_IS_ON_STAIRS = 253, - _PED_FLAG_HAS_ONE_LEG_ON_GROUND = 276, - PED_FLAG_NO_WRITHE = 281, - PED_FLAG_FREEZE = 292, - PED_FLAG_IS_STILL = 301, - PED_FLAG_NO_PED_MELEE = 314, - _PED_SWITCHING_WEAPON = 331, - PED_FLAG_ALPHA = 410, - }; - (*) When flagId is set to 33 and the bool value to true, peds will die by starting ragdoll, so you should set this flag to false when you resurrect a ped. - When flagId is set to 62 and the boolvalue to false this happens: Ped is taken out of vehicle and can't get back in when jacking their empty vehicle. If in a plane it falls from the sky and crashes. Sometimes peds vehicle continue to drive the route without its driver who's running after. - (*) - JUMPING CHANGES 60,61,104 TO FALSE - BEING ON WATER CHANGES 60,61 TO FALSE AND 65,66,168 TO TRUE - FALLING CHANGES 60,61,104,276 TO FALSE AND TO 76 TRUE - DYING CHANGES 60,61,104,276* TO FALSE AND (NONE) TO TRUE - DYING MAKES 60,61,104 TO FALSE - BEING IN A CAR CHANGES 60,79,104 TO FALSE AND 62 TO TRUE - (*)Maximum value for flagId is 0x1AA (426) in b944. - ID 0xF0 (240) appears to be a special flag which is handled different compared to the others IDs. - - - - - teleports ped to coords along with the vehicle ped is in - - - - - p1: Only "CODE_HUMAN_STAND_COWER" found in the b617d scripts. - - - - - Has 5 parameters since latest patches. - - - - - Sets Ped Default Clothes - - - - - • Usage - → Use this native inside a looped function. - → Values: - → 0.0 = no peds on streets - → 1.0 = normal peds on streets - - - - - [16/06/2017 by ins1de] : - Drops the weapon object from selected peds and turns it into a pickup. - Offset defines the next position of the weapon, ammo count is the stored ammo in the pickup (if ammoCount == 0, pickup won't be created) - Default offset values (freemode.c): - if (is_ped_walking(player_ped_id())) - { - vVar1 = {0.6f, 4.7f, -0.1f}; - } - else if (is_ped_sprinting(player_ped_id())) - { - vVar1 = {0.6f, 5.7f, -0.1f}; - } - else if (is_ped_running(player_ped_id())) - { - vVar1 = {0.6f, 4.7f, -0.1f}; - } - else - { - vVar1 = {0.4f, 4.7f, -0.1f}; - } - - - - - This is the SET_CHAR_DUCKING from GTA IV, that makes Peds duck. This function does nothing in GTA V. It cannot set the ped as ducking in vehicles, and IS_PED_DUCKING will always return false. - - - - - This is a hash collision... - _IS_VEHICLE_NEAR_ENTITY - - - - - Values look to be between 0.0 and 1.0 - From decompiled scripts: 0.0, 0.6, 0.65, 0.8, 1.0 - You are correct, just looked in IDA it breaks from the function if it's less than 0.0f or greater than 1.0f. - - - - - FIRING_PATTERN_BURST_FIRE = 0xD6FF6D61 ( 1073727030 ) - FIRING_PATTERN_BURST_FIRE_IN_COVER = 0x026321F1 ( 40051185 ) - FIRING_PATTERN_BURST_FIRE_DRIVEBY = 0xD31265F2 ( -753768974 ) - FIRING_PATTERN_FROM_GROUND = 0x2264E5D6 ( 577037782 ) - FIRING_PATTERN_DELAY_FIRE_BY_ONE_SEC = 0x7A845691 ( 2055493265 ) - FIRING_PATTERN_FULL_AUTO = 0xC6EE6B4C ( -957453492 ) - FIRING_PATTERN_SINGLE_SHOT = 0x5D60E4E0 ( 1566631136 ) - FIRING_PATTERN_BURST_FIRE_PISTOL = 0xA018DB8A ( -1608983670 ) - FIRING_PATTERN_BURST_FIRE_SMG = 0xD10DADEE ( 1863348768 ) - FIRING_PATTERN_BURST_FIRE_RIFLE = 0x9C74B406 ( -1670073338 ) - FIRING_PATTERN_BURST_FIRE_MG = 0xB573C5B4 ( -1250703948 ) - FIRING_PATTERN_BURST_FIRE_PUMPSHOTGUN = 0x00BAC39B ( 12239771 ) - FIRING_PATTERN_BURST_FIRE_HELI = 0x914E786F ( -1857128337 ) - FIRING_PATTERN_BURST_FIRE_MICRO = 0x42EF03FD ( 1122960381 ) - FIRING_PATTERN_SHORT_BURSTS = 0x1A92D7DF ( 445831135 ) - FIRING_PATTERN_SLOW_FIRE_TANK = 0xE2CA3A71 ( -490063247 ) - if anyone is interested firing pattern info: pastebin.com/Px036isB - - - - - Bool probably has something to do with vehicles, maybe if the ped can use vehicle to flee? - Values used as attributes are those in sequence of powers of two, 1, 2, 4, 8, 16, 32, 64.... 65536. - jedijosh920: Setting attribute "2" to true will make the ped steal a vehicle. - - - - - p1/gadgetHash was always 0xFBAB5776 ("GADGET_PARACHUTE"). - p2 is always true. - - - - - From the scripts: - PED::SET_PED_GESTURE_GROUP(PLAYER::PLAYER_PED_ID(), - "ANIM_GROUP_GESTURE_MISS_FRA0"); - PED::SET_PED_GESTURE_GROUP(PLAYER::PLAYER_PED_ID(), - "ANIM_GROUP_GESTURE_MISS_DocksSetup1"); - - - - - enable or disable the gravity of a ped - Examples: - PED::SET_PED_GRAVITY(PLAYER::PLAYER_PED_ID(), 0x00000001); - PED::SET_PED_GRAVITY(Local_289[iVar0 -- [[20]] ], 0x00000001); - - - - - The "shape" parameters control the shape of the ped's face. The "skin" parameters control the skin tone. ShapeMix and skinMix control how much the first and second IDs contribute,(typically mother and father.) ThirdMix overrides the others in favor of the third IDs. IsParent is set for "children" of the player character's grandparents during old-gen character creation. It has unknown effect otherwise. - The IDs start at zero and go Male Non-DLC, Female Non-DLC, Male DLC, and Female DLC. - !!!Can someone add working example for this??? - try this: - headBlendData headData; - _GET_PED_HEAD_BLEND_DATA(PLAYER_PED_ID(), &headData); - SET_PED_HEAD_BLEND_DATA(PLAYER_PED_ID(), headData.shapeFirst, headData.shapeSecond, headData.shapeThird, headData.skinFirst, headData.skinSecond - , headData.skinThird, headData.shapeMix, headData.skinMix, headData.skinThird, 0); - For more info please refer to this topic. - gtaforums.com/topic/858970-all-gtao-face-ids-pedset-ped-head-blend-data-explained - - - - - OverlayID ranges from 0 to 12, index from 0 to _GET_NUM_OVERLAY_VALUES(overlayID)-1, and opacity from 0.0 to 1.0. - overlayID Part Index, to disable - 0 Blemishes 0 - 23, 255 - 1 Facial Hair 0 - 28, 255 - 2 Eyebrows 0 - 33, 255 - 3 Ageing 0 - 14, 255 - 4 Makeup 0 - 74, 255 - 5 Blush 0 - 6, 255 - 6 Complexion 0 - 11, 255 - 7 Sun Damage 0 - 10, 255 - 8 Lipstick 0 - 9, 255 - 9 Moles/Freckles 0 - 17, 255 - 10 Chest Hair 0 - 16, 255 - 11 Body Blemishes 0 - 11, 255 - 12 Add Body Blemishes 0 - 1, 255 - - - - - List of component/props ID - gtaxscripting.blogspot.com/2016/04/gta-v-peds-component-and-props.html - - - - - Ped: The ped to warp. - vehicle: The vehicle to warp the ped into. - Seat_Index: [-1 is driver seat, -2 first free passenger seat] - Moreinfo of Seat Index - DriverSeat = -1 - Passenger = 0 - Left Rear = 1 - RightRear = 2 - - - - - PED::SET_PED_IN_VEHICLE_CONTEXT(l_128, GAMEPLAY::GET_HASH_KEY("MINI_PROSTITUTE_LOW_PASSENGER")); - PED::SET_PED_IN_VEHICLE_CONTEXT(l_128, GAMEPLAY::GET_HASH_KEY("MINI_PROSTITUTE_LOW_RESTRICTED_PASSENGER")); - PED::SET_PED_IN_VEHICLE_CONTEXT(l_3212, GAMEPLAY::GET_HASH_KEY("MISS_FAMILY1_JIMMY_SIT")); - PED::SET_PED_IN_VEHICLE_CONTEXT(l_3212, GAMEPLAY::GET_HASH_KEY("MISS_FAMILY1_JIMMY_SIT_REAR")); - PED::SET_PED_IN_VEHICLE_CONTEXT(l_95, GAMEPLAY::GET_HASH_KEY("MISS_FAMILY2_JIMMY_BICYCLE")); - PED::SET_PED_IN_VEHICLE_CONTEXT(num3, GAMEPLAY::GET_HASH_KEY("MISSFBI2_MICHAEL_DRIVEBY")); - PED::SET_PED_IN_VEHICLE_CONTEXT(PLAYER::PLAYER_PED_ID(), GAMEPLAY::GET_HASH_KEY("MISS_ARMENIAN3_FRANKLIN_TENSE")); - PED::SET_PED_IN_VEHICLE_CONTEXT(PLAYER::PLAYER_PED_ID(), GAMEPLAY::GET_HASH_KEY("MISSFBI5_TREVOR_DRIVING")); - - - - - Sets the ped drunk sounds. Only works with PLAYER_PED_ID - ==================================================== - As mentioned above, this only sets the drunk sound to ped/player. - To give the Ped a drunk effect with drunk walking animation try using SET_PED_MOVEMENT_CLIPSET - Below is an example - if (!Function.Call<bool>(Hash.HAS_ANIM_SET_LOADED, "move_m@drunk@verydrunk")) - { - Function.Call(Hash.REQUEST_ANIM_SET, "move_m@drunk@verydrunk"); - } - Function.Call(Hash.SET_PED_MOVEMENT_CLIPSET, Ped.Handle, "move_m@drunk@verydrunk", 0x3E800000); - And to stop the effect use - RESET_PED_MOVEMENT_CLIPSET - - - - - "IK" stands for "Inverse kinematics." I assume this has something to do with how the ped uses his legs to balance. In the scripts, the second parameter is always an int with a value of 2, 0, or sometimes 1 - - - - - sets the maximum health of a ped - I think it's never been used in any script - - - - - Ped will stay on the ground after being stunned for at lest ms time. (in milliseconds) - - - - - Maximum possible amount of money on MP is 2000. ~JX - ----------------------------------------------------------------------------- - Maximum amount that a ped can theoretically have is 65535 (0xFFFF) since the amount is stored as an unsigned short (uint16_t) value. - - - - - p2 is usually 1.0f - EDIT 12/24/16: - p2 does absolutely nothing no matter what the value is. - EDIT 08/16/17: - p2 is the time for a smooth changing to the new clipset. - List of movement clipsets: - Thanks to elsewhat for list. - "ANIM_GROUP_MOVE_BALLISTIC" - "ANIM_GROUP_MOVE_LEMAR_ALLEY" - "clipset@move@trash_fast_turn" - "FEMALE_FAST_RUNNER" - "missfbi4prepp1_garbageman" - "move_characters@franklin@fire" - "move_characters@Jimmy@slow@" - "move_characters@michael@fire" - "move_f@flee@a" - "move_f@scared" - "move_f@sexy@a" - "move_heist_lester" - "move_injured_generic" - "move_lester_CaneUp" - "move_m@bag" - "MOVE_M@BAIL_BOND_NOT_TAZERED" - "MOVE_M@BAIL_BOND_TAZERED" - "move_m@brave" - "move_m@casual@d" - "move_m@drunk@moderatedrunk" - "MOVE_M@DRUNK@MODERATEDRUNK" - "MOVE_M@DRUNK@MODERATEDRUNK_HEAD_UP" - "MOVE_M@DRUNK@SLIGHTLYDRUNK" - "MOVE_M@DRUNK@VERYDRUNK" - "move_m@fire" - "move_m@gangster@var_e" - "move_m@gangster@var_f" - "move_m@gangster@var_i" - "move_m@JOG@" - "MOVE_M@PRISON_GAURD" - "MOVE_P_M_ONE" - "MOVE_P_M_ONE_BRIEFCASE" - "move_p_m_zero_janitor" - "move_p_m_zero_slow" - "move_ped_bucket" - "move_ped_crouched" - "move_ped_mop" - "MOVE_M@FEMME@" - "MOVE_F@FEMME@" - "MOVE_M@GANGSTER@NG" - "MOVE_F@GANGSTER@NG" - "MOVE_M@POSH@" - "MOVE_F@POSH@" - "MOVE_M@TOUGH_GUY@" - "MOVE_F@TOUGH_GUY@" - ~ NotCrunchyTaco - - - - - Min: 0.00 - Max: 10.00 - Can be used in combo with fast run cheat. - When value is set to 10.00: - Sprinting without fast run cheat: 66 m/s - Sprinting with fast run cheat: 77 m/s - Does not need to be looped! - Note: According to IDA for the Xbox360 xex, when they check bgt they seem to have the min to 0.0f, but the max set to 1.15f not 10.0f. - - - - - NOTE: Debugging functions are not present in the retail version of the game. - *untested but char *name could also be a hash for a localized string - - - - - The distance between these points, is the diagonal of a box (remember it's 3D). - - - - - Hash collision!!! Actual name: SET_PED_PATH_MAY_ENTER_WATER - - - - - p2 could be time. Only example in the decompiled scripts uses it as -1. - - - - - Points to the same function as for example GET_RANDOM_VEHICLE_MODEL_IN_MEMORY and it does absolutely nothing. - - - - - This is only called once in the scripts. - sub_1CD9(&l_49, 0, getElem(3, &l_34, 4), "MICHAEL", 0, 1); - sub_1CA8("WORLD_HUMAN_SMOKING", 2); - PED::SET_PED_PRIMARY_LOOKAT(getElem(3, &l_34, 4), PLAYER::PLAYER_PED_ID()); - - - - - ComponentId can be set to various things based on what category you're wanting to set - enum PedPropsData - { - PED_PROP_HATS = 0, - PED_PROP_GLASSES = 1, - PED_PROP_EARS = 2, - PED_PROP_WATCHES = 3, - }; - Usage: SET_PED_PROP_INDEX(playerPed, PED_PROP_HATS, GET_NUMBER_OF_PED_PROP_DRAWABLE_VARIATIONS(playerPed, PED_PROP_HATS), GET_NUMBER_OF_PED_PROP_TEXTURE_VARIATIONS(playerPed, PED_PROP_HATS, 0), TRUE); - List of component/props ID - gtaxscripting.blogspot.com/2016/04/gta-v-peds-component-and-props.html - - - - - Causes Ped to ragdoll on collision with any object (e.g Running into trashcan). If applied to player you will sometimes trip on the sidewalk. - - - - - p1 is always false in R* scripts. - Quick disassembly seems to indicate that p1 is unused. - List of component/props ID - gtaxscripting.blogspot.com/2016/04/gta-v-peds-component-and-props.html - - - - - List of component/props ID - gtaxscripting.blogspot.com/2016/04/gta-v-peds-component-and-props.html - - - - - PED::SET_PED_RESET_FLAG(PLAYER::PLAYER_PED_ID(), 240, 1); - - - - - shootRate 0-1000 - - - - - p1 is usually 0 in the scripts. action is either 0 or a pointer to "DEFAULT_ACTION". - - - - - ped cannot be headshot if this is set to false - - - - - Sweat is set to 100.0 or 0.0 in the decompiled scripts. - - - - - Hash collision!!! - SET_VEHICLE_I* - destroyType is 1 for opens on damage, 2 for breaks on damage. - - - - - Only 1 and 2 appear in the scripts. combatbehaviour.meta seems to only have TLR_SearchForTarget for all peds, but we don't know if that's 1 or 2. - - - - - time1- Time Ped is in ragdoll mode(ms) - time2- Unknown time, in milliseconds - ragdollType- - 0 : Normal ragdoll - 1 : Falls with stiff legs/body - 2 : Narrow leg stumble(may not fall) - 3 : Wide leg stumble(may not fall) - p4, p5, p6- No idea. In R*'s scripts they are usually either "true, true, false" or "false, false, false". - EDIT 3/11/16: unclear what 'mircoseconds' mean-- a microsecond is 1000x a ms, so time2 must be 1000x time1? more testing needed. -sob - Edit Mar 21, 2017: removed part about time2 being the microseconds version of time1. this just isn't correct. time2 is in milliseconds, and time1 and time2 don't seem to be connected in any way. - - - - - Return variable is never used in R*'s scripts. - Not sure what p2 does. It seems like it would be a time judging by it's usage in R*'s scripts, but didn't seem to affect anything in my testings. - x, y, and z are coordinates, most likely to where the ped will fall. - p7 is probably the force of the fall, but untested, so I left the variable name the same. - p8 to p13 are always 0f in R*'s scripts. - (Simplified) Example of the usage of the function from R*'s scripts: - ped::set_ped_to_ragdoll_with_fall(ped, 1500, 2000, 1, -entity::get_entity_forward_vector(ped), 1f, 0f, 0f, 0f, 0f, 0f, 0f); - - - - - p2 is usually -1 in the scripts. action is either 0 or "DEFAULT_ACTION". - - - - - This native refers to the field of vision the ped has above them, starting at 0 degrees. 90f would let the ped see enemies directly above of them. - - - - - This native refers to the field of vision the ped has below them, starting at 0 degrees. The angle value should be negative. - - - - - tintIndex can be the following: - 1 - 2 - 3 - 4 - 5 - 6 - 7 - - - - - combined with PED::SET_PED_WETNESS_HEIGHT(), this native makes the ped drenched in water up to the height specified in the other function - - - - - It adds the wetness level to the player clothing/outfit. As if player just got out from water surface. - - - - - duration specifies the time until the next respawn, in ms. (known values: 600000). - Usage Example: - Pickup pickup = OBJECT::CREATE_PICKUP_ROTATE(...); - OBJECT::SET_PICKUP_REGENERATION_TIME(pickup, 600000); // 10mins - - - - - This native sets the turbulence multiplier. It only works for planes. - 0.0 = no turbulence at all. - 1.0 = heavy turbulence. - - Works by just calling it once, does not need to be called every tick. - - - - - Hash collision! Disables speech. - - - - - Sets whether this player can be hassled by gangs. - - - - - Set whether this player should be able to do drive-bys. - "A drive-by is when a ped is aiming/shooting from vehicle. This includes middle finger taunts. By setting this value to false I confirm the player is unable to do all that. Tested on tick." - - - - - Sets whether this player can take cover. - - - - - 6 matches across 4 scripts. 5 occurrences were 240. The other was 255. - - - - - Every occurrence was either 0 or 2. - - - - - Every occurrence of p1 I found was true.1.0.335.2, 1.0.350.1/2, 1.0.372.2, 1.0.393.2, 1.0.393.4, 1.0.463.1; - - - - - Flags used in the scripts: 0,4,16,24,32,56,60,64,128,134,256,260,384,512,640,768,896,900,952,1024,1280,2048,2560 - Note to people who needs this with camera mods, etc.: - Flags(0, 4, 16, 24, 32, 56, 60, 64, 128, 134, 512, 640, 1024, 2048, 2560) - - Disables camera rotation as well. - Flags(256, 260, 384, 768, 896, 900, 952, 1280) - [ translation: cameraRotation = flags & (1 << 8) - sfink] - - - - - Hash collision - - - - - Simply sets you as invincible (Health will not deplete). - Use 0x733A643B5B0C53C1 instead if you want Ragdoll enabled, which is equal to: - *(DWORD *)(playerPedAddress + 0x188) |= (1 << 9); - - - - - Example from fm_mission_controler.ysc.c4: - PLAYER::SET_PLAYER_LOCKON(PLAYER::PLAYER_ID(), 1); - All other decompiled scripts using this seem to be using the player id as the first parameter, so I feel the need to confirm it as so. - No need to confirm it says PLAYER_ID() so it uses PLAYER_ID() lol. - - - - - Affects the range of auto aim target. - - - - - Default is 100. Use player id and not ped id. For instance: PLAYER::SET_PLAYER_MAX_ARMOUR(PLAYER::PLAYER_ID(), 100); // main_persistent.ct4 - - - - - Set the model for a specific Player. Be aware that this will destroy the current Ped for the Player and create a new one, any - reference to the old ped should be reset (by using the GetPlayerPed native). - - ``` - Make sure to request the model first and wait until it has loaded. - ``` - - - - - example: - PLAYER::SET_PLAYER_PARACHUTE_MODEL_OVERRIDE(PLAYER::PLAYER_ID(), 0x73268708); - - - - - tints 0 - 1 - 2 - 3 - 4 - - - - - Tints: - None = -1, - Rainbow = 0, - Red = 1, - SeasideStripes = 2, - WidowMaker = 3, - Patriot = 4, - Blue = 5, - Black = 6, - Hornet = 7, - AirFocce = 8, - Desert = 9, - Shadow = 10, - HighAltitude = 11, - Airbone = 12, - Sunrise = 13, - - - - - p1 was always 5. - p4 was always false. - - - - - Tints: - None = -1, - Rainbow = 0, - Red = 1, - SeasideStripes = 2, - WidowMaker = 3, - Patriot = 4, - Blue = 5, - Black = 6, - Hornet = 7, - AirFocce = 8, - Desert = 9, - Shadow = 10, - HighAltitude = 11, - Airbone = 12, - Sunrise = 13, - - - - - example: - flags: 0-6 - PLAYER::SET_PLAYER_RESET_FLAG_PREFER_REAR_SEATS(PLAYER::PLAYER_ID(), 6); - wouldnt the flag be the seatIndex? - - - - - Values around 1.0f to 2.0f used in game scripts. - - - - - 77 - - - - - the status of default voip system. It affects on `NETWORK_IS_PLAYER_TALKING` and `mp_facial` animation. - This function doesn't need to be called every frame, it works like a switcher. - - - - - Sets your targeting mode. - 0 = Traditional GTA - 1 = Assisted Aiming - 2 = Free Aim - Even tho gtaforums nor Alexander B supports this, if you're online in freemode already it's nice to have this since retail or otherwise you have to go to SP to change it. - - - - - Set player team on deathmatch and last team standing.. - - - - - # Predominant call signatures - PLAYER::SET_PLAYER_WANTED_CENTRE_POSITION(PLAYER::PLAYER_ID(), ENTITY::GET_ENTITY_COORDS(PLAYER::PLAYER_PED_ID(), 1)); - # Parameter value ranges - P0: PLAYER::PLAYER_ID() - P1: ENTITY::GET_ENTITY_COORDS(PLAYER::PLAYER_PED_ID(), 1) - P2: Not set by any call - - - - - Call SET_PLAYER_WANTED_LEVEL_NOW for immediate effect - wantedLevel is an integer value representing 0 to 5 stars even though the game supports the 6th wanted level but no police will appear since no definitions are present for it in the game files - disableNoMission- Disables When Off Mission- appears to always be false - - - - - Forces any pending wanted level to be applied to the specified player immediately. - Call SET_PLAYER_WANTED_LEVEL with the desired wanted level, followed by SET_PLAYER_WANTED_LEVEL_NOW. - Second parameter is unknown (always false). - - - - - p2 is always false in R* scripts - - - - - This modifies the damage value of your weapon. Whether it is a multiplier or base damage is unknown. - Based on tests, it is unlikely to be a multiplier. - - - - - The player will be ignored by the police if toggle is set to true - - - - - If toggle is set to false: - The police won't be shown on the (mini)map - If toggle is set to true: - The police will be shown on the (mini)map - - - - - List of interior hashes: pastebin.com/1FUyXNqY - Not for every interior zoom > 0 available. - - - - - zoomLevel ranges from 0 to 200 - - - - - Sets radio station by index. - - - - - For a full list, see here: pastebin.com/Kj9t38KF - - - - - Only found this one in the decompiled scripts: - AUDIO::SET_RADIO_TRACK("RADIO_03_HIPHOP_NEW", "ARM1_RADIO_STARTS"); - - - - - If the parameter is true, sets the random event flag to true, if the parameter is false, the function does nothing at all. - Does nothing if the mission flag is set. - - - - - Sets the relationship between two groups. This should be called twice (once for each group). - Relationship types: - 0 = Companion - 1 = Respect - 2 = Like - 3 = Neutral - 4 = Dislike - 5 = Hate - 255 = Pedestrians - Example: - PED::SET_RELATIONSHIP_BETWEEN_GROUPS(2, l_1017, 0xA49E591C); - PED::SET_RELATIONSHIP_BETWEEN_GROUPS(2, 0xA49E591C, l_1017); - - - - - makes the train all jumbled up and derailed as it moves on the tracks (though that wont stop it from its normal operations) - - - - - Sets the player's rich presence detail state for social platform providers to a specified string. - - - - - missing a last parameter int p6 - - - - - bool p7 - always 1 - - - - - -- [[ Corrected conflicting parameter names ]] - - - - - -- [[ Corrected conflicting parameter names ]] - - - - - Sets a pixel in the specified runtime texture. This will have to be committed using `COMMIT_RUNTIME_TEXTURE` to have any effect. - - - - - Multiplier goes up to 1.49 any value above will be completely overruled by the game and the multiplier will not take effect, this can be edited in memory however. - Just call it one time, it is not required to be called once every tick. - Note: At least the IDA method if you change the max float multiplier from 1.5 it will change it for both this and SWIM above. I say 1.5 as the function blrs if what you input is greater than or equal to 1.5 hence why it's 1.49 max default. - It is not possible to "decrease" speed. Anything below 1 will be ignored. - - - - - The bool is not a toggle!!! - - - - - Occurrences in the b617d scripts: pastebin.com/Tvg2PRHU - - - - - Sets a value indicating whether scenario peds should be returned by the next call to a command that returns peds. Eg. GET_CLOSEST_PED. - - - - - p0 and p1 are always the same - - - - - seems to enable/disable specific scenario-types from happening in the game world. - Here are some scenario types from the scripts: - "WORLD_MOUNTAIN_LION_REST" - "WORLD_MOUNTAIN_LION_WANDER" - "DRIVE" - "WORLD_VEHICLE_POLICE_BIKE" - "WORLD_VEHICLE_POLICE_CAR" - "WORLD_VEHICLE_POLICE_NEXT_TO_CAR" - "WORLD_VEHICLE_DRIVE_SOLO" - "WORLD_VEHICLE_BIKER" - "WORLD_VEHICLE_DRIVE_PASSENGERS" - "WORLD_VEHICLE_SALTON_DIRT_BIKE" - "WORLD_VEHICLE_BICYCLE_MOUNTAIN" - "PROP_HUMAN_SEAT_CHAIR" - "WORLD_VEHICLE_ATTRACTOR" - "WORLD_HUMAN_LEANING" - "WORLD_HUMAN_HANG_OUT_STREET" - "WORLD_HUMAN_DRINKING" - "WORLD_HUMAN_SMOKING" - "WORLD_HUMAN_GUARD_STAND" - "WORLD_HUMAN_CLIPBOARD" - "WORLD_HUMAN_HIKER" - "WORLD_VEHICLE_EMPTY" - "WORLD_VEHICLE_BIKE_OFF_ROAD_RACE" - "WORLD_HUMAN_PAPARAZZI" - "WORLD_VEHICLE_PARK_PERPENDICULAR_NOSE_IN" - "WORLD_VEHICLE_PARK_PARALLEL" - "WORLD_VEHICLE_CONSTRUCTION_SOLO" - "WORLD_VEHICLE_CONSTRUCTION_PASSENGERS" - "WORLD_VEHICLE_TRUCK_LOGS" - -alphazolam - scenarioType could be the same as scenarioName, used in for example AI::TASK_START_SCENARIO_AT_POSITION. - - - - - For a full list, see here: pastebin.com/yLNWicUi - - - - - This function anchors script draws to a side of the safe zone. This needs to be called to make the interface - independent of the player's safe zone configuration. - - These values are equivalent to `alignX` and `alignY` in `common:/data/ui/frontend.xml`, which can be used as a baseline - for default alignment. - - Valid values for `horizontalAlign`, from original documentation: - - - **C (67)** - Center: DRAW_TEXT starts in the middle of the screen, while DRAW_RECT starts on the right; both move with - the right side of the screen. - - **L (76)** - Left: Anchors to the left side, DRAW_RECT starts on the left side of the screen, same as DRAW_TEXT when - centered. - - **R (82)** - Right: DRAW_TEXT starts on the left side (normal 0,0), while DRAW_RECT starts some short distance away - from the right side of the screen, both move with the right side of the screen. - - Valid values for `verticalAlign`, from original documentation: - - - **B (66)** - Bottom: DRAW_RECT starts about as far as the middle of the map from the bottom, while DRAW_TEXT is about - rather centered. - - **C (67)** - Center: It starts at a certain distance from the bottom, but the distance is fixed, the distance is - different from 66. - - **T (84)** - Top: Anchors to the top, DRAW_RECT starts on the top of the screen, DRAW_TEXT just below it. - - Using any other value (including 0) will result in the safe zone not being taken into account for this draw. The - canonical value for this is 'I' (73). - - For example, you can use `SET_SCRIPT_GFX_ALIGN(0, 84)` to only scale on the Y axis (to the top), but not change the X - axis. - - To reset the value, use `RESET_SCRIPT_GFX_ALIGN`. - - - - - Sets the draw offset/calculated size for `SET_SCRIPT_GFX_ALIGN`. If using any alignment other than left/top, the game - expects the width/height to be configured using this native in order to get a proper starting position for the draw - command. - - - - - Sets a flag defining whether or not script draw commands should continue being drawn behind the pause - menu. This is usually used for TV channels and other draw commands that are used with a world render target. - - - - - Sets the draw order for script draw commands. - - Examples from decompiled scripts: - - ```cpp - GRAPHICS::SET_SCRIPT_GFX_DRAW_ORDER(7); - GRAPHICS::DRAW_RECT(0.5, 0.5, 3.0, 3.0, v_4, v_5, v_6, a_0._f172, 0); - GRAPHICS::SET_SCRIPT_GFX_DRAW_ORDER(1); - GRAPHICS::DRAW_RECT(0.5, 0.5, 1.5, 1.5, 0, 0, 0, 255, 0); - ``` - - - - - Only called once in the decompiled scripts. Presumably activates the specified generator. - - - - - Toggles Heatvision on/off. - - - - - Hardcoded to not work in multiplayer. - Used to lock/unlock doors to interior areas of the game. - (Possible) Door Types: - pastebin.com/9S2m3qA4 - Heading is either 1, 0 or -1 in the scripts. Means default closed(0) or opened either into(1) or out(-1) of the interior. - Locked means that the heading is locked. - p6 is always 0. - 225 door types, model names and coords found in stripclub.c4: - pastebin.com/gywnbzsH - get door info: pastebin.com/i14rbekD - - - - - Example: - AUDIO::SET_STATIC_EMITTER_ENABLED((Any*)"LOS_SANTOS_VANILLA_UNICORN_01_STAGE", false); AUDIO::SET_STATIC_EMITTER_ENABLED((Any*)"LOS_SANTOS_VANILLA_UNICORN_02_MAIN_ROOM", false); AUDIO::SET_STATIC_EMITTER_ENABLED((Any*)"LOS_SANTOS_VANILLA_UNICORN_03_BACK_ROOM", false); - This turns off surrounding sounds not connected directly to peds. - - - - - Access to the store for shark cards etc... - - - - - Swim speed multiplier. - Multiplier goes up to 1.49 - Just call it one time, it is not required to be called once every tick. - Note copied from below native. - Note: At least the IDA method if you change the max float multiplier from 1.5 it will change it for both this and RUN_SPRINT below. I say 1.5 as the function blrs if what you input is greater than or equal to 1.5 hence why it's 1.49 max default. - - - - - This is not tested - it's just an assumption. - Doesn't seem to work. I'll try with an int instead. --JT - Read the scripts, im dumpass. - Doesn't work at all, wether with an bool neither an int - if (!VEHICLE::IS_TAXI_LIGHT_ON(l_115)) { - VEHICLE::SET_TAXI_LIGHTS(l_115, 1); - } - - - - - Sets the drop shadow for the current text style. - - - - - fonts that mess up your text where made for number values/misc stuff - - - - - Types - - 0: Center-Justify - 1: Left-Justify - 2: Right-Justify - Right-Justify requires SET_TEXT_WRAP, otherwise it will draw to the far right of the screen - - - - - from script am_mp_yacht.c int? - ui::set_text_leading(2); - - - - - Size range : 0f to 1.0f - - - - - It sets the text in a specified box and wraps the text if it exceeds the boundries. Both values are for X axis. Useful when positioning text set to center or aligned to the right. - start - left boundry on screen position (0.0 - 1.0) - end - right boundry on screen position (0.0 - 1.0) - - - - - Loads the specified timecycle modifier. Modifiers are defined separately in another file (e.g. "timecycle_mods_1.xml") - Parameters: - modifierName - The modifier to load (e.g. "V_FIB_IT3", "scanline_cam", etc.) - For a full list, see here: pastebin.com/kVPwMemE - - - - - Hash collision. Please change back to _0x_ - - - - - hash collision? - - - - - Maximum value is 1. - At a value of 0 the game will still run at a minimum time scale. - Slow Motion 1: 0.6 - Slow Motion 2: 0.4 - Slow Motion 3: 0.2 - - - - - For a full list, see here: pastebin.com/kVPwMemE - - - - - Might be more appropriate in AUDIO? - Rockstar made it like this. - Probably changes tvs from being a 3d audio to being "global" audio - - - - - Hash collision! Please change back to _0xEF4CED81CEBEDC6D - - - - - From the scripts, p0: - "ArmWrestlingIntensity", - "INOUT", - "Monkey_Stream", - "ZoomLevel" - - - - - Makes the vehicle accept no passengers. - - - - - This is an alias of SET_ENTITY_AS_NO_LONGER_NEEDED. - - - - - Please change to void. - - - - - Disables the vehicle from being repaired when a vehicle extra is enabled. - - - - - p2 often set to 1000.0 in the decompiled scripts. - - - - - SET_VEHICLE_BOOST_ACTIVE(vehicle, 1, 0); - SET_VEHICLE_BOOST_ACTIVE(vehicle, 0, 0); - Will give a boost-soundeffect. - - - - - On accelerating, spins the driven wheels with the others braked, so you don't go anywhere. - - - - - This has not yet been tested - it's just an assumption of what the types could be. - - - - - Previously named GET_VEHICLE_DEFORMATION_GET_TREE (hash collision) - from Decrypted Scripts I found - VEHICLE::SET_VEHICLE_CEILING_HEIGHT(l_BD9[2 -- [[2]] ], 420.0); - - - - - colorPrimary & colorSecondary are the paint index for the vehicle. - For a list of valid paint indexes, view: pastebin.com/pwHci0xK - ------------------------------------------------------------------------- - Use this to get the number of color indices: pastebin.com/RQEeqTSM - Note: minimum color index is 0, maximum color index is (numColorIndices - 1) - - - - - Sets the selected vehicle's colors to their default value (specific variant specified using the colorCombination parameter). - - Range of possible values for colorCombination is currently unknown, I couldn't find where these values are stored either (Disquse's guess was vehicles.meta but I haven't seen it in there.) - - - - - p1, p2, p3 are RGB values for color (255,0,0 for Red, ect) - - - - - p1, p2, p3 are RGB values for color (255,0,0 for Red, ect) - - - - - Apply damage to vehicle at a location. Location is relative to vehicle model (not world). - Radius of effect damage applied in a sphere at impact location - - - - - This fixes the deformation of a vehicle but the vehicle health doesn't improve - - - - - • Usage - → Use this native inside a looped function. - → Values: - → 0.0 = no vehicles on streets - → 1.0 = normal vehicles on streets - - - - - You can't use values greater than 15.0 - You can see why here: pastebin.com/Wbn34fGD - Also, R* does (float)(rand() % 15) to get a random dirt level when generating a vehicle. - - - - - 1 - 2 - CARLOCK_LOCKED (locked) - 3 - 4 - CARLOCK_LOCKED_PLAYER_INSIDE (can get in, can't leave) - (maybe, these are leftovers from GTA:VC) - 5 - 6 - 7 - (source: GTA VC miss2 leak, matching constants for 0/2/4, testing) - They use 10 in am_mp_property_int, don't know what it does atm. - - - - - After some analysis, I've decided that these are what the parameters are. - We can see this being used in R* scripts such as "am_mp_property_int.ysc.c4": - l_11A1 = PED::GET_VEHICLE_PED_IS_IN(PLAYER::PLAYER_PED_ID(), 1); - ... - VEHICLE::SET_VEHICLE_DOORS_LOCKED_FOR_ALL_PLAYERS(l_11A1, 1); - - - - - Closes all doors of a vehicle: - - - - - doorIndex: - 0 = Front Right Door - 1 = Front Left Door - 2 = Back Right Door - 3 = Back Left Door - 4 = Hood - 5 = Trunk - Changed last paramater from CreateDoorObject To NoDoorOnTheFloor because when on false, the door object is created,and not created when on true...the former parameter name was counter intuitive...(by Calderon) - - - - - doorIndex: - 0 = Front Left Door (driver door) - 1 = Front Right Door - 2 = Back Left Door - 3 = Back Right Door - 4 = Hood - 5 = Trunk - 6 = Trunk2 - p2: - mostly use 0 and 1, very rare using 3 and 5 - p3: - It seems it is an angle - Example in VB: - Public Shared Sub Set_Vehicle_Door_Angle(Vehicle As Vehicle, Door As VehicleDoor, Angle As Single) - Native.Function.Call(Hash.SET_VEHICLE_DOOR_CONTROL, Vehicle.Handle, Door, 1, Angle) - End Sub - I'm Not MentaL - sfink: p2 is speed, 5 is fast, 1 is slow 3 is medium - - - - - When lock is false other entities can overwrite it. - - - - - doorIndex: - 0 = Front Left Door - 1 = Front Right Door - 2 = Back Left Door - 3 = Back Right Door - 4 = Hood - 5 = Trunk - 6 = Back - 7 = Back2 - - - - - doorIndex: - 0 = Front Left Door - 1 = Front Right Door - 2 = Back Left Door - 3 = Back Right Door - 4 = Hood - 5 = Trunk - 6 = Trunk2 - - - - - Money pickups are created around cars when they explodes. Only works when the vehicle model is a car. A single pickup is between 1 and 18 dollars in size. All car models seems to give the same amount of money. - youtu.be/3arlUxzHl5Y - i.imgur.com/WrNpYFs.jpg - From the scripts: - VEHICLE::_068F64F2470F9656(l_36, 0); - Found a "correct" name for this :P - _dead_vehicle_pickups_dies_when_set_exploded_destroy_it_drops_on_money - SET_VEHICLE_D* or SET_VEHICLE_E* - - - - - 1000 is max health - Begins leaking gas at around 650 health - -999.90002441406 appears to be minimum health, although nothing special occurs <- false statement - ------------------------- - Minimum: -4000 - Maximum: 1000 - -4000: Engine is destroyed - 0 and below: Engine catches fire and health rapidly declines - 300: Engine is smoking and losing functionality - 1000: Engine is perfect - - - - - Starts or stops the engine on the specified vehicle. - vehicle: The vehicle to start or stop the engine on. - value: true to turn the vehicle on; false to turn it off. - instantly: if true, the vehicle will be set to the state immediately; otherwise, the current driver will physically turn on or off the engine. - -------------------------------------- - from what I've tested when I do this to a helicopter the propellers turn off after the engine has started. so is there any way to keep the heli propellers on? - -------------------------------------- - And what's with BOOL otherwise, what does it do??? - - - - - formerly known as _SET_VEHICLE_PAINT_FADE - The parameter fade is a value from 0-1, where 0 is fresh paint. - ------------------------------------------------------------------------------------ - The actual value isn't stored as a float but as an unsigned char (BYTE). More info here: pastebin.com/r0h6EM5s - -------------- - Separate Person: I didn't want to be rude and remove it, but whom ever posted that pastebin above please remove it as the paste says it has been removed. - - - - - Seems according to TU27 X360 Scripts, this has 3 arguments as well. - SET_VEHICLE_EXCLUSIVE_DRIVER(vehicle, 0, 0); in freemode.c - In case 5 of a switch case, is the only time it shows Arg2 being PLAYER_PED_ID(), otherwise it's 0. Arg3 always seems to be 0. - - - - - Sets a vehicle to be strongly resistant to explosions. p0 is the vehicle; set p1 to false to toggle the effect on/off. - - - - - Note: only some vehicle have extras - extra ids are from 1 - 9 depending on the vehicle - ------------------------------------------------- - ^ not sure if outdated or simply wrong. Max extra ID for b944 is 14 - ------------------------------------------------- - p2 is not a on/off toggle. mostly 0 means on and 1 means off. - not sure if it really should be a BOOL. - ------------------------------------------------- - Confirmed p2 does not work as a bool. Changed to int. [0=on, 1=off] - - - - - They use the same color indexs as SET_VEHICLE_COLOURS. - - - - - SCALE: Setting the speed to 30 would result in a speed of roughly 60mph, according to speedometer. - Speed is in meters per second - You can convert meters/s to mph here: - http://www.calculateme.com/Speed/MetersperSecond/ToMilesperHour.htm - - - - - Seems to be related to the metal parts, not tyres (like i was expecting lol) - Must be called every tick. - - - - - It switch to highbeam when p1 is set to true. - - - - - Sets a handling override for a specific vehicle. Certain handling flags can only be set globally using `SET_HANDLING_FIELD`, this might require some experimentation. - Example: `SetVehicleHandlingField(vehicle, 'CHandlingData', 'fSteeringLock', 360.0)` - - - - - Sets a handling override for a specific vehicle. Certain handling flags can only be set globally using `SET_HANDLING_FLOAT`, this might require some experimentation. - Example: `SetVehicleHandlingFloat(vehicle, 'CHandlingData', 'fSteeringLock', 360.0)` - - - - - Sets a handling override for a specific vehicle. Certain handling flags can only be set globally using `SET_HANDLING_INT`, this might require some experimentation. - - - - - Sets a handling override for a specific vehicle. Certain handling flags can only be set globally using `SET_HANDLING_VECTOR`, this might require some experimentation. - - - - - if true, axles won't bend. - - - - - Sets the turn signal enabled for a vehicle. - Set turnSignal to 1 for left light, 0 for right light. - - - - - Setting this to false, makes the specified vehicle to where if you press Y your character doesn't even attempt the animation to enter the vehicle. Hence it's not considered aka ignored. - - - - - Sets the wanted state of this vehicle. - - - - - set's if the vehicle has lights or not. - not an on off toggle. - p1 = 0 ;vehicle normal lights, off then lowbeams, then highbeams - p1 = 1 ;vehicle doesn't have lights, always off - p1 = 2 ;vehicle has always on lights - p1 = 3 ;or even larger like 4,5,... normal lights like =1 - note1: when using =2 on day it's lowbeam,highbeam - but at night it's lowbeam,lowbeam,highbeam - note2: when using =0 it's affected by day or night for highbeams don't exist in daytime. - - - - - multiplier = brightness of head lights. - this value isn't capped afaik. - multiplier = 0.0 no lights - multiplier = 1.0 default game value - - - - - Note: Only seems to work on Emergency Vehicles - - - - - In b944, there are 50 (0 - 49) mod types. - Sets the vehicle mod. - The vehicle must have a mod kit first. - Any out of range ModIndex is stock. - #Mod Type - Spoilers - Front Bumper - Rear Bumper - Side Skirt - Exhaust - Frame - Grille - Hood - Fender - Right Fender - Roof - Engine - Brakes - Transmission - Horns - 14 (modIndex from 0 to 51) - Suspension - Armor - Front Wheels - Back Wheels - 24 //only for motocycles - Plate holders - Trim Design - Ornaments - Dial Design - Steering Wheel - Shifter Leavers - Plaques - Hydraulics - Livery - ENUMS: pastebin.com/QzEAn02v - - - - - seems to make the vehicle stop spawning naturally in traffic. Here's an essential example: - VEHICLE::SET_VEHICLE_MODEL_IS_SUPPRESSED(GAMEPLAY::GET_HASH_KEY("taco"), true); - god I hate taco vans - Confirmed to work? Needs to be looped? Can not get it to work. - - - - - paintType: - 0: Normal - 1: Metallic - 2: Pearl - 3: Matte - 4: Metal - 5: Chrome - color: number of the color. - p3 seems to always be 0. - - - - - Changes the secondary paint type and color - paintType: - 0: Normal - 1: Metallic - 2: Pearl - 3: Matte - 4: Metal - 5: Chrome - color: number of the color - - - - - Set modKit to 0 if you plan to call SET_VEHICLE_MOD. That's what the game does. Most body modifications through SET_VEHICLE_MOD will not take effect until this is set to 0. - --------- - Setting the modKit to 0 also seems to load some livery related vehicle information. For example, using GET_LIVERY_NAME() will return NULL if you haven't set the modKit to 0 in advance. As soon as you set it to 0, GET_LIVERY_NAME() will work properly. - - - - - NOTE: Debugging functions are not present in the retail version of the game. - - - - - Sets a vehicle's license plate text. 8 chars maximum. - Example: - Ped playerPed = PLAYER::PLAYER_PED_ID(); - Vehicle veh = PED::GET_VEHICLE_PED_IS_USING(playerPed); - char *plateText = "KING"; - VEHICLE::SET_VEHICLE_NUMBER_PLATE_TEXT(veh, plateText); - - - - - Plates: - Blue/White - Yellow/black - Yellow/Blue - Blue/White2 - Blue/White3 - Yankton - - - - - Sets a vehicle on the ground on all wheels. Returns whether or not the operation was successful. - sfink: This has an additional param(Vehicle vehicle, float p1) which is always set to 5.0f in the b944 scripts. - - - - - Tested on the player's current vehicle. Unless you kill the driver, the vehicle doesn't loose control, however, if enabled, explodeOnImpact is still active. The moment you crash, boom. - - - - - 1000 is max health - Begins leaking gas at around 650 health - - - - - can't seem to enable radio on cop cars etc - - - - - Reduces grip significantly so it's hard to go anywhere. - - - - - Only works during nighttime. - And only if there is a driver in heli. - - - - - Commands the driver of an armed vehicle (p0) to shoot its weapon at a target (p1). p3, p4 and p5 are the coordinates of the target. Example: - WEAPON::SET_CURRENT_PED_VEHICLE_WEAPON(pilot,GAMEPLAY::GET_HASH_KEY("VEHICLE_WEAPON_PLANE_ROCKET"));VEHICLE::SET_VEHICLE_SHOOT_AT_TARGET(pilot, target, targPos.x, targPos.y, targPos.z); - - - - - Activate siren on vehicle (Only works if the vehicle has a siren). - - - - - Locks the vehicle's steering to the desired angle, explained below. - Requires to be called onTick. Steering is unlocked the moment the function stops being called on the vehicle. - Steer bias: - -1.0 = full right - 0.0 = centered steering - 1.0 = full left - - - - - If set to true, vehicle will not take crash damage, but is still susceptible to damage from bullets and explosives - - - - - VEHICLE::SET_VEHICLE_TIMED_EXPLOSION(v_3, PLAYER::GET_PLAYER_PED(v_5), 1); - - - - - Allows you to toggle bulletproof tires. - - - - - "To burst tyres VEHICLE::SET_VEHICLE_TYRE_BURST(vehicle, 0, true, 1000.0) - to burst all tyres type it 8 times where p1 = 0 to 7. - p3 seems to be how much damage it has taken. 0 doesn't deflate them, 1000 completely deflates them. - '0 = wheel_lf / bike, plane or jet front - '1 = wheel_rf - '2 = wheel_lm / in 6 wheels trailer, plane or jet is first one on left - '3 = wheel_rm / in 6 wheels trailer, plane or jet is first one on right - '4 = wheel_lr / bike rear / in 6 wheels trailer, plane or jet is last one on left - '5 = wheel_rr / in 6 wheels trailer, plane or jet is last one on right - '45 = 6 wheels trailer mid wheel left - '47 = 6 wheels trailer mid wheel right - - - - - tyreIndex = 0 to 4 on normal vehicles - '0 = wheel_lf / bike, plane or jet front - '1 = wheel_rf - '2 = wheel_lm / in 6 wheels trailer, plane or jet is first one on left - '3 = wheel_rm / in 6 wheels trailer, plane or jet is first one on right - '4 = wheel_lr / bike rear / in 6 wheels trailer, plane or jet is last one on left - '5 = wheel_rr / in 6 wheels trailer, plane or jet is last one on right - '45 = 6 wheels trailer mid wheel left - '47 = 6 wheels trailer mid wheel right - - - - - Sets the tire smoke's color of this vehicle. - vehicle: The vehicle that is the target of this method. - r: The red level in the RGB color code. - g: The green level in the RGB color code. - b: The blue level in the RGB color code. - Note: - setting r,g,b to 0 will give the car independance day tyre smoke - - - - - Player won't be able to drive the car or enter it, unless you task him to get into any other seat than the driver one. - - - - - Example script: <https://pastebin.com/J6XGbkCW> - - List of known states: - - ``` - 1: Not wheeling. - 65: Vehicle is ready to do wheelie (burnouting). - 129: Vehicle is doing wheelie. - ``` - - - - - 0: Sport - 1: Muscle - 2: Lowrider - 3: SUV - 4: Offroad - 5: Tuner - 6: Bike Wheels - 7: High End - - - - - Adjusts the offset of the specified wheel relative to the wheel's axle center. - Needs to be called every frame in order to function properly, as GTA will reset the offset otherwise. - This function can be especially useful to set the track width of a vehicle, for example: - - ``` - function SetVehicleFrontTrackWidth(vehicle, width) - SetVehicleWheelXOffset(vehicle, 0, -width/2) - SetVehicleWheelXOffset(vehicle, 1, width/2) - end - ``` - - - - - enum WindowTints - { - WINDOWTINT_NONE, - WINDOWTINT_PURE_BLACK, - WINDOWTINT_DARKSMOKE, - WINDOWTINT_LIGHTSMOKE, - WINDOWTINT_STOCK, - WINDOWTINT_LIMO, - WINDOWTINT_GREEN - }; - - - - - For a full list, see here: pastebin.com/Kj9t38KF - - - - - Max value is 1.0 - - - - - **instructionalKey enum list**: - - ``` - enum INSTRUCTIONAL_BUTTON_TYPES - { - NONE = 0, - SELECT = 1, - OK = 2, - YES = 4, - BACK = 8, - BACK_SELECT = 9, - BACK_OK = 10, - BACK_YES = 12, - CANCEL = 16, - CANCEL_SELECT = 17, - CANCEL_OK = 18, - CANCEL_YES = 20, - NO = 32, - NO_SELECT = 33, - NO_OK = 34, - YES_NO = 36, - RETRY = 64, - RETRY_SELECT = 65, - RETRY_OK = 66, - RETRY_YES = 68, - RETRY_BACK = 72, - RETRY_BACK_SELECT = 73, - RETRY_BACK_OK = 74, - RETRY_BACK_YES = 76, - RETRY_CANCEL = 80, - RETRY_CANCEL_SELECT = 81, - RETRY_CANCEL_OK = 82, - RETRY_CANCEL_YES = 84, - SKIP = 256, - SKIP_SELECT = 257, - SKIP_OK = 258, - SKIP_YES = 260, - SKIP_BACK = 264, - SKIP_BACK_SELECT = 265, - SKIP_BACK_OK = 266, - SKIP_BACK_YES = 268, - SKIP_CANCEL = 272, - SKIP_CANCEL_SELECT = 273, - SKIP_CANCEL_OK = 274, - SKIP_CANCEL_YES = 276, - CONTINUE = 16384, - BACK_CONTINUE = 16392, - CANCEL_CONTINUE = 16400, - LOADING_SPINNER = 134217728, - SELECT_LOADING_SPINNER = 134217729, - OK_LOADING_SPINNER = 134217730, - YES_LOADING_SPINNER = 134217732, - BACK_LOADING_SPINNER = 134217736, - BACK_SELECT_LOADING_SPINNER = 134217737, - BACK_OK_LOADING_SPINNER = 134217738, - BACK_YES_LOADING_SPINNER = 134217740, - CANCEL_LOADING_SPINNER = 134217744, - CANCEL_SELECT_LOADING_SPINNER = 134217745, - CANCEL_OK_LOADING_SPINNER = 134217746, - CANCEL_YES_LOADING_SPINNER = 134217748 - } - ``` - - Note: this list is definitely NOT complete, but these are the ones I've been able to find before giving up because it's such a boring thing to look for 'good' combinations. - - **Result of the example code:** - <https://i.imgur.com/imwoimm.png> - - - - - You can only use text entries. No custom text. - C# Example : - Function.Call(Hash._SET_WARNING_MESSAGE_2, "HUD_QUIT", "HUD_CGIGNORE", 2, "HUD_CGINVITE", 0, -1, 0, 0, 1); - you can recreate this easily with scaleforms - --------------- - Fixed native name, from before nativedb restoration. - - - - - This native removes the current waypoint from the map. - Example: - C#: - Function.Call(Hash.SET_WAYPOINT_OFF); - C++: - UI::SET_WAYPOINT_OFF(); - - - - - Changes the selected ped aiming animation style. - Note : You must use GET_HASH_KEY! - Strings to use with GET_HASH_KEY : - "Ballistic", - "Default", - "Fat", - "Female", - "FirstPerson", - "FirstPersonAiming", - "FirstPersonFranklin", - "FirstPersonFranklinAiming", - "FirstPersonFranklinRNG", - "FirstPersonFranklinScope", - "FirstPersonMPFemale", - "FirstPersonMichael", - "FirstPersonMichaelAiming", - "FirstPersonMichaelRNG", - "FirstPersonMichaelScope", - "FirstPersonRNG", - "FirstPersonScope", - "FirstPersonTrevor", - "FirstPersonTrevorAiming", - "FirstPersonTrevorRNG", - "FirstPersonTrevorScope", - "Franklin", - "Gang", - "Gang1H", - "GangFemale", - "Hillbilly", - "MP_F_Freemode", - "Michael", - "SuperFat", - "Trevor" - - - - - Hash collision, real name is: IS_FLASH_LIGHT_ON - - - - - The following weatherTypes are used in the scripts: - "CLEAR" - "EXTRASUNNY" - "CLOUDS" - "OVERCAST" - "RAIN" - "CLEARING" - "THUNDER" - "SMOG" - "FOGGY" - "XMAS" - "SNOWLIGHT" - "BLIZZARD" - - - - - The following weatherTypes are used in the scripts: - "CLEAR" - "EXTRASUNNY" - "CLOUDS" - "OVERCAST" - "RAIN" - "CLEARING" - "THUNDER" - "SMOG" - "FOGGY" - "XMAS" - "SNOWLIGHT" - "BLIZZARD" - - - - - The following weatherTypes are used in the scripts: - "CLEAR" - "EXTRASUNNY" - "CLOUDS" - "OVERCAST" - "RAIN" - "CLEARING" - "THUNDER" - "SMOG" - "FOGGY" - "XMAS" - "SNOWLIGHT" - "BLIZZARD" - - - - - Sets the the raw wind speed value. - - - - - This is NOT a heading. It's a FLOAT value from 0.0-7.0. Look at this image: - i.imgur.com/FwVpGS6.png - ---------------------------- - This appears to be a heading, in radians (0-2*pi) -PNWParksFan - - - - - Using this native will clamp the wind speed value to a range of 0.0- 12.0. Using SET_WIND sets the same value but without the restriction. - - - - - Possible shake types (updated b617d): - DEATH_FAIL_IN_EFFECT_SHAKE - DRUNK_SHAKE - FAMILY5_DRUG_TRIP_SHAKE - HAND_SHAKE - JOLT_SHAKE - LARGE_EXPLOSION_SHAKE - MEDIUM_EXPLOSION_SHAKE - SMALL_EXPLOSION_SHAKE - ROAD_VIBRATION_SHAKE - SKY_DIVING_SHAKE - VIBRATE_SHAKE - - - - - p0 argument found in the b617d scripts: "DRUNK_SHAKE" - - - - - Possible shake types (updated b617d): - DEATH_FAIL_IN_EFFECT_SHAKE - DRUNK_SHAKE - FAMILY5_DRUG_TRIP_SHAKE - HAND_SHAKE - JOLT_SHAKE - LARGE_EXPLOSION_SHAKE - MEDIUM_EXPLOSION_SHAKE - SMALL_EXPLOSION_SHAKE - ROAD_VIBRATION_SHAKE - SKY_DIVING_SHAKE - VIBRATE_SHAKE - - - - - this is what p7 does in disassembly - __int8 var = 32; - if (isInvisible) - { - var = 16; - } - int v110 = var | 2 * p7; - - - - - Returns true if the game is using the metric measurement system, false if imperial is used. - This is what r\* uses for the different label types (either ones with miles in them or with km, as well as some other measurement related labels). - - - - - Enables or disables the blue half circle ![](https://i.imgur.com/iZes9Ec.png) around the specified blip on the left side of the blip. This is used to indicate that the player is in your crew in GTA:O. Color is changeable by using [`SET_BLIP_SECONDARY_COLOUR`](#_0x14892474891E09EB). - - To toggle the right side of the circle use: [`SHOW_FRIEND_INDICATOR_ON_BLIP`](#_0x23C3EB807312F01A). - - Example code result: - ![](https://i.imgur.com/iZ9tNWl.png) - - - - - Highlights a blip by a half cyan circle on the right side of the blip. ![](https://i.imgur.com/FrV9M4e.png) Indicating that that player is a friend (in GTA:O). This color can not be changed. - - To toggle the left side (crew member indicator) of the half circle around the blip, use: [`SHOW_CREW_INDICATOR_ON_BLIP`](#_0xDCFB5D4DB8BF367E). - - - - - Adds the GTA: Online player heading indicator to a blip. - - - - - Toggles a cyan outline around the blip. - - Color can be changed with `SET_BLIP_SECONDARY_COLOUR`. Enabling this circle will override the "crew" and "friend" half-circles (see [`SHOW_CREW_INDICATOR_ON_BLIP`](#_0xDCFB5D4DB8BF367E) and [`SHOW_FRIEND_INDICATOR_ON_BLIP`](#_0x23C3EB807312F01A)). - - ~~Oddly enough, this native is called `_SET_BLIP_FRIENDLY`, but the color of the circle is only changable for the 'crew' half-circle (using `SET_BLIP_SECONDARY_COLOUR`), the 'friendly' side can NOT be changed and will always stay cyan/blue. This makes it seem more likely that this should be called `_SET_BLIP_CREW_CIRCLE` or something similar?~~ - - Real name is `SHOW_OUTLINE_INDICATOR_ON_BLIP`, discovered by Blattersturm. - - - - - Adds a green checkmark on top of a blip. - - - - - Starts a new singleplayer game (at the prologue). - - - - - Shuts down the `loadingScreen` NUI frame, similarly to `SHUTDOWN_LOADING_SCREEN`. - - - - - This is to make the player walk without accepting input from INPUT. - gaitType is in increments of 100s. 2000, 500, 300, 200, etc. - p4 is always 1 and p5 is always 0. - C# Example : - Function.Call(Hash.SIMULATE_PLAYER_INPUT_GAIT, Game.Player, 1.0f, 100, 1.0f, 1, 0); //Player will go forward for 100ms - - - - - Returns true if the object has finished moving. - If false, moves the object towards the specified X, Y and Z coordinates with the specified X, Y and Z speed. - See also: gtag.gtagaming.com/opcode-database/opcode/034E/ - - - - - p1 appears as 5, 10, 15, 25, or 30. p2 is always true. - - - - - p1 appears to always be 1 (only comes up twice) - - - - - 2 matches. p1 was always true. - - - - - Only 1 match. Both p1 & p2 were true. - - - - - normalizedValue is from 0.0 - 1.0 - p2 is always 1 - - - - - Every occurrence of p1 & p2 were both true. - - - - - p1 was always true. - - - - - Also known as _RECHARGE_SPECIAL_ABILITY - - - - - Hash collision!!! PLAY_STREAM_FROM_POSITION is the correct name! - - - - - Example: - This will start the alarm at Fort Zancudo. - AUDIO::START_ALARM("PORT_OF_LS_HEIST_FORT_ZANCUDO_ALARMS", 1); - First parameter (char) is the name of the alarm. - Second parameter (bool) is unknown, it does not seem to make a difference if this one is 0 or 1. - ---------- - It DOES make a difference but it has to do with the duration or something I dunno yet - ---------- - Found in the b617d scripts: - AUDIO::START_ALARM("AGENCY_HEIST_FIB_TOWER_ALARMS", 0); - AUDIO::START_ALARM("AGENCY_HEIST_FIB_TOWER_ALARMS_UPPER", 1); - AUDIO::START_ALARM("AGENCY_HEIST_FIB_TOWER_ALARMS_UPPER_B", 0); - AUDIO::START_ALARM("BIG_SCORE_HEIST_VAULT_ALARMS", a_0); - AUDIO::START_ALARM("FBI_01_MORGUE_ALARMS", 1); - AUDIO::START_ALARM("FIB_05_BIOTECH_LAB_ALARMS", 0); - AUDIO::START_ALARM("JEWEL_STORE_HEIST_ALARMS", 0); - AUDIO::START_ALARM("PALETO_BAY_SCORE_ALARM", 1); - AUDIO::START_ALARM("PALETO_BAY_SCORE_CHICKEN_FACTORY_ALARM", 0); - AUDIO::START_ALARM("PORT_OF_LS_HEIST_FORT_ZANCUDO_ALARMS", 1); - AUDIO::START_ALARM("PORT_OF_LS_HEIST_SHIP_ALARMS", 0); - AUDIO::START_ALARM("PRISON_ALARMS", 0); - AUDIO::START_ALARM("PROLOGUE_VAULT_ALARMS", 0); - - - - - Used to prepare a scene where the surrounding sound is muted or a bit changed. This does not play any sound. - List of all usable scene names found in b617d. Sorted alphabetically and identical names removed: pastebin.com/MtM9N9CC - - - - - some kind of flag. Usually 0. - - - - - p3: some kind of flag. Usually 0. - - - - - Examples: - g_384A = SYSTEM::START_NEW_SCRIPT("cellphone_flashhand", 1424); - l_10D = SYSTEM::START_NEW_SCRIPT("taxiService", 1828); - SYSTEM::START_NEW_SCRIPT("AM_MP_YACHT", 5000); - SYSTEM::START_NEW_SCRIPT("emergencycall", 512); - SYSTEM::START_NEW_SCRIPT("emergencycall", 512); - SYSTEM::START_NEW_SCRIPT("FM_maintain_cloud_header_data", 1424); - SYSTEM::START_NEW_SCRIPT("FM_Mission_Controller", 31000); - SYSTEM::START_NEW_SCRIPT("tennis_family", 3650); - SYSTEM::START_NEW_SCRIPT("Celebrations", 3650); - Decompiled examples of usage when starting a script: - SCRIPT::REQUEST_SCRIPT(a_0); - if (SCRIPT::HAS_SCRIPT_LOADED(a_0)) { - SYSTEM::START_NEW_SCRIPT(a_0, v_3); - SCRIPT::SET_SCRIPT_AS_NO_LONGER_NEEDED(a_0); - return 1; - } - or: - v_2 = "MrsPhilips2"; - SCRIPT::REQUEST_SCRIPT(v_2); - while (!SCRIPT::HAS_SCRIPT_LOADED(v_2)) { - SCRIPT::REQUEST_SCRIPT(v_2); - SYSTEM::WAIT(0); - } - sub_8792(36); - SYSTEM::START_NEW_SCRIPT(v_2, 17000); - SCRIPT::SET_SCRIPT_AS_NO_LONGER_NEEDED(v_2); - All native script names: pastebin.com/K9adDsu4 and pastebin.com/yLNWicUi - - - - - return : script thread id, 0 if failed - Pass pointer to struct of args in p1, size of struct goes into p2 - - - - - GRAPHICS::START_PARTICLE_FX_LOOPED_AT_COORD("scr_fbi_falling_debris", 93.7743f, -749.4572f, 70.86904f, 0f, 0f, 0f, 0x3F800000, 0, 0, 0, 0) - p11 seems to be always 0 - - - - - list: pastebin.com/N9unUFWY - - - - - GRAPHICS::START_PARTICLE_FX_NON_LOOPED_AT_COORD("scr_paleto_roof_impact", -140.8576f, 6420.789f, 41.1391f, 0f, 0f, 267.3957f, 0x3F800000, 0, 0, 0); - Axis - Invert Axis Flags - list: pastebin.com/N9unUFWY - ------------------------------------------------------------------- - C# - Function.Call<int>(Hash.START_PARTICLE_FX_NON_LOOPED_AT_COORD, = you are calling this function. - char *effectname = This is an in-game effect name, for e.g. "scr_fbi4_trucks_crash" is used to give the effects when truck crashes etc - float x, y, z pos = this one is Simple, you just have to declare, where do you want this effect to take place at, so declare the ordinates - float xrot, yrot, zrot = Again simple? just mention the value in case if you want the effect to rotate. - float scale = is declare the scale of the effect, this may vary as per the effects for e.g 1.0f - bool xaxis, yaxis, zaxis = To bool the axis values. - example: - Function.Call<int>(Hash.START_PARTICLE_FX_NON_LOOPED_AT_COORD, "scr_fbi4_trucks_crash", GTA.Game.Player.Character.Position.X, GTA.Game.Player.Character.Position.Y, GTA.Game.Player.Character.Position.Z + 4f, 0, 0, 0, 5.5f, 0, 0, 0); - - - - - Starts a particle effect on an entity for example your player. - List: pastebin.com/N9unUFWY - Example: - C#: - Function.Call(Hash.REQUEST_NAMED_PTFX_ASSET, "scr_rcbarry2"); Function.Call(Hash._SET_PTFX_ASSET_NEXT_CALL, "scr_rcbarry2"); Function.Call(Hash.START_PARTICLE_FX_NON_LOOPED_ON_ENTITY, "scr_clown_appears", Game.Player.Character, 0.0, 0.0, -0.5, 0.0, 0.0, 0.0, 1.0, false, false, false); - Internally this calls the same function as GRAPHICS::START_PARTICLE_FX_NON_LOOPED_ON_PED_BONE - however it uses -1 for the specified bone index, so it should be possible to start a non looped fx on an entity bone using that native - - - - - GRAPHICS::START_PARTICLE_FX_NON_LOOPED_ON_PED_BONE("scr_sh_bong_smoke", PLAYER::PLAYER_PED_ID(), -0.025f, 0.13f, 0f, 0f, 0f, 0f, 31086, 0x3F800000, 0, 0, 0); - Axis - Invert Axis Flags - list: pastebin.com/N9unUFWY - - - - - // this enum comes directly from R* so don't edit this - enum ePlayerSwitchType - { - SWITCH_TYPE_AUTO, - SWITCH_TYPE_LONG, - SWITCH_TYPE_MEDIUM, - SWITCH_TYPE_SHORT - }; - Use GET_IDEAL_PLAYER_SWITCH_TYPE for the best switch type. Or just auto, because it calls the same function in executable. - ---------------------------------------------------- - Examples from the decompiled scripts: - STREAMING::START_PLAYER_SWITCH(l_832._f3, PLAYER::PLAYER_PED_ID(), 0, 3); - STREAMING::START_PLAYER_SWITCH(l_832._f3, PLAYER::PLAYER_PED_ID(), 2050, 3); - STREAMING::START_PLAYER_SWITCH(PLAYER::PLAYER_PED_ID(), l_832._f3, 1024, 3); - STREAMING::START_PLAYER_SWITCH(g_141F27, PLAYER::PLAYER_PED_ID(), 513, v_14); - Note: DO NOT, use SWITCH_TYPE_LONG with flag 513. It leaves you stuck in the clouds. You'll have to call STOP_PLAYER_SWITCH() to return to your ped. - Flag 8 w/ SWITCH_TYPE_LONG will zoom out 3 steps, then zoom in 2/3 steps and stop on the 3rd and just hang there. - Flag 8 w/ SWITCH_TYPE_MEDIUM will zoom out 1 step, and just hang there. - - - - - Starts a fire: - xyz: Location of fire - maxChildren: The max amount of times a fire can spread to other objects. Must be 25 or less, or the function will do nothing. - isGasFire: Whether or not the fire is powered by gasoline. - - - - - Raycast from point to point, where the ray has a radius. - flags: - vehicles=10 - peds =12 - Iterating through flags yields many ped / vehicle/ object combinations - p9 = 7, but no idea what it does - Entity is an entity to ignore - - - - - Returns a ray (?) going from x1, y1, z1 to x2, y2, z2. - entity = 0 most of the time. - p8 = 7 most of the time. - Result of this function is passed to WORLDPROBE::_GET_RAYCAST_RESULT as a first argument. - - - - - Sounds the horn for the specified vehicle. - vehicle: The vehicle to activate the horn for. - mode: The hash of "NORMAL" or "HELDDOWN". Can be 0. - duration: The duration to sound the horn, in milliseconds. - Note: If a player is in the vehicle, it will only sound briefly. - - - - - Please change to "void"! - --------------------------------- - Example: - for (v_2 = 0; v_2 <= 4; v_2 += 1) { - STATS::STAT_CLEAR_SLOT_FOR_RELOAD(v_2); - } - - - - - p2 - Default value? Seems to be -1 most of the time. - - - - - p2 appears to always be -1 - - - - - p1 is always -1 in the script files - - - - - Needs more research. Seems to return "STAT_UNKNOWN" if no such user id exists. - - - - - p1 always true. - - - - - 'value' is a structure to a structure, 'numFields' is how many fields there are in said structure (usually 7). - The structure looks like this: - int year - int month - int day - int hour - int minute - int second - int millisecond - The decompiled scripts use TIME::GET_POSIX_TIME to fill this structure. - - - - - The following values have been found in the decompiled scripts: - "RC_ABI1" - "RC_ABI2" - "RC_BA1" - "RC_BA2" - "RC_BA3" - "RC_BA3A" - "RC_BA3C" - "RC_BA4" - "RC_DRE1" - "RC_EPS1" - "RC_EPS2" - "RC_EPS3" - "RC_EPS4" - "RC_EPS5" - "RC_EPS6" - "RC_EPS7" - "RC_EPS8" - "RC_EXT1" - "RC_EXT2" - "RC_EXT3" - "RC_EXT4" - "RC_FAN1" - "RC_FAN2" - "RC_FAN3" - "RC_HAO1" - "RC_HUN1" - "RC_HUN2" - "RC_JOS1" - "RC_JOS2" - "RC_JOS3" - "RC_JOS4" - "RC_MAU1" - "RC_MIN1" - "RC_MIN2" - "RC_MIN3" - "RC_MRS1" - "RC_MRS2" - "RC_NI1" - "RC_NI1A" - "RC_NI1B" - "RC_NI1C" - "RC_NI1D" - "RC_NI2" - "RC_NI3" - "RC_OME1" - "RC_OME2" - "RC_PA1" - "RC_PA2" - "RC_PA3" - "RC_PA3A" - "RC_PA3B" - "RC_PA4" - "RC_RAM1" - "RC_RAM2" - "RC_RAM3" - "RC_RAM4" - "RC_RAM5" - "RC_SAS1" - "RC_TON1" - "RC_TON2" - "RC_TON3" - "RC_TON4" - "RC_TON5" - - - - - Add Cash example: - for (int i = 0; i < 3; i++) - { - char statNameFull[32]; - sprintf_s(statNameFull, "SP%d_TOTAL_CASH", i); - Hash hash = GAMEPLAY::GET_HASH_KEY(statNameFull); - int val; - STATS::STAT_GET_INT(hash, &val, -1); - val += 1000000; - STATS::STAT_SET_INT(hash, val, 1); - } - - - - - Hash collision!!! - SET_VEHICLE_IS_* - p1 (toggle) was always 1 (true) except in one case in the b678 scripts. - - - - - Example: - This will stop the alarm at Fort Zancudo. - AUDIO::STOP_ALARM("PORT_OF_LS_HEIST_FORT_ZANCUDO_ALARMS", 1); - First parameter (char) is the name of the alarm. - Second parameter (bool) has to be true (1) to have any effect. - - - - - From re_drunkdriver: - • AI::STOP_ANIM_PLAYBACK(l_5B[0 -- [[1]] ], 0, 0); - Looks like p1 may be a flag, still need to do some research, though. - - - - - Animations list : www.los-santos-multiplayer.com/dev.airdancer?cxt=anim - - - - - ?? - - - - - Needs to be called every frame. - - - - - Animations list : www.los-santos-multiplayer.com/dev.airdancer?cxt=anim - RAGEPluginHook list: docs.ragepluginhook.net/html/62951c37-a440-478c-b389-c471230ddfc5.htm - - - - - This doesn't stop fire nor the fire propagation in a loop... for some reasons. - - - - - p1 is always 0 in the native scripts - - - - - Disables the player's teleportation - - - - - In drunk_controller.c4, sub_309 - if (CAM::_C912AF078AF19212()) { - CAM::_1C9D7949FA533490(0); - } - - - - - p1 sync task id? - - - - - Returns false if it's a null or empty string or if the string is too long. outInteger will be set to -999 in that case. - If all checks have passed successfully, the return value will be set to whatever strtol(string, 0i64, 10); returns. - - - - - Returns tangent value of p0. - - - - - Makes the specified ped achieve the specified heading. - pedHandle: The handle of the ped to assign the task to. - heading: The desired heading. - timeout: The time, in milliseconds, to allow the task to complete. If the task times out, it is cancelled, and the ped will stay at the heading it managed to reach in the time. - - - - - - - - - - duration: the amount of time in milliseconds to do the task. -1 will keep the task going until either another task is applied, or CLEAR_ALL_TASKS() is called with the ped - - - - - Example from "me_amanda1.ysc.c4": - AI::TASK_ARREST_PED(l_19F -- [[ This is a Ped ]] , PLAYER::PLAYER_PED_ID()); - Example from "armenian1.ysc.c4": - if (!PED::IS_PED_INJURED(l_B18[0 -- [[1]] ])) { - AI::TASK_ARREST_PED(l_B18[0 -- [[1]] ], PLAYER::PLAYER_PED_ID()); - } - I would love to have time to experiment to see if a player Ped can arrest another Ped. Might make for a good cop mod. - Looks like only the player can be arrested this way. Peds react and try to arrest you if you task them, but the player charater doesn't do anything if tasked to arrest another ped. - - - - - You need to call PED::SET_BLOCKING_OF_NON_TEMPORARY_EVENTS after TASK_BOAT_MISSION in order for the task to execute. - Working example - float vehicleMaxSpeed = VEHICLE::_GET_VEHICLE_MAX_SPEED(ENTITY::GET_ENTITY_MODEL(pedVehicle)); - AI::TASK_BOAT_MISSION(pedDriver, pedVehicle, 0, 0, waypointCoord.x, waypointCoord.y, waypointCoord.z, 4, vehicleMaxSpeed, 786469, -1.0, 7); - PED::SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedDriver, 1); - P8 appears to be driving style flag - see gtaforums.com/topic/822314-guide-driving-styles/ for documentation - - - - - p2 tend to be 16, 17 or 1 - p3 to p7 tend to be 0.0 - - - - - Not clear what it actually does, but here's how script uses it - - if (OBJECT::HAS_PICKUP_BEEN_COLLECTED(...) - { - if(ENTITY::DOES_ENTITY_EXIST(PLAYER::PLAYER_PED_ID())) - { - AI::TASK_CLEAR_LOOK_AT(PLAYER::PLAYER_PED_ID()); - } - ... - } - Another one where it doesn't "look" at current player - - AI::TASK_PLAY_ANIM(l_3ED, "missheist_agency2aig_2", "look_at_phone_a", 1000.0, -2.0, -1, 48, v_2, 0, 0, 0); - PED::_2208438012482A1A(l_3ED, 0, 0); - AI::TASK_CLEAR_LOOK_AT(l_3ED); - - - - - Climbs or vaults the nearest thing. - - - - - Despite its name, it only attacks ONE hated target. The one closest hated target. - p2 seems to be always 0 - - - - - Despite its name, it only attacks ONE hated target. The one closest to the specified position. - - - - - Makes the specified ped attack the target ped. - p2 should be 0 - p3 should be 16 - - - - - Example: - AI::TASK_DRIVE_BY(l_467[1 -- [[22]] ], PLAYER::PLAYER_PED_ID(), 0, 0.0, 0.0, 2.0, 300.0, 100, 0, ${firing_pattern_burst_fire_driveby}); - Needs working example. Doesn't seem to do anything. - I marked p2 as targetVehicle as all these shooting related tasks seem to have that in common. - I marked p6 as distanceToShoot as if you think of GTA's Logic with the native SET_VEHICLE_SHOOT natives, it won't shoot till it gets within a certain distance of the target. - I marked p7 as pedAccuracy as it seems it's mostly 100 (Completely Accurate), 75, 90, etc. Although this could be the ammo count within the gun, but I highly doubt it. I will change this comment once I find out if it's ammo count or not. - - - - - speed 1.0 = walk, 2.0 = run - p5 1 = normal, 3 = teleport to vehicle, 16 = teleport directly into vehicle - p6 is always 0 - Usage of seat - -1 = driver - 0 = passenger - 1 = left back seat - 2 = right back seat - 3 = outside left - 4 = outside right - - - - - MulleKD19: Adds a new point to the current point route. Call TASK_FLUSH_ROUTE before the first call to this. Call TASK_FOLLOW_POINT_ROUTE to make the Ped go the route. - A maximum of 8 points can be added. - - - - - MulleKD19: Clears the current point route. Call this before TASK_EXTEND_ROUTE and TASK_FOLLOW_POINT_ROUTE. - - - - - If no timeout, set timeout to -1. - - - - - MulleKD19: Makes the ped go on the created point route. - ped: The ped to give the task to. - speed: The speed to move at in m/s. - int: Unknown. Can be 0, 1, 2 or 3. - Example: - TASK_FLUSH_ROUTE(); - TASK_EXTEND_ROUTE(0f, 0f, 70f); - TASK_EXTEND_ROUTE(10f, 0f, 70f); - TASK_EXTEND_ROUTE(10f, 10f, 70f); - TASK_FOLLOW_POINT_ROUTE(GET_PLAYER_PED(), 1f, 0); - - - - - p6 always -1 - p7 always 10.0 - p8 always 1 - - - - - p2 always false - [30/03/2017] ins1de : - See dev-c.com/nativedb/func/info/f28965d04f570dca - - - - - eg - AI::TASK_GOTO_ENTITY_AIMING(v_2, PLAYER::PLAYER_PED_ID(), 5.0, 25.0); - ped = Ped you want to perform this task. - target = the Entity they should aim at. - distanceToStopAt = distance from the target, where the ped should stop to aim. - StartAimingDist = distance where the ped should start to aim. - - - - - The ped will walk or run towards goToLocation, aiming towards goToLocation or focusLocation (depending on the aimingFlag) and shooting if shootAtEnemies = true to any enemy in his path. - If the ped is closer than noRoadsDistance, the ped will ignore pathing/navmesh and go towards goToLocation directly. This could cause the ped to get stuck behind tall walls if the goToLocation is on the other side. To avoid this, use 0.0f and the ped will always use pathing/navmesh to reach his destination. - If the speed is set to 0.0f, the ped will just stand there while aiming, if set to 1.0f he will walk while aiming, 2.0f will run while aiming. - The ped will stop aiming when he is closer than distanceToStopAt to goToLocation. - I still can't figure out what unkTrue is used for. I don't notice any difference if I set it to false but in the decompiled scripts is always true. - I think that unkFlag, like the driving styles, could be a flag that "work as a list of 32 bits converted to a decimal integer. Each bit acts as a flag, and enables or disables a function". What leads me to this conclusion is the fact that in the decompiled scripts, unkFlag takes values like: 0, 1, 5 (101 in binary) and 4097 (4096 + 1 or 1000000000001 in binary). For now, I don't know what behavior enable or disable this possible flag so I leave it at 0. - Note: After some testing, using unkFlag = 16 (0x10) enables the use of sidewalks while moving towards goToLocation. - The aimingFlag takes 2 values: 0 to aim at the focusLocation, 1 to aim at where the ped is heading (goToLocation). - Example: - enum AimFlag - { - AimAtFocusLocation, - AimAtGoToLocation - }; - Vector3 goToLocation1 = { 996.2867f, 0, -2143.044f, 0, 28.4763f, 0 }; // remember the padding. - Vector3 goToLocation2 = { 990.2867f, 0, -2140.044f, 0, 28.4763f, 0 }; // remember the padding. - Vector3 focusLocation = { 994.3478f, 0, -2136.118f, 0, 29.2463f, 0 }; // the coord z should be a little higher, around +1.0f to avoid aiming at the ground - // 1st example - AI::TASK_GO_TO_COORD_AND_AIM_AT_HATED_ENTITIES_NEAR_COORD(pedHandle, goToLocation1.x, goToLocation1.y, goToLocation1.z, focusLocation.x, focusLocation.y, focusLocation.z, 2.0f -- [[run]] , true -- [[shoot]] , 3.0f -- [[stop at]] , 0.0f -- [[noRoadsDistance]] , true -- [[always true]] , 0 -- [[possible flag]] , AimFlag::AimAtGoToLocation, -957453492 -- [[FullAuto pattern]] ); - // 2nd example - AI::TASK_GO_TO_COORD_AND_AIM_AT_HATED_ENTITIES_NEAR_COORD(pedHandle, goToLocation2.x, goToLocation2.y, goToLocation2.z, focusLocation.x, focusLocation.y, focusLocation.z, 1.0f -- [[walk]] , false -- [[don't shoot]] , 3.0f -- [[stop at]] , 0.0f -- [[noRoadsDistance]] , true -- [[always true]] , 0 -- [[possible flag]] , AimFlag::AimAtFocusLocation, -957453492 -- [[FullAuto pattern]] ); - 1st example: The ped (pedhandle) will run towards goToLocation1. While running and aiming towards goToLocation1, the ped will shoot on sight to any enemy in his path, using "FullAuto" firing pattern. The ped will stop once he is closer than distanceToStopAt to goToLocation1. - 2nd example: The ped will walk towards goToLocation2. This time, while walking towards goToLocation2 and aiming at focusLocation, the ped will point his weapon on sight to any enemy in his path without shooting. The ped will stop once he is closer than distanceToStopAt to goToLocation2. - - - - - example from fm_mission_controller - AI::TASK_GO_TO_COORD_ANY_MEANS(l_649, sub_f7e86(-1, 0), 1.0, 0, 0, 786603, 0xbf800000); - - - - - movement_speed: mostly 2f, but also 1/1.2f, etc. - p8: always false - p9: 2f - p10: 0.5f - p11: true - p12: 0 / 512 / 513, etc. - p13: 0 - firing_pattern: ${firing_pattern_full_auto}, 0xC6EE6B4C - - - - - The entity will move towards the target until time is over (duration) or get in target's range (distance). p5 and p6 are unknown, but you could leave p5 = 1073741824 or 100 or even 0 (didn't see any difference but on the decompiled scripts, they use 1073741824 mostly) and p6 = 0 - Note: I've only tested it on entity -> ped and target -> vehicle. It could work differently on other entities, didn't try it yet. - Example: AI::TASK_GO_TO_ENTITY(pedHandle, vehicleHandle, 5000, 4.0, 100, 1073741824, 0) - Ped will run towards the vehicle for 5 seconds and stop when time is over or when he gets 4 meters(?) around the vehicle (with duration = -1, the task duration will be ignored). - - - - - shootatEntity: - If true, peds will shoot at Entity till it is dead. - If false, peds will just walk till they reach the entity and will cease shooting. - - - - - From re_prisonvanbreak: - AI::TASK_GUARD_CURRENT_POSITION(l_DD, 35.0, 35.0, 1); - - - - - p0 - Guessing PedID - p1, p2, p3 - XYZ? - p4 - ??? - p5 - Maybe the size of sphere from XYZ? - p6 - ??? - p7, p8, p9 - XYZ again? - p10 - Maybe the size of sphere from second XYZ? - - - - - In the scripts, p3 was always -1. - p3 seems to be duration or timeout of turn animation. - Also facingPed can be 0 or -1 so ped will just raise hands up. - - - - - Ped pilot should be in a heli. - EntityToFollow can be a vehicle or Ped. - x,y,z appear to be how close to the EntityToFollow the heli should be. Scripts use 0.0, 0.0, 80.0. Then the heli tries to position itself 80 units above the EntityToFollow. If you reduce it to -5.0, it tries to go below (if the EntityToFollow is a heli or plane) - NOTE: If the pilot finds enemies, it will engage them, then remain there idle, not continuing to chase the Entity given. - - - - - EDITED (8/16/2017) - DESCRIPTION: - Allow a ped to fly to a specific destination. - USAGE: - -- REQUIRED -- - • pilot = The ped flying the aircraft. - • aircraft = The aircraft the pilot is flying. - -- OPTIONAL -- [atleast 1 must be assigned] - • targetVehicle = The vehicle the pilot will target. - • targetPed = The ped the pilot will target. - • destinationX, destinationY, destinationZ = The location the pilot will target. - -- LOGIC -- - • missionFlag = The type of mission. - • maxSpeed = The speed in mph that the pilot will limit his/her self to while flying. - • landingRadius = The distance from the destination that the pilot must be to land. - • targetHeading = The heading that the pilot will try to achieve while flying. - • unk1, unk2 = Set to -1 and it will be okay. - • unk3 = I'm almost sure this is a vehicle record/waypoint recording hash. A value of -1 is for none. Maybe it's a float? Idk. - • landingFlags = Bit flags used for landing. All I know is: - 0 = Hover over the destination. - 32 = Land on destination. - 1024 = Erratic, crash into nearby obstacles. - 4096 = Rushed movement + Hover over destination - Known Mission Types: - 4 = FlyToCoord - 8 = FleeFromPed - 9 = CircleAroundTarget - 10 = CopyTargetHeading - 20 = LandNearPed - 21 = Crash - Example C#: - Function.Call(Hash.TASK_HELI_MISSION, driver, heli, 0, 0, position.X, position.Y, position.Z, 4, 50.0, 10.0, (position - heli.Position).ToHeading(), -1, -1, -1, 32); - OLD USAGE: pastebin.com/ndkSjaaW - - - - - Definition is wrong. This has 4 parameters (Not sure when they were added. v350 has 2, v678 has 4). - v350: Ped ped, bool unused - v678: Ped ped, bool unused, bool flag1, bool flag2 - flag1 = super jump, flag2 = do nothing if flag1 is false and doubles super jump height if flag1 is true. - - - - - Flags from decompiled scripts: - 0 = normal exit and closes door. - 1 = normal exit and closes door. - 16 = teleports outside, door kept closed. - 64 = normal exit and closes door, maybe a bit slower animation than 0. - 256 = normal exit but does not close the door. - 4160 = ped is throwing himself out, even when the vehicle is still. - 262144 = ped moves to passenger seat first, then exits normally - Others to be tried out: 320, 512, 131072. - - - - - p5 = 0, p6 = 2 - - - - - param3: duration in ms, use -1 to look forever - param4: using 2048 is fine - param5: using 3 is fine - - - - - This function has a third parameter as well (bool). - Second parameter is unused. - seconds parameter was for jetpack in the early stages of gta and the hard coded code is now removed - - - - - makes ped parachute to coords x y z. Works well with PATHFIND::GET_SAFE_COORD_FOR_PED - - - - - After looking at some scripts the second parameter seems to be an id of some kind. Here are some I found from some R* scripts: - "miss_Tower_01" (this went from 01 - 10) - "miss_Ass0" (0, 4, 6, 3) - "MISS_PATROL_8" - I think they're patrol routes, but I'm not sure. And I believe the 3rd parameter is a BOOL, but I can't confirm other than only seeing 0 and 1 being passed. - As far as I can see the patrol routes names such as "miss_Ass0" have been defined earlier in the scripts. This leads me to believe we can defined our own new patrol routes by following the same approach. - From the scripts - AI::OPEN_PATROL_ROUTE("miss_Ass0"); - AI::ADD_PATROL_ROUTE_NODE(0, "WORLD_HUMAN_GUARD_STAND", l_738[0 -- [[3]] ], -139.4076690673828, -993.4732055664062, 26.2754, GAMEPLAY::GET_RANDOM_INT_IN_RANGE(5000, 10000)); - AI::ADD_PATROL_ROUTE_NODE(1, "WORLD_HUMAN_GUARD_STAND", l_738[1 -- [[3]] ], -116.1391830444336, -987.4984130859375, 26.38541030883789, GAMEPLAY::GET_RANDOM_INT_IN_RANGE(5000, 10000)); - AI::ADD_PATROL_ROUTE_NODE(2, "WORLD_HUMAN_GUARD_STAND", l_738[2 -- [[3]] ], -128.46847534179688, -979.0340576171875, 26.2754, GAMEPLAY::GET_RANDOM_INT_IN_RANGE(5000, 10000)); - AI::ADD_PATROL_ROUTE_LINK(0, 1); - AI::ADD_PATROL_ROUTE_LINK(1, 2); - AI::ADD_PATROL_ROUTE_LINK(2, 0); - AI::CLOSE_PATROL_ROUTE(); - AI::CREATE_PATROL_ROUTE(); - - - - - Stand still (?) - - - - - Function.Call(Hash.TASK_PLANE_LAND, pilot, selectedAirplane, runwayStartPoint.X, runwayStartPoint.Y, runwayStartPoint.Z, runwayEndPoint.X, runwayEndPoint.Y, runwayEndPoint.Z); - - - - - EDITED (7/13/2017) - NOTE: If you want air combat, AI::TASK_COMBAT_PED (while your pilot is in an aircraft) also does the same thing as this native. - DESCRIPTION: - Ever wish your buddy could shoot down one of your enemies for you? Ever wanted an auto-pilot? Well look no further! This is the native for you! (Ped intelligence may vary) - USAGE: - -- REQUIRED -- - • pilot = The ped flying the aircraft. - • aircraft = The aircraft the pilot is flying - -- OPTIONAL -- [atleast 1 must be assigned] - • targetVehicle = The vehicle the pilot will target. - • targetPed = The ped the pilot will target. - • destinationX, destinationY, destinationZ = The location the pilot will target. - -- LOGIC -- - • missionFlag = The type of mission. pastebin.com/R8x73dbv - • angularDrag = The higher the value, the slower the plane will rotate. Value ranges from 0 - Infinity. - • unk = Set to 0, and you'll be fine. - • targetHeading = The target angle (from world space north) that the pilot will try to acheive before executing an attack/landing. - • maxZ = Maximum Z coordinate height for flying. - • minZ = Minimum Z coordinate height for flying. - Z: 2,700 is the default max height a pilot will be able to fly. Anything greater and he will fly downward until reaching 2,700 again. - Mission Types (incase you don't like links..): - 0 = None - 1 = Unk - 2 = CTaskVehicleRam - 3 = CTaskVehicleBlock - 4 = CTaskVehicleGoToPlane - 5 = CTaskVehicleStop - 6 = CTaskVehicleAttack - 7 = CTaskVehicleFollow - 8 = CTaskVehicleFleeAirborne - 9 = CTaskVehicleCircle - 10 = CTaskVehicleEscort - 15 = CTaskVehicleFollowRecording - 16 = CTaskVehiclePoliceBehaviour - 17 = CTaskVehicleCrash - Example C#: - Function.Call(Hash.TASK_PLANE_MISSION, pilot, vehicle, 0, Game.Player.Character, 0, 0, 0, 6, 0f, 0f, 0f, 2500.0f, -1500f); - Example C++ - AI::TASK_PLANE_MISSION(pilot, vehicle, 0, PLAYER::GET_PLAYER_PED(PLAYER::GET_PLAYER_INDEX()), 0, 0, 0, 6, 0.0, 0.0, 0.0, 2500.0, -1500.0); - [DEPRECATED] EXAMPLE USAGE: - pastebin.com/gx7Finsk - - - - - Animations list : www.los-santos-multiplayer.com/dev.airdancer?cxt=anim - float speed > normal speed is 8.0f - ---------------------- - float speedMultiplier > multiply the playback speed - ---------------------- - int duration: time in millisecond - ---------------------- - -1 _ _ _ _ _ _ _> Default (see flag) - 0 _ _ _ _ _ _ _ > Not play at all - Small value _ _ > Slow down animation speed - Other _ _ _ _ _ > freeze player control until specific time (ms) has - _ _ _ _ _ _ _ _ _ passed. (No effect if flag is set to be - _ _ _ _ _ _ _ _ _ controllable.) - int flag: - ---------------------- - enum eAnimationFlags - { - ANIM_FLAG_NORMAL = 0, - ANIM_FLAG_REPEAT = 1, - ANIM_FLAG_STOP_LAST_FRAME = 2, - ANIM_FLAG_UPPERBODY = 16, - ANIM_FLAG_ENABLE_PLAYER_CONTROL = 32, - ANIM_FLAG_CANCELABLE = 120, - }; - Odd number : loop infinitely - Even number : Freeze at last frame - Multiple of 4: Freeze at last frame but controllable - 01 to 15 > Full body - 10 to 31 > Upper body - 32 to 47 > Full body > Controllable - 48 to 63 > Upper body > Controllable - ... - 001 to 255 > Normal - 256 to 511 > Garbled - ... - playbackRate: - values are between 0.0 and 1.0 - lockX: - 0 in most cases 1 for rcmepsilonism8 and rcmpaparazzo_3 - > 1 for mini@sprunk - lockY: - 0 in most cases - 1 for missfam5_yoga, missfra1mcs_2_crew_react - lockZ: - 0 for single player - Can be 1 but only for MP - - - - - It's similar to the one above, except the first 6 floats let you specify the initial position and rotation of the task. (Ped gets teleported to the position). animTime is a float from 0.0 -> 1.0, lets you start an animation from given point. The rest as in AI::TASK_PLAY_ANIM. - Rotation information : rotX and rotY don't seem to have any effect, only rotZ works. - Animations list : www.los-santos-multiplayer.com/dev.airdancer?cxt=anim - - - - - Example from the scripts: - AI::TASK_PLAY_PHONE_GESTURE_ANIMATION(PLAYER::PLAYER_PED_ID(), v_3, v_2, v_4, 0.25, 0.25, 0, 0); - ========================================================= - ^^ No offense, but Idk how that would really help anyone. - As for the animDict & animation, they're both store in a global in all 5 scripts. So if anyone would be so kind as to read that global and comment what strings they use. Thanks. - Known boneMaskTypes' - "BONEMASK_HEADONLY" - "BONEMASK_HEAD_NECK_AND_ARMS" - "BONEMASK_HEAD_NECK_AND_L_ARM" - "BONEMASK_HEAD_NECK_AND_R_ARM" - p4 known args - 0.0f, 0.5f, 0.25f - p5 known args - 0.0f, 0.25f - p6 known args - 1 if a global if check is passed. - p7 known args - 1 if a global if check is passed. - The values found above, I found within the 5 scripts this is ever called in. (fmmc_launcher, fm_deathmatch_controller, fm_impromptu_dm_controller, fm_mission_controller, and freemode). - ========================================================= - - - - - from armenian3.c4 - AI::TASK_PUT_PED_DIRECTLY_INTO_MELEE(PlayerPed, armenianPed, 0.0, -1.0, 0.0, 0); - - - - - Only appears twice in the scripts. - AI::TASK_RAPPEL_FROM_HELI(PLAYER::PLAYER_PED_ID(), 0x41200000); - AI::TASK_RAPPEL_FROM_HELI(a_0, 0x41200000); - Fixed, definitely not a float and since it's such a big number obviously not a bool. All though note when I thought it was a bool and set it to 1 it seemed to work that same as int 0x41200000. - 0x41200000 = 10.0 as float. - Not all helicopters support rappelling. - - - - - The 2nd param (unused) is not implemented. - ----------------------------------------------------------------------- - The only occurrence I found in a R* script ("assassin_construction.ysc.c4"): - if (((v_3 < v_4) && (AI::GET_SCRIPT_TASK_STATUS(PLAYER::PLAYER_PED_ID(), 0x6a67a5cc) != 1)) && (v_5 > v_3)) { - AI::TASK_RELOAD_WEAPON(PLAYER::PLAYER_PED_ID(), 1); - } - - - - - From fm_mission_controller.c: - reserve_network_mission_objects(get_num_reserved_mission_objects(0) + 1); - vVar28 = {0.094f, 0.02f, -0.005f}; - vVar29 = {-92.24f, 63.64f, 150.24f}; - func_253(&uVar30, joaat("prop_ld_case_01"), Global_1592429.imm_34757[iParam1 <268>], 1, 1, 0, 1); - set_entity_lod_dist(net_to_ent(uVar30), 500); - attach_entity_to_entity(net_to_ent(uVar30), iParam0, get_ped_bone_index(iParam0, 28422), vVar28, vVar29, 1, 0, 0, 0, 2, 1); - Var31.imm_4 = 1065353216; - Var31.imm_5 = 1065353216; - Var31.imm_9 = 1065353216; - Var31.imm_10 = 1065353216; - Var31.imm_14 = 1065353216; - Var31.imm_15 = 1065353216; - Var31.imm_17 = 1040187392; - Var31.imm_18 = 1040187392; - Var31.imm_19 = -1; - Var32.imm_4 = 1065353216; - Var32.imm_5 = 1065353216; - Var32.imm_9 = 1065353216; - Var32.imm_10 = 1065353216; - Var32.imm_14 = 1065353216; - Var32.imm_15 = 1065353216; - Var32.imm_17 = 1040187392; - Var32.imm_18 = 1040187392; - Var32.imm_19 = -1; - Var31 = 1; - Var31.imm_1 = "weapons@misc@jerrycan@mp_male"; - Var31.imm_2 = "idle"; - Var31.imm_20 = 1048633; - Var31.imm_4 = 0.5f; - Var31.imm_16 = get_hash_key("BONEMASK_ARMONLY_R"); - task_scripted_animation(iParam0, &Var31, &Var32, &Var32, 0f, 0.25f); - set_model_as_no_longer_needed(joaat("prop_ld_case_01")); - remove_anim_dict("anim@heists@biolab@"); - - - - - from michael2: - AI::TASK_SEEK_COVER_TO_COORDS(ped, 967.5164794921875, -2121.603515625, 30.479299545288086, 978.94677734375, -2125.84130859375, 29.4752, -1, 1); - appears to be shorter variation - from michael3: - AI::TASK_SEEK_COVER_TO_COORDS(ped, -2231.011474609375, 263.6326599121094, 173.60195922851562, -1, 0); - - - - - I cant believe I have to define this, this is one of the best natives. - It makes the ped ignore basically all shocking events around it. Occasionally the ped may comment or gesture, but other than that they just continue their daily activities. This includes shooting and wounding the ped. And - most importantly - they do not flee. - Since it is a task, every time the native is called the ped will stop for a moment. - - - - - p1 is always GET_HASH_KEY("empty") in scripts, for the rare times this is used - - - - - //this part of the code is to determine at which entity the player is aiming, for example if you want to create a mod where you give orders to peds - Entity aimedentity; - Player player = PLAYER::PLAYER_ID(); - PLAYER::_GET_AIMED_ENTITY(player, &aimedentity); - //bg is an array of peds - AI::TASK_SHOOT_AT_ENTITY(bg[i], aimedentity, 5000, GAMEPLAY::GET_HASH_KEY("FIRING_PATTERN_FULL_AUTO")); - in practical usage, getting the entity the player is aiming at and then task the peds to shoot at the entity, at a button press event would be better. - - - - - Makes the specified ped shuffle to the next vehicle seat. - The ped MUST be in a vehicle and the vehicle parameter MUST be the ped's current vehicle. - - - - - Makes the specified ped flee the specified distance from the specified position. - - - - - Makes a ped run away from another ped (fleeTarget). - distance = ped will flee this distance. - fleeTime = ped will flee for this amount of time, set to "-1" to flee forever - - - - - scenarioName example: "WORLD_HUMAN_GUARD_STAND" - - - - - Makes the specified ped stand still for (time) milliseconds. - - - - - List of scenarioNames: pastebin.com/6mrYTdQv - Also a few more listed at AI::TASK_START_SCENARIO_IN_PLACE just above. - --------------- - The first parameter in every scenario has always been a Ped of some sort. The second like TASK_START_SCENARIO_IN_PLACE is the name of the scenario. - The next 4 parameters were harder to decipher. After viewing "hairdo_shop_mp.ysc.c4", and being confused from seeing the case in other scripts, they passed the first three of the arguments as one array from a function, and it looked like it was obviously x, y, and z. - I haven't seen the sixth parameter go to or over 360, making me believe that it is rotation, but I really can't confirm anything. - I have no idea what the last 3 parameters are, but I'll try to find out. - -going on the last 3 parameters, they appear to always be "0, 0, 1" - p6 -1 also used in scrips - p7 used for sitting scenarios - p8 teleports ped to position - - - - - Plays a scenario on a Ped at their current location. - unkDelay - Usually 0 or -1, doesn't seem to have any effect. Might be a delay between sequences. - playEnterAnim - Plays the "Enter" anim if true, otherwise plays the "Exit" anim. Scenarios that don't have any "Enter" anims won't play if this is set to true. - ---- - From "am_hold_up.ysc.c4" at line 339: - AI::TASK_START_SCENARIO_IN_PLACE(NETWORK::NET_TO_PED(l_8D._f4), sub_adf(), 0, 1); - I'm unsure of what the last two parameters are, however sub_adf() randomly returns 1 of 3 scenarios, those being: - WORLD_HUMAN_SMOKING - WORLD_HUMAN_HANG_OUT_STREET - WORLD_HUMAN_STAND_MOBILE - This makes sense, as these are what I commonly see when going by a liquor store. - ------------------------- - List of scenarioNames: pastebin.com/6mrYTdQv - (^ Thank you so fucking much for this) - Also these: - WORLD_FISH_FLEE - DRIVE - WORLD_HUMAN_HIKER - WORLD_VEHICLE_ATTRACTOR - WORLD_VEHICLE_BICYCLE_MOUNTAIN - WORLD_VEHICLE_BIKE_OFF_ROAD_RACE - WORLD_VEHICLE_BIKER - WORLD_VEHICLE_CONSTRUCTION_PASSENGERS - WORLD_VEHICLE_CONSTRUCTION_SOLO - WORLD_VEHICLE_DRIVE_PASSENGERS - WORLD_VEHICLE_DRIVE_SOLO - WORLD_VEHICLE_EMPTY - WORLD_VEHICLE_PARK_PARALLEL - WORLD_VEHICLE_PARK_PERPENDICULAR_NOSE_IN - WORLD_VEHICLE_POLICE_BIKE - WORLD_VEHICLE_POLICE_CAR - WORLD_VEHICLE_POLICE_NEXT_TO_CAR - WORLD_VEHICLE_SALTON_DIRT_BIKE - WORLD_VEHICLE_TRUCK_LOGS - - - - - Makes the ped run to take cover - - - - - Stealth kill action name hashes: - stealth kills can be found here: Grand Theft Auto V\common.rpf\data\action\stealth_kills.meta - ... - { - "ACT_stealth_kill_a", - "ACT_stealth_kill_weapon", - "ACT_stealth_kill_b", - "ACT_stealth_kill_c", - "ACT_stealth_kill_d", - "ACT_stealth_kill_a_gardener" - } - Only known script using this native: fbi4_prep2 - EXAMPLE: - ai::task_stealth_kill(iParam1, Local_252, gameplay::get_hash_key("AR_stealth_kill_a"), 1f, 0);ai::task_stealth_kill(iParam1, Local_252, gameplay::get_hash_key("AR_stealth_kill_knife"), 1f, 0); - Also it may be important to note, that each time this task is called, it's followed by AI::CLEAR_PED_TASKS on the target - - - - - This function is called on peds in vehicles. - anim: animation name - p2, p3, p4: "sweep_low", "sweep_med" or "sweep_high" - p5: no idea what it does but is usually -1 - - - - - AI::TASK_SYNCHRONIZED_SCENE(ped, scene, "creatures@rottweiler@in_vehicle@std_car", "get_in", 1000.0, -8.0, 4, 0, 0x447a0000, 0); - Animations List : www.ls-multiplayer.com/dev/index.php?section=3 - - - - - In every case of this native, I've only seen the first parameter passed as 0, although I believe it's a Ped after seeing tasks around it using 0. That's because it's used in a Sequence Task. - The last 3 parameters are definitely coordinates after seeing them passed in other scripts, and even being used straight from the player's coordinates. - --- - It seems that - in the decompiled scripts - this native was used on a ped who was in a vehicle to throw a projectile out the window at the player. This is something any ped will naturally do if they have a throwable and they are doing driveby-combat (although not very accurately). - It is possible, however, that this is how SWAT throws smoke grenades at the player when in cover. - ---------------------------------------------------- - The first comment is right it definately is the ped as if you look in script finale_heist2b.c line 59628 in Xbox Scripts atleast you will see task_throw_projectile and the first param is Local_559[2 <14>] if you look above it a little bit line 59622 give_weapon_to_ped uses the same exact param Local_559[2 <14>] and we all know the first param of that native is ped. So it guaranteed has to be ped. 0 just may mean to use your ped by default for some reason. - - - - - used in sequence task - both parameters seems to be always 0 - - - - - duration in milliseconds - - - - - duration: the amount of time in milliseconds to do the task. -1 will keep the task going until either another task is applied, or CLEAR_ALL_TASKS() is called with the ped - - - - - Actually has 3 params, not 2. - p0: Ped - p1: int (or bool?) - p2: int - - - - - Updated variables - An alternative to AI::TASK_USE_NEAREST_SCENARIO_TO_COORD_WARP. Makes the ped walk to the scenario instead. - - - - - chases targetEnt fast and aggressively - -- - Makes ped (needs to be in vehicle) chase targetEnt. - - - - - info about driving modes: HTTP://gtaforums.com/topic/822314-guide-driving-styles/ - --------------------------------------------------------------- - Passing P6 value as floating value didn't throw any errors, though unsure what is it exactly, looks like radius or something. - P10 though, it is mentioned as float, however, I used bool and set it to true, that too worked. - Here the e.g. code I used - Function.Call(Hash.TASK_VEHICLE_DRIVE_TO_COORD, Ped, Vehicle, Cor X, Cor Y, Cor Z, 30f, 1f, Vehicle.GetHashCode(), 16777216, 1f, true); - - - - - Makes a ped follow the targetVehicle with <minDistance> in between. - note: minDistance is ignored if drivingstyle is avoiding traffic, but Rushed is fine. - Mode: The mode defines the relative position to the targetVehicle. The ped will try to position its vehicle there. - -1 = behind - 0 = ahead - 1 = left - 2 = right - 3 = back left - 4 = back right - if the target is closer than noRoadsDistance, the driver will ignore pathing/roads and follow you directly. - Driving Styles guide: gtaforums.com/topic/822314-guide-driving-styles/ - - - - - task_vehicle_follow_waypoint_recording(Ped p0, Vehicle p1, string p2, int p3, int p4, int p5, int p6, float.x p7, float.Y p8, float.Z p9, bool p10, int p11) - p2 = Waypoint recording string (found in update\update.rpf\x64\levels\gta5\waypointrec.rpf - p3 = 786468 - p4 = 0 - p5 = 16 - p6 = -1 (angle?) - p7/8/9 = usually v3.zero - p10 = bool (repeat?) - p11 = 1073741824 - - - - - Differs from TASK_VEHICLE_DRIVE_TO_COORDS in that it will pick the shortest possible road route without taking one-way streets and other "road laws" into consideration. - WARNING: - A behaviorFlag value of 0 will result in a clunky, stupid driver! - Recommended settings: - speed = 30.0f, - behaviorFlag = 156, - stoppingRange = 5.0f; - If you simply want to have your driver move to a fixed location, call it only once, or, when necessary in the event of interruption. - If using this to continually follow a Ped who is on foot: You will need to run this in a tick loop. Call it in with the Ped's updated coordinates every 20 ticks or so and you will have one hell of a smart, fast-reacting NPC driver -- provided he doesn't get stuck. If your update frequency is too fast, the Ped may not have enough time to figure his way out of being stuck, and thus, remain stuck. One way around this would be to implement an "anti-stuck" mechanism, which allows the driver to realize he's stuck, temporarily pause the tick, unstuck, then resume the tick. - EDIT: This is being discussed in more detail at http://gtaforums.com/topic/818504-any-idea-on-how-to-make-peds-clever-and-insanely-fast-c/ - - - - - pilot, vehicle and altitude are rather self-explanatory. - p4: is unused variable in the function. - entityToFollow: you can provide a Vehicle entity or a Ped entity, the heli will protect them. - 'targetSpeed': The pilot will dip the nose AS MUCH AS POSSIBLE so as to reach this value AS FAST AS POSSIBLE. As such, you'll want to modulate it as opposed to calling it via a hard-wired, constant #. - 'radius' isn't just "stop within radius of X of target" like with ground vehicles. In this case, the pilot will fly an entire circle around 'radius' and continue to do so. - NOT CONFIRMED: p7 appears to be a FlyingStyle enum. Still investigating it as of this writing, but playing around with values here appears to result in different -behavior- as opposed to offsetting coordinates, altitude, target speed, etc. - NOTE: If the pilot finds enemies, it will engage them until it kills them, but will return to protect the ped/vehicle given shortly thereafter. - - - - - Example from fm_mission_controller.c4: - AI::TASK_VEHICLE_MISSION_COORS_TARGET(l_65E1, l_65E2, 324.84588623046875, 325.09619140625, 104.3525, 4, 15.0, 802987, 5.0, 5.0, 0); - - - - - Modes: - 8= flees - 1=drives around the ped - 4=drives and stops near - 7=follows - 10=follows to the left - 11=follows to the right - 12 = follows behind - 13=follows ahead - 14=follows, stop when near - - - - - Modes: - 0 - ignore heading - 1 - park forward - 2 - park backwards - Depending on the angle of approach, the vehicle can park at the specified heading or at its exact opposite (-180) angle. - Radius seems to define how close the vehicle has to be -after parking- to the position for this task considered completed. If the value is too small, the vehicle will try to park again until it's exactly where it should be. 20.0 Works well but lower values don't, like the radius is measured in centimeters or something. - - - - - Most probably plays a specific animation on vehicle. For example getting chop out of van etc... - Here's how its used - - AI::TASK_VEHICLE_PLAY_ANIM(l_325, "rcmnigel1b", "idle_speedo"); - AI::TASK_VEHICLE_PLAY_ANIM(l_556[0 -- [[1]] ], "missfra0_chop_drhome", "InCar_GetOutofBack_Speedo"); - FYI : Speedo is the name of van in which chop was put in the mission. - Animations list : www.los-santos-multiplayer.com/dev.airdancer?cxt=anim - - - - - '1 - '3 - brake + reverse - '4 - turn left 90 + braking - '5 - turn right 90 + braking - '6 - brake strong (handbrake?) until time ends - '7 - turn left + accelerate - '7 - turn right + accelerate - '9 - weak acceleration - '10 - turn left + restore wheel pos to center in the end - '11 - turn right + restore wheel pos to center in the end - '13 - turn left + go reverse - '14 - turn left + go reverse - '16 - crash the game after like 2 seconds :) - '17 - keep actual state, game crashed after few tries - '18 - game crash - '19 - strong brake + turn left/right - '20 - weak brake + turn left then turn right - '21 - weak brake + turn right then turn left - '22 - brake + reverse - '23 - accelerate fast - '24 - '25 - brake turning left then when almost stopping it turns left more - '26 - brake turning right then when almost stopping it turns right more - '27 - brake until car stop or until time ends - '28 - brake + strong reverse acceleration - '30 - performs a burnout (brake until stop + brake and accelerate) - '31 - accelerate + handbrake - '32 - accelerate very strong - Seems to be this: - Works on NPCs, but overrides their current task. If inside a task sequence (and not being the last task), "time" will work, otherwise the task will be performed forever until tasked with something else - - - - - Makes ped walk around the area. - set p1 to 10.0f and p2 to 10 if you want the ped to walk anywhere without a duration. - - - - - Seat Numbers - ------------------------------- - Driver = -1 - Any = -2 - Left-Rear = 1 - Right-Front = 0 - Right-Rear = 2 - Extra seats = 3-14(This may differ from vehicle type e.g. Firetruck Rear Stand, Ambulance Rear) - - - - - EX: Function.Call(Ped1, Ped2, Time, 0); - The last parameter is always 0 for some reason I do not know. The first parameter is the pedestrian who will writhe to the pedestrian in the other parameter. The third paremeter is how long until the Writhe task ends. When the task ends, the ped will die. If set to -1, he will not die automatically, and the task will continue until something causes it to end. This can be being touched by an entity, being shot, explosion, going into ragdoll, having task cleared. Anything that ends the current task will kill the ped at this point. - MulleDK19: Third parameter does not appear to be time. The last parameter is not implemented (It's not used, regardless of value). - - - - - For a full list, see here: pastebin.com/yLNWicUi - - - - - I guess p3 is shape test flags? - - - - - Counts up. Every 1000 is 1 real-time second. Use SETTIMERA(int value) to set the timer (e.g.: SETTIMERA(0)). - - - - - Gets the current frame time. - - - - - Toggles: - UNK17 - Turbo - UNK19 - Tire Smoke - UNK21 - Xenon Headlights - - - - - in script hook .net - Vehicle v = ...; - Function.Call(Hash.TRACK_VEHICLE_VISIBILITY, v.Handle); - - - - - The backing function for TriggerEvent. - - - - - List of all usable event names found in b617d used with this native. Sorted alphabetically and identical names removed: pastebin.com/RzDFmB1W - All music event names found in the b617d scripts: pastebin.com/GnYt0R3P - - - - - yis - eventGroup: 0 = CEventGroupScriptAI, 1 = CEventGroupScriptNetwork - ^^ I'm assuming it's like the rest with this parameter. - - - - - The backing function for TriggerServerEvent. - - - - - I see this as a native that would of been used back in GTA III when you finally unlocked the bridge to the next island and such. - - - - - Does something similar to INTERIOR::DISABLE_INTERIOR. - You don't fall through the floor but everything is invisible inside and looks the same as when INTERIOR::DISABLE_INTERIOR is used. Peds behaves normally inside. - - - - - gtaforums.com/topic/885580-ped-headshotmugshot-txd/ - - - - - On last-gen this just runs blr and this func is called by several other functions other then the native's table. - - - - - Returns the current status of the onscreen keyboard, and updates the output. - Status Codes: - 0 - User still editing - 1 - User has finished editing - 2 - User has canceled editing - 3 - Keyboard isn't active - - - - - See SET_PED_HEAD_BLEND_DATA(). - - - - - hash collision? - - - - - Hash collision - If this is a hash collision, it's a very lucky one. It does seem strangely named but it is used to toggle the mission creator mode. - - - - - hash collision? - - - - - Calculates distance between vectors. - - - - - Calculates distance between vectors but does not perform Sqrt operations. (Its way faster) - - - - - calls from vehicle to net. - - - - - Calculates the magnitude of a vector. - - - - - Calculates the magnitude of a vector but does not perform Sqrt operations. (Its way faster) - - - - - Pauses execution of the current script, please note this behavior is only seen when called from one of the game script files(ysc). In order to wait an asi script use - static void WAIT(DWORD time); - found in main.h - -------------------------------------------------------------------- - It does not actually seem to wait the amount of milliseconds stated like the normal WAIT() command does, but it does seem to make task sequences work more smoothly - System native hashes do not change on gameupdate - - - - - Hash collision - - - - - Returns whether or not the currently executing event was canceled. - - - - - Despite this function's name, it simply returns whether the specified handle is a Ped. - - - - - For a full list, see here: pastebin.com/Tp0XpBMN - For a full list of the points, see here: goo.gl/wIH0vn - - - - - For a full list, see here: pastebin.com/Tp0XpBMN - For a full list of the points, see here: goo.gl/wIH0vn - - - - - For a full list, see here: pastebin.com/Tp0XpBMN - For a full list of the points, see here: goo.gl/wIH0vn - - - - - First parameter was previously an Entity but after further research it is definitely a hash. - - - - - Aborts the current message in the text chat. - - - - - Show Rockstar Editor Menu - by I'm Not MentaL - ---------- - "new_editor" menu - - - - - Adds a rectangular blip for the specified coordinates/area. - - It is recommended to use [SET_BLIP_ROTATION](#_0xF87683CDF73C3F6E) and [SET_BLIP_COLOUR](#_0x03D7FB09E75D6B7E) to make the blip not rotate along with the camera. - - By default, the blip will show as a _regular_ blip with the specified color/sprite if it is outside of the minimap view. - - Example image: - ![minimap](https://w.wew.wtf/pdcjig.png) - ![big map](https://w.wew.wtf/zgcjcm.png) - - (Native name is _likely_ to actually be ADD_BLIP_FOR_AREA, but due to the usual reasons this can't be confirmed) - - - - - Now has 15 parameters, previous declaration: - BOOL _0x428BDCB9DA58DA53(Any p0, Any p1, Any p2, float p3, float p4, float p5, float p6, float p7, float p8, float p9, float p10, float p11, float p12, Any p13) - boneIndex is always chassis_dummy in the scripts. The x/y/z params are location relative to the chassis bone. They are usually rotations and measurements. Haven't reversed which are what yet. - Scale is how big the decal will be. - p13 is always 0. - For alpha, 200 seems to match what the game is doing, I think. I don't have access to the new scripts to see what this parameter is, but based on guessing this seems (kind of) accurate. - - - - - REQUEST_STREAMED_TEXTURE_DICT("MPOnMissMarkers", false); - *uParam0.f_809 = add_decal(9120, vParam1, vVar4, vVar7, 2f, 2f, to_float(iVar0) / 255f, to_float(iVar1) / 255f, to_float(iVar2) / 255f, 1f, -1f, 1, 0, 0); - _0x8A35C742130C6080(9120, "MPOnMissMarkers", "Capture_The_Flag_Base_Icon"); - - - - - Seems to add/set the current menu context (to show/hide buttons?) - Pausemenu.xml: - <Contexts>*ALL*, DISPLAY_CORONA_BUTTONS, *NONE*, BET_LOCKED, BET_AVAILABLE, SCROLL_OPTION</Contexts> - Code: - if (...) { - sub_bbd34(a_0, 0, "FM_BET_HELP"); - UI::_DD564BDD0472C936(${bet_available}); // This native - UI::OBJECT_DECAL_TOGGLE(${bet_locked}); - } else { - sub_bbd34(a_0, 0, ""); - UI::OBJECT_DECAL_TOGGLE(${bet_available}); - UI::_DD564BDD0472C936(${bet_locked}); // This native - } - OBJECT_DECAL_TOGGLE seems to remove a context, It also has a hash collision - // Old - Scripts do not make this native's purpose clear. However, this native most likely has something to do with decals since in nearly every instance, "OBJECT_DECAL_TOGGLE" is called prior. - - - - - This is used to add a speedzone on a position. - Example usage C#: - uint speedZone = Function.Call<uint>((Hash) 0x2CE544C68FB812A0, Game.PlayerPed.Position.X, Game.PlayerPed.Position.Y, Game.PlayerPed.Position.Z, 100.0f, 0.0f, false); - (Thanks to alexguirre for his help!) - ========================================== - What is the point in adding a speed zone? Does it just generally affect the speed NPCs will drive? I can imagine running this on every section of the interstate setting it to 3 MPH rip. - - - - - p1 was always -1. - used for phone applications; scaleform - - - - - This native (along with 0x6C188BE134E074AA and 0x94CF4AC034C9C986) do not actually filter anything. They simply add the provided text (as of 944) - did you even check the disassembly? - > Do you even lift bro? The PLAYER_NAME and WEBSITE natives are the correct names, it doesn't matter if they're filtered or not. Blame R* for that matter. Hashes don't lie, and it's extremely unlikely the validated names are collisions (what are the odds??) - - - - - Seems to animate the gameplay camera zoom. - Eg. _ANIMATE_GAMEPLAY_CAM_ZOOM(1f, 1000f); - will animate the camera zooming in from 1000 meters away. - Game scripts use it like this: - // Setting this to 1 prevents V key from changing zoom - PLAYER::SET_PLAYER_FORCED_ZOOM(PLAYER::PLAYER_ID(), 1); - // These restrict how far you can move cam up/down left/right - CAM::_CLAMP_GAMEPLAY_CAM_YAW(-20f, 50f); - CAM::_CLAMP_GAMEPLAY_CAM_PITCH(-60f, 0f); - CAM::_ANIMATE_GAMEPLAY_CAM_ZOOM(1f, 1f); - - - - - Returns true when the bomb bay doors of this plane are open. False if they're closed. - - - - - Returns true if the coords are colliding with the outdoors, and false if they collide with an interior. - - - - - Found this in the decompiled scripts, I'd do more research before changing the name -- - if (!ENTITY::IS_ENTITY_DEAD(l_1911)) { - if (!VEHICLE::_755D6D5267CBBD7E(l_1911)) { - sub_1ba80("TRAFFICKING AIR: FAILING - PROPELLERS ARE DAMAGED"); - l_12CE = 9; - } - } - - - - - ADD_A_MARKER_OVER_VEHICLE was a hash collision!!! - Can be used for planes only! - - - - - Types: - 1 = Boolean - 2 = Integer - 3 = Float - 4 = String - 5 = Vector3 - 6 = Object - 7 = Array - - - - - MulleDK19: Starts a new enumeration of the current threads. - Call this first, then _GET_ID_OF_NEXT_THREAD_IN_ENUMERATION (0x30B4FA1C82DD4B9F) - see _GET_ID_OF_NEXT_THREAD_IN_ENUMERATION (0x30B4FA1C82DD4B9F) for an example - - - - - Pushes a function from the Hud component Scaleform onto the stack. Same behavior as GRAPHICS::_PUSH_SCALEFORM_MOVIE_FUNCTION, just a hud component id instead of a Scaleform. - Known components: - 19 - 20 - This native requires more research - all information can be found inside of 'hud.gfx'. Using a decompiler, the different components are located under "scripts\__Packages\com\rockstargames\gtav\hud\hudComponents" and "scripts\__Packages\com\rockstargames\gtav\Multiplayer". - - - - - Possibly calls "global" Scaleform functions - needs more research! - - - - - Initializes the text entry for the the text next to a loading prompt. All natives for for building UI texts can be used here - BEGIN_TEXT_COMMAND_PRINT - e.g - void StartLoadingMessage(char *text, int spinnerType = 3) - { - _SET_LOADING_PROMPT_TEXT_ENTRY("STRING"); - ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(text); - _SHOW_LOADING_PROMPT(spinnerType); - } - -- [[OR]] - void ShowLoadingMessage(char *text, int spinnerType = 3, int timeMs = 10000) - { - _SET_LOADING_PROMPT_TEXT_ENTRY("STRING"); - ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(text); - _SHOW_LOADING_PROMPT(spinnerType); - WAIT(timeMs); - _REMOVE_LOADING_PROMPT(); - } - These are some localized strings used in the loading spinner. - "PM_WAIT" = Please Wait - "CELEB_WPLYRS" = Waiting For Players. - "CELL_SPINNER2" = Scanning storage. - "ERROR_CHECKYACHTNAME" = Registering your yacht's name. Please wait. - "ERROR_CHECKPROFANITY" = Checking your text for profanity. Please wait. - "FM_COR_AUTOD" = Just spinner no text - "FM_IHELP_WAT2" = Waiting for other players - "FM_JIP_WAITO" = Game options are being set - "FMMC_DOWNLOAD" = Downloading - "FMMC_PLYLOAD" = Loading - "FMMC_STARTTRAN" = Launching session - "HUD_QUITTING" = Quiting session - "KILL_STRIP_IDM" = Waiting for to accept - "MP_SPINLOADING" = Loading - - - - - get's line count - int GetLineCount(char *text, float x, float y) - { - _BEGIN_TEXT_COMMAND_LINE_COUNT("STRING"); - ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(text); - return _END_TEXT_COMMAND_GET_LINE_COUNT(x, y); - } - - - - - nothin doin. - void message() - { - _BEGIN_TEXT_COMMAND_OBJECTIVE("AHT_RTIT"); - _END_TEXT_COMMAND_OBJECTIVE(0); - } - - - - - void message(char *text) - { - _BEGIN_TEXT_COMMAND_TIMER("STRING"); - ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(text); - _END_TEXT_COMMAND_TIMER(0); - } - - - - - Example: - _BEGIN_TEXT_COMMAND_WIDTH("NUMBER"); - ADD_TEXT_COMPONENT_FLOAT(69.420f, 2); - float width = _END_TEXT_COMMAND_GET_WIDTH(true); - - - - - calling this each frame, it stops the player from receiving a weapon via the weapon wheel. - - - - - Calls the Scaleform function and passes the parameters as floats. - The number of parameters passed to the function varies, so the end of the parameter list is represented by -1.0. - - - - - Calls the Scaleform function and passes both float and string parameters (in their respective order). - The number of parameters passed to the function varies, so the end of the float parameters is represented by -1.0, and the end of the string parameters is represented by 0 (NULL). - NOTE: The order of parameters in the function prototype is important! All float parameters must come first, followed by the string parameters. - Examples: - // function MY_FUNCTION(floatParam1, floatParam2, stringParam) - GRAPHICS::_CALL_SCALEFORM_MOVIE_FUNCTION_MIXED_PARAMS(scaleform, "MY_FUNCTION", 10.0, 20.0, -1.0, -1.0, -1.0, "String param", 0, 0, 0, 0); - // function MY_FUNCTION_2(floatParam, stringParam1, stringParam2) - GRAPHICS::_CALL_SCALEFORM_MOVIE_FUNCTION_MIXED_PARAMS(scaleform, "MY_FUNCTION_2", 10.0, -1.0, -1.0, -1.0, -1.0, "String param #1", "String param #2", 0, 0, 0); - - - - - Calls the Scaleform function and passes the parameters as strings. - The number of parameters passed to the function varies, so the end of the parameter list is represented by 0 (NULL). - - - - - Returns true if ped1 can see ped2 in their line of vision - - - - - Checks if the ped can play the speech or has the speech file, last parameter is usually 0 - - - - - if(_CAN_PLAY_ONLINE() == 0) means the player is banned(Social Club or Rockstar) - - - - - When calling this, the current frame will have the players "arrow icon" be focused on the dead center of the radar. - - - - - minimum: Degrees between -90f and 90f. - maximum: Degrees between -90f and 90f. - Clamps the gameplay camera's current pitch. - Eg. _CLAMP_GAMEPLAY_CAM_PITCH(0.0f, 0.0f) will set the vertical angle directly behind the player. - - - - - minimum: Degrees between -180f and 180f. - maximum: Degrees between -180f and 180f. - Clamps the gameplay camera's current yaw. - Eg. _CLAMP_GAMEPLAY_CAM_YAW(0.0f, 0.0f) will set the horizontal angle directly behind the player. - - - - - GAMEPLAY::_0x957838AAF91BD12D(x, y, z, radius, false, false, false, false); seem to make all objects go away, peds, vehicles etc. All booleans set to true doesn't seem to change anything. - - - - - Clears the secondary timecycle modifier usually set with [`SetExtraTimecycleModifier`](#_0X3B2FD68DB5F8331C) - - - - - _CLEAR_NOTIFICATIONS_POS(0.5f); - - - - - creates single lightning+thunder at random position - - - - - p0 was the return of NET_TO_PED in fm_mission_controler. - p4 was always "". - returns headDisplayId - - - - - Console Hash: 0x8DE5382F - The native name is correct but the db automatically prefixes "_" to unknown natives when changed. - - - - - Console Hash: 0xBC7BD5CB - The native name is correct but the db automatically prefixes "_" to unknown natives when changed. - - - - - Detaches the vehicle's windscreen. - For further information, see : gtaforums.com/topic/859570-glass/#entry1068894566 - - - - - Disables first person camera for the current frame. - Found in decompiled scripts: - GRAPHICS::DRAW_DEBUG_TEXT_2D("Disabling First Person Cam", 0.5, 0.8, 0.0, 0, 0, 255, 255); - CAM::_DE2EF5DA284CC8DF(); - - - - - Disables the phone up-button, oddly enough. - i.e.: When the phone is out, and this method is called with false as it's parameter, the phone will not be able to scroll up. However, when you use the down arrow key, it's functionality still, works on the phone. - When the phone is not out, and this method is called with false as it's parameter, you will not be able to bring up the phone. Although the up arrow key still works for whatever functionality it's used for, just not for the phone. - This can be used for creating menu's when trying to disable the phone from being used. - You do not have to call the function again with false as a parameter, as soon as the function stops being called, the phone will again be usable. - - - - - confirmed working - - - - - Toggles to render distant vehicles. They may not be vehicles but images to look like vehicles. - - - - - Shows a hud element for reporting jobs - - - - - only documented to be continued... - - - - - Returns true only when the magnet is active, will return false if the hook is active - console hash 0x4778CA0A - - - - - Returns true if a destructible object with this handle exists, false otherwise. - - - - - Example: - if (OBJECT::_DOES_DOOR_EXIST(doorHash)) - { - OBJECT::REMOVE_DOOR_FROM_SYSTEM(doorHash); - } - - - - - formerly _IS_STREAMED_SCRIPT_RUNNING - Jenkins hash: 0x19EAE282 - - - - - This function is called before ADD_CLAN_DECAL_TO_VEHICLE to see if it needs to run. IDK if it's for clan decal or not, but the 2nd parameter might be decal index? It's always passed 0. Not sure what this function really does. But it does return 0 if the clan tag is not on, and 1 if it is. - - - - - OBJECT::_9B12F9A24FABEDB0(${prop_gate_prison_01}, 1845.0, 2605.0, 45.0, 0, 0.0, 50.0, 0); //door unlocked - OBJECT::_9B12F9A24FABEDB0(${prop_gate_prison_01}, 1845.0, 2605.0, 45.0, 1, 0.0, 50.0, 0); //door locked - locked simply tells the game whether or not the door is locked. - x,y,z RotMult are multipliers that specify how fast the door/gate will rotate in degrees per second. - - - - - Downloads prod.cloud.rockstargames.com/titles/gta5/<platform>/check.json - - - - - instructionalKey enum list: - - ``` - Buttons = { - Empty = 0, - Select = 1, -- (RETURN) - Ok = 2, -- (RETURN) - Yes = 4, -- (RETURN) - Back = 8, -- (ESC) - Cancel = 16, -- (ESC) - No = 32, -- (ESC) - RetrySpace = 64, -- (SPACE) - Restart = 128, -- (SPACE) - Skip = 256, -- (SPACE) - Quit = 512, -- (ESC) - Adjust = 1024, -- (ARROWS) - SpaceKey = 2048, -- (SPACE) - Share = 4096, -- (SPACE) - SignIn = 8192, -- (SPACE) - Continue = 16384, -- (RETURN) - AdjustLeftRight = 32768, -- (SCROLL L/R) - AdjustUpDown = 65536, -- (SCROLL U/D) - Overwrite = 131072, -- (SPACE) - SocialClubSignup = 262144, -- (RETURN) - Confirm = 524288, -- (RETURN) - Queue = 1048576, -- (RETURN) - RetryReturn = 2097152, -- (RETURN) - BackEsc = 4194304, -- (ESC) - SocialClub = 8388608, -- (RETURN) - Spectate = 16777216, -- (SPACE) - OkEsc = 33554432, -- (ESC) - CancelTransfer = 67108864, -- (ESC) - LoadingSpinner = 134217728, - NoReturnToGTA = 268435456, -- (ESC) - CancelEsc = 536870912, -- (ESC) - } - - Alt = { - Empty = 0, - No = 1, -- (SPACE) - Host = 2, -- (ESC) - SearchForJob = 4, -- (RETURN) - ReturnKey = 8, -- (TURN) - Freemode = 16, -- (ESC) - } - ``` - - **Result of the example code:** <https://i.imgur.com/TvmNF4k.png> - - - - - Similar to [\_DRAW_SPRITE](#_0xE7FFAE5EBF23D890), but seems to be some kind of "interactive" sprite, at least used by render targets. - These seem to be the only dicts ever requested by this native: - - ``` - prop_screen_biker_laptop - Prop_Screen_GR_Disruption - Prop_Screen_TaleOfUs - prop_screen_nightclub - Prop_Screen_IE_Adhawk - prop_screen_sm_free_trade_shipping - prop_screen_hacker_truck - MPDesktop - Prop_Screen_Nightclub - And a few others - ``` - - - - - Draws a notification above the map and returns the notifications handle - Color syntax: - ~r~ = Red - ~b~ = Blue - ~g~ = Green - ~y~ = Yellow - ~p~ = Purple - ~o~ = Orange - ~c~ = Grey - ~m~ = Darker Grey - ~u~ = Black - ~n~ = New Line - ~s~ = Default White - ~w~ = White - ~h~ = Bold Text - ~nrt~ = ??? - Special characters: - ¦ = Rockstar Verified Icon (U+00A6:Broken Bar - Alt+0166) - ÷ = Rockstar Icon (U+00F7:Division Sign - Alt+0247) - ∑ = Rockstar Icon 2 (U+2211:N-Ary Summation) - Example C#: - Function.Call(Hash._ADD_TEXT_COMPONENT_STRING3, "Now I need you to bring the ~b~vehicle~w~ back to me!"); - ---- - showInBrief==true: the notification will appear in the "Brief/Info" -> "Notifications" tab in the pause menu. - showInBrief==false: the notification will NOT appear in the pause menu. - - - - - This function and the one below it are for after you receive an invite, not sending it. - p0 = 1 or 0 - nothin doin. - int invite(Player player) - { - int iVar2, iVar3; - networkHandleMgr handle; - NETWORK_HANDLE_FROM_PLAYER(player, &handle.netHandle, 13); - networkClanMgr clan; - char *playerName = GET_PLAYER_NAME(player); - _SET_NOTIFICATION_TEXT_ENTRY("STRING"); - _SET_NOTIFACTION_COLOR_NEXT(0); - ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(playerName); - if (NETWORK_CLAN_PLAYER_GET_DESC(&clan, 35, &handle.netHandle)) - { - iVar2 = 0; - if (ARE_STRINGS_EQUAL(clan.unk22, "Leader") && clan.unk30 == 0) - { - iVar2 = 1; - } - if (clan.unk21 > 0) - { - iVar3 = 0; - } - else - { - iVar3 = 1; - } - BOOL unused = _0x54E79E9C(&clan.clanHandle, 35); - return _DRAW_NOTIFICATION_APARTMENT_INVITE(iVar3, 0 -- [[unused]] , &clan.unk17, clan.unk30, iVar2, 0, clan.clanHandle, 0, 0, 0); - } - } - - - - - Shows an "award" notification above the minimap, lua example result: - - ![](https://i.imgur.com/e2DNaKX.png) - - Old description: - - ``` - Example: - UI::_SET_NOTIFICATION_TEXT_ENTRY("HUNT"); - UI::_0xAA295B6F28BD587D("Hunting", "Hunting_Gold_128", 0, 109, "HUD_MED_UNLKED"); - ``` - - - - - p0 = 1 or 0 - crashes my game... - this is for sending invites to network players - jobs/apartment/ect... - return notification handle - int invite(Player player) - { - networkHandleMgr netHandle; - networkClanMgr clan; - char *playerName = GET_PLAYER_NAME(player); - _SET_NOTIFICATION_TEXT_ENTRY("STRING"); - _SET_NOTIFACTION_COLOR_NEXT(1); - ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(playerName); - NETWORK_HANDLE_FROM_PLAYER(player, &netHandle.netHandle, 13); - if (NETWORK_CLAN_PLAYER_IS_ACTIVE(&netHandle.netHandle)) - { - NETWORK_CLAN_PLAYER_GET_DESC(&clan.clanHandle, 35, &netHandle.netHandle); - _DRAW_NOTIFICATION_CLAN_INVITE(0, _0x54E79E9C(&clan.clanHandle, 35), &clan.unk17, clan.isLeader, 0, 0, clan.clanHandle, playerName, 0, 0, 0); - } - } - - - - - returns a notification handle, prints out a notification like below: - type range: 0 - if you set type to 1, button accepts "~INPUT_SOMETHING~" - example: - UI::_0xDD6CB2CCE7C2735C(1, "~INPUT_TALK~", "Who you trynna get crazy with, ese? Don't you know I'm LOCO?!"); - - imgur.com/UPy0Ial - Examples from the scripts: - l_D1[1 -- [[1]] ]=UI::_DD6CB2CCE7C2735C(1,"~INPUT_REPLAY_START_STOP_RECORDING~",""); - l_D1[2 -- [[1]] ]=UI::_DD6CB2CCE7C2735C(1,"~INPUT_SAVE_REPLAY_CLIP~",""); - l_D1[1 -- [[1]] ]=UI::_DD6CB2CCE7C2735C(1,"~INPUT_REPLAY_START_STOP_RECORDING~",""); - l_D1[2 -- [[1]] ]=UI::_DD6CB2CCE7C2735C(1,"~INPUT_REPLAY_START_STOP_RECORDING_SECONDARY~",""); - - - - - returns a notification handle, prints out a notification like below: - type range: 0 - if you set type to 1, image goes from 0 - 39 - Xbox you can add text to - example: - UI::_0xD202B92CBF1D816F(1, 20, "Who you trynna get crazy with, ese? Don't you know I'm LOCO?!"); - - - - - what the heck does this one do differently from the one above? - - - - - It's called after 0xD3A10FC7FD8D98CD and 0xF1CEA8A4198D8E9A - p0 was always "CELEBRATION_WINNER" - - - - - shadowId: each call to this native in the same tick should have a different value passed to this parameter, if two or more calls have the same values, only the first one will render its shadow properly - - - - - ADD_E* (most likely ADD_ENTITY_*) - All found occurrences in b678d: - pastebin.com/ceu67jz8 - Still not sure on the functionality of this native but it has something to do with dynamic mixer groups defined in dynamix.dat15 - - - - - Shows the crosshair even if it wouldn't show normally. Only works for one frame, so make sure to call it repeatedly. - - - - - More info: http://gtaforums.com/topic/836367-adding-props-to-interiors/ - - - - - Pops and calls the Scaleform movie on the stack. Returns data from the function (not sure if this is a string). - - - - - This does NOT get called per frame. Call it once to show, then use UI::_REMOVE_LOADING_PROMPT to remove it - Changes the the above native's (UI::_SET_LOADING_PROMPT_TEXT_ENTRY) spinning circle type. - Types: - enum LoadingPromptTypes - { - LOADING_PROMPT_LEFT, - LOADING_PROMPT_LEFT_2, - LOADING_PROMPT_LEFT_3, - SAVE_PROMPT_LEFT, - LOADING_PROMPT_RIGHT, - }; - - - - - Used with _BEGIN_TEXT_COMMAND_WIDTH. - In scripts, p0 is false when used in combination with "ESMINDOLLA" or "ESDOLLA", otherwise it's true. - Returns from range 0 to 1. - - - - - p0 is always false in scripts. - - - - - Only found twice in decompiled scripts. Something to do with an entity/object? - On a side note, it's very interesting how the hash for this native is "DEADC0DE" - this is usually used as padding for initializing a buffer of some sort. I wonder if this native is actually "dead"? - "carmod_shop.ysc", line 9520: - if (ENTITY::DOES_ENTITY_EXIST(l_324._f6)) { - GRAPHICS::_0xDEADC0DEDEADC0DE(l_324._f6); - } - "fm_mission_controller.ysc", line 189641: - if (GAMEPLAY::IS_BIT_SET(g_1870E1._f7B64[a_0 -- [[104]] ]._f25, 28)) { - GRAPHICS::_0xDEADC0DEDEADC0DE(NETWORK::NET_TO_OBJ(l_4064._f26A._f87[a_0 -- [[1]] ])); - if (!GAMEPLAY::IS_BIT_SET(g_1870E1._f7B64[a_0 -- [[104]] ]._f25, 31)) { - if (!ENTITY::IS_ENTITY_DEAD(v_7)) { - AUDIO::PLAY_SOUND_FROM_ENTITY(-1, "EMP_Vehicle_Hum", v_7, "DLC_HEIST_BIOLAB_DELIVER_EMP_SOUNDS", 0, 0); - GAMEPLAY::SET_BIT(&g_1870E1._f7B64[a_0 -- [[104]] ]._f25, 31); - } - } - } - Console Hash: 0xC12AC47A - ---------- - It's most likely named UPDATE_* (like UPDATE_ENTITY_SHIT_OR_SOMETHING). - - - - - Will change world AABB so that given point will be inside of the world limits. - Example: - You want world limits to be -9000<X<10000 -11000<Y<12000 and leave Z limits as is. - You should call this function two times: - _EXPAND_WORLD_LIMITS(-9000.0,-11000.0,30.0) - _EXPAND_WORLD_LIMITS(10000.0,12000.0,30.0) - Appears only 3 times in the scripts, more specifically in michael1.ysc - Console hash: 0x64ddb07d - - - This can be used to prevent dying if you are "out of the world" - - - - - GTA Online character creation - - - - - milestoneId: - 0 = "percentcomplete" - 1 = "storycomplete" - 2 = "vehicles" - 3 = "properties" - 4 = "psych" - 5 = "mapreveal" - 6 = "prologue" - - - - - if value is set to true, and ambient siren sound will be played. - ------------------------------------------------------------------------- - Appears to enable/disable an audio flag. - - - - - Exits the game and downloads a fresh social club update on next restart. - - - - - This native sets the audio of the specified vehicle to audioName (p1). - Use the audioNameHash found in vehicles.meta - Example: - _FORCE_VEHICLE_ENGINE_SOUND(veh, "ADDER"); - The selected vehicle will now have the audio of the Adder. - FORCE_VEHICLE_??? - - - - - p0 = int (?) - Dr. Underscore (1/6/18): - This gets the progression of an achievement. Returns 0 if the achievement cannot be progressed. - - - - - Returns current screen resolution. - - - - - native only found once in appinternet.c4 - same thing as this but does not need websiteID - Any _0xE3B05614DCE1D014(Any p0) // 0xE3B05614DCE1D014 0xD217EE7E - returns current websitePageID - - - - - Gets the amount of bombs that this vehicle has. As far as I know, this does _not_ impact vehicle weapons or the ammo of those weapons in any way, it is just a way to keep track of the amount of bombs in a specific plane. - - In decompiled scripts this is used to check if the vehicle has enough bombs before a bomb can be dropped (bombs are dropped by using [`_SHOOT_SINGLE_BULLET_BETWEEN_COORDS_WITH_EXTRA_PARAMS`](#_0xBFE5756E7407064A)). - - Use [`_SET_AIRCRAFT_BOMB_COUNT`](#_0xF4B2ED59DEB5D774) to set the amount of bombs on that vehicle. - - - - - Similar to [`_GET_AIRCRAFT_BOMB_COUNT`](#_0xEA12BD130D7569A1), this gets the amount of countermeasures that are present on this vehicle. - - Use [`_SET_AIRCRAFT_COUNTERMEASURE_COUNT`](#_0x9BDA23BF666F0855) to set the current amount. - - - - - Returns the current AI BLIP for the specified ped - - - - - Console Hash: 0x8B5E3E3D = GET_ANIM_DURATION - Animations list : www.los-santos-multiplayer.com/dev.airdancer?cxt=anim - - - - - Console Hash: 0xE97A4F5E - - - - - Gets the position of the cargobob hook, in world coords. - - - - - Return the mission id of a job. - - - - - if (UI::_2309595AD6145265() == ${fe_menu_version_empty_no_background}) - Seems to get the current frontend menu - - - - - Gets the aggressiveness factor of the ocean waves. - - - - - american = 0 - french = 1 - german = 2 - italian =3 - spanish = 4 - portuguese = 5 - polish = 6 - russian = 7 - korean = 8 - chinese = 9 - japanese = 10 - mexican = 11 - - - - - Returns the handle for the notification currently displayed on the screen. - - - - - Takes the specified time and writes it to the structure specified in the second argument. - struct date_time - { - alignas(8) int year; - alignas(8) int month; - alignas(8) int day; - alignas(8) int hour; - alignas(8) int minute; - alignas(8) int second; - }; - - - - - Gets a destructible object's handle - Example: - OBJECT::_B48FCED898292E52(-809.9619750976562, 170.919, 75.7406997680664, 3.0, "des_tvsmash"); - All found arguments for p4 starts with "des_" like "DES_FIB_Floor" and "des_shipsink". - - - - - Get a destrictible object's state. - Substract 1 to get the real state. - See _SET_DES_OBJECT_STATE to see the different states - For example, if the object just spawned (state 2), the native will return 3. - - - - - console hash: 0xE8C0C629 - - - - - Gets the heading of the entity physics in degrees, which tends to be more accurate than just "GET_ENTITY_HEADING". This can be clearly seen while, for example, ragdolling a ped/player. - NOTE: The name and description of this native are based on independent research. If you find this native to be more suitable under a different name and/or described differently, please feel free to do so. - - - - - See [`GetTimecycleModifierIndex`](#_0xFDF3D97C674AFB66) for use, works the same just for the secondary timecycle modifier. - - - - - Type equals 0 for male non-dlc, 1 for female non-dlc, 2 for male dlc, and 3 for female dlc. - Used when calling SET_PED_HEAD_BLEND_DATA. - - - - - Gets the gameplay camera's far clipping plane. - - - - - Gets the gameplay camera's far depth of field distance. - - - - - Gets the gameplay camera's near depth of field distance. - - - - - p0 seems to consistently be 2 across scripts - Function is called faily often by CAM::CREATE_CAM_WITH_PARAMS - - - - - it returns a reference to an empty string, the same empty string that's used by 1687 internal gta functions. if it was used in a script (and i cannot find an instance of it being used), it would be as the source for a StringCopy or somesuch. - - - - - only documented to be continued... - - - - - Input: Haircolor index, value between 0 and 63 (inclusive). - Output: RGB values for the haircolor specified in the input. - - This is used with the hair color swatches scaleform. - - Use [`_0x013E5CFC38CD5387`](#_0x013E5CFC38CD5387) to get the makeup colors. - - - - - Max 1000. - At -100 both helicopter rotors will stall. - - - - - Max 1000. - At 0 the main rotor will stall. - - - - - Max 1000. - At 0 the tail rotor will stall. - - - - - MulleDK19: Gets the ID of the next active thread. - First call _BEGIN_ENUMERATE_THREADS (0xDADFADA5A20143A8). - Any subsequent call to this function will then return the ID of the next active thread. - If the function returns 0, the end of the enumeration has been reached. - ----------------------------------------------------------------------- - Here's an example: - std::vector<int> vecCurrentThreads; - void update_current_threads_list() - { - vecCurrentThreads.clear(); - _BEGIN_ENUMERATING_THREADS(); - int id = _GET_ID_OF_NEXT_THREAD_IN_ENUMERATION(); - while (id != 0) - { - id = _GET_ID_OF_NEXT_THREAD_IN_ENUMERATION(); - vecCurrentThreads.push_back(id); - } - } - - - - - Dr. Underscore (1/6/18): - Works exactly like IS_PROJECTILE_TYPE_IN_AREA, but it puts the position of the projectile in the vector. - p8 is probably ownedByPlayer, but not known for sure. (see IS_PROJECTILE_IN_AREA for info) - Unsure of the hash name, could someone confirm this? - - - - - p0 = VEHICLE_NODE_ID - Returns true when the node is Offroad. Alleys, some dirt roads, and carparks return true. - Normal roads where plenty of Peds spawn will return false - - - - - Gets a string literal from a label name. - - - - - gets the length of a null terminated string, without checking unicode encodings - - - - - Input: Makeup color index, value between 0 and 63 (inclusive). - Output: RGB values for the makeup color specified in the input. - - This is used with the makeup color swatches scaleform. - - Use [`_0x4852FC386E2E1BB5`](#_0x4852FC386E2E1BB5) to get the hair colors. - - - - - This is the "actual" GET_MAXIMUM_NUMBER_OF_PHOTOS native. Always returns 96. - - - - - The reversed code looks like this (Sasuke78200) - // - char g_szScriptName[64]; - char* _0xBE7ACD89(int a_iThreadID) - { - scrThread* l_pThread; - // Get the script thread - l_pThread = GetThreadByID(a_iThreadID); - if(l_pThread == 0 || l_pThread->m_iThreadState == 2) - { - strncpy(g_szScriptName, "", 64); - } - else - { - strncpy(g_szScriptName, l_pThread->m_szScriptName, 64); - } - return g_szScriptName; - } - - - - - Needs more research. Gets the stat name of a masked bool? - p4 - Usually "_NGPSTAT_BOOL" or "_NGTATPSTAT_BOOL". There may be more that I missed. - - - - - Needs more research. Gets the stat name of a masked int? - p4 - Usually one of the following (there may be more that I missed): - -----> "_APAPSTAT_INT" - -----> "_LRPSTAT_INT" - -----> "_NGPSTAT_INT" - -----> "_MP_APAPSTAT_INT" - -----> "_MP_LRPSTAT_INT" - - - - - Gets the number of instances of the specified script is currently running. - Actually returns numInstances - 1. - if (scriptPtr) - v3 = GetNumberOfInstancesOfScript(scriptPtr) - 1; - return v3; - - - - - only documented to be continued... - - - - - Returns number of possible values of the componentId argument of GET_FORCED_COMPONENT. - - - - - Used for freemode (online) characters. - - - - - Used with freemode (online) characters. - - - - - Type equals 0 for male non-dlc, 1 for female non-dlc, 2 for male dlc, and 3 for female dlc. - - - - - character is 0 for Michael, 1 for Franklin, 2 for Trevor, 3 for freemode male, and 4 for freemode female. - componentId is between 0 and 11 and corresponds to the usual component slots. - p1 could be the outfit number; unsure. - p2 is usually -1; unknown function. - p3 appears to be a boolean flag; unknown function. - p4 is usually -1; unknown function. - - - - - Online version is defined here: update\update.rpf\common\data\version.txt - Example: - [ONLINE_VERSION_NUMBER] - 1.33 - _GET_ONLINE_VERSION() will return "1.33" - Belongs in NETWORK - - - - - The pointer is to a padded struct that matches the arguments to SET_PED_HEAD_BLEND_DATA(...). There are 4 bytes of padding after each field. - (Edit) Console Hash: 0x44E1680C - pass this struct in the second parameter - typedef struct - { - int shapeFirst, shapeSecond, shapeThird; - int skinFirst, skinSecond, skinThird; - float shapeMix, skinMix, thirdMix; - } headBlendData; - - - - - Likely a char, if that overlay is not set, e.i. "None" option, returns 255; - - - - - Use [`SetPedIlluminatedClothingGlowIntensity`](#_0x4E90D746056E273D) to set the illuminated clothing glow intensity for a specific ped. - - - - - Returns a handle to the first entity within the a circle spawned inside the 2 points from a radius. It could return a ped or an entity, but the scripts expect a ped, but still check if it's a ped. - - - - - Quick disassembly and test seems to indicate that this native gets the Ped currently using the specified door. - - - - - returns pickup hash. - - - - - only documented to be continued... - Dr. Underscore (1/6/18): - Exactly like _GET_PROJECTILE_NEAR_PED_COORDS (_0xDFB4138EEFED7B81), but it gives us the Entity that was found aswell. - p6 is (most likely) ownedByPlayer. (see IS_PROJECTILE_IN_AREA for info) - - - - - From a quick disassembly I can say that this has something to do with weapons. - Added params according to what I could see in IDA. - Dr. Underscore (1/6/18): - Returns if any projectiles of projHash type are in a radius around this ped. If true, projPos is filled with the position of that entity. - This native was only ever used with projectiles, but may not be limited to. - p4 isn't an Entity*, it's actually a Vector3*, which outputs the position of the found entity. - p5 is (most likely) ownedByPlayer. (see IS_PROJECTILE_IN_AREA for info) - - - - - outfit = a structure passing though it - see GET_SHOP_PED_QUERY_OUTFIT - slot - outfit slot - item - hold 3 ints in a struct, you can use Vector3 structure - GET_SHOP_PED_??? - - - - - Returns the room hash key from the current gameplay cam. - - - - - Return the root content id of a job. - - - - - Get a rope's length. Can be modified with ROPE_FORCE_LENGTH - - - - - Seems to take data that is returned from "_POP_SCALEFORM_MOVIE_FUNCTION" and checks to see if it's not null/empty. - "agency_heist3b.ysc", line 71836: - if (CONTROLS::IS_CONTROL_JUST_PRESSED(2, 201) || CONTROLS::IS_CONTROL_JUST_PRESSED(2, 237)) { - GRAPHICS::_PUSH_SCALEFORM_MOVIE_FUNCTION(l_46, "SET_INPUT_EVENT_SELECT"); - l_45 = GRAPHICS::_POP_SCALEFORM_MOVIE_FUNCTION(); - } - if (GRAPHICS::_0x768FF8961BA904D6(l_45)) { - v_13 = GRAPHICS::_0x2DE7EFA66B906036(l_45); - if (v_13 == 6) { - sub_73269(a_0); - } - } - - - - - Needs a bit more research, but it seems to return an int. - Testing with the scaleform "HACKING_PC" it seems to return an int depending on the clicked App/Program ID - "agency_heist3b.ysc", line 71836: - if (CONTROLS::IS_CONTROL_JUST_PRESSED(2, 201) || CONTROLS::IS_CONTROL_JUST_PRESSED(2, 237)) { - GRAPHICS::_PUSH_SCALEFORM_MOVIE_FUNCTION(l_46, "SET_INPUT_EVENT_SELECT"); - l_45 = GRAPHICS::_POP_SCALEFORM_MOVIE_FUNCTION(); - } - if (GRAPHICS::_0x768FF8961BA904D6(l_45)) { - v_13 = GRAPHICS::_0x2DE7EFA66B906036(l_45); - if (v_13 == 6) { - sub_73269(a_0); - } - } - - - - - This returns the name of the scaleform movie. - - - - - World to relative screen coords - this world to screen will keep the text on screen. it will keep it in the screen pos. good for a deer hunting mod - - - - - Returns whether the specified screen effect is active. - See the effects list in _START_SCREEN_EFFECT - Example and list of screen FX: www.pastebin.com/dafBAjs0 - - - - - Calculates the effective X/Y fractions when applying the values set by `SET_SCRIPT_GFX_ALIGN` and - `SET_SCRIPT_GFX_ALIGN_PARAMS`. - - - - - behaves exactly the same way as GET_SHAPE_TEST_RESULT except it has one extra parameter (_materialHash). - Quick disassembly seems to indicate that the unknown is a hash. EDIT: Seems to be the hash of the hit material or surface type. - found a materialFX.dat list of them but not sure if it has to do with this native yet. - materials (full list): pastebin.com/gyHjsYBK - - - - - p0 = VEHICLE_NODE_ID - Returns false for nodes that aren't used for GPS routes. - Example: - Nodes in Fort Zancudo and LSIA are false - - - - - Character types: - - ``` - 0 = Michael, - 1 = Franklin, - 2 = Trevor, - 3 = MPMale, - 4 = MPFemale - ``` - - ```csharp - enum TattooZoneData - { - ZONE_TORSO = 0, - ZONE_HEAD = 1, - ZONE_LEFT_ARM = 2, - ZONE_RIGHT_ARM = 3, - ZONE_LEFT_LEG = 4, - ZONE_RIGHT_LEG = 5, - ZONE_UNKNOWN = 6, - ZONE_NONE = 7, - }; - - struct outComponent - { - // these vars are suffixed with 4 bytes of padding each. - uint unk; - int unk2; - uint tattooCollectionHash; - uint tattooNameHash; - int unk3; - TattooZoneData zoneId; - uint unk4; - uint unk5; - // maybe more, not sure exactly, decompiled scripts are very vague around this part. - } - ``` - - - - - Returns the zoneID for the overlay if it is a member of collection. - enum TattooZoneData - { - ZONE_TORSO = 0, - ZONE_HEAD = 1, - ZONE_LEFT_ARM = 2, - ZONE_RIGHT_ARM = 3, - ZONE_LEFT_LEG = 4, - ZONE_RIGHT_LEG = 5, - ZONE_UNKNOWN = 6, - ZONE_NONE = 7, - }; - - - - - This get's the height of the FONT and not the total text. You need to get the number of lines your text uses, and get the height of a newline (I'm using a smaller value) to get the total text height. - - - - - Determines how many lines the text string will use when drawn on screen. - Must use _BEGIN_TEXT_COMMAND_LINE_COUNT for setting up - - - - - Returns a substring of a specified length starting at a specified position. - Example: - // Get "STRING" text from "MY_STRING" - subStr = UI::_GET_TEXT_SUBSTRING("MY_STRING", 3, 6); - - - - - Returns a substring of a specified length starting at a specified position. The result is guaranteed not to exceed the specified max length. - NOTE: The 'maxLength' parameter might actually be the size of the buffer that is returned. More research is needed. -CL69 - Example: - // Condensed example of how Rockstar uses this function - strLen = UI::GET_LENGTH_OF_LITERAL_STRING(GAMEPLAY::GET_ONSCREEN_KEYBOARD_RESULT()); - subStr = UI::_GET_TEXT_SUBSTRING_SAFE(GAMEPLAY::GET_ONSCREEN_KEYBOARD_RESULT(), 0, strLen, 63); - -- - "fm_race_creator.ysc", line 85115: - // parameters modified for clarity - BOOL sub_8e5aa(char *text, int length) { - for (i = 0; i <= (length - 2); i += 1) { - if (!GAMEPLAY::ARE_STRINGS_EQUAL(UI::_GET_TEXT_SUBSTRING_SAFE(text, i, i + 1, 1), " ")) { - return FALSE; - } - } - return TRUE; - } - - - - - Returns a substring that is between two specified positions. The length of the string will be calculated using (endPosition - startPosition). - Example: - // Get "STRING" text from "MY_STRING" - subStr = UI::_GET_TEXT_SUBSTRING_SLICE("MY_STRING", 3, 9); - // Overflows are possibly replaced with underscores (needs verification) - subStr = UI::_GET_TEXT_SUBSTRING_SLICE("MY_STRING", 3, 10); // "STRING_"? - - - - - Return the content modifier id (the tunables context if you want) of a specific content. - It takes the content hash (which is the mission id hash), and return the content modifier id, used as the tunables context. - The mission id can be found on the Social club, for example, 'socialclub.rockstargames.com/games/gtav/jobs/job/A8M6Bz8MLEC5xngvDCzGwA' - 'A8M6Bz8MLEC5xngvDCzGwA' is the mission id, so the game hash this and use it as the parameter for this native. - - - - - Returns the user's defined langauge as ID - english: 12 - french = 7 - german = 22 - italian = 21 - japanese = 9 - korean = 17 - portuguese = 16 - spanish = 10 - russian = 25 - - - - - console hash: 0xC589CD7D = GET_UTC_TIME - gets current UTC time - - - - - Get the vehicle attached to the object/entity? May also just convert it to a vehicle, but I'm not sure. - - - - - 0 min 100 max - starts at 100 - Seams to have health zones - Front of vehicle when damaged goes from 100-50 and stops at 50. - Rear can be damaged from 100-0 - Only tested with two cars. - any idea how this differs from the first one? - -- - May return the vehicle health on a scale of 0.0 - 100.0 (needs to be confirmed) - example: - v_F = ENTITY::GET_ENTITY_MODEL(v_3); - if (((v_F == ${tanker}) || (v_F == ${armytanker})) || (v_F == ${tanker2})) { - if (VEHICLE::_GET_VEHICLE_BODY_HEALTH_2(v_3) <= 1.0) { - NETWORK::NETWORK_EXPLODE_VEHICLE(v_3, 1, 1, -1); - } - } - - - - - GET_VEHICLE_CLASS_MAX_* - - - - - Returns the headlight color index from the vehicle. Value between 0, 12. - Use [\_SET_VEHICLE_HEADLIGHTS_COLOUR](#_0xE41033B25D003A07) to set the headlights color for the vehicle. - Must enable xenon headlights before it'll take affect. - - List of colors and ids: - - ``` - enum headlightColors { - Default = -1, - White = 0, - Blue = 1, - Electric_Blue = 2, - Mint_Green = 3, - Lime_Green = 4, - Yellow = 5, - Golden_Shower = 6, - Orange = 7, - Red = 8, - Pony_Pink = 9, - Hot_Pink = 10, - Purple = 11, - Blacklight = 12 - } - ``` - - - - - Seems to get the hash of the vehicle's currently installed horn? - - - - - A float indicating the percentage of the hover mode. 1.0 = in VTOL mode, 0.0 = in normal flying mode. - - - - - GET_VEHICLE_MODEL_* - 9.8 * thrust if air vehicle, else 0.38 + drive force? - For a full list, see here: pastebin.com/bJQeDqNd - - - - - GET_VEHICLE_MODEL_MAX_* - max braking if air vehicle, else max braking + 0.1 - ------------------- - For a full list, see here: pastebin.com/Cb9L1Cn0 - - - - - GET_VEHICLE_MODEL_* - Function pertains only to aviation vehicles. - For a full list, see here: pastebin.com/JwuGNp2K - - - - - Returns max speed (without mods) of the specified vehicle model in m/s. - For a full list, see here: pastebin.com/AUuHHK06 - GET_VEHICLE_MODEL_* - - - - - GET_VEHICLE_MODEL_* - called if the vehicle is a boat -- returns vecMoveResistanceX? - For a full list, see here: pastebin.com/Pyb2RhZ9 - - - - - Can be used for IS_DLC_VEHICLE_MOD and _0xC098810437312FFF - - - - - Gets the color of the neon lights of the specified vehicle. - See _SET_VEHICLE_NEON_LIGHTS_COLOUR (0x8E0A582209A62695) for more information - - - - - The resulting entity can be a Vehicle or Ped. - The native is stored between GET_VEHICLE_LIVERY_COUNT and GET_VEHICLE_MAX_BRAKING so the actual name is either GET_VEHICLE_L* or GET_VEHICLE_M* - ========================= - on a side note watching changes in memory this will only store your ped's entityPoolAddress if it's your personal vehicle. So seems to be related to personal vehicles or atleast a specific decor of it maybe. - - - - - Gets the height of the vehicle's suspension. - The higher the value the lower the suspension. Each 0.002 corresponds with one more level lowered. - 0.000 is the stock suspension. - 0.008 is Ultra Suspension. - - - - - This native does not return damages of weapons from the melee and explosive group. - - - - - returns the weapon hash of pickup - - - - - changed any --> hash - progress_or_time --> percentWeather2, is not time but percent of the 2nd weather (0-1). - weatherType1 is same as GAMEPLAY::GET_PREV_WEATHER_TYPE_HASH_NAME() - and weatherType 2 GAMEPLAY::GET_NEXT_WEATHER_TYPE_HASH_NAME() - -QuantFC - - - - - Console Hash - - - - - This native appears on the cheat_controller script and tracks a combination of buttons, which may be used to toggle cheats in-game. Credits to ThreeSocks for the info. The hash contains the combination, while the "amount" represents the amount of buttons used in a combination. The following page can be used to make a button combination: gta5offset.com/ts/hash/ - INT_SCORES_SCORTED was a hash collision - - - - - Get inputted "Cheat code", for example: - while (TRUE) - { - if (GAMEPLAY::_557E43C447E700A8(${fugitive})) - { - // Do something. - } - SYSTEM::WAIT(0); - } - Calling this will also set the last saved string hash to zero. - - - - - Check to see if hud component Scaleform has loaded? - - - - - Pretty sure it's the real name (not 100% sure so I added the _ prefix); can someone else confirm it? - Only values used in the scripts are: - "heist_mp" - "heistmap_mp" - "instructional_buttons" - "heist_pre" - - - - - Console Hash - - - - - This is the native that is used to hide the exterior of GTA Online apartment buildings when you are inside an apartment. - More info: http://gtaforums.com/topic/836301-hiding-gta-online-apartment-exteriors/ - - - - - draws circular marker at pos - -1 = none - 0 = red - 1 = green - 2 = blue - 3 = green larger - 4 = nothing - 5 = green small - - - - - if "flag" is true, the AI blip will always be displayed for the specified ped, if it has an AI blip - If "flag" is false, the AI blip will only be displayed when the player is in combat with the specified ped, if it has an AI blip - - - - - Seems to return true if the input is currently disabled. "_GET_LAST_INPUT_METHOD" didn't seem very accurate, but I've left the original description below. - -- - index usually 2 - returns true if the last input method was made with mouse + keyboard, false if it was made with a gamepad - 0, 1 and 2 used in the scripts. 0 is by far the most common of them. - - - - - I may be wrong with this one, but from the looks of the scripts, it sets keyboard related stuff as soon as this returns true. - 0, 1 and 2 used in the scripts. 0 is by far the most common of them. - - - - - Returns a bool if interior rendering is disabled, if yes, all "normal" rendered interiors are invisible - - - - - Only occurrence was false, in maintransition. - - - - - Gets whether or not NIGHTVISION is Active. - Note: When nightvision is actually active, this native will return TRUE! - - - - - List of component/props ID - gtaxscripting.blogspot.com/2016/04/gta-v-peds-component-and-props.html - - - - - Console Hash: 0xDD5D08A7 - - - - - Pickup hashes: pastebin.com/8EuSv2r1 - - - - - Returns true when the player is not able to control the cam i.e. when running a benchmark test, switching the player or viewing a cutscene. - Note: I am not 100% sure if the native actually checks if the cam control is disabled but it seems promising. - - - - - Dr. Underscore (1/6/18): - Checks if the projectile is in the radius around that point. - p6 is (most likely) ownedByPlayer. (see IS_PROJECTILE_IN_AREA for info) - - - - - Checks if you're recording, returns TRUE when you start recording (F1) or turn on action replay (F2) - mov al, cs:g_bIsRecordingGameplay // byte_141DD0CD0 in b944 - retn - - - - - if(NETWORK::_IS_ROCKSTAR_BANNED() == 0) means the player is rockstar banned - - - - - Returns whether or not SEETHROUGH is active. - - - - - if(_IS_SOCIALCLUB_BANNED() == 0) means the player is social club banned - - - - - Returns whether or not the text chat (MULTIPLAYER_CHAT Scaleform component) is active. - - - - - Checks if model is a boat, then checks for FLAG_IS_JETSKI. - @whoever named this _IS_THIS_MODEL_AN_EMERGENCY_BOAT: please do some tests before naming natives, thanks. - - - - - Appears to return true if the vehicle has any damage, including cosmetically. - - - - - Only ever used once in decompiled scripts: **am_pi_menu**: - Returns true if the engine is on fire, or if the vehicle engine health is &lt; 0 and it **has been** on fire. - - It sometimes doesn't return true when the vehicle engine has been on fire, and has since been fixed. I'm not really sure what the exact conditions are. - - This usually returns true even if there are no visible flames yet (engine health > 0). However if you monitor engine health you'll see that it starts decreasing as soon as this returns true. - - ``` - if (((ENTITY::DOES_ENTITY_EXIST(Global_1281959) && !ENTITY::IS_ENTITY_DEAD(Global_1281959, 0)) && func_1545(Global_1281959)) && !func_205(PLAYER::PLAYER_ID())) - { - if (VEHICLE::GET_VEHICLE_ENGINE_HEALTH(Global_1281959) > 0f && VEHICLE::GET_IS_VEHICLE_ENGINE_RUNNING(Global_1281959)) - { - bVar0 = true; - } - else - { - bVar0 = false; - } - if (VEHICLE::_0xEC69ADF931AAE0C3(Global_1281959)) // _IS_VEHICLE_ENGINE_ON_FIRE - { - bVar0 = false; - } - } - ``` - - - - - Returns whether or not the vehicle has a CVehicleStreamRequestGfx that's trying to load mods. - True if it isn't loading mods, false if it is. - - - - - indices: - 0 = Left - 1 = Right - 2 = Front - 3 = Back - - - - - Checks for FLAG_NO_RESPRAY - - - - - When I called this with what the script was doing, which was -190f for yaw pitch and roll, all my car did was jitter a little. I also tried 0 and 190f. I altered the p1 variable between TRUE and FALSE and didn't see a difference. - This might have something to do with the physbox of the vehicle, but I'm not sure. - - - - - Load interior - - - - - Loads "common:/data/missioncreatordata" data and sets some values. - - - - - This loads the GTA:O dlc map parts (high end garages, apartments). - Works in singleplayer. - In order to use GTA:O heist IPL's you have to call this native with the following params: _9BAE5AD2508DF078(1); - console hash: 0xC65586A9 - - - - - Loads specified video sequence into the TV Channel - TV_Channel ranges from 0-2 - VideoSequence can be any of the following: - "PL_STD_CNT" CNT Standard Channel - "PL_STD_WZL" Weazel Standard Channel - "PL_LO_CNT" - "PL_LO_WZL" - "PL_SP_WORKOUT" - "PL_SP_INV" - Jay Norris Assassination Mission Fail - "PL_SP_INV_EXP" - Jay Norris Assassination Mission Success - "PL_LO_RS" - Righteous Slaughter Ad - "PL_LO_RS_CUTSCENE" - Righteous Slaughter Cut-scene - "PL_SP_PLSH1_INTRO" - "PL_LES1_FAME_OR_SHAME" - "PL_STD_WZL_FOS_EP2" - "PL_MP_WEAZEL" - Weazel Logo on loop - "PL_MP_CCTV" - Generic CCTV loop - Restart - 0=video sequence continues as normal - 1=sequence restarts from beginning every time that channel is selected - - - - - Loads a User-Generated Content (UGC) file. These files can be found in "[GTA5]\data\ugc" and "[GTA5]\common\patch\ugc". They seem to follow a naming convention, most likely of "[name]_[part].ugc". See example below for usage. - Returns whether or not the file was successfully loaded. - Example: - DATAFILE::_LOAD_UGC_FILE("RockstarPlaylists") // loads "rockstarplaylists_00.ugc" - - - - - Not present in retail version of the game, actual definiton seems to be - _LOG_DEBUG_INFO(char* category, char* debugText); - - - - - is this like setting is as no longer needed? - - - - - For move the finger of player, the value of int goes 1 at 5. - - - - - Console Hash - 0x18867C61 = NETWORK_ACCESS_TUNABLE_BOOL_HASH - - - - - Returns a default value if the tunable don't exist. - Console Hash - - - - - Console Hash - 0x3972551F = NETWORK_ACCESS_TUNABLE_FLOAT_HASH - - - - - Console Hash - 0xB2E83B75 = NETWORK_ACCESS_TUNABLE_INT_HASH - - - - - Console hash: 0xCD69BEA1 - - - - - Returns whether the Rockstar game services are available or not: - SCLB_NO_ROS = The Rockstar game services are unavailable right now. Please try again later. - ros.rockstargames.com - - - - - this function is toggle when people report you and you get the auto mute message - - - - - console hash: 0x3624F054 - - - - - Only documented... - - - - - netScene to scene - - - - - console hash: 0x99F58A07 - Sadly I thought this copied their tattoos, but it just seems to copy their 'blend data'. E.G. skin tone/color, fat/skinny face, etc. - - - - - Console Hash - 0x25915CB9 = NETWORK_DOES_TUNABLE_EXIST_HASH - - - - - Console Hash - 0xA14CC95D = NETWORK_EARN_FROM_AMBIENT_JOB - Example for p1: "AM_DISTRACT_COPS" - - - - - For the money bags that drop a max of $40,000. Often called 40k bags. - Most likely NETWORK_EARN_FROM_ROB*** - MONEY_EARN_JOBS - - - - - Console Hash - 0xAB6BD72F = NETWORK_EARN_FROM_DAILY_OBJECTIVE - - - - - MONEY_EARN_PICKED_UP - - - - - Console Hash - 0xBEE23713 = NETWORK_EARN_FROM_JOB_BONUS - - - - - Console Hash: Probably 0xAA7EA3BD - - - - - Seems to always return 0, but it's used in quite a few loops. - for (num3 = 0; num3 < NETWORK::0xCCD8C02D(); num3++) - { - if (NETWORK::NETWORK_IS_PARTICIPANT_ACTIVE(PLAYER::0x98F3B274(num3)) != 0) - { - var num5 = NETWORK::NETWORK_GET_PLAYER_INDEX(PLAYER::0x98F3B274(num3)); - - - - - Returns the coordinates of another player. - - Does not work if you enter your own player id as p0 (will return `(0.0, 0.0, 0.0)` in that case). - - - - - Same as GAMEPLAY::GET_RANDOM_INT_IN_RANGE - - - - - console hash: 0x5AC9F04D = network_hash_from_gamer_handle - - - - - console hash: 0xF8D7AF3B = NETWORK_HASH_FROM_PLAYER_HANDLE - - - - - console hash: 0xD14D9C07 - - - - - NETWORK_ARE_* - - - - - p1 = 6 - NETWORK_CRC_HASH_CHECK? - - - - - Same as _IS_TEXT_CHAT_ACTIVE, except it does not check if the text chat HUD component is initialized, and therefore may crash. - - - - - Console Hash: 0x6C344AE3 - "NETWORK_OVERRIDE_SEND_RESTRICTIONS" is right, but dev-c put a _ by default. - This is used alongside the native, - 'NETWORK_OVERRIDE_RECEIVE_RESTRICTIONS'. Read it's description for more info. - - - - - fuck this function in particular. - It's similar to unk_0x9A176B6E but this ones got a different stat hash: - 0xBC707798 - - - - - NETWORK_PLAYER_??? - - - - - NETWORK_REQUEST_CLOUD_BACKGROUND_SCRIPTS - Correct console hash is 0x98EFB921 - Start the downloading of BG_NG.RPF from R* Cloud which contains hotfix. - The console hash given is incorrect for Xbox360 that is. I searched in IDA and found 0x98EFB921 which came right after 0x155465EE. Then I searched it in TU27 X360 scripts and found it was the same results same scripts as the PC Hash for this which is obviously correct. I found the correct one as I noticed TU27 X360 script search pulled no results for 0x29532731 when it should have. - As you can see here you will see the 155465EE first then the correct hash for this native. Then the current 29532731 one which could be the native below or the native below's hash could be the has below the 29532731 - puu.sh/nhdQI/e0ca5567b4.png - 0x98EFB921 is the correct console hash for "_DOWNLOAD_BG_SCRIPT_RPF". 0x29532731 is "_HAS_BG_SCRIPT_BEEN_DOWNLOADED" - The code: - seg001:00000000003EFF4C uunk_0x29532731: # CODE XREF: sub_158C8AC+14p - seg001:00000000003EFF4C lis r3, dword_1CFB100@ha - seg001:00000000003EFF50 lwz r3, dword_1CFB100@l(r3) - seg001:00000000003EFF54 ld r3, 0x1020(r3) - seg001:00000000003EFF58 extsw r3, r3 - seg001:00000000003EFF5C blr - seg001:00000000003EFF5C # End of function uunk_0x29532731 - - - - - p4 and p5 are always 0 in scripts - - - - - p0 = 0 or 4 - - - - - String "NETWORK_SEND_PRESENCE_TRANSITION_INVITE" is contained in the function in ida so this one is correct. - - - - - BLR the shit. - - - - - if set to true other network players can't see it - if set to false other network player can see it - ========================================= - ^^ I attempted this by grabbing an object with GET_ENTITY_PLAYER_IS_FREE_AIMING_AT and setting this naive no matter the toggle he could still see it. - pc or last gen? - ^^ last-gen - - - - - This is called shortly after setting Network ID Migration off it seems. Does anyone know the point of this? - Example scenario, - If I were to request and gain control of an online players vehicle then their vehicle's Network ID and turn migration off. I wouldn't need to ever request control again as they wouldn't gain control back. - - scenario over - - So what would be the point hereafter of setting it 'dynamic'? - - - - - NETWORK_SET_RICH_PRESENCE but for PlayStation? (On PC it's a nullsub) - - - - - p0 is pointer to a script array - - - - - p0 => unk3::_network_shop_basket_apply_server_data(Global_2590199[iParam0 -- [[76]] ], &uVar6); => script array - - - - - No longer works if you hook it as a stealth money method - Modes------------------ - 1: Wallet - 2: Bank - 4: Bank - 8: Wallet - Only difference I noticed. - - - - - Belongs in UNK3, non-hashed version of 0x247F0F73A182EA0B - - - - - ex.: - v_15 = sub_10cc8(VEHICLE::GET_VEHICLE_WHEEL_TYPE(a_2)); - if (!MOBILE::_247F0F73A182EA0B(v_15)) { - return 1; - } - Belongs in UNK3, hashed version of 0xBD4D7EAF8A30F637 - - - - - bool is always true in game scripts - - - - - Will cancel the transaction - - - - - Console Hash 0xF4287778 = NETWORK_SPENT_REQUEST_HEIST - - - - - used in atm_trigger script. - usage: - int iVar0;STATS::STAT_GET_INT(GAMEPLAY::GET_HASH_KEY("mpply_last_mp_char"), &iVar0, -1); - UNK3::_NETWORK_TRANSFER_WALLET_TO_BANK(iVar0, amount); - used to deposit money into bank from wallet, shows up in transaction log. - - - - - used in atm_trigger script. - usage: - int iVar0; STATS::STAT_GET_INT(GAMEPLAY::GET_HASH_KEY("mpply_last_mp_char"), &iVar0, -1); - UNK3::_NETWORK_TRANSFER_BANK_TO_WALLET(iVar0, amount); - used to withdraw money from bank into wallet, shows up in transaction log. - - - - - Only one occurence in the scripts: - auto sub_cb43(auto a_0, auto a_1) { - if (g_2594CB._f1) { - if (NETWORK::_855BC38818F6F684()) { - NETWORK::_ABD5E88B8A2D3DB2(&a_0._fB93); - g_2594CB._f14 -- [[{13}]] = a_0._fB93; - g_2594CB._f4 -- [["64"]] = a_1; - return 1; - } - } - return 0; - } - other: - looks like it passes a player in the paramater - Contains string "NETWORK_VOICE_CONNECT_TO_PLAYER" in ida - - - - - Sets the value of the specified variable to 0. - Always returns true. - bool _NULLIFY(void* variable, int unused) - { - *variable = NULL; - return true; - } - - - - - Types: - 1 = Boolean - 2 = Integer - 3 = Float - 4 = String - 5 = Vector3 - 6 = Object - 7 = Array - - - - - [23.03.2017 19:08] by ins1de : - "_IS_PED_RELOADING" is totally a wrong name... - This native actually disables the reloading animation and script for the specified ped. Native renamed. - - - - - Plays ambient speech. See also _0x444180DB. - ped: The ped to play the ambient speech. - speechName: Name of the speech to play, eg. "GENERIC_HI". - speechParam: Can be one of the following: - SPEECH_PARAMS_STANDARD - SPEECH_PARAMS_ALLOW_REPEAT - SPEECH_PARAMS_BEAT - SPEECH_PARAMS_FORCE - SPEECH_PARAMS_FORCE_FRONTEND - SPEECH_PARAMS_FORCE_NO_REPEAT_FRONTEND - SPEECH_PARAMS_FORCE_NORMAL - SPEECH_PARAMS_FORCE_NORMAL_CLEAR - SPEECH_PARAMS_FORCE_NORMAL_CRITICAL - SPEECH_PARAMS_FORCE_SHOUTED - SPEECH_PARAMS_FORCE_SHOUTED_CLEAR - SPEECH_PARAMS_FORCE_SHOUTED_CRITICAL - SPEECH_PARAMS_FORCE_PRELOAD_ONLY - SPEECH_PARAMS_MEGAPHONE - SPEECH_PARAMS_HELI - SPEECH_PARAMS_FORCE_MEGAPHONE - SPEECH_PARAMS_FORCE_HELI - SPEECH_PARAMS_INTERRUPT - SPEECH_PARAMS_INTERRUPT_SHOUTED - SPEECH_PARAMS_INTERRUPT_SHOUTED_CLEAR - SPEECH_PARAMS_INTERRUPT_SHOUTED_CRITICAL - SPEECH_PARAMS_INTERRUPT_NO_FORCE - SPEECH_PARAMS_INTERRUPT_FRONTEND - SPEECH_PARAMS_INTERRUPT_NO_FORCE_FRONTEND - SPEECH_PARAMS_ADD_BLIP - SPEECH_PARAMS_ADD_BLIP_ALLOW_REPEAT - SPEECH_PARAMS_ADD_BLIP_FORCE - SPEECH_PARAMS_ADD_BLIP_SHOUTED - SPEECH_PARAMS_ADD_BLIP_SHOUTED_FORCE - SPEECH_PARAMS_ADD_BLIP_INTERRUPT - SPEECH_PARAMS_ADD_BLIP_INTERRUPT_FORCE - SPEECH_PARAMS_FORCE_PRELOAD_ONLY_SHOUTED - SPEECH_PARAMS_FORCE_PRELOAD_ONLY_SHOUTED_CLEAR - SPEECH_PARAMS_FORCE_PRELOAD_ONLY_SHOUTED_CRITICAL - SPEECH_PARAMS_SHOUTED - SPEECH_PARAMS_SHOUTED_CLEAR - SPEECH_PARAMS_SHOUTED_CRITICAL - Note: A list of Name and Parameters can be found here pastebin.com/1GZS5dCL - Full list of speeches and voices names by some spanish shitbag: gist.github.com/alexguirre/0af600eb3d4c91ad4f900120a63b8992 - - - - - Plays ambient speech. See also _0x5C57B85D. - See _PLAY_AMBIENT_SPEECH1 for parameter specifications. - Full list of speeches and voices names: gist.github.com/alexguirre/0af600eb3d4c91ad4f900120a63b8992 - - - - - This is the same as _PLAY_AMBIENT_SPEECH1 and _PLAY_AMBIENT_SPEECH2 but it will allow you to play a speech file from a specific voice file. It works on players and all peds, even animals. - EX (C#): - GTA.Native.Function.Call(Hash._0x3523634255FC3318, Game.Player.Character, "GENERIC_INSULT_HIGH", "s_m_y_sheriff_01_white_full_01", "SPEECH_PARAMS_FORCE_SHOUTED", 0); - The first param is the ped you want to play it on, the second is the speech name, the third is the voice name, the fourth is the speech param, and the last param is usually always 0. - Full list of speeches and voices names: gist.github.com/alexguirre/0af600eb3d4c91ad4f900120a63b8992 - - - - - Pushes a boolean for the Scaleform function onto the stack. - - - - - This method is the equivalent to PUSH_SCALEFORM_MOVIE_FUNCTION_PARAMETER_STRING when using it to add a new button (like "INSTRUCTIONAL_BUTTONS"). - When switching with a controller, the icons update and become the controller's icons. - - - - - Pushes a float for the Scaleform function onto the stack. - - - - - Pushes an integer for the Scaleform function onto the stack. - - - - - GRAPHICS::\_0x77FE3402004CD1B0(HUD::\_GET_LABEL_TEXT("YACHT_GSY")); - GRAPHICS::\_0x77FE3402004CD1B0(PLAYER::GET_PLAYER_NAME(PLAYER::PLAYER_ID())); - - Both \_0xBA7148484BD90365 / \_0x77FE3402004CD1B0 works, but \_0x77FE3402004CD1B0 is usually used for "name" (organisation, players..). - - - - - p0 is the handle returned from _0xFDBF4CDBC07E1706 - - - - - Removes the loading prompt at the bottom right of the screen, created by the UI::_SHOW_LOADING_PROMPT native. - - - - - assetName = For example "core" - console hash: 0xC44762A1 - - - - - Removes a notification instantly instead of waiting for it to disappear - - - - - Used to remove a speedzone. - This is the speed zone native. - Example usage C#: - uint speedZone = Function.Call<uint>((Hash) 0x2CE544C68FB812A0, Game.PlayerPed.Position.X, Game.PlayerPed.Position.Y, Game.PlayerPed.Position.Z, 100.0f, 0.0f, false); - bool speedZoneClosed = Function.Call<bool>((Hash) 0x1033371FC8E842A7, speedZone); - (Thanks to alexguirre for his help!) - - - - - Appears to remove stealth kill action from memory. - ------------------------------------ - I agree with the above statement. - p1 is unknown, my best guess would be if false it marks the stealth kill for immediate deletion, or if true marks it for deletion later. - - - - - This native makes the gameplay camera zoom into first person/third person with a special effect. - For example, if you were first person in a mission and after the cutscene ends, the camera would then zoom into the first person camera view. - if (CAM::GET_FOLLOW_PED_CAM_VIEW_MODE() != 4) - CAM::_C819F3CBB62BF692(1, 0, 3, 0) - This makes the camera zoom in to first person. - -------------------------------------------- - 1st Param Options: 0 or 1 (Changes quit often, toggle?) - 2nd Param Options: 0, 0f, 1f, 3.8f, 10f, 20f (Mostly 0) - 3rd Param Options: 3, 2, 1 (Mostly 3); - Note for the 2nd param 10f (offroad_race.c) and 3rd param 20f (range_modern.c) are the only times those 2 high floats are called. - Note for the 3rd param 2 is only ever set in (franklin0.c), but it also sets it as 3. (0, 0, 3) ||(0, 0f, 2) || (0, 0, 3) - - - - - Example: - CUTSCENE::_0xC23DE0E91C30B58C("JOSH_1_INT_CONCAT", 13, 8); - Cutscene list: pastebin.com/Bbj7ANpQ - - - - - http://gtaforums.com/topic/717612-v-scriptnative-documentation-and-research/?p=1068285912 - - - - - REQUEST_* - Something to do with interiors that have been loaded. - STREAMING::_8A7A40100EDFEC58(l_13BC, "V_FIB01_cur_elev"); - STREAMING::_8A7A40100EDFEC58(l_13BC, "limbo"); - STREAMING::_8A7A40100EDFEC58(l_13BB, "V_Office_gnd_lifts"); - STREAMING::_8A7A40100EDFEC58(l_13BB, "limbo"); - STREAMING::_8A7A40100EDFEC58(l_13BC, "v_fib01_jan_elev"); - STREAMING::_8A7A40100EDFEC58(l_13BC, "limbo"); - - - - - Similar to REQUEST_SCALEFORM_MOVIE, but seems to be some kind of "interactive" scaleform movie? - These seem to be the only scaleforms ever requested by this native: - "breaking_news" - "desktop_pc" - "ECG_MONITOR" - "Hacking_PC" - "TEETH_PULLING" - Note: Unless this hash is out-of-order, this native is next-gen only. - - - - - used for the remote vehicle explode thing with phones - - - - - Sets the waves intensity back to original (1.0 in most cases). - - - - - Sets (almost, not sure) all Rockstar Editor values (bIsRecording etc) to 0. - - - - - Resets the extra timecycle modifier strength normally set with [`SetExtraTimecycleModifierStrength`](#_0x2C328AF17210F009) - - - - - Sets the localplayer playerinfo state back to playing (State 0) - States are: - -1: "Invalid" - 0: "Playing" - 1: "Died" - 2: "Arrested" - 3: "Failed Mission" - 4: "Left Game" - 5: "Respawn" - 6: "In MP Cutscene" - - - - - console hash: 0x9E8D8B72 - Resets the effect of _SET_PARTICLE_FX_ASSET_OLD_TO_NEW - - - - - There seem to be 26 flags - - - - - It returns two lol - li r3, 2 - blr - thats all it does. - mov dword ptr [rax], 2 - Заебись функционал - - - - - Returns the status of a _SC_START_CHECK_STRING_TASK task. - Possible return values: - 0: not a profane string - 1: a profane string - 3: server error occurred - - - - - Returns the nickname of the logged-in Rockstar Social Club account. - - - - - Returns whether or not a task started with _SC_START_CHECK_STRING_TASK has completed. - - - - - Starts a task to check an entered string for profanity on the ROS/Social Club services. - See also: 1753344C770358AE, 82E4A58BABC15AE7. - - - - - This seems to be related to Steam achievements. - p0 and p1 are int (?) - ------ - Can't say anything about the Steam version but it is hardcoded to always return false in the retail version. - Dr. Underscore (1/6/18): - This has to do with achievement progression. If this achievement has progression, it will set the progression of it to this value. - Only tested on un-achieved achievements, Steamworks probably just rejects it if it has already been achieved. - Steamworks also seems to not like reversing achievement progression. - - - - - Sets the amount of bombs that this vehicle has. As far as I know, this does _not_ impact vehicle weapons or the ammo of those weapons in any way, it is just a way to keep track of the amount of bombs in a specific plane. - - In decompiled scripts this is used to deduct from or add to the count whenever bombs are dropped or purchased/restocked. - - Use [`_GET_AIRCRAFT_BOMB_COUNT`](#_0xEA12BD130D7569A1) to get the amount of bombs on that vehicle. - - - - - Similar to [`_SET_AIRCRAFT_BOMB_COUNT`](#_0xF4B2ED59DEB5D774), this sets the amount of countermeasures that are present on this vehicle. - - Use [`_GET_AIRCRAFT_COUNTERMEASURE_COUNT`](#_0xF846AA63DF56B804) to get the current amount. - - - - - Previously named _0x97C65887D4B37FA9. - Sets the maximum view distance for the AI BIP - - - - - Set a ped's AI blip type: - 1 - Yellow blip with no name - 2 - - - - - Only works on bikes, both X and Y work in the -1 - 1 range. - X forces the bike to turn left or right (-1, 1) - Y forces the bike to lean to the left or to the right (-1, 1) - Example with X -1/Y 1 - http://i.imgur.com/TgIuAPJ.jpg - - - - - Makes a blip go small when off the minimap. - - - - - This native has its name defined inside its codE - - - - - This native has a name defined inside its code - - - - - This native has a name defined inside its code - - - - - This native has a name defined inside its code - - - - - if p0 is 0, effect is cancelled - if p0 is 1, effect zooms in, gradually tilts cam clockwise apx 30 degrees, wobbles slowly. Motion blur is active until cancelled. - if p0 is 2, effect immediately tilts cam clockwise apx 30 degrees, begins to wobble slowly, then gradually tilts cam back to normal. The wobbling will continue until the effect is cancelled. - - - - - For now, I changed the last one from bool to int. - According to scripts specifically 'fm_mission_controller' this last parameter is 'false/0' when its called after the create rope native above is called for the magnet and 'true/1' after the create rope native above is called for the hook. - - - - - Console Hash: 0xF57066DA - Won't attract or magnetize to any helicopters or planes of course, but that's common sense. - - - - - console hash 0xCC3CF97D - - - - - Something to do with "high speed bump severity"? - if (!sub_87a46("SET_CAR_HIGH_SPEED_BUMP_SEVERITY_MULTIPLIER")) { - VEHICLE::_84FD40F56075E816(0.0); - sub_8795b("SET_CAR_HIGH_SPEED_BUMP_SEVERITY_MULTIPLIER", 1); - } - - - - - Sets the checkpoint icon color. - - - - - p0 - Scale? Looks to be a normalized value (0.0 - 1.0) - offroad_races.c4, line ~67407: - a_3._f7 = GRAPHICS::CREATE_CHECKPOINT(v_D, v_A, a_4, a_7, v_E, v_F, v_10, sub_62b2(v_A, 220, 255), 0); - UI::GET_HUD_COLOUR(134, &v_E, &v_F, &v_10, &v_11); - GRAPHICS::_SET_CHECKPOINT_ICON_RGBA(a_3._f7, v_E, v_F, v_10, sub_62b2(v_A, 70, 210)); - GRAPHICS::_4B5B4DA5D79F1943(a_3._f7, 0.95); - GRAPHICS::SET_CHECKPOINT_CYLINDER_HEIGHT(a_3._f7, 4.0, 4.0, 100.0); - - - - - This is for simulating player input. - amount is a float value from 0 - 0, 1 and 2 used in the scripts. 0 is by far the most common of them. - - - - - Sets a value that determines how aggressive the ocean waves will be. Values of 2.0 or more make for very aggressive waves like you see during a thunderstorm. - Works only ~200 meters around the player. - - - - - Renamed to SET_CURSOR_LOCATION (I previously named it _SET_CURSOR_POSTION) which is the correct name as far as I can tell. - - - - - Changes the mouse cursor's sprite. - public enum CursorType - { - None = 0, - Normal = 1, - TransparentNormal = 2, - PreGrab = 3, - Grab = 4, - MiddleFinger = 5, - LeftArrow = 6, - RightArrow = 7, - UpArrow = 8, - DownArrow = 9, - HorizontalExpand = 10, - Add = 11, - Remove = 12, - } - - - - - Specifies a custom respawn position to be used in conjunction with _SET_NEXT_RESPAWN_TO_CUSTOM - - - - - MulleDK19: This starts moving the VTOL engines towards the specified angle ratio (0f-1f). - - - - - Defines the state of a destructible object. - Use the "0xB48FCED898292E52" native to find an object's handle with its name / coords - State 2 == object just spawned - State 4 == Beginning of the animation - State 6 == Start animation - State 9 == End of the animation - - - - - If toggle is true, hides special ability bar / character name in the pause menu - If toggle is false, shows special ability bar / character name in the pause menu - - - - - Sets the acceleration limit of a door. - How fast it can open, or the inverse hinge resistance. - A limit of 0 seems to lock doors. - p2 is always 0, p3 is always 1. - - - - - Sets the ajar angle of a door. - Ranges from -1.0 to 1.0, and 0.0 is closed / default. - p2 is always 0, p3 is always 1. - - - - - console hash: 0xBD0D4831 - internally it calls the same function as 'SET_ENTITY_COLLISION'. but uses a hard coded parameter that only activates when p1 is set to true - ============================= - Weirdly enough in the 3 scripts it's used in on PC, - - director_mode (2 hits) - - re_duel (2 hits) - - re_seaplane (1 hit) - Most of the time in the hits its actually used after the normal SET_ENTITY_COLLISION. Example from re_seaplane, - Local_49[iParam0 -- [[6]] ] = create_ped(26, iVar4, vVar0, fVar3, 1, true); - set_entity_collision(Local_49[iParam0 -- [[6]] ], iVar42, 0); - _0x9EBC85ED0FFFE51C(Local_49[iParam0 -- [[6]] ], !iVar66, 0); (_SET_ENTITY_COLLISION_2) - iVar42 being true so the normal collision native is true, 0 - iVar66 being false so !false so it's true, 0 - Gonna ignore the 'vars' for the create_ped no point in defining them. - - - - - does the same as SET_ENTITY_COORDS. - Console Hash: 0x749B282E - - - - - what does this native do? - bool IsEntitySomething(Entity entity) - { - auto addr = getScriptHandleBaseAddress(entity); - printf("addr: 0x%X \n", addr); - if (addr) - { - DWORD flag = *(DWORD *)(addr + 0x48D); - printf("flag: 0x%X \n", flag); - return ((flag & (1 << 3)) != 0) || ((flag & (1 << 30)) != 0); - } - return false; - } - wot ? - - - - - Sets a secondary timecycle modifier. - - - - - The same as [`SetTimecycleModifierStrength`](#_0x82E7FFCD5B2326B3) but for the secondary tiemcycle modifier. - - - - - When this is set to ON, shadows only draw as you get nearer. - When OFF, they draw from a further distance. (((BUT))) f*ck up nearer shadows quality. - - - - - Sets the near clipping plane of the first person camera. - - - - - Similar to _CLAMP_GAMEPLAY_CAM_PITCH except this is specifically for the FP camera, and it only lets you clamp the pitch within the normal range. - - - - - Override the area where the camera will render the terrain. - p3, p4 and p5 are usually set to 0.0 - - - - - Forces footstep tracks on all surfaces. - - - - - Forces vehicle trails on all surfaces. - - - - - Does nothing - - - - - value between 0.0 and 1.0 - - - - - HUD colors and their values: pastebin.com/d9aHPbXN - - - - - HUD colors and their values: pastebin.com/d9aHPbXN - -------------------------------------------------- - makes hudColorIndex2 color into hudColorIndex color - - - - - If toggle is true, the map is shown in full screen - If toggle is false, the map is shown in normal mode - - - - - Argument must be 0.0f or above 38.0f, or it will be ignored. - - - - - If true, the entire map will be revealed. - - - - - Similar to SET_MISSION_NAME but this one can take any string (must not be greater than 600 chars, should not exceed 64 chars), not just text labels. - p0 must be true. - - - - - Set's the string displayed when flag 3 (AudioSpeaker) active. - - - - - Displays a bunch of icons above the players name, and level, and their name twice - - - - - not tested.... - - - - - Original put name, - _SET_NETWORK_VEHICLE_NON_CONTACT - However changed to 'object' as the instances where this is called in scripts both freemode and golf it's only used on objects after the objects are called OBJ_TO_NET p_parachute_s (freemode) prop_golf_ball (golf). Tho the script search was done via TU27 Xbox360 ones. - Got my hopes up whoever put this as vehicle. I was hoping it was what R* used in non-contact races. - - - - - Sets the next spawn location to the position supplied to _SET_CUSTOM_RESPAWN_POSITION. - - - - - Toggles the North Yankton map - - - - - From the decompiled scripts: - UI::_92F0DA1E27DB96DC(6); - UI::_92F0DA1E27DB96DC(184); - UI::_92F0DA1E27DB96DC(190); - sets background color for the next notification - 6 = red - 184 = green - 190 = yellow - Here is a list of some colors that can be used: gyazo.com/68bd384455fceb0a85a8729e48216e15 - this seems to set the alpha to 255 automatically, if you have a work around let me know - - - - - sets font color for the next notification - - - - - sets color for notification flash - - - - - Sets some extra options for a notification. It adds an image (or icon type) and sets a notification title (sender) and subtitle (subject). - - Texture dictionary and texture name parameters are usually the same exact value. - - Example result: - - ![](https://i.imgur.com/LviutDl.png) - - Old description with list of possible icons and texture names: - - ```text - List of picNames: pastebin.com/XdpJVbHz - flash is a bool for fading in. - iconTypes: - 1 : Chat Box - 2 : Email - 3 : Add Friend Request - 4 : Nothing - 5 : Nothing - 6 : Nothing - 7 : Right Jumping Arrow - 8 : RP Icon - 9 : $ Icon - "sender" is the very top header. This can be any old string. - "subject" is the header under the sender. - ``` - - - - - List of picNames: pastebin.com/XdpJVbHz - - - - - Needs more research. - Only one type of usage in the scripts: - UI::_C6F580E4C94926AC("CHAR_ACTING_UP", "CHAR_ACTING_UP", 0, 0, "DI_FEED_CHAR", a_0); - - - - - NOTE: 'duration' is a multiplier, so 1.0 is normal, 2.0 is twice as long (very slow), and 0.5 is half as long. - Example, only occurrence in the scripts: - v_8 = UI::_1E6611149DB3DB6B("CHAR_SOCIAL_CLUB", "CHAR_SOCIAL_CLUB", 0, 0, &v_9, "", a_5); - - - - - List of picNames pastebin.com/XdpJVbHz - flash is a bool for fading in. - iconTypes: - 1 : Chat Box - 2 : Email - 3 : Add Friend Request - 4 : Nothing - 5 : Nothing - 6 : Nothing - 7 : Right Jumping Arrow - 8 : RP Icon - 9 : $ Icon - "sender" is the very top header. This can be any old string. - "subject" is the header under the sender. - "duration" is a multiplier, so 1.0 is normal, 2.0 is twice as long (very slow), and 0.5 is half as long. - "clanTag" shows a crew tag in the "sender" header, after the text. You need to use 3 underscores as padding. Maximum length of this field seems to be 7. (e.g. "MK" becomes "___MK", "ACE" becomes "___ACE", etc.) - - - - - List of picNames: pastebin.com/XdpJVbHz - flash is a bool for fading in. - iconTypes: - 1 : Chat Box - 2 : Email - 3 : Add Friend Request - 4 : Nothing - 5 : Nothing - 6 : Nothing - 7 : Right Jumping Arrow - 8 : RP Icon - 9 : $ Icon - "sender" is the very top header. This can be any old string. - "subject" is the header under the sender. - "duration" is a multiplier, so 1.0 is normal, 2.0 is twice as long (very slow), and 0.5 is half as long. - "clanTag" shows a crew tag in the "sender" header, after the text. You need to use 3 underscores as padding. Maximum length of this field seems to be 7. (e.g. "MK" becomes "___MK", "ACE" becomes "___ACE", etc.) - iconType2 is a mirror of iconType. It shows in the "subject" line, right under the original iconType. - int IconNotification(char *text, char *text2, char *Subject) - { - _SET_NOTIFICATION_TEXT_ENTRY("STRING"); - ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(text); - _SET_NOTIFICATION_MESSAGE_CLAN_TAG_2("CHAR_SOCIAL_CLUB", "CHAR_SOCIAL_CLUB", 1, 7, text2, Subject, 1.0f, "__EXAMPLE", 7); - return _DRAW_NOTIFICATION(1, 1); - } - - - - - Declares the entry type of a notification, for example "STRING". - int ShowNotification(char *text) - { - _SET_NOTIFICATION_TEXT_ENTRY("STRING"); - ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(text); - return _DRAW_NOTIFICATION(1, 1); - } - - - - - Seems to set the colour of the prop. Haven't really tested it on other props. - Only appears in am_mp_nightclub.c for the nightclub dancefloor. - - Not sure what p1 does, seems to only ever be '1' in scripts. - - - - - ` - i don't know what this does - ```<pre> - void __fastcall OBJECT___0x77F33F2CCF64B3AA_START(scrNativeCallContext *args) - { - bool p2; // bl@1 - CObject *pObject; // rax@1 - scrNativeCallContextArgStruct *pArgs; // rax@1 - pArgs = args->pArgs; - p2 = pArgs->a2.BOOL != 0; - pObject = getAddressOfObject(pArgs->a1.Object); - if ( pObject ) - { - pObject->field_425 &= 0xDFu; // 1101 1111 (clear bit 6) - pObject->field_425 |= 32 * p2; // bit 6 = p2 - } - } - // sfink - // note to AB: please set "white-space: pre" in css - ```` - - ``` - ## Parameters - * **object**: - * **p1**: - - - - - enum ObjectPaintVariants - { - Pacific = 0, - Azure = 1, - Nautical = 2, - Continental = 3, - Battleship = 4, - Intrepid = 5, - Uniform = 6, - Classico = 7, - Mediterranean = 8, - Command = 9, - Mariner = 10, - Ruby = 11, - Vintage = 12, - Pristine = 13, - Merchant = 14, - Voyager = 15 - }; - - - - - console hash: 0xC92719A7 - - - - - Previously named _0xD30C50DF888D58B5, this native turns on the AI blip on the specified ped. It also disappears automatically when the ped is too far or if the ped is dead. You don't need to control it with other natives. - See gtaforums.com/topic/884370-native-research-ai-blips for further information. - Note: Everything said at the bottom is only valid for persistant peds, as AI blips seem to behave differently for non-persistant peds. - • To create an AI blip, you must use UI::0xD30C50DF888D58B5() (_SET_PED_ENEMY_AI_BLIP). It has two arguments: "ped" which is the ped you want to AI blip to be linked to, and "showViewCones" which needs to be true for AI blips to appear. - • To check if a ped has an AI blip, you can use UI::DOES_PED_HAVE_AI_BLIP(Ped ped), which returns a simple bool. - • By default, AI blips never disappear. If you want them to disappear when you're at a certain distance from a ped, you can use UI::0x97C65887D4B37FA9(Ped ped, float distance) (_SET_AI_BLIP_MAX_DISTANCE) - • By default, the blip only appears when you're in combat with the specified ped. If you want it to be always displayed, you can use UI::x0C4BBF625CA98C4E() (_IS_AI_BLIP_ALWAYS_SHOWN). It also has two arguments: "ped", and a flag. If the flag is set to true, the blip will always be displayed. If it's set to false, the AI blip will have its default behaviour. - • By default, a view cone is displayed with the blip (basically a blue surface that represents the field of view of the ped, like in vanilla stealth missions). If you don't want it, you can disable it with UI::HIDE_SPECIAL_ABILITY_LOCKON_OPERATION(Ped ped, bool flag). If the flag is set to true, the view cone is displayed. If the flag is set to false, it is not. - • Finally, there's actually 3 types of AI blips: - 0 - the default, red, "enemy" blip - 1 - a weird, semi-transparent, nameless, yellow blip - 2 - the blue "friend" blip - You can change an AI blip's type with UI::0xE52B8E7F85D39A08(Ped ped, int type) (_SET_AI_BLIP_TYPE). - - - - - Applies an Item from a PedDecorationCollection to a ped. These include tattoos and shirt decals. - collection - PedDecorationCollection filename hash - overlay - Item name hash - Example: - Entry inside "mpbeach_overlays.xml" - - <Item> - <uvPos x="0.500000" y="0.500000" /> - <scale x="0.600000" y="0.500000" /> - <rotation value="0.000000" /> - <nameHash>FM_Hair_Fuzz</nameHash> - <txdHash>mp_hair_fuzz</txdHash> - <txtHash>mp_hair_fuzz</txtHash> - <zone>ZONE_HEAD</zone> - <type>TYPE_TATTOO</type> - <faction>FM</faction> - <garment>All</garment> - <gender>GENDER_DONTCARE</gender> - <award /> - <awardLevel /> - </Item> - Code: - PED::_0x5F5D1665E352A839(PLAYER::PLAYER_PED_ID(), GAMEPLAY::GET_HASH_KEY("mpbeach_overlays"), GAMEPLAY::GET_HASH_KEY("fm_hair_fuzz")) - - - - - Used for freemode (online) characters. - For some reason, the scripts use a rounded float for the index. - - - - - Sets the various freemode face features, e.g. nose length, chin shape. Scale ranges from -1.0 to 1.0. - Index can be 0 - Edit:---->Thanks to the first user. - Enum Face_Feature - Nose_Width - Nose_Peak_Hight - Nose_Peak_Lenght - Nose_Bone_High - Nose_Peak_Lowering - Nose_Bone_Twist - EyeBrown_High - EyeBrown_Forward - Cheeks_Bone_High - Cheeks_Bone_Width - Cheeks_Width - Eyes_Openning - Lips_Thickness - Jaw_Bone_Width 'Bone size to sides - Jaw_Bone_Back_Lenght 'Bone size to back - Chimp_Bone_Lowering 'Go Down - Chimp_Bone_Lenght 'Go forward - Chimp_Bone_Width - Chimp_Hole - Neck_Thikness - End Enum - Example in VB.Net - Public Shared Sub SET_PED_FACE_FEATURE(FreemodePed As Ped, Index As Face_Feature, Scale As Single) - Native.Function.Call(Native.Hash._SET_PED_FACE_FEATURE, FreemodePed, Index, Scale) - End Sub - - - - - Console Hash: 0x8CD3E487 - - - - - Used for freemode (online) characters. - - - - - Used for freemode (online) characters. - ColorType is 1 for eyebrows, beards, and chest hair; 2 for blush and lipstick; and 0 otherwise, though not called in those cases. - Called after SET_PED_HEAD_OVERLAY(). - - - - - This native sets the glow intensity of illuminated clothing items. - - This native does **NOT** need to be executed every tick. - This native is **NOT** synced with other connected players, you will have to set the opacity on the ped on all clients individually. - - Glow intensity is a value between `0.0` and `1.0`. - - In some older decompiled scripts this is known as `_SET_PED_REFLECTION_INTENSITY`. - Since there's no joaat hash for this, I find `_SET_PED_ILLUMINATED_CLOTHING_GLOW_INTENSITY` more descriptive than `_SET_PED_REFLECTION_INTENSITY`. - - Use [`GetPedIlluminatedClothingGlowIntensity`](#_0x1461B28A06717D68) to get the illuminated clothing glow intensity of a specific ped. - - Intensity: `1.0`: - ![](https://www.vespura.com/hi/i/2018-11-13_17-03_c2e23_229.png) - - Intensity: `0.0`: - ![](https://www.vespura.com/hi/i/2018-11-13_17-03_35c33_230.png) - - **Examples code result**: - ![](https://www.vespura.com/hi/i/2018-11-13_17-11_10199_232.gif) - - (Direct link if embed doesn't work: [here](https://www.vespura.com/hi/i/2018-11-13_17-11_10199_232.gif)) - - - - - Stops speech. - - - - - Works for both player and peds, but some flags don't seem to work for the player (1, for example) - 1 - Blocks ragdolling when shot. - 2 - Blocks ragdolling when hit by a vehicle. The ped still might play a falling animation. - 4 - Blocks ragdolling when set on fire. - ----------------------------------------------------------------------- - There seem to be 26 flags - - - - - Assigns some ambient voice to the ped. - - - - - Speech related. - - - - - if the bool "Toggle" is "true" so the phone is lean. - if the bool "Toggle" is "false" so the phone is not lean. - - - - - Sets the position of the arrow icon representing the player on both the minimap and world map. - Too bad this wouldn't work over the network (obviously not). Could spoof where we would be. - - - - - Displays cash change notifications on HUD. - - - - - Disables the radio station from the radio wheel. - Note: You cannot disable LSUR, WCTR and Blaine County Radio. - - List of known station names; - - ``` - RADIO_01_CLASS_ROCK - RADIO_02_POP - RADIO_03_HIPHOP_NEW - RADIO_04_PUNK - RADIO_05_TALK_01 - RADIO_06_COUNTRY - RADIO_07_DANCE_01 - RADIO_08_MEXICAN - RADIO_09_HIPHOP_OLD - RADIO_12_REGGAE - RADIO_13_JAZZ - RADIO_14_DANCE_02 - RADIO_15_MOTOWN - RADIO_20_THELAB - RADIO_16_SILVERLAKE - RADIO_17_FUNK - RADIO_18_90S_ROCK - RADIO_21_DLC_XM17 - RADIO_22_DLC_BATTLE_MIX1_RADIO - RADIO_19_USER - HIDDEN_RADIO_AMBIENT_TV - HIDDEN_RADIO_AMBIENT_TV_BRIGHT - HIDDEN_RADIO_01_CLASS_ROCK - HIDDEN_RADIO_ADVERTS - HIDDEN_RADIO_02_POP - HIDDEN_RADIO_03_HIPHOP_NEW - HIDDEN_RADIO_04_PUNK - HIDDEN_RADIO_06_COUNTRY - HIDDEN_RADIO_07_DANCE_01 - HIDDEN_RADIO_09_HIPHOP_OLD - HIDDEN_RADIO_12_REGGAE - HIDDEN_RADIO_15_MOTOWN - HIDDEN_RADIO_16_SILVERLAKE - RADIO_22_DLC_BATTLE_MIX1_CLUB - HIDDEN_RADIO_STRIP_CLUB - DLC_BATTLE_MIX1_CLUB_PRIV - HIDDEN_RADIO_BIKER_CLASSIC_ROCK - DLC_BATTLE_MIX2_CLUB_PRIV - HIDDEN_RADIO_BIKER_MODERN_ROCK - RADIO_23_DLC_BATTLE_MIX2_CLUB - RADIO_25_DLC_BATTLE_MIX4_CLUB - DLC_BATTLE_MIX3_CLUB_PRIV - RADIO_26_DLC_BATTLE_CLUB_WARMUP - HIDDEN_RADIO_BIKER_PUNK - RADIO_24_DLC_BATTLE_MIX3_CLUB - DLC_BATTLE_MIX4_CLUB_PRIV - HIDDEN_RADIO_BIKER_HIP_HOP - ``` - - - - - SET_*_MULTIPLIER_THIS_FRAME - - - - - Judging from the effect, this is some sort of vehicle density multiplier. - - - - - Sets the position of the audio event to the entity's position for one frame(?) - if (l_8C3 == 0) { - sub_27fd1(0, -1, 1); - if (PED::IS_SYNCHRONIZED_SCENE_RUNNING(l_87D)) { - AUDIO::STOP_SYNCHRONIZED_AUDIO_EVENT(l_87D); - } - if (sub_7dd(l_A00)) { - AUDIO::_950A154B8DAB6185("PAP2_IG1_POPPYSEX", l_A00); - } - sub_91c("TK************ SETTING SYNCH SCENE AUDIO POSITION THIS FRAME ************TK"); - l_8C3 = 1; - } - -- - Found in the b617d scripts, duplicates removed: - AUDIO::_950A154B8DAB6185("CAR_5_IG_6", l_7FE[1 -- [[1]] ]); - AUDIO::_950A154B8DAB6185("EX03_TRAIN_BIKE_LAND", PLAYER::PLAYER_PED_ID()); - AUDIO::_950A154B8DAB6185("FBI_2_MCS_1_LeadIn", l_40[2 -- [[1]] ]); - AUDIO::_950A154B8DAB6185("FIN_C2_MCS_1", l_24C[0 -- [[1]] ]); - AUDIO::_950A154B8DAB6185("MNT_DNC", l_5F); - AUDIO::_950A154B8DAB6185("PAP2_IG1_POPPYSEX", l_A00); - - - - - Sets an unknown boolean value in the text chat. - - - - - Sets the near clipping plane of the third person aim camera. - - - - - Sets how much the crane on the tow truck is raised, where 0.0 is fully lowered and 1.0 is fully raised. - - - - - Sets an unknown flag used by CScene in determining which entities from CMapData scene nodes to draw, similar to 9BAE5AD2508DF078. - Documented by NTAuthority (http://fivem.net/). - - - - - Keeps Vehicle Doors/Hood/Trunk from breaking off - - - - - Vehicle power multiplier. - Does not have to be looped each frame. Can be set once. - Values lower than 1f don't work. - Note: If the value is set with GET_RANDOM_FLOAT_IN_RANGE, the vehicle will have an absurdly high ammount of power, and will become almost undrivable for the player or NPCs. The range doesn't seem to matter. - An high value like 10000000000f will visually remove the wheels that apply the power (front wheels for FWD, rear wheels for RWD), but the power multiplier will still apply, and the wheels still work. - ------ - value is a percentage bump which affects directly the parameter known as fInitialDriveForce in handling.meta. For example: - VEHICLE::_SET_VEHICLE_ENGINE_POWER_MULTIPLIER(myVehicle, 30.0) - will have this effect: DriveForce *= 1.3 - - - - - <1.0 - Decreased torque - =1.0 - Default torque - >1.0 - Increased torque - Negative values will cause the vehicle to go backwards instead of forwards while accelerating. - value - is between 0.2 and 1.8 in the decompiled scripts. - This needs to be called every frame to take effect. - - - - - This native makes the vehicle stop immediately, as happens when we enter a MP garage. - . distance defines how far it will travel until stopping. Garage doors use 3.0. - . If killEngine is set to 1, you cannot resume driving the vehicle once it stops. This looks like is a bitmapped integer. - - - - - color is the paint index for the vehicle. - Paint index goes from 0 to 12. - Be aware that it only works on xenon lights. - - You can find the list of colors and ids here: [\_GET_VEHICLE_HEADLIGHTS_COLOUR](#_0x3DFF319A831E0CDB) - - - - - console hash: 0x71CDD52F - - - - - VEHICLE::SET_VEHICLE_ENGINE_ON is not enough to start jet engines when not inside the vehicle. But with this native set to true it works: youtu.be/OK0ps2fDpxs - i.imgur.com/7XA14pX.png - Certain planes got jet engines. - void VEHICLE::_SET_VEHICLE_JET_ENGINE_ON(scrNativeCallContext *args) - { - bool bOn; // bl@1 - CVehicle *pVehicle; // rax@1 - scrNativeCallContextArgStruct *pArgs; // rax@1 - pArgs = args->pArgs; - bOn = pArgs->a2.INT32 != 0; - pVehicle = getEntityAddressIfVehicle(pArgs->a1.INT32); - if ( pVehicle ) - { - pVehicle->bitmapBulletProofTires &= 0xFBu; - pVehicle->bitmapBulletProofTires |= 4 * bOn; - } - } // sfink - - - - - p1 can be either 0, 1 or 2. - Determines how vehicle lights behave when toggled. - 0 = Default (Lights can be toggled between off, normal and high beams) - 1 = Lights Disabled (Lights are fully disabled, cannot be toggled) - 2 = Always On (Lights can be toggled between normal and high beams) - - - - - Sets the color of the neon lights on the specified vehicle. - - RGB values and colour names taken from the decompiled scripts: - - | Colour | R | G | B | - | ------------- | :-: | :-: | :-: | - | White | 222 | 222 | 255 | - | Blue | 2 | 21 | 255 | - | Electric Blue | 3 | 83 | 255 | - | Mint Green | 0 | 255 | 140 | - | Lime Green | 94 | 255 | 1 | - | Yellow | 255 | 255 | 0 | - | Golden Shower | 255 | 150 | 0 | - | Orange | 255 | 62 | 0 | - | Red | 255 | 1 | 1 | - | Pony Pink | 255 | 50 | 100 | - | Hot Pink | 255 | 5 | 190 | - | Purple | 35 | 1 | 255 | - | Blacklight | 15 | 3 | 255 | - - - - - Sets the neon lights of the specified vehicle on/off. - Indices: - 0 = Left - 1 = Right - 2 = Front - 3 = Back - - - - - Used to set the tornado custom (convertible) rooftop livery. - - Livery value that works for tornado custom is between 0 and 9 from what i can tell. Maybe 0-8 even. - - Might work on other custom vehicles but im not sure what those might be, only confirmed it working with the tornado custom. - - - - - If set to TRUE, it seems to suppress door noises and doesn't allow the horn to be continuous. - - - - - Has something to do with trains. Always precedes SET_MISSION_TRAIN_AS_NO_LONGER_NEEDED. - ============================================ - May be true that it can be used with trains not sure, but not specifically for trains. Go find Xbox360 decompiled scripts and search for 'func_1333' in freemode.c it isn't used just for trains. Thanks for the info tho. - Btw, func_1333 ends up calling this func which uses this native, - void func_1338(int iParam0)//Position - { - ENTITY::FREEZE_ENTITY_POSITION(iParam0, true); - ENTITY::SET_ENTITY_COLLISION(iParam0, false, 0); - ENTITY::SET_ENTITY_INVINCIBLE(iParam0, true); - VEHICLE::_0xDF594D8D(iParam0, true); - } - - - - - According to decompiled scripts this should work with the `deluxo` and `oppressor2` vehicles. - I've only seen this work for `deluxo` though, can't figure out what it's supposed to do on `oppressor2`. - - For the deluxo: - - - Set `state` to `0.0`: Fully transform to a 'road' vehicle (non-hover mode). - - Set `state` to `1.0`: Fully transform to a 'flying' vehicle (hover mode). - - If you set it to something like 0.5, then something [weird happens](https://streamable.com/p6wmr), you end up in some 50% hover mode, 50% not hover mode. - - This doesn't need to be called every tick, just once and the vehicle will transform to that state at the usual transform speed. It'll just stop transforming when it reaches the state you provided. - - Once this native is used then players will just be able to hit the vehicle transform key to toggle the transformation cycle; it won't block users from using the key. - - - - - MulleDK19: This immediately sets the VTOL engines at the specified angle ratio (0f-1f). - - - - - You can only use text entries. No custom text. - - - - - Mixes two weather types. If percentWeather2 is set to 0.0f, then the weather will be entirely of weatherType1, if it is set to 1.0f it will be entirely of weatherType2. If it's set somewhere in between, there will be a mixture of weather behaviors. To test, try this in the RPH console, and change the float to different values between 0 and 1: - execute "NativeFunction.Natives.x578C752848ECFA0C(Game.GetHashKey(""RAIN""), Game.GetHashKey(""SMOG""), 0.50f); - Note that unlike most of the other weather natives, this native takes the hash of the weather name, not the plain string. These are the weather names and their hashes: - CLEAR 0x36A83D84 - EXTRASUNNY 0x97AA0A79 - CLOUDS 0x30FDAF5C - OVERCAST 0xBB898D2D - RAIN 0x54A69840 - CLEARING 0x6DB1A50D - THUNDER 0xB677829F - SMOG 0x10DCF4B5 - FOGGY 0xAE737644 - XMAS 0xAAC9C895 - SNOWLIGHT 0x23FB812B - BLIZZARD 0x27EA2814 - -- [[ OLD INVALID INFO BELOW ]] - Not tested. Based purely on disassembly. Instantly sets the weather to sourceWeather, then transitions to targetWeather over the specified transitionTime in seconds. - If an invalid hash is specified for sourceWeather, the current weather type will be used. - If an invalid hash is specified for targetWeather, the next weather type will be used. - If an invalid hash is specified for both sourceWeather and targetWeather, the function just changes the transition time of the current transition. - - - - - entity - entity to ignore - - - - - Since latest patches has 18 parameters. - Console Hash: 0xCCDC33CC - entity - entity to ignore - - - - - Shows the cursor on screen for the frame its called. - - - - - If toggle is true, the ped's head is shown in the pause menu - If toggle is false, the ped's head is not shown in the pause menu - - - - - probs one frame - - - - - Forces the weapon wheel to appear on screen. - - - - - network fx - - - - - Console Hash: 0x23BF0F9B - - - - - Console Hash: 0xF478EFCF - network fx - - - - - network fx - - - - - Console hash: 0x469A2B4A - network fx - - - - - network fx - - - - - Starts recording a replay. - If mode is 0, turns on action replay. - If mode is 1, starts recording. - If already recording a replay, does nothing. - - - - - Second parameter might be length. - - - - - Second parameter might be length. - - - - - playLength - is how long to play the effect for in milliseconds. If 0, it plays the default length - if loop is true, the effect wont stop until you call _STOP_SCREEN_EFFECT on it. (only loopable effects) - Example and list of screen FX: www.pastebin.com/dafBAjs0 - - - - - Performs the same type of trace as START_SHAPE_TEST_CAPSULE, but with some different hardcoded parameters. - - - - - Not sure how or why this differs from 0x7EE9F5D83DD4F90E, but it does. - This function casts a ray from Point1 to Point2 and returns it's ray handle. A simple ray cast will 'shoot' a line from point A to point B, and return whether or not the ray reached it's destination or if it hit anything and if it did hit anything, will return the handle of what it hit (entity handle) and coordinates of where the ray reached. - You can use _GET_RAYCAST_RESULT to get the result of the raycast - Entity is an entity to ignore, such as the player. - Flags are intersection bit flags. They tell the ray what to care about and what not to care about when casting. Passing -1 will intersect with everything, presumably. - Flags: - 1: Intersect with map - 2: Intersect with vehicles (used to be mission entities?) (includes train) - 4: Intersect with peds? (same as 8) - 8: Intersect with peds? (same as 4) - 16: Intersect with objects - 32: Water? - 64: Unknown - 128: Unknown - 256: Intersect with vegetation (plants, coral. trees not included) - NOTE: Raycasts that intersect with mission_entites (flag = 2) has limited range and will not register for far away entites. The range seems to be about 30 metres. - - - - - it returns a ShapeTest handle that can be used with GET_SHAPE_TEST_RESULT. - In its only usage in game scripts its called with flag set to 511, entity to player_ped_id and flag2 set to 7 - - - - - Does not take effect immediately, unfortunately. - profileSetting seems to only be 936, 937 and 938 in scripts - gtaforums.com/topic/799843-stats-profile-settings/ - - - - - Stops recording and discards the recorded clip. - - - - - Stops recording and saves the recorded clip. - - - - - This disable the recording feature and has to be called every frame. - - - - - Example and list of screen FX: www.pastebin.com/dafBAjs0 - - - - - This was previously named as "RESERVE_ENTITY_EXPLODES_ON_HIGH_EXPLOSION_COMBO" - which is obviously incorrect. - Seems to only appear in scripts used in Singleplayer. p1 ranges from 2 - 46. - I assume this switches the crime type - - - - - Use after using \_SWITCH_OUT_PLAYER to swoop the camera back down to the player's ped. - - - - - doesn't act normally when used on mount chilliad - - flags: - - 0: normal - 1: no transition - 255: switch IN - - switchType: 0 - 3 - - 0: 1 step towards ped - 1: 3 steps out from ped - 2: 1 step out from ped - 3: 1 step towards ped - - - - - Jenkins of this native is 0x4293601F. This is the actual name. - - - - - Example: - AI::_2D537BA194896636(PLAYER::PLAYER_PED_ID(), "arm_wrestling_sweep_paired_a_rev3", 0.0, 1, "mini@arm_wrestling", 0); - - - - - Example: - AI::_D5B35BEA41919ACB(PLAYER::PLAYER_PED_ID(), "minigame_tattoo_michael_parts", 324.13, 181.29, 102.6, 0.0, 0.0, 22.32, 2, 0, 0, 0, 0); - - - - - TODO: add hash from x360 - ^^^ - I got you, x360 Hash: 0x5A32D4B4. - Note: Whoever named this I just compared it and the hash matches, it was the correct name thanks. - Note: Alexander Blade, needs to fix this site or his code one, as when we do find the right name the server throws an error saying the name is already in use. AB is a legend coder, so I'm sure this is a simple fix for him. - - - - - Makes a ped in a vehicle follow an entity (ped, vehicle, etc.) - Driving Styles guide: gtaforums.com/topic/822314-guide-driving-styles/ - Console Hash: 0xA8B917D7 - AI::_TASK_VEHICLE_FOLLOW(l_244[3 -- [[1]] ], l_268[3 -- [[1]] ], l_278, 40.0, 262144, 10); - What is this known as in the decompiled scripts ffs. I need more examples. I've searched in all scripts for keywords suchas, - TASK_VEHICLE_FOLLOW, FC545A9F0626E3B6, 0xFC545A9F0626E3B6, all the parameters in the above example even just search the last few params '40.0, 262144, 10' and couldnt find where this native is used in scripts at all unless whoever decompiled the scripts gave it a whack a.. name. - - - - - Transforms the `stormberg` to it's "road vehicle" variant. If the vehicle is already in that state then the vehicle transformation audio will still play, but the vehicle won't change at all. - - - - - Transforms the `stormberg` to it's "water vehicle" variant. If the vehicle is already in that state then the vehicle transformation audio will still play, but the vehicle won't change at all. - - - - - time in ms to transition from fully blurred to normal - - - - - time in ms to transition to fully blurred screen - - - - - Returns the interior ID at the given coords, but only if the unknown variable is set to 0, otherwise it will return 0. - - - - - Formerly known as _LOWER_MAP_PROP_DENSITY and wrongly due to idiots as _ENABLE_MP_DLC_MAPS. - Sets the maximum prop density and changes a loading screen flag from 'loading story mode' to 'loading GTA Online'. Does not touch DLC map data at all. - In fact, I doubt this changes the flag whatsoever, that's the OTHER native idiots use together with this that does so, this one only causes a loading screen to show as it reloads map data. - ------------------------ - While you're going on your rant about other "idiots" can you please supply the name of the "other native" for us "idiots" who'd like to actually learn about loading IPL's? Thank, you. - - - - - From the b678d decompiled scripts: - GRAPHICS::_SET_PTFX_ASSET_NEXT_CALL("FM_Mission_Controler"); - GRAPHICS::_SET_PTFX_ASSET_NEXT_CALL("scr_apartment_mp"); - GRAPHICS::_SET_PTFX_ASSET_NEXT_CALL("scr_indep_fireworks"); - GRAPHICS::_SET_PTFX_ASSET_NEXT_CALL("scr_mp_cig_plane"); - GRAPHICS::_SET_PTFX_ASSET_NEXT_CALL("scr_mp_creator"); - GRAPHICS::_SET_PTFX_ASSET_NEXT_CALL("scr_ornate_heist"); - GRAPHICS::_SET_PTFX_ASSET_NEXT_CALL("scr_prison_break_heist_station"); - - - - - Vehicle has landing gear? - - - - - parachuteModel = 230075693 - - - - - colorIndex = 0 - - - - - Deprecated name, use ADD_EXPLOSION_WITH_USER_VFX instead - - - - - Deprecated name, use ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME instead - - - - - Deprecated name, use ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL instead - - - - - Deprecated name, use ADD_TEXT_COMPONENT_SUBSTRING_WEBSITE instead - - - - - Deprecated name, use ARE_ALL_VEHICLE_WINDOWS_INTACT instead - - - - - Deprecated name, use ARE_ANY_VEHICLE_SEATS_FREE instead - - - - - Deprecated name, use BEGIN_SCALEFORM_MOVIE_METHOD instead - - - - - Deprecated name, use BEGIN_TEXT_COMMAND_DISPLAY_HELP instead - - - - - Deprecated name, use BEGIN_TEXT_COMMAND_DISPLAY_TEXT instead - - - - - Deprecated name, use BEGIN_TEXT_COMMAND_PRINT instead - - - - - Deprecated name, use BEGIN_TEXT_COMMAND_SCALEFORM_STRING instead - - - - - Deprecated name, use CALL_SCALEFORM_MOVIE_METHOD instead - - - - - Deprecated name, use CLEAR_PED_SCUBA_GEAR_VARIATION instead - - - - - Deprecated name, use CLONE_PED_TO_TARGET instead - - - - - Deprecated name, use CONTROL_LANDING_GEAR instead - - - - - Deprecated name, use CREATE_PICK_UP_ROPE_FOR_CARGOBOB instead - - - - - Deprecated name, use DOES_CARGOBOB_HAVE_PICK_UP_ROPE instead - - - - - Deprecated name, use ENABLE_CLOWN_BLOOD_VFX instead - - - - - Deprecated name, use END_SCALEFORM_MOVIE_METHOD instead - - - - - Deprecated name, use END_TEXT_COMMAND_DISPLAY_HELP instead - - - - - Deprecated name, use END_TEXT_COMMAND_DISPLAY_TEXT instead - - - - - Deprecated name, use END_TEXT_COMMAND_PRINT instead - - - - - Deprecated name, use END_TEXT_COMMAND_SCALEFORM_STRING instead - - - - - Deprecated name, use GET_HASH_OF_THIS_SCRIPT_NAME instead - - - - - Deprecated name, use GET_IS_LEFT_VEHICLE_HEADLIGHT_DAMAGED instead - - - - - Deprecated name, use GET_IS_RIGHT_VEHICLE_HEADLIGHT_DAMAGED instead - - - - - Deprecated name, use GET_IS_VEHICLE_ENGINE_RUNNING instead - - - - - Deprecated name, use GET_LANDING_GEAR_STATE instead - - - - - Deprecated name, use GET_NEXT_WEATHER_TYPE_HASH_NAME instead - - - - - Deprecated name, use GET_PED_AMMO_TYPE_FROM_WEAPON instead - - - - - Deprecated name, use GET_PED_SOURCE_OF_DEATH instead - - - - - Deprecated name, use GET_PLAYER_ADVANCED_MODIFIER_PRIVILEGES instead - - - - - Deprecated name, use GET_PREV_WEATHER_TYPE_HASH_NAME instead - - - - - Deprecated name, use GET_SCREEN_COORD_FROM_WORLD_COORD instead - - - - - Deprecated name, use GET_SHAPE_TEST_RESULT instead - - - - - Deprecated name, use GET_TIME_AS_STRING instead - - - - - Deprecated name, use GET_VEHICLE_ENVEFF_SCALE instead - - - - - Deprecated name, use GET_VEHICLE_MODEL_NUMBER_OF_SEATS instead - - - - - Deprecated name, use GET_VEHICLE_WHEEL_Y_ROTATION instead - - - - - Deprecated name, use HAS_SCRIPT_WITH_NAME_HASH_LOADED instead - - - - - Deprecated name, use IS_TIME_EQUAL_TO instead - - - - - Deprecated name, use IS_TIME_LESS_THAN instead - - - - - Deprecated name, use IS_TIME_MORE_THAN instead - - - - - Deprecated name, use IS_WARNING_MESSAGE_ACTIVE instead - - - - - Deprecated name, use NETWORK_PLAYER_GET_USERID instead - - - - - Deprecated name, use OPEN_BOMB_BAY_DOORS instead - - - - - Deprecated name, use REMOVE_PICK_UP_ROPE_FOR_CARGOBOB instead - - - - - Deprecated name, use REQUEST_SCRIPT_WITH_NAME_HASH instead - - - - - Deprecated name, use RESET_SCRIPT_GFX_ALIGN instead - - - - - Deprecated name, use SET_ARTIFICIAL_LIGHTS_STATE instead - - - - - Deprecated name, use SET_BIGMAP_ACTIVE instead - - - - - Deprecated name, use SET_MP_GAMER_TAG_HEALTH_BAR_COLOUR instead - - - - - Deprecated name, use SET_SCRIPT_GFX_ALIGN instead - - - - - Deprecated name, use SET_SCRIPT_GFX_ALIGN instead - - - - - Deprecated name, use SET_SCRIPT_GFX_ALIGN_PARAMS instead - - - - - Deprecated name, use SET_SCRIPT_GFX_DRAW_ORDER instead - - - - - Deprecated name, use SET_SCRIPT_GFX_DRAW_ORDER instead - - - - - Deprecated name, use SET_SCRIPT_WITH_NAME_HASH_AS_NO_LONGER_NEEDED instead - - - - - Deprecated name, use SET_VEHICLE_CEILING_HEIGHT instead - - - - - Deprecated name, use SET_VEHICLE_DROPS_MONEY_WHEN_BLOWN_UP instead - - - - - Deprecated name, use SET_VEHICLE_ENVEFF_SCALE instead - - - - - Deprecated name, use SET_VEHICLE_WHEELS_CAN_BREAK_OFF_WHEN_BLOW_UP instead - - - - - Deprecated name, use SET_VEHICLE_WHEEL_Y_ROTATION instead - - - - - Deprecated name, use SET_WARNING_MESSAGE_WITH_HEADER instead - - - - - Deprecated name, use SHOULD_USE_METRIC_MEASUREMENTS instead - - - - - Deprecated name, use SHOW_CREW_INDICATOR_ON_BLIP instead - - - - - Deprecated name, use SHOW_FRIEND_INDICATOR_ON_BLIP instead - - - - - Deprecated name, use SHOW_OUTLINE_INDICATOR_ON_BLIP instead - - - - - Deprecated name, use SHOW_TICK_ON_BLIP instead - - - - - Deprecated name, use SPECIAL_ABILITY_CHARGE_NORMALIZED instead - - - - - Deprecated name, use START_NEW_SCRIPT_WITH_NAME_HASH instead - - - - - Deprecated name, use START_NEW_SCRIPT_WITH_NAME_HASH_AND_ARGS instead - - - - - Deprecated name, use START_SHAPE_TEST_CAPSULE instead - - - - - Deprecated name, use _ADD_TEXT_COMPONENT_SCALEFORM instead - - - - - Deprecated name, use _ARE_BOMB_BAY_DOORS_OPEN instead - - - - - Deprecated name, use _ARE_VEHICLE_WINGS_INTACT instead - - - - - Deprecated name, use _BEGIN_SCALEFORM_MOVIE_METHOD_HUD_COMPONENT instead - - - - - Deprecated name, use _BEGIN_SCALEFORM_MOVIE_METHOD_N instead - - - - - Deprecated name, use _BEGIN_TEXT_COMMAND_BUSY_STRING instead - - - - - Deprecated name, use _BEGIN_TEXT_COMMAND_LINE_COUNT instead - - - - - Deprecated name, use _BEGIN_TEXT_COMMAND_WIDTH instead - - - - - Deprecated name, use _CAN_PLAY_ONLINE instead - - - - - Deprecated name, use _DOES_CARGOBOB_HAVE_PICKUP_MAGNET instead - - - - - Deprecated name, use _DOES_VEHICLE_HAVE_DECAL instead - - - - - Deprecated name, use _DRAW_LIGHT_WITH_RANGE_AND_SHADOW instead - - - - - Deprecated name, use _DRAW_NOTIFICATION_APARTMENT_INVITE instead - - - - - Deprecated name, use _DRAW_NOTIFICATION_AWARD instead - - - - - Deprecated name, use _DRAW_NOTIFICATION_CLAN_INVITE instead - - - - - Deprecated name, use _END_SCALEFORM_MOVIE_METHOD_RETURN instead - - - - - Deprecated name, use _END_TEXT_COMMAND_BUSY_STRING instead - - - - - Deprecated name, use _END_TEXT_COMMAND_GET_WIDTH instead - - - - - Deprecated name, use _FORCE_VEHICLE_ENGINE_AUDIO instead - - - - - Deprecated name, use _GET_ACTIVE_SCREEN_RESOLUTION instead - - - - - Deprecated name, use _GET_ASPECT_RATIO instead - - - - - Deprecated name, use _GET_CURRENT_INTENSITY instead - - - - - Deprecated name, use _GET_CURRENT_LANGUAGE_ID instead - - - - - Deprecated name, use _GET_NAME_OF_THREAD instead - - - - - Deprecated name, use _GET_NUMBER_OF_INSTANCES_OF_SCRIPT_WITH_NAME_HASH instead - - - - - Deprecated name, use _GET_ONLINE_VERSION instead - - - - - Deprecated name, use _GET_SCALEFORM_MOVIE_FUNCTION_RETURN_STRING instead - - - - - Deprecated name, use _GET_TEXT_SCREEN_LINE_COUNT instead - - - - - Deprecated name, use _GET_UTC_TIME instead - - - - - Deprecated name, use _GET_VEHICLE_HOVER_MODE_PERCENTAGE instead - - - - - Deprecated name, use _IS_DLC_DATA_EMPTY instead - - - - - Deprecated name, use _IS_INPUT_DISABLED instead - - - - - Deprecated name, use _IS_NIGHTVISION_ACTIVE instead - - - - - Deprecated name, use _IS_THIS_MODEL_A_JETSKI instead - - - - - Deprecated name, use _IS_THIS_MODEL_A_JETSKI instead - - - - - Deprecated name, use _NETWORK_CONVERT_SYNCHRONISED_SCENE_TO_SYNCHRONIZED_SCENE instead - - - - - Deprecated name, use _NETWORK_GET_FRIEND_NAME_FROM_INDEX instead - - - - - Deprecated name, use _NETWORK_IS_THIS_SCRIPT_MARKED instead - - - - - Deprecated name, use _NETWORK_SESSION_IS_PLAYER_VOTED_TO_KICK instead - - - - - Deprecated name, use _NETWORK_SET_ENTITY_INVISIBLE_TO_NETWORK instead - - - - - Deprecated name, use _NETWORK_SHOP_DOES_ITEM_EXIST instead - - - - - Deprecated name, use _NETWORK_SHOP_DOES_ITEM_EXIST_HASH instead - - - - - Deprecated name, use _NETWORK_SHOP_TERMINATE_SERVICE instead - - - - - Deprecated name, use _PED_SKIP_NEXT_RELOADING instead - - - - - Deprecated name, use _PUSH_SCALEFORM_MOVIE_METHOD_PARAMETER_BOOL instead - - - - - Deprecated name, use _PUSH_SCALEFORM_MOVIE_METHOD_PARAMETER_FLOAT instead - - - - - Deprecated name, use _PUSH_SCALEFORM_MOVIE_METHOD_PARAMETER_INT instead - - - - - Deprecated name, use _PUSH_SCALEFORM_MOVIE_METHOD_PARAMETER_STRING instead - - - - - Deprecated name, use _REQUEST_SCALEFORM_MOVIE_INTERACTIVE instead - - - - - Deprecated name, use _RESET_CURRENT_INTENSITY instead - - - - - Deprecated name, use _SET_AIRCRAFT_BOMB_COUNT instead - - - - - Deprecated name, use _SET_CARGOBOB_PICKUP_MAGNET_ACTIVE instead - - - - - Deprecated name, use _SET_CURRENT_INTENSITY instead - - - - - Deprecated name, use _SET_ENTITY_SOMETHING instead - - - - - Deprecated name, use _SET_FROZEN_RENDERING_DISABLED instead - - - - - Deprecated name, use _SET_MP_GAMER_TAG_COLOR instead - - - - - Deprecated name, use _SET_NORTH_YANKTON_MAP instead - - - - - Deprecated name, use _SET_PARTICLE_FX_ASSET_OLD_TO_NEW instead - - - - - Deprecated name, use _SET_PED_AI_BLIP instead - - - - - Deprecated name, use _SET_PED_DECORATION instead - - - - - Deprecated name, use _SET_PLANE_MIN_HEIGHT_ABOVE_TERRAIN instead - - - - - Deprecated name, use _SET_PLAYER_CASH_CHANGE instead - - - - - Deprecated name, use _SET_TOW_TRUCK_CRANE_HEIGHT instead - - - - - Deprecated name, use _SET_VEHICLE_DOOR_CAN_BREAK instead - - - - - Deprecated name, use _START_SHAPE_TEST_RAY instead - - - - - Deprecated name, use _STOP_RECORDING_AND_SAVE_CLIP instead - - - - - Deprecated name, use _USE_FREEMODE_MAP_BEHAVIOR instead - - - - - Deprecated name, use _USE_PARTICLE_FX_ASSET_NEXT_CALL instead - - - - - Aborts the current message in the text chat. - - - - - Returns arccos value of p0. - - - - - Does stuff like this: - gyazo.com/7fcb78ea3520e3dbc5b2c0c0f3712617 - Example: - int GetHash = GET_HASH_KEY("fe_menu_version_corona_lobby"); - ACTIVATE_FRONTEND_MENU(GetHash, 0, -1); - BOOL p1 is a toggle to define the game in pause. - int p2 is unknown but -1 always works, not sure why though. - [30/03/2017] ins1de : - the int p2 is actually a component variable. When the pause menu is visible, it opens the tab related to it. - Example : Function.Call(Hash.ACTIVATE_FRONTEND_MENU,-1171018317, 0, 42); - Result : Opens the "Online" tab without pausing the menu, with -1 it opens the map. - - - - - seems to be frequently used with the NETWORK::NET_TO_x natives, particularly with vehicles. It is often the only ROPE:: native in a script. - - - - - Show Rockstar Editor Menu - by I'm Not MentaL - ---------- - "new_editor" menu - - - - - Show Rockstar Editor Menu - by I'm Not MentaL - ---------- - "new_editor" menu - - - - - Same as SET_PED_ARMOUR, but ADDS 'amount' to the armor the Ped already has. - - - - - Adds a rectangular blip for the specified coordinates/area. - It is recommended to use [SET_BLIP_ROTATION](#_0xF87683CDF73C3F6E) and [SET_BLIP_COLOUR](#_0x03D7FB09E75D6B7E) to make the blip not rotate along with the camera. - By default, the blip will show as a _regular_ blip with the specified color/sprite if it is outside of the minimap view. - Example image: - ![minimap](https://w.wew.wtf/pdcjig.png) - ![big map](https://w.wew.wtf/zgcjcm.png) - (Native name is _likely_ to actually be ADD_BLIP_FOR_AREA, but due to the usual reasons this can't be confirmed) - - The X coordinate of the center of the blip. - The Y coordinate of the center of the blip. - The Z coordinate of the center of the blip. - The width of the blip. - The height of the blip. - A handle to the blip. - - - - Adds a rectangular blip for the specified coordinates/area. - It is recommended to use [SET_BLIP_ROTATION](#_0xF87683CDF73C3F6E) and [SET_BLIP_COLOUR](#_0x03D7FB09E75D6B7E) to make the blip not rotate along with the camera. - By default, the blip will show as a _regular_ blip with the specified color/sprite if it is outside of the minimap view. - Example image: - ![minimap](https://w.wew.wtf/pdcjig.png) - ![big map](https://w.wew.wtf/zgcjcm.png) - (Native name is _likely_ to actually be ADD_BLIP_FOR_AREA, but due to the usual reasons this can't be confirmed) - - The X coordinate of the center of the blip. - The Y coordinate of the center of the blip. - The Z coordinate of the center of the blip. - The width of the blip. - The height of the blip. - A handle to the blip. - - - - Creates a blip for the specified coordinates. You can use `SET_BLIP_` natives to change the blip. - - The X coordinate to create the blip on. - The Y coordinate. - The Z coordinate. - A blip handle. - - - - Returns red ( default ) blip attached to entity. - Example: - Blip blip; //Put this outside your case or option - blip = UI::ADD_BLIP_FOR_ENTITY(YourPedOrBodyguardName); - UI::SET_BLIP_AS_FRIENDLY(blip, true); - - - - - I filled p1-p6 (the floats) as they are as other natives with 6 floats in a row are similar and I see no other method. So if a test from anyone proves them wrong please correct. - p7 (length) determines the length of the spline, affects camera path and duration of transition between previous node and this one - p8 big values ~100 will slow down the camera movement before reaching this node - p9 != 0 seems to override the rotation/pitch (bool?) - - - - - Now has 15 parameters, previous declaration: - BOOL _0x428BDCB9DA58DA53(Any p0, Any p1, Any p2, float p3, float p4, float p5, float p6, float p7, float p8, float p9, float p10, float p11, float p12, Any p13) - boneIndex is always chassis_dummy in the scripts. The x/y/z params are location relative to the chassis bone. They are usually rotations and measurements. Haven't reversed which are what yet. - Scale is how big the decal will be. - p13 is always 0. - For alpha, 200 seems to match what the game is doing, I think. I don't have access to the new scripts to see what this parameter is, but based on guessing this seems (kind of) accurate. - - - - - decal types: - public enum DecalTypes - { - splatters_blood = 1010, - splatters_blood_dir = 1015, - splatters_blood_mist = 1017, - splatters_mud = 1020, - splatters_paint = 1030, - splatters_water = 1040, - splatters_water_hydrant = 1050, - splatters_blood2 = 1110, - weapImpact_metal = 4010, - weapImpact_concrete = 4020, - weapImpact_mattress = 4030, - weapImpact_mud = 4032, - weapImpact_wood = 4050, - weapImpact_sand = 4053, - weapImpact_cardboard = 4040, - weapImpact_melee_glass = 4100, - weapImpact_glass_blood = 4102, - weapImpact_glass_blood2 = 4104, - weapImpact_shotgun_paper = 4200, - weapImpact_shotgun_mattress, - weapImpact_shotgun_metal, - weapImpact_shotgun_wood, - weapImpact_shotgun_dirt, - weapImpact_shotgun_tvscreen, - weapImpact_shotgun_tvscreen2, - weapImpact_shotgun_tvscreen3, - weapImpact_melee_concrete = 4310, - weapImpact_melee_wood = 4312, - weapImpact_melee_metal = 4314, - burn1 = 4421, - burn2, - burn3, - burn4, - burn5, - bang_concrete_bang = 5000, - bang_concrete_bang2, - bang_bullet_bang, - bang_bullet_bang2 = 5004, - bang_glass = 5031, - bang_glass2, - solidPool_water = 9000, - solidPool_blood, - solidPool_oil, - solidPool_petrol, - solidPool_mud, - porousPool_water, - porousPool_blood, - porousPool_oil, - porousPool_petrol, - porousPool_mud, - porousPool_water_ped_drip, - liquidTrail_water = 9050 - } - - - - - REQUEST_STREAMED_TEXTURE_DICT("MPOnMissMarkers", false); - *uParam0.f_809 = add_decal(9120, vParam1, vVar4, vVar7, 2f, 2f, to_float(iVar0) / 255f, to_float(iVar1) / 255f, to_float(iVar2) / 255f, 1f, -1f, 1, 0, 0); - _0x8A35C742130C6080(9120, "MPOnMissMarkers", "Capture_The_Flag_Base_Icon"); - - - - - REQUEST_STREAMED_TEXTURE_DICT("MPOnMissMarkers", false); - *uParam0.f_809 = add_decal(9120, vParam1, vVar4, vVar7, 2f, 2f, to_float(iVar0) / 255f, to_float(iVar1) / 255f, to_float(iVar2) / 255f, 1f, -1f, 1, 0, 0); - _0x8A35C742130C6080(9120, "MPOnMissMarkers", "Capture_The_Flag_Base_Icon"); - - - - - Example: - GRAPHICS::ADD_ENTITY_ICON(a_0, "MP_Arrow"); - I tried this and nothing happened... - - - - - BOOL isAudible = If explosion makes a sound. - BOOL isInvisible = If the explosion is invisible or not. - this native is missing a new argument: noDamage - nodamage = false: damage || nodamage = true: no damage - enum ExplosionTypes - { - EXPLOSION_GRENADE, - EXPLOSION_GRENADELAUNCHER, - EXPLOSION_STICKYBOMB, - EXPLOSION_MOLOTOV, - EXPLOSION_ROCKET, - EXPLOSION_TANKSHELL, - EXPLOSION_HI_OCTANE, - EXPLOSION_CAR, - EXPLOSION_PLANE, - EXPLOSION_PETROL_PUMP, - EXPLOSION_BIKE, - EXPLOSION_DIR_STEAM, - EXPLOSION_DIR_FLAME, - EXPLOSION_DIR_WATER_HYDRANT, - EXPLOSION_DIR_GAS_CANISTER, - EXPLOSION_BOAT, - EXPLOSION_SHIP_DESTROY, - EXPLOSION_TRUCK, - EXPLOSION_BULLET, - EXPLOSION_SMOKEGRENADELAUNCHER, - EXPLOSION_SMOKEGRENADE, - EXPLOSION_BZGAS, - EXPLOSION_FLARE, - EXPLOSION_GAS_CANISTER, - EXPLOSION_EXTINGUISHER, - EXPLOSION_PROGRAMMABLEAR, - EXPLOSION_TRAIN, - EXPLOSION_BARREL, - EXPLOSION_PROPANE, - EXPLOSION_BLIMP, - EXPLOSION_DIR_FLAME_EXPLODE, - EXPLOSION_TANKER, - EXPLOSION_PLANE_ROCKET, - EXPLOSION_VEHICLE_BULLET, - EXPLOSION_GAS_TANK, - EXPLOSION_BIRD_CRAP - }; - - - - - Seems to add/set the current menu context (to show/hide buttons?) - Pausemenu.xml: - <Contexts>*ALL*, DISPLAY_CORONA_BUTTONS, *NONE*, BET_LOCKED, BET_AVAILABLE, SCROLL_OPTION</Contexts> - Code: - if (...) { - sub_bbd34(a_0, 0, "FM_BET_HELP"); - UI::_DD564BDD0472C936(${bet_available}); // This native - UI::OBJECT_DECAL_TOGGLE(${bet_locked}); - } else { - sub_bbd34(a_0, 0, ""); - UI::OBJECT_DECAL_TOGGLE(${bet_available}); - UI::_DD564BDD0472C936(${bet_locked}); // This native - } - OBJECT_DECAL_TOGGLE seems to remove a context, It also has a hash collision - // Old - Scripts do not make this native's purpose clear. However, this native most likely has something to do with decals since in nearly every instance, "OBJECT_DECAL_TOGGLE" is called prior. - - - - - Seems to add/set the current menu context (to show/hide buttons?) - Pausemenu.xml: - <Contexts>*ALL*, DISPLAY_CORONA_BUTTONS, *NONE*, BET_LOCKED, BET_AVAILABLE, SCROLL_OPTION</Contexts> - Code: - if (...) { - sub_bbd34(a_0, 0, "FM_BET_HELP"); - UI::_DD564BDD0472C936(${bet_available}); // This native - UI::OBJECT_DECAL_TOGGLE(${bet_locked}); - } else { - sub_bbd34(a_0, 0, ""); - UI::OBJECT_DECAL_TOGGLE(${bet_available}); - UI::_DD564BDD0472C936(${bet_locked}); // This native - } - OBJECT_DECAL_TOGGLE seems to remove a context, It also has a hash collision - // Old - Scripts do not make this native's purpose clear. However, this native most likely has something to do with decals since in nearly every instance, "OBJECT_DECAL_TOGGLE" is called prior. - - - - - Returns the index of the newly created hospital spawn point. - p3 might be radius? - - - - - NOTE: ones that are -1, 0 - 35 are determined by a function where it gets a TextLabel from a global then runs, - _GET_TEXT_SUBSTRING and depending on what the result is it goes in check order of 0 - 9 then A - Z then z (lowercase). So it will then return 0 - 35 or -1 if it's 'z'. The func to handle that ^^ is func_67 in dialog_handler.c atleast in TU27 Xbox360 scripts. - p0 is -1, 0 - p1 is a char or string (whatever you wanna call it) - p2 is Global 10597 + i * 6. 'i' is a while(i < 70) loop - p3 is again -1, 0 - 35 - p4 is again -1, 0 - 35 - p5 is either 0 or 1 (bool ?) - p6 is either 0 or 1 (The func to determine this is bool) - p7 is either 0 or 1 (The func to determine this is bool) - p8 is either 0 or 1 (The func to determine this is bool) - p9 is 0 - 3 (Determined by func_60 in dialogue_handler.c) - p10 is either 0 or 1 (The func to determine this is bool) - p11 is either 0 or 1 (The func to determine this is bool) - p12 is unknown as in TU27 X360 scripts it only goes to p11. - - - - - Loads a minimap overlay from a GFx file in the current resource. - - The path to a `.gfx` file in the current resource. It has to be specified as a `file`. - A minimap overlay ID. - - - - hash collision? - - - - - enum ExplosionTypes - { - EXPLOSION_GRENADE, - EXPLOSION_GRENADELAUNCHER, - EXPLOSION_STICKYBOMB, - EXPLOSION_MOLOTOV, - EXPLOSION_ROCKET, - EXPLOSION_TANKSHELL, - EXPLOSION_HI_OCTANE, - EXPLOSION_CAR, - EXPLOSION_PLANE, - EXPLOSION_PETROL_PUMP, - EXPLOSION_BIKE, - EXPLOSION_DIR_STEAM, - EXPLOSION_DIR_FLAME, - EXPLOSION_DIR_WATER_HYDRANT, - EXPLOSION_DIR_GAS_CANISTER, - EXPLOSION_BOAT, - EXPLOSION_SHIP_DESTROY, - EXPLOSION_TRUCK, - EXPLOSION_BULLET, - EXPLOSION_SMOKEGRENADELAUNCHER, - EXPLOSION_SMOKEGRENADE, - EXPLOSION_BZGAS, - EXPLOSION_FLARE, - EXPLOSION_GAS_CANISTER, - EXPLOSION_EXTINGUISHER, - EXPLOSION_PROGRAMMABLEAR, - EXPLOSION_TRAIN, - EXPLOSION_BARREL, - EXPLOSION_PROPANE, - EXPLOSION_BLIMP, - EXPLOSION_DIR_FLAME_EXPLODE, - EXPLOSION_TANKER, - EXPLOSION_PLANE_ROCKET, - EXPLOSION_VEHICLE_BULLET, - EXPLOSION_GAS_TANK, - EXPLOSION_BIRD_CRAP - }; - BOOL isAudible = If explosion makes a sound. - BOOL isInvisible = If the explosion is invisible or not. - - - - - Example: - AI::ADD_PATROL_ROUTE_NODE(2, "WORLD_HUMAN_GUARD_STAND", -193.4915, -2378.864990234375, 10.9719, -193.4915, -2378.864990234375, 10.9719, 3000); - p0 is between 0 and 4 in the scripts. - p1 is "WORLD_HUMAN_GUARD_STAND" or "StandGuard". - p2, p3 and p4 is only one parameter sometimes in the scripts. Most likely a Vector3 hence p2, p3 and p4 are coordinates. - Examples: - AI::ADD_PATROL_ROUTE_NODE(1, "WORLD_HUMAN_GUARD_STAND", l_739[7 -- [[3]] ], 0.0, 0.0, 0.0, 0); - AI::ADD_PATROL_ROUTE_NODE(1, "WORLD_HUMAN_GUARD_STAND", l_B0[17 -- [[44]] ]._f3, l_B0[17 -- [[44]] ]._f3, 2000); - p5, p6 and p7 are for example set to: 1599.0406494140625, 2713.392578125, 44.4309. - p8 is an int, often random set to for example: GAMEPLAY::GET_RANDOM_INT_IN_RANGE(5000, 10000). - - - - - 4 calls in the b617d scripts. The only one with p0 and p2 in clear text: - AUDIO::ADD_PED_TO_CONVERSATION(5, l_AF, "DINAPOLI"); - ================================================= - One of the 2 calls in dialogue_handler.c p0 is in a while-loop, and so is determined to also possibly be 0 - 15. - Based on it asking if does_entity_exist for the global I have determined that p1 is, in fact, the ped, but could be wrong. - - - - - Can't select void. This function returns nothing. The hash of the created relationship group is output in the second parameter. - - - - - Experimental natives, please do not use in a live environment. - - - - - Creates a rope at the specific position, that extends in the specified direction when not attached to any entities. - __ - Add_Rope(pos.x,pos.y,pos.z,0.0,0.0,0.0,20.0,4,20.0,1.0,0.0,false,false,false,5.0,false,NULL) - When attached, Position<vector> does not matter - When attached, Angle<vector> does not matter - Rope Type: - 4 and bellow is a thick rope - 5 and up are small metal wires - 0 crashes the game - Max_length - Rope is forced to this length, generally best to keep this the same as your rope length. - Rigid - If max length is zero, and this is set to false the rope will become rigid (it will force a specific distance, what ever length is, between the objects). - breakable - Whether or not shooting the rope will break it. - unkPtr - unknown ptr, always 0 in orig scripts - __ - Lengths can be calculated like so: - float distance = abs(x1 - x2) + abs(y1 - y2) + abs(z1 - z2); // Rope length - NOTES: - Rope does NOT interact with anything you attach it to, in some cases it make interact with the world AFTER it breaks (seems to occur if you set the type to -1). - Rope will sometimes contract and fall to the ground like you'd expect it to, but since it doesn't interact with the world the effect is just jaring. - - - - - BRAIN::ADD_SCRIPT_TO_RANDOM_PED("pb_prostitute", ${s_f_y_hooker_01}, 100, 0); - ----- - Hardcoded to not work in Multiplayer. - ------ - Which I'm sure can easily be bypassed by nop'ing the branch preventing it from working if you are in multiplayer lol. Which would still be pointless since you don't need this to make peds do what you wish. - - - - - duration is float here - Event types- camx.me/gtav/tasks/shockingevents.txt - - - - - duration is float here - Event types - camx.me/gtav/tasks/shockingevents.txt - - - - - This is used to add a speedzone on a position. - Example usage C#: - uint speedZone = Function.Call<uint>((Hash) 0x2CE544C68FB812A0, Game.PlayerPed.Position.X, Game.PlayerPed.Position.Y, Game.PlayerPed.Position.Z, 100.0f, 0.0f, false); - (Thanks to alexguirre for his help!) - ========================================== - What is the point in adding a speed zone? Does it just generally affect the speed NPCs will drive? I can imagine running this on every section of the interstate setting it to 3 MPH rip. - - - - - This is used to add a speedzone on a position. - Example usage C#: - uint speedZone = Function.Call<uint>((Hash) 0x2CE544C68FB812A0, Game.PlayerPed.Position.X, Game.PlayerPed.Position.Y, Game.PlayerPed.Position.Z, 100.0f, 0.0f, false); - (Thanks to alexguirre for his help!) - ========================================== - What is the point in adding a speed zone? Does it just generally affect the speed NPCs will drive? I can imagine running this on every section of the interstate setting it to 3 MPH rip. - - - - - p1 was always -1. - used for phone applications; scaleform - - - - - p1 was always -1. - used for phone applications; scaleform - - - - - This native (along with 0x6C188BE134E074AA and 0x94CF4AC034C9C986) do not actually filter anything. They simply add the provided text (as of 944) - did you even check the disassembly? - > Do you even lift bro? The PLAYER_NAME and WEBSITE natives are the correct names, it doesn't matter if they're filtered or not. Blame R* for that matter. Hashes don't lie, and it's extremely unlikely the validated names are collisions (what are the odds??) - - - - - This native (along with 0x6C188BE134E074AA and 0x94CF4AC034C9C986) do not actually filter anything. They simply add the provided text (as of 944) - did you even check the disassembly? - > Do you even lift bro? The PLAYER_NAME and WEBSITE natives are the correct names, it doesn't matter if they're filtered or not. Blame R* for that matter. Hashes don't lie, and it's extremely unlikely the validated names are collisions (what are the odds??) - - - - - Adds an arbitrary string as a text component placeholder, replacing `~a~` in the current text command's text label. - See the documentation on text formatting for more information. - - A string to add of up to 99 characters. This can contain additional `~` formatting directives. - - - - Adds an arbitrary string as a text component placeholder, replacing `~a~` in the current text command's text label. - See the documentation on text formatting for more information. - - A string to add of up to 99 characters. This can contain additional `~` formatting directives. - - - - It adds the localized text of the specified GXT entry name. Eg. if the argument is GET_HASH_KEY("ES_HELP"), adds "Continue". Just uses a text labels hash key - - - - - It adds the localized text of the specified GXT entry name. Eg. if the argument is GET_HASH_KEY("ES_HELP"), adds "Continue". Just uses a text labels hash key - - - - - Adds a timer (e.g. "00:00:00:000"). The appearance of the timer depends on the flags, which needs more research. - - - - - This native (along with 0x5F68520888E69014 and 0x6C188BE134E074AA) do not actually filter anything. They simply add the provided text (as of 944) - - - - - This native (along with 0x5F68520888E69014 and 0x6C188BE134E074AA) do not actually filter anything. They simply add the provided text (as of 944) - - - - - Hash collision! - _IS_MP_GAMER_TAG_ACTIVE_2 - - - - - x, y, z: offset in world coords from some entity. - - - - - Seems to animate the gameplay camera zoom. - Eg. _ANIMATE_GAMEPLAY_CAM_ZOOM(1f, 1000f); - will animate the camera zooming in from 1000 meters away. - Game scripts use it like this: - // Setting this to 1 prevents V key from changing zoom - PLAYER::SET_PLAYER_FORCED_ZOOM(PLAYER::PLAYER_ID(), 1); - // These restrict how far you can move cam up/down left/right - CAM::_CLAMP_GAMEPLAY_CAM_YAW(-20f, 50f); - CAM::_CLAMP_GAMEPLAY_CAM_PITCH(-60f, 0f); - CAM::_ANIMATE_GAMEPLAY_CAM_ZOOM(1f, 1f); - - - - - Example from michael2 script. - CAM::ANIMATED_SHAKE_CAM(l_5069, "shake_cam_all@", "light", "", 1f); - - - - - Called in the gamescripts like: - APP::APP_SET_APP("car"); - APP::APP_SET_APP("dog"); - - - - - damages a ped with the given amount - ---- - armorFirst means it will damage/lower the armor first before damaging the player. - setting damageAmount to a negative amount will cause the player or the armor (depending on armorFirst) to be healed by damageAmount instead. - - - - - Documented here: - gtaforums.com/topic/885669-precisely-define-object-physics/ - gtaforums.com/topic/887362-apply-forces-and-momentums-to-entityobject/ - forceFlags: - First bit (lowest): Strong force flag, factor 100 - Second bit: Unkown flag - Third bit: Momentum flag=1 (vector (x,y,z) is a momentum, more research needed) - If higher bits are unequal 0 the function doesn't applay any forces at all. - (As integer possible values are 0-7) - 0: weak force - 1: strong force - 2: same as 0 (2nd bit?) - 3: same as 1 - 4: weak momentum - 5: strong momentum - 6: same as 4 - 7: same as 5 - isDirectionRel: vector defined in local (body-fixed) coordinate frame - isForceRel: if true the force gets multiplied with the objects mass (this is why it was known as highForce) and different objects will have the same acceleration. - - - - - Found one occurence in re_crashrescue.c4 - PED::APPLY_PED_BLOOD(l_4B, 3, 0.0, 0.0, 0.0, "wound_sheet"); - - - - - APPLY_PED_DAMAGE_DECAL(ped, 1, 0.5f, 0.513f, 0f, 1f, unk, 0, 0, "blushing"); - - - - - Damage Packs: - "SCR_TrevorTreeBang" - "HOSPITAL_0" - "HOSPITAL_1" - "HOSPITAL_2" - "HOSPITAL_3" - "HOSPITAL_4" - "HOSPITAL_5" - "HOSPITAL_6" - "HOSPITAL_7" - "HOSPITAL_8" - "HOSPITAL_9" - "SCR_Dumpster" - "BigHitByVehicle" - "SCR_Finale_Michael_Face" - "SCR_Franklin_finb" - "SCR_Finale_Michael" - "SCR_Franklin_finb2" - "Explosion_Med" - "SCR_Torture" - "SCR_TracySplash" - "Skin_Melee_0" - Additional damage packs: - gist.github.com/alexguirre/f3f47f75ddcf617f416f3c8a55ae2227 - - - - - Appears to return false if any window is broken. - - - - - Returns false if every seat is occupied. - - - - - Returns false if every seat is occupied. - - - - - Returns true when the bomb bay doors of this plane are open. False if they're closed. - - The vehicle to check the bomb bay doors on. - A bool indicating the state of the doors (true = open, false = closed). - - - - Returns true when the bomb bay doors of this plane are open. False if they're closed. - - The vehicle to check the bomb bay doors on. - A bool indicating the state of the doors (true = open, false = closed). - - - - Returns true when the bomb bay doors of this plane are open. False if they're closed. - - The vehicle to check the bomb bay doors on. - A bool indicating the state of the doors (true = open, false = closed). - - - - Returns true if the coords are colliding with the outdoors, and false if they collide with an interior. - - - - - Returns true if the coords are colliding with the outdoors, and false if they collide with an interior. - - - - - Found this in the decompiled scripts, I'd do more research before changing the name -- - if (!ENTITY::IS_ENTITY_DEAD(l_1911)) { - if (!VEHICLE::_755D6D5267CBBD7E(l_1911)) { - sub_1ba80("TRAFFICKING AIR: FAILING - PROPELLERS ARE DAMAGED"); - l_12CE = 9; - } - } - - - - - Found this in the decompiled scripts, I'd do more research before changing the name -- - if (!ENTITY::IS_ENTITY_DEAD(l_1911)) { - if (!VEHICLE::_755D6D5267CBBD7E(l_1911)) { - sub_1ba80("TRAFFICKING AIR: FAILING - PROPELLERS ARE DAMAGED"); - l_12CE = 9; - } - } - - - - - is this like strcmp?? - - - - - ADD_A_MARKER_OVER_VEHICLE was a hash collision!!! - Can be used for planes only! - - - - - ADD_A_MARKER_OVER_VEHICLE was a hash collision!!! - Can be used for planes only! - - - - - ADD_A_MARKER_OVER_VEHICLE was a hash collision!!! - Can be used for planes only! - - - - - Types: - 1 = Boolean - 2 = Integer - 3 = Float - 4 = String - 5 = Vector3 - 6 = Object - 7 = Array - - - - - Returns arcsin value of p0. - - - - - Routes: "1_FIBStairs", "2_FIBStairs", "3_FIBStairs", "4_FIBStairs", "5_FIBStairs", "5_TowardsFire", "6a_FIBStairs", "7_FIBStairs", "8_FIBStairs", "Aprtmnt_1", "AssAfterLift", "ATM_1", "coroner2", "coroner_stairs", "f5_jimmy1", "fame1", "family5b", "family5c", "Family5d", "family5d", "FIB_Glass1", "FIB_Glass2", "FIB_Glass3", "finaBroute1A", "finalb1st", "finalB1sta", "finalbround", "finalbroute2", "Hairdresser1", "jan_foyet_ft_door", "Jo_3", "Lemar1", "Lemar2", "mansion_1", "Mansion_1", "pols_1", "pols_2", "pols_3", "pols_4", "pols_5", "pols_6", "pols_7", "pols_8", "Pro_S1", "Pro_S1a", "Pro_S2", "Towards_case", "trev_steps", "tunrs1", "tunrs2", "tunrs3", "Wave01457s" - - - - - Returns arctan value of p0. - - - - - Last param determines if its relative to the Entity - - - - - Attaches entity 1 to entity 2. - - - - - Attaches entity1 to bone (boneIndex) of entity2. - boneIndex - this is different to boneID, use GET_PED_BONE_INDEX to get the index from the ID. use the index for attaching to specific bones. entity1 will be attached to entity2's centre if bone index given doesn't correspond to bone indexes for that entity type. - useSoftPinning - when 2 entities with collision collide and form into a ball they will break the attachment of the entity that they were attached to. Or when an entity is attached far away and then the resets. - collision - controls collision between the two entities (FALSE disables collision). - isPed - pitch doesnt work when false and roll will only work on negative numbers (only peds) - vertexIndex - position of vertex - fixedRot - if false it ignores entity vector - - - - - breakForce is the amount of force required to break the bond. - fixedRot - if false it ignores entity vector - p15 - is 1 or 0 in scripts - unknoun what it does - collision - controls collision between the two entities (FALSE disables collision). - teleport - do not teleport entity to be attached to the position of the bone Index of the target entity (if 1, entity will not be teleported to target bone) - p18 - is always 2 in scripts. - ------------------------- - teleport is not exactly "doNotTeleport". What it actually does is the following: - if true, entities will be attached as if loosely tethered, up to the maximum offset position specified. Almost as if attached by an invisible rope. - if false, entities will be attached in a fixed position as specified in the offset position. - When p15 = true, it seems to force teleport to false. - It also lets the Rotation params actually work. - - - - - The position supplied can be anywhere, and the entity should anchor relative to that point from it's origin. - - - - - Might be more appropriate in AUDIO? - - - - - HookOffset defines where the hook is attached. leave at 0 for default attachment. - When using the tow truck online, this is not used (set a breakpoint and never called during tow truck attachment) - - - - - MulleDK19: Starts a new enumeration of the current threads. - Call this first, then _GET_ID_OF_NEXT_THREAD_IN_ENUMERATION (0x30B4FA1C82DD4B9F) - see _GET_ID_OF_NEXT_THREAD_IN_ENUMERATION (0x30B4FA1C82DD4B9F) for an example - - - - - MulleDK19: Starts a new enumeration of the current threads. - Call this first, then _GET_ID_OF_NEXT_THREAD_IN_ENUMERATION (0x30B4FA1C82DD4B9F) - see _GET_ID_OF_NEXT_THREAD_IN_ENUMERATION (0x30B4FA1C82DD4B9F) for an example - - - - - Push a function from the Scaleform onto the stack - - - - - Push a function from the Scaleform onto the stack - - - - - Pushes a function from the Hud component Scaleform onto the stack. Same behavior as GRAPHICS::_PUSH_SCALEFORM_MOVIE_FUNCTION, just a hud component id instead of a Scaleform. - Known components: - 19 - 20 - This native requires more research - all information can be found inside of 'hud.gfx'. Using a decompiler, the different components are located under "scripts\__Packages\com\rockstargames\gtav\hud\hudComponents" and "scripts\__Packages\com\rockstargames\gtav\Multiplayer". - - - - - Pushes a function from the Hud component Scaleform onto the stack. Same behavior as GRAPHICS::_PUSH_SCALEFORM_MOVIE_FUNCTION, just a hud component id instead of a Scaleform. - Known components: - 19 - 20 - This native requires more research - all information can be found inside of 'hud.gfx'. Using a decompiler, the different components are located under "scripts\__Packages\com\rockstargames\gtav\hud\hudComponents" and "scripts\__Packages\com\rockstargames\gtav\Multiplayer". - - - - - Possibly calls "global" Scaleform functions - needs more research! - - - - - Possibly calls "global" Scaleform functions - needs more research! - - - - - Possibly calls "global" Scaleform functions - needs more research! - - - - - Initializes the text entry for the the text next to a loading prompt. All natives for for building UI texts can be used here - BEGIN_TEXT_COMMAND_PRINT - e.g - void StartLoadingMessage(char *text, int spinnerType = 3) - { - _SET_LOADING_PROMPT_TEXT_ENTRY("STRING"); - ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(text); - _SHOW_LOADING_PROMPT(spinnerType); - } - -- [[OR]] - void ShowLoadingMessage(char *text, int spinnerType = 3, int timeMs = 10000) - { - _SET_LOADING_PROMPT_TEXT_ENTRY("STRING"); - ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(text); - _SHOW_LOADING_PROMPT(spinnerType); - WAIT(timeMs); - _REMOVE_LOADING_PROMPT(); - } - These are some localized strings used in the loading spinner. - "PM_WAIT" = Please Wait - "CELEB_WPLYRS" = Waiting For Players. - "CELL_SPINNER2" = Scanning storage. - "ERROR_CHECKYACHTNAME" = Registering your yacht's name. Please wait. - "ERROR_CHECKPROFANITY" = Checking your text for profanity. Please wait. - "FM_COR_AUTOD" = Just spinner no text - "FM_IHELP_WAT2" = Waiting for other players - "FM_JIP_WAITO" = Game options are being set - "FMMC_DOWNLOAD" = Downloading - "FMMC_PLYLOAD" = Loading - "FMMC_STARTTRAN" = Launching session - "HUD_QUITTING" = Quiting session - "KILL_STRIP_IDM" = Waiting for to accept - "MP_SPINLOADING" = Loading - - - - - Initializes the text entry for the the text next to a loading prompt. All natives for for building UI texts can be used here - BEGIN_TEXT_COMMAND_PRINT - e.g - void StartLoadingMessage(char *text, int spinnerType = 3) - { - _SET_LOADING_PROMPT_TEXT_ENTRY("STRING"); - ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(text); - _SHOW_LOADING_PROMPT(spinnerType); - } - -- [[OR]] - void ShowLoadingMessage(char *text, int spinnerType = 3, int timeMs = 10000) - { - _SET_LOADING_PROMPT_TEXT_ENTRY("STRING"); - ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(text); - _SHOW_LOADING_PROMPT(spinnerType); - WAIT(timeMs); - _REMOVE_LOADING_PROMPT(); - } - These are some localized strings used in the loading spinner. - "PM_WAIT" = Please Wait - "CELEB_WPLYRS" = Waiting For Players. - "CELL_SPINNER2" = Scanning storage. - "ERROR_CHECKYACHTNAME" = Registering your yacht's name. Please wait. - "ERROR_CHECKPROFANITY" = Checking your text for profanity. Please wait. - "FM_COR_AUTOD" = Just spinner no text - "FM_IHELP_WAT2" = Waiting for other players - "FM_JIP_WAITO" = Game options are being set - "FMMC_DOWNLOAD" = Downloading - "FMMC_PLYLOAD" = Loading - "FMMC_STARTTRAN" = Launching session - "HUD_QUITTING" = Quiting session - "KILL_STRIP_IDM" = Waiting for to accept - "MP_SPINLOADING" = Loading - - - - - Initializes the text entry for the the text next to a loading prompt. All natives for for building UI texts can be used here - BEGIN_TEXT_COMMAND_PRINT - e.g - void StartLoadingMessage(char *text, int spinnerType = 3) - { - _SET_LOADING_PROMPT_TEXT_ENTRY("STRING"); - ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(text); - _SHOW_LOADING_PROMPT(spinnerType); - } - -- [[OR]] - void ShowLoadingMessage(char *text, int spinnerType = 3, int timeMs = 10000) - { - _SET_LOADING_PROMPT_TEXT_ENTRY("STRING"); - ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(text); - _SHOW_LOADING_PROMPT(spinnerType); - WAIT(timeMs); - _REMOVE_LOADING_PROMPT(); - } - These are some localized strings used in the loading spinner. - "PM_WAIT" = Please Wait - "CELEB_WPLYRS" = Waiting For Players. - "CELL_SPINNER2" = Scanning storage. - "ERROR_CHECKYACHTNAME" = Registering your yacht's name. Please wait. - "ERROR_CHECKPROFANITY" = Checking your text for profanity. Please wait. - "FM_COR_AUTOD" = Just spinner no text - "FM_IHELP_WAT2" = Waiting for other players - "FM_JIP_WAITO" = Game options are being set - "FMMC_DOWNLOAD" = Downloading - "FMMC_PLYLOAD" = Loading - "FMMC_STARTTRAN" = Launching session - "HUD_QUITTING" = Quiting session - "KILL_STRIP_IDM" = Waiting for to accept - "MP_SPINLOADING" = Loading - - - - - clears a print text command with this text - - - - - clears a print text command with this text - - - - - Used to be known as _SET_TEXT_COMPONENT_FORMAT - - - - - Used to be known as _SET_TEXT_COMPONENT_FORMAT - - - - - The following were found in the decompiled script files: - STRING, TWOSTRINGS, NUMBER, PERCENTAGE, FO_TWO_NUM, ESMINDOLLA, ESDOLLA, MTPHPER_XPNO, AHD_DIST, CMOD_STAT_0, CMOD_STAT_1, CMOD_STAT_2, CMOD_STAT_3, DFLT_MNU_OPT, F3A_TRAFDEST, ES_HELP_SOC3 - ESDOLLA - ESMINDOLLA - cash (negative) - Used to be known as _SET_TEXT_ENTRY - - - - - The following were found in the decompiled script files: - STRING, TWOSTRINGS, NUMBER, PERCENTAGE, FO_TWO_NUM, ESMINDOLLA, ESDOLLA, MTPHPER_XPNO, AHD_DIST, CMOD_STAT_0, CMOD_STAT_1, CMOD_STAT_2, CMOD_STAT_3, DFLT_MNU_OPT, F3A_TRAFDEST, ES_HELP_SOC3 - ESDOLLA - ESMINDOLLA - cash (negative) - Used to be known as _SET_TEXT_ENTRY - - - - - nothin doin. - BOOL Message(char* text) - { - BEGIN_TEXT_COMMAND_IS_MESSAGE_DISPLAYED("STRING"); - ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(text); - return END_TEXT_COMMAND_IS_MESSAGE_DISPLAYED(); - } - - - - - nothin doin. - BOOL Message(char* text) - { - BEGIN_TEXT_COMMAND_IS_MESSAGE_DISPLAYED("STRING"); - ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(text); - return END_TEXT_COMMAND_IS_MESSAGE_DISPLAYED(); - } - - - - - BOOL IsContextActive(char *ctx) - { - BEGIN_TEXT_COMMAND_IS_THIS_HELP_MESSAGE_BEING_DISPLAYED(ctx); - return END_TEXT_COMMAND_IS_THIS_HELP_MESSAGE_BEING_DISPLAYED(0); - } - - - - - BOOL IsContextActive(char *ctx) - { - BEGIN_TEXT_COMMAND_IS_THIS_HELP_MESSAGE_BEING_DISPLAYED(ctx); - return END_TEXT_COMMAND_IS_THIS_HELP_MESSAGE_BEING_DISPLAYED(0); - } - - - - - get's line count - int GetLineCount(char *text, float x, float y) - { - _BEGIN_TEXT_COMMAND_LINE_COUNT("STRING"); - ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(text); - return _END_TEXT_COMMAND_GET_LINE_COUNT(x, y); - } - - - - - get's line count - int GetLineCount(char *text, float x, float y) - { - _BEGIN_TEXT_COMMAND_LINE_COUNT("STRING"); - ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(text); - return _END_TEXT_COMMAND_GET_LINE_COUNT(x, y); - } - - - - - nothin doin. - void message() - { - _BEGIN_TEXT_COMMAND_OBJECTIVE("AHT_RTIT"); - _END_TEXT_COMMAND_OBJECTIVE(0); - } - - - - - nothin doin. - void message() - { - _BEGIN_TEXT_COMMAND_OBJECTIVE("AHT_RTIT"); - _END_TEXT_COMMAND_OBJECTIVE(0); - } - - - - - Used to be known as _SET_TEXT_ENTRY_2 - void ShowSubtitle(char *text) - { - BEGIN_TEXT_COMMAND_PRINT("STRING"); - ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(text); - END_TEXT_COMMAND_PRINT(2000, 1); - } - - - - - Used to be known as _SET_TEXT_ENTRY_2 - void ShowSubtitle(char *text) - { - BEGIN_TEXT_COMMAND_PRINT("STRING"); - ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(text); - END_TEXT_COMMAND_PRINT(2000, 1); - } - - - - - Previously called _BEGIN_TEXT_COMPONENT - Called prior to adding a text component to the UI. After doing so, GRAPHICS::END_TEXT_COMMAND_SCALEFORM_STRING is called. - Examples: - GRAPHICS::BEGIN_TEXT_COMMAND_SCALEFORM_STRING("NUMBER"); - UI::ADD_TEXT_COMPONENT_INTEGER(GAMEPLAY::ABSI(a_1)); - GRAPHICS::END_TEXT_COMMAND_SCALEFORM_STRING(); - GRAPHICS::BEGIN_TEXT_COMMAND_SCALEFORM_STRING("STRING"); - UI::_ADD_TEXT_COMPONENT_STRING(a_2); - GRAPHICS::END_TEXT_COMMAND_SCALEFORM_STRING(); - GRAPHICS::BEGIN_TEXT_COMMAND_SCALEFORM_STRING("STRTNM2"); - UI::_0x17299B63C7683A2B(v_3); - UI::_0x17299B63C7683A2B(v_4); - GRAPHICS::END_TEXT_COMMAND_SCALEFORM_STRING(); - GRAPHICS::BEGIN_TEXT_COMMAND_SCALEFORM_STRING("STRTNM1"); - UI::_0x17299B63C7683A2B(v_3); - GRAPHICS::END_TEXT_COMMAND_SCALEFORM_STRING(); - - - - - Previously called _BEGIN_TEXT_COMPONENT - Called prior to adding a text component to the UI. After doing so, GRAPHICS::END_TEXT_COMMAND_SCALEFORM_STRING is called. - Examples: - GRAPHICS::BEGIN_TEXT_COMMAND_SCALEFORM_STRING("NUMBER"); - UI::ADD_TEXT_COMPONENT_INTEGER(GAMEPLAY::ABSI(a_1)); - GRAPHICS::END_TEXT_COMMAND_SCALEFORM_STRING(); - GRAPHICS::BEGIN_TEXT_COMMAND_SCALEFORM_STRING("STRING"); - UI::_ADD_TEXT_COMPONENT_STRING(a_2); - GRAPHICS::END_TEXT_COMMAND_SCALEFORM_STRING(); - GRAPHICS::BEGIN_TEXT_COMMAND_SCALEFORM_STRING("STRTNM2"); - UI::_0x17299B63C7683A2B(v_3); - UI::_0x17299B63C7683A2B(v_4); - GRAPHICS::END_TEXT_COMMAND_SCALEFORM_STRING(); - GRAPHICS::BEGIN_TEXT_COMMAND_SCALEFORM_STRING("STRTNM1"); - UI::_0x17299B63C7683A2B(v_3); - GRAPHICS::END_TEXT_COMMAND_SCALEFORM_STRING(); - - - - - Starts a text command to change the name of a blip displayed in the pause menu. - This should be paired with [`END_TEXT_COMMAND_SET_BLIP_NAME`](#_0xBC38B49BCB83BC9B), once adding all required text components. - - The text label to set. - - - - void message(char *text) - { - _BEGIN_TEXT_COMMAND_TIMER("STRING"); - ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(text); - _END_TEXT_COMMAND_TIMER(0); - } - - - - - void message(char *text) - { - _BEGIN_TEXT_COMMAND_TIMER("STRING"); - ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(text); - _END_TEXT_COMMAND_TIMER(0); - } - - - - - Example: - _BEGIN_TEXT_COMMAND_WIDTH("NUMBER"); - ADD_TEXT_COMPONENT_FLOAT(69.420f, 2); - float width = _END_TEXT_COMMAND_GET_WIDTH(true); - - - - - Example: - _BEGIN_TEXT_COMMAND_WIDTH("NUMBER"); - ADD_TEXT_COMPONENT_FLOAT(69.420f, 2); - float width = _END_TEXT_COMMAND_GET_WIDTH(true); - - - - - Plays the siren sound of a vehicle which is otherwise activated when fastly double-pressing the horn key. - Only works on vehicles with a police siren. - - - - - calling this each frame, it stops the player from receiving a weapon via the weapon wheel. - - - - - calling this each frame, it stops the player from receiving a weapon via the weapon wheel. - - - - - Calculates the travel distance between a set of points. - Doesn't seem to correlate with distance on gps sometimes. - - - - - This is similar to the PushScaleformMovieFunction natives, except it calls in the `TIMELINE` of a minimap overlay. - - The minimap overlay ID. - A function in the overlay's TIMELINE. - - - - Calls the Scaleform function and passes the parameters as floats. - The number of parameters passed to the function varies, so the end of the parameter list is represented by -1.0. - - - - - Calls the Scaleform function and passes both float and string parameters (in their respective order). - The number of parameters passed to the function varies, so the end of the float parameters is represented by -1.0, and the end of the string parameters is represented by 0 (NULL). - NOTE: The order of parameters in the function prototype is important! All float parameters must come first, followed by the string parameters. - Examples: - // function MY_FUNCTION(floatParam1, floatParam2, stringParam) - GRAPHICS::_CALL_SCALEFORM_MOVIE_FUNCTION_MIXED_PARAMS(scaleform, "MY_FUNCTION", 10.0, 20.0, -1.0, -1.0, -1.0, "String param", 0, 0, 0, 0); - // function MY_FUNCTION_2(floatParam, stringParam1, stringParam2) - GRAPHICS::_CALL_SCALEFORM_MOVIE_FUNCTION_MIXED_PARAMS(scaleform, "MY_FUNCTION_2", 10.0, -1.0, -1.0, -1.0, -1.0, "String param #1", "String param #2", 0, 0, 0); - - - - - Calls the Scaleform function and passes the parameters as strings. - The number of parameters passed to the function varies, so the end of the parameter list is represented by 0 (NULL). - - - - - Calls the Scaleform function. - - - - - Calls the Scaleform function. - - - - - Prevents the ped from going limp. - [Example: Can prevent peds from falling when standing on moving vehicles.] - - - - - Returns true if ped1 can see ped2 in their line of vision - - - - - Returns true if ped1 can see ped2 in their line of vision - - - - - Checks if the ped can play the speech or has the speech file, last parameter is usually 0 - - - - - Checks if the ped can play the speech or has the speech file, last parameter is usually 0 - - - - - This one is weird and seems to return a TRUE state regardless of whether the phone is visible on screen or tucked away. - I can confirm the above. This function is hard-coded to always return 1. - - - - - if(_CAN_PLAY_ONLINE() == 0) means the player is banned(Social Club or Rockstar) - - - - - if(_CAN_PLAY_ONLINE() == 0) means the player is banned(Social Club or Rockstar) - - - - - if (CAN_REGISTER_MISSION_ENTITIES(20, 20, 20, 10)) - { - } - - - - - modelHash (p1) was always 0 in R* scripts - - - - - this returns if you can use the weapon while using a parachute - - - - - Cancels the currently executing event. - - - - - All music event names found in the b617d scripts: pastebin.com/GnYt0R3P - - - - - Does something similar to INTERIOR::DISABLE_INTERIOR - - - - - I'm guessing this rounds a float value up to the next whole number, and FLOOR rounds it down - - - - - hash collision??? - - - - - When calling this, the current frame will have the players "arrow icon" be focused on the dead center of the radar. - - - - - b2 and/or b3 maybe got something to do with keeping values from the last ped. Both of them set to 1 works great. <br/><br/>Examples from the decompiled scripts:<br/><br/>PLAYER::CHANGE_PLAYER_PED(PLAYER::PLAYER_ID(), l_5C0[4 -- [[14]] ], 0, 1);<br/>PLAYER::CHANGE_PLAYER_PED(PLAYER::PLAYER_ID(), a_0[a_0._f7 -- [[1]] ], a_2, 0);<br/><br/><br/>===========================================================<br/>The only way I ever got this to work in GTA Online once is by setting both to 0, 0. However, when you switch from your online character to whomever, your character will start walking away 'as if you left the game.' If from there you attempt to call this native once more to switch back to you online ped. You will freeze or if you try changing to another ped. I've tried all posibilities so far.<br/>1, 1 (Freeze), 0, 0(Works Once), 1, 0 & 0, 1 (Freeze). Note of course trying to call this on another online player will crash. Anyone have any idea if implementing a blr within the xex itself on a possible check if it would prevent this freezing?<br/>=========================================================== - - - - - minimum: Degrees between -90f and 90f. - maximum: Degrees between -90f and 90f. - Clamps the gameplay camera's current pitch. - Eg. _CLAMP_GAMEPLAY_CAM_PITCH(0.0f, 0.0f) will set the vertical angle directly behind the player. - - - - - minimum: Degrees between -180f and 180f. - maximum: Degrees between -180f and 180f. - Clamps the gameplay camera's current yaw. - Eg. _CLAMP_GAMEPLAY_CAM_YAW(0.0f, 0.0f) will set the horizontal angle directly behind the player. - - - - - Removes broken glass particles. - - - - - List of component/props ID - gtaxscripting.blogspot.com/2016/04/gta-v-peds-component-and-props.html - - - - - This function also has a p2, unknown. Signature AUDIO::CLEAR_AMBIENT_ZONE_STATE(char* zoneName, bool p1, Any p2); - Still needs more research. - Here are the names I've found: pastebin.com/AfA0Qjyv - New Ambient Zone List (Combind with old): pastebin.com/h8BsKgUD -DasChaos - - - - - Example: CLEAR_AREA(0, 0, 0, 30, true, false, false, false); - - - - - GAMEPLAY::_0x957838AAF91BD12D(x, y, z, radius, false, false, false, false); seem to make all objects go away, peds, vehicles etc. All booleans set to true doesn't seem to change anything. - - - - - GAMEPLAY::_0x957838AAF91BD12D(x, y, z, radius, false, false, false, false); seem to make all objects go away, peds, vehicles etc. All booleans set to true doesn't seem to change anything. - - - - - I looked through the PC scripts that this site provides you with a link to find. It shows the last param mainly uses, (0, 2, 6, 16, and 17) so I am going to assume it is a type of flag. - - - - - Example: CLEAR_AREA_OF_PEDS(0, 0, 0, 10000, 1); - - - - - Example: CLEAR_AREA_OF_VEHICLES(0, 0, 0, 10000, false, false, false, false, false); - - - - - This sets bit [offset] of [address] to off. - Example: - GAMEPLAY::CLEAR_BIT(&bitAddress, 1); - To check if this bit has been enabled: - GAMEPLAY::IS_BIT_SET(bitAddress, 1); // will return 0 afterwards - - - - - Resets the screen's draw-origin which was changed by the function GRAPHICS::SET_DRAW_ORIGIN(...) back to x=0,y=0. - See GRAPHICS::SET_DRAW_ORIGIN(...) for further information. - - - - - Clears the secondary timecycle modifier usually set with [`SetExtraTimecycleModifier`](#_0X3B2FD68DB5F8331C) - - - - - Clears the secondary timecycle modifier usually set with [`SetExtraTimecycleModifier`](#_0X3B2FD68DB5F8331C) - - - - - p0 looks like int in script - - - - - Clears the GPS flags. Only the script that originally called SET_GPS_FLAGS can clear them. - Doesn't seem like the flags are actually read by the game at all. - - - - - _CLEAR_NOTIFICATIONS_POS(0.5f); - - - - - _CLEAR_NOTIFICATIONS_POS(0.5f); - - - - - Somehow related to changing ped's clothes. - - - - - Somehow related to changing ped's clothes. - - - - - p1: from 0 to 5 in the b617d scripts. - p2: "blushing" and "ALL" found in the b617d scripts. - - - - - p1: from 0 to 5 in the b617d scripts. - p2: "blushing" and "ALL" found in the b617d scripts. - - - - - List of component/props ID - gtaxscripting.blogspot.com/2016/04/gta-v-peds-component-and-props.html - - - - - Removes the scubagear (for mp male: component id: 8, drawableId: 123, textureId: any) from peds. Does not play the 'remove scuba gear' animation, but instantly removes it. - - The ped to remove the scuba gear from. - - - - Removes the scubagear (for mp male: component id: 8, drawableId: 123, textureId: any) from peds. Does not play the 'remove scuba gear' animation, but instantly removes it. - - The ped to remove the scuba gear from. - - - - Removes the scubagear (for mp male: component id: 8, drawableId: 123, textureId: any) from peds. Does not play the 'remove scuba gear' animation, but instantly removes it. - - The ped to remove the scuba gear from. - - - - Immediately stops the pedestrian from whatever it's doing. They stop fighting, animations, etc. they forget what they were doing. - - - - - It clears the wetness of the selected Ped/Player. Clothes have to be wet to notice the difference. - - - - - This executes at the same as speed as PLAYER::SET_PLAYER_WANTED_LEVEL(player, 0, false); - PLAYER::GET_PLAYER_WANTED_LEVEL(player); executes in less than half the time. Which means that it's worth first checking if the wanted level needs to be cleared before clearing. However, this is mostly about good code practice and can important in other situations. The difference in time in this example is negligible. - - - - - Only used once in the decompiled scripts. Seems to be related to scripted vehicle generators. - Modified example from "am_imp_exp.c4", line 6418: - -- [[ popSchedules[0] = ZONE::GET_ZONE_POPSCHEDULE(ZONE::GET_ZONE_AT_COORDS(891.3, 807.9, 188.1)); - etc. - ]] - STREAMING::SET_MODEL_AS_NO_LONGER_NEEDED(vehicleHash); - ZONE::CLEAR_POPSCHEDULE_OVERRIDE_VEHICLE_MODEL(popSchedules[index]); - - - - - Clears the relationship between two groups. This should be called twice (once for each group). - Relationship types: - 0 = Companion - 1 = Respect - 2 = Like - 3 = Neutral - 4 = Dislike - 5 = Hate - 255 = Pedestrians - (Credits: Inco) - Example: - PED::CLEAR_RELATIONSHIP_BETWEEN_GROUPS(2, l_1017, 0xA49E591C); - PED::CLEAR_RELATIONSHIP_BETWEEN_GROUPS(2, 0xA49E591C, l_1017); - - - - - p0: found arguments in the b617d scripts: pastebin.com/X5akCN7z - - - - - thisScriptCheck - can be destroyed if it belongs to the calling script. - Example of Cloning Your Player: - CLONE_PED(PLAYER_PED_ID(), GET_ENTITY_HEADING(PLAYER_PED_ID()), 0, 1); - - - - - What exactly is the difference? What does this exactly do by chance? - ^ Copies ped's components and props to targetPed. - --------------------------------------------------------------------------------- - | Internally has a 3rd param (bool) which is set to true by default | - - - - - What exactly is the difference? What does this exactly do by chance? - ^ Copies ped's components and props to targetPed. - --------------------------------------------------------------------------------- - | Internally has a 3rd param (bool) which is set to true by default | - - - - - Commits the backing pixels to the specified runtime texture. - - The runtime texture handle. - - - - Compares two strings up to a specified number of characters. - Parameters: - str1 - String to be compared. - str2 - String to be compared. - matchCase - Comparison will be case-sensitive. - maxLength - Maximum number of characters to compare. A value of -1 indicates an infinite length. - Returns: - A value indicating the relationship between the strings: - <0 - The first non-matching character in 'str1' is less than the one in 'str2'. (e.g. 'A' < 'B', so result = -1) - 0 - The contents of both strings are equal. - >0 - The first non-matching character in 'str1' is less than the one in 'str2'. (e.g. 'B' > 'A', so result = 1) - Examples: - GAMEPLAY::COMPARE_STRINGS("STRING", "string", false, -1); // 0; equal - GAMEPLAY::COMPARE_STRINGS("TESTING", "test", false, 4); // 0; equal - GAMEPLAY::COMPARE_STRINGS("R2D2", "R2xx", false, 2); // 0; equal - GAMEPLAY::COMPARE_STRINGS("foo", "bar", false, -1); // 4; 'f' > 'b' - GAMEPLAY::COMPARE_STRINGS("A", "A", true, 1); // 0; equal - When comparing case-sensitive strings, lower-case characters are greater than upper-case characters: - GAMEPLAY::COMPARE_STRINGS("A", "a", true, 1); // -1; 'A' < 'a' - GAMEPLAY::COMPARE_STRINGS("a", "A", true, 1); // 1; 'a' > 'A' - - - - - Works for vehicles with a retractable landing gear - landing gear states: - 0: Deployed - 1: Closing - 2: Opening - 3: Retracted - - - - - Works for vehicles with a retractable landing gear - landing gear states: - 0: Deployed - 1: Closing - 2: Opening - 3: Retracted - - - - - Forces the ped to use the mounted weapon. - Returns false if task is not possible. - - - - - Used for doing money drop - Pickup hashes: pastebin.com/8EuSv2r1 - - - - - "DEFAULT_SCRIPTED_CAMERA" - "DEFAULT_ANIMATED_CAMERA" - "DEFAULT_SPLINE_CAMERA" - "DEFAULT_SCRIPTED_FLY_CAMERA" - "TIMED_SPLINE_CAMERA" - - - - - camName is always set to "DEFAULT_SCRIPTED_CAMERA" in Rockstar's scripts. - ------------ - Camera names found in the b617d scripts: - "DEFAULT_ANIMATED_CAMERA" - "DEFAULT_SCRIPTED_CAMERA" - "DEFAULT_SCRIPTED_FLY_CAMERA" - "DEFAULT_SPLINE_CAMERA" - ------------ - Side Note: It seems p8 is basically to represent what would be the bool p1 within CREATE_CAM native. As well as the p9 since it's always 2 in scripts seems to represent what would be the last param within SET_CAM_ROT native which normally would be 2. - - - - - CAM::_GET_GAMEPLAY_CAM_COORDS can be used instead of posX,Y,Z - CAM::_GET_GAMEPLAY_CAM_ROT can be used instead of rotX,Y,Z - CAM::_80EC114669DAEFF4() can be used instead of p7 (Possible p7 is FOV parameter. ) - p8 ??? - p9 uses 2 by default - - - - - Creates a checkpoint. Returns the handle of the checkpoint. - 20/03/17 : Attention, checkpoints are already handled by the game itself, so you must not loop it like markers. - Parameters: - * type - The type of checkpoint to create. See below for a list of checkpoint types. - * pos1 - The position of the checkpoint. - * pos2 - The position of the next checkpoint to point to. - * radius - The radius of the checkpoint. - * color - The color of the checkpoint. - * reserved - Special parameter, see below for details. Usually set to 0 in the scripts. - Checkpoint types: - 0-4---------Cylinder: 1 arrow, 2 arrow, 3 arrows, CycleArrow, Checker - 5-9---------Cylinder: 1 arrow, 2 arrow, 3 arrows, CycleArrow, Checker - 10-14-------Ring: 1 arrow, 2 arrow, 3 arrows, CycleArrow, Checker - 15-19-------1 arrow, 2 arrow, 3 arrows, CycleArrow, Checker - 20-24-------Cylinder: 1 arrow, 2 arrow, 3 arrows, CycleArrow, Checker - 25-29-------Cylinder: 1 arrow, 2 arrow, 3 arrows, CycleArrow, Checker - 30-34-------Cylinder: 1 arrow, 2 arrow, 3 arrows, CycleArrow, Checker - 35-38-------Ring: Airplane Up, Left, Right, UpsideDown - 39----------? - 40----------Ring: just a ring - 41----------? - 42-44-------Cylinder w/ number (uses 'reserved' parameter) - 45-47-------Cylinder no arrow or number - If using type 42-44, reserved sets number / number and shape to display - 0-99------------Just numbers (0-99) - 100-109-----------------Arrow (0-9) - 110-119------------Two arrows (0-9) - 120-129----------Three arrows (0-9) - 130-139----------------Circle (0-9) - 140-149------------CycleArrow (0-9) - 150-159----------------Circle (0-9) - 160-169----Circle w/ pointer (0-9) - 170-179-------Perforated ring (0-9) - 180-189----------------Sphere (0-9) - - - - - Creates a DUI browser. This can be used to draw on a runtime texture using CREATE_RUNTIME_TEXTURE_FROM_DUI_HANDLE. - - The initial URL to load in the browser. - The width of the backing surface. - The height of the backing surface. - A DUI object. - - - - Creates a new ped group. - Groups can contain up to 8 peds. - The parameter is unused. - Returns a handle to the created group, or 0 if a group couldn't be created. - - - - - enum IncidentTypes - { - FireDepartment = 3, - Paramedics = 5, - Police = 7, - PedsInCavalcades = 11, - Merryweather = 14 - }; - As for the 'police' incident, it will call police cars to you, but unlike PedsInCavalcades & Merryweather they won't start shooting at you unless you shoot first or shoot at them. The top 2 however seem to cancel theirselves if there is noone dead around you or a fire. I only figured them out as I found out the 3rd param is definately the amountOfPeople and they called incident 3 in scripts with 4 people (which the firetruck has) and incident 5 with 2 people (which the ambulence has). The 4 param I cant say is radius, but for the pedsInCavalcades and Merryweather R* uses 0.0f and for the top 3 (Emergency Services) they use 3.0f. - Side Note: It seems calling the pedsInCavalcades or Merryweather then removing it seems to break you from calling the EmergencyEvents and I also believe pedsInCavalcades. (The V cavalcades of course not IV). - Side Note 2: I say it breaks as if you call this proper, - if(CREATE_INCIDENT) etc it will return false if you do as I said above. - ===================================================== - - - - - p0 could be type (valueused in scripts: 14, 7, 5, 3, 11) - p1 is a return from get_player_ped() in am_gang_call.c, but player_ped_id() in other (non am) scripts. - p3 is usually 0f or 3f - ===================================================== - enum IncidentTypes - { - FireDepartment = 3, - Paramedics = 5, - Police = 7, - PedsInCavalcades = 11, - Merryweather = 14 - }; - As for the 'police' incident, it will call police cars to you, but unlike PedsInCavalcades & Merryweather they won't start shooting at you unless you shoot first or shoot at them. The top 2 however seem to cancel theirselves if there is noone dead around you or a fire. I only figured them out as I found out the 3rd param is definately the amountOfPeople and they called incident 3 in scripts with 4 people (which the firetruck has) and incident 5 with 2 people (which the ambulence has). The 4 param I cant say is radius, but for the pedsInCavalcades and Merryweather R* uses 0.0f and for the top 3 (Emergency Services) they use 3.0f. - Side Note: It seems calling the pedsInCavalcades or Merryweather then removing it seems to break you from calling the EmergencyEvents and I also believe pedsInCavalcades. (The V cavalcades of course not IV). - Side Note 2: I say it breaks as if you call this proper, - if(CREATE_INCIDENT) etc it will return false if you do as I said above. - ===================================================== - - - - - creates single lightning+thunder at random position - - - - - Train models HAVE TO be loaded (requested) before you use this. - For variation 15 - request: - freight - freightcar - freightgrain - freightcont1 - freightcont2 - freighttrailer - - - - - Creates a mobile phone of the specified type. - Possible phone types: - 0 - Default phone / Michael's phone - 1 - Trevor's phone - 2 - Franklin's phone - 4 - Prologue phone - These values represent bit flags, so a value of '3' would toggle Trevor and Franklin's phones together, causing unexpected behavior and most likely crash the game. - - - - - p5 = sets as true in scripts - Same as the comment for CREATE_MODEL_SWAP unless for some reason p5 affects it this only works with objects as well. - Network players do not see changes done with this. - - - - - Only works with objects! - Network players do not see changes done with this. - - - - - Spawns one or more money pickups. - x: The X-component of the world position to spawn the money pickups at. - y: The Y-component of the world position to spawn the money pickups at. - z: The Z-component of the world position to spawn the money pickups at. - value: The combined value of the pickups (in dollars). - amount: The number of pickups to spawn. - model: The model to use, or 0 for default money model. - Example: - CREATE_MONEY_PICKUPS(x, y, z, 1000, 3, 0x684a97ae); - Spawns 3 spray cans that'll collectively give $1000 when picked up. (Three spray cans, each giving $334, $334, $332 = $1000). - ============================================== - Max is 2000 in MP. So if you put the amount to 20, but the value to $400,000 eg. They will only be able to pickup 20 - $2,000 bags. So, $40,000 - - - - - p0 was the return of NET_TO_PED in fm_mission_controler. - p4 was always "". - returns headDisplayId - - - - - p0 was the return of NET_TO_PED in fm_mission_controler. - p4 was always "". - returns headDisplayId - - - - - Creates a new NaturalMotion message. - startImmediately: If set to true, the character will perform the message the moment it receives it by GIVE_PED_NM_MESSAGE. If false, the Ped will get the message but won't perform it yet. While it's a boolean value, if negative, the message will not be initialized. - messageId: The ID of the NaturalMotion message. - If a message already exists, this function does nothing. A message exists until the point it has been successfully dispatched by GIVE_PED_NM_MESSAGE. - - - - - thisScriptCheck - can be destroyed if it belongs to the calling script. - p5 - last parameter does not mean object handle is returned - maybe a quick view in disassembly will tell us what is actually does - ---------- - prop_tt_screenstatic (0xE2E039BC) is handled different. Not sure how yet but it I know it is. - - - - - thisScriptCheck - can be destroyed if it belongs to the calling script. - p5 - does not mean object handle is returned - maybe a quick view in disassembly will tell us what is actually does - ---------- - prop_tt_screenstatic (0xE2E039BC) is handled different. Not sure how yet but it I know it is. - - - - - thisScriptCheck - can be destroyed if it belongs to the calling script. - p7 - last parameter does not mean ped handle is returned - maybe a quick view in disassembly will tell us what is actually does - *Heading*: 0.0 - *Heading* is the Z axis spawn rotation of the ped 0->5th parameter. - Ped Types: - enum PedTypes - { - PED_TYPE_PLAYER_0,// michael - PED_TYPE_PLAYER_1,// franklin - PED_TYPE_NETWORK_PLAYER, // mp character - PED_TYPE_PLAYER_2,// trevor - PED_TYPE_CIVMALE, - PED_TYPE_CIVFEMALE, - PED_TYPE_COP, - PED_TYPE_GANG_ALBANIAN, - PED_TYPE_GANG_BIKER_1, - PED_TYPE_GANG_BIKER_2, - PED_TYPE_GANG_ITALIAN, - PED_TYPE_GANG_RUSSIAN, - PED_TYPE_GANG_RUSSIAN_2, - PED_TYPE_GANG_IRISH, - PED_TYPE_GANG_JAMAICAN, - PED_TYPE_GANG_AFRICAN_AMERICAN, - PED_TYPE_GANG_KOREAN, - PED_TYPE_GANG_CHINESE_JAPANESE, - PED_TYPE_GANG_PUERTO_RICAN, - PED_TYPE_DEALER, - PED_TYPE_MEDIC, - PED_TYPE_FIREMAN, - PED_TYPE_CRIMINAL, - PED_TYPE_BUM, - PED_TYPE_PROSTITUTE, - PED_TYPE_SPECIAL, - PED_TYPE_MISSION, - PED_TYPE_SWAT, - PED_TYPE_ANIMAL, - PED_TYPE_ARMY - }; - - - - - thisScriptCheck - can be destroyed if it belongs to the calling script. - p5 - last parameter does not mean ped handle is returned - maybe a quick view in disassembly will tell us what is actually does - Ped Types: - enum ePedType - { - PED_TYPE_PLAYER_0 = 0, - PED_TYPE_PLAYER_1 = 1, - PED_TYPE_PLAYER_2 = 3, - PED_TYPE_CIVMALE = 4, - PED_TYPE_CIVFEMALE = 5, - PED_TYPE_COP = 6, - PED_TYPE_UNKNOWN_7 = 7, - PED_TYPE_UNKNOWN_12 = 12, // gang member? - PED_TYPE_UNKNOWN_19 = 19, - PED_TYPE_MEDIC = 20, - PED_TYPE_FIREMAN = 21, - PED_TYPE_UNKNOWN_22 = 22, - PED_TYPE_UNKNOWN_25 = 25, - PED_TYPE_UNKNOWN_26 = 26, - PED_TYPE_SWAT = 27, - PED_TYPE_ANIMAL = 28, - PED_TYPE_ARMY = 29 - }; - - - - - Drops the Hook/Magnet on a cargobob - state - enum eCargobobHook - { - CARGOBOB_HOOK = 0, - CARGOBOB_MAGNET = 1, - }; - - - - - Drops the Hook/Magnet on a cargobob - state - enum eCargobobHook - { - CARGOBOB_HOOK = 0, - CARGOBOB_MAGNET = 1, - }; - - - - - Pickup hashes: pastebin.com/8EuSv2r1 - - - - - Pickup hashes: pastebin.com/8EuSv2r1 - flags: - 8 (1 << 3): place on ground - 512 (1 << 9): spin around - - - - - Pickup hashes: pastebin.com/8EuSv2r1 - - - - - vb.net - Dim ped_handle As Integer - With Game.Player.Character - Dim pos As Vector3 = .Position + .ForwardVector * 3 - ped_handle = Native.Function.Call(Of Integer)(Hash.CREATE_RANDOM_PED, pos.X, pos.Y, pos.Z) - End With - Creates a Ped at the specified location, returns the Ped Handle. - Ped will not act until SET_PED_AS_NO_LONGER_NEEDED is called. - - - - - Creates a blank runtime texture. - - A handle to the runtime TXD to create the runtime texture in. - The name for the texture in the runtime texture dictionary. - The width of the new texture. - The height of the new texture. - A runtime texture handle. - - - - Creates a runtime texture from a DUI handle. - - A handle to the runtime TXD to create the runtime texture in. - The name for the texture in the runtime texture dictionary. - The DUI handle returned from GET_DUI_HANDLE. - The runtime texture handle. - - - - Creates a runtime texture from the specified file in the current resource. - - A handle to the runtime TXD to create the runtime texture in. - The name for the texture in the runtime texture dictionary. - The file name of an image to load. This should preferably be a PNG, and has to be specified as a `file` in the resource manifest. - A runtime texture handle. - - - - Creates a runtime texture dictionary with the specified name. - Example: - ```lua - local txd = CreateRuntimeTxd('meow') - ``` - - The name for the runtime TXD. - A handle to the runtime TXD. - - - - Creates a script vehicle generator at the given coordinates. Most parameters after the model hash are unknown. - Parameters: - a/w/s - Generator position - heading - Generator heading - p4 - Unknown (always 5.0) - p5 - Unknown (always 3.0) - modelHash - Vehicle model hash - p7/8/9/10 - Unknown (always -1) - p11 - Unknown (usually TRUE, only one instance of FALSE) - p12/13 - Unknown (always FALSE) - p14 - Unknown (usally FALSE, only two instances of TRUE) - p15 - Unknown (always TRUE) - p16 - Unknown (always -1) - Vector3 coords = GET_ENTITY_COORDS(PLAYER_PED_ID(), 0); CREATE_SCRIPT_VEHICLE_GENERATOR(coords.x, coords.y, coords.z, 1.0f, 5.0f, 3.0f, GET_HASH_KEY("adder"), -1. -1, -1, -1, -1, true, false, false, false, true, -1); - - - - - p6 always 2 (but it doesnt seem to matter...) - roll and pitch 0 - yaw to Ped.rotation - - - - - Creates a tracked point, useful for checking the visibility of a 3D point on screen. - - - - - thisScriptCheck - can be destroyed if it belongs to the calling script. - - - - - Now has 8 params. - - - - - some camera effect that is used in the drunk-cheat, and turned off (by setting it to 0.0) along with the shaking effects once the drunk cheat is disabled. - - - - - some camera effect that is used in the drunk-cheat, and turned off (by setting it to 0.0) along with the shaking effects once the drunk cheat is disabled. - - - - - Example: - if (!DATAFILE::_BEDB96A7584AA8CF()) - { - if (!g_109E3) - { - if (((sub_d4f() == 2) == 0) && (!NETWORK::NETWORK_IS_GAME_IN_PROGRESS())) - { - if (NETWORK::NETWORK_IS_CLOUD_AVAILABLE()) - { - g_17A8B = 0; - } - if (!g_D52C) - { - sub_730(); - } - } - } - } - - - - - Example: - if (!DATAFILE::_BEDB96A7584AA8CF()) - { - if (!g_109E3) - { - if (((sub_d4f() == 2) == 0) && (!NETWORK::NETWORK_IS_GAME_IN_PROGRESS())) - { - if (NETWORK::NETWORK_IS_CLOUD_AVAILABLE()) - { - g_17A8B = 0; - } - if (!g_D52C) - { - sub_730(); - } - } - } - } - - - - - Returns whether or not the specified property is set for the entity. - - - - - Console Hash: 0x8DE5382F - The native name is correct but the db automatically prefixes "_" to unknown natives when changed. - - - - - Is property of that type. - enum eDecorType - { - DECOR_TYPE_FLOAT = 1, - DECOR_TYPE_BOOL, - DECOR_TYPE_INT, - DECOR_TYPE_UNK, - DECOR_TYPE_TIME - }; - - - - - Found this in standard_global_init.c4 line 1898 - void sub_523a() { - DECORATOR::DECOR_REGISTER("Player_Vehicle", 3); - DECORATOR::DECOR_REGISTER("PV_Slot", 3); - DECORATOR::DECOR_REGISTER("Previous_Owner", 3); - DECORATOR::DECOR_REGISTER("Sprayed_Vehicle_Decorator", 2); - DECORATOR::DECOR_REGISTER("Sprayed_Vehicle_Timer_Dec", 5); - DECORATOR::DECOR_REGISTER("Vehicle_Reward", 3); - DECORATOR::DECOR_REGISTER("Vehicle_Reward_Teams", 3); - DECORATOR::DECOR_REGISTER("Skill_Blocker", 2); - DECORATOR::DECOR_REGISTER("TargetPlayerForTeam", 3); - DECORATOR::DECOR_REGISTER("XP_Blocker", 2); - DECORATOR::DECOR_REGISTER("CrowdControlSetUp", 3); - DECORATOR::DECOR_REGISTER("Bought_Drugs", 2); - DECORATOR::DECOR_REGISTER("HeroinInPossession", 1); - DECORATOR::DECOR_REGISTER("CokeInPossession", 1); - DECORATOR::DECOR_REGISTER("WeedInPossession", 1); - DECORATOR::DECOR_REGISTER("MethInPossession", 1); - DECORATOR::DECOR_REGISTER("bombdec", 3); - DECORATOR::DECOR_REGISTER("bombdec1", 3); - DECORATOR::DECOR_REGISTER("bombowner", 3); - DECORATOR::DECOR_REGISTER("noPlateScan", 2); - DECORATOR::DECOR_REGISTER("prisonBreakBoss", 2); - DECORATOR::DECOR_REGISTER("cashondeadbody", 3); - DECORATOR::DECOR_REGISTER("MissionType", 3); - DECORATOR::DECOR_REGISTER("MatchId", 3); - DECORATOR::DECOR_REGISTER("TeamId", 3); - DECORATOR::DECOR_REGISTER("Not_Allow_As_Saved_Veh", 3); - DECORATOR::DECOR_REGISTER("Veh_Modded_By_Player", 3); - DECORATOR::DECOR_REGISTER("MPBitset", 3); - DECORATOR::DECOR_REGISTER("MC_EntityID", 3); - DECORATOR::DECOR_REGISTER("MC_ChasePedID", 3); - DECORATOR::DECOR_REGISTER("MC_Team0_VehDeliveredRules", 3); - DECORATOR::DECOR_REGISTER("MC_Team1_VehDeliveredRules", 3); - DECORATOR::DECOR_REGISTER("MC_Team2_VehDeliveredRules", 3); - DECORATOR::DECOR_REGISTER("MC_Team3_VehDeliveredRules", 3); - DECORATOR::DECOR_REGISTER("AttributeDamage", 3); - DECORATOR::DECOR_REGISTER("GangBackup", 3); - DECORATOR::DECOR_REGISTER("CreatedByPegasus", 2); - DECORATOR::DECOR_REGISTER("BeforeCorona_0", 2); - } - ----------------------------------------------------------------------- - Defines type of property for property name. - enum eDecorType - { - DECOR_TYPE_FLOAT = 1, - DECOR_TYPE_BOOL, - DECOR_TYPE_INT, - DECOR_TYPE_UNK, - DECOR_TYPE_TIME - }; - - - - - Called after all decorator type initializations. - - - - - This function sets metadata of type bool to specified entity. - - - - - Console Hash: 0xBC7BD5CB - The native name is correct but the db automatically prefixes "_" to unknown natives when changed. - - - - - Sets property to int. - - - - - Deletes the specified entity, then sets the handle pointed to by the pointer to NULL. - - - - - Delete an incident with a given id. - ======================================================= - Correction, I have change this to int, instead of int* - as it doesn't use a pointer to the createdIncident. - If you try it you will crash (or) freeze. - ======================================================= - - - - - Deletes the specified object, then sets the handle pointed to by the pointer to NULL. - meme. - - - - - From the b617d scripts: - AI::DELETE_PATROL_ROUTE("miss_merc0"); - AI::DELETE_PATROL_ROUTE("miss_merc1"); - AI::DELETE_PATROL_ROUTE("miss_merc2"); - AI::DELETE_PATROL_ROUTE("miss_dock"); - - - - - Deletes the specified ped, then sets the handle pointed to by the pointer to NULL. - - - - - Deletes a vehicle. - The vehicle must be a mission entity to delete, so call this before deleting: SET_ENTITY_AS_MISSION_ENTITY(vehicle, true, true); - eg how to use: - SET_ENTITY_AS_MISSION_ENTITY(vehicle, true, true); - DELETE_VEHICLE(&vehicle); - Deletes the specified vehicle, then sets the handle pointed to by the pointer to NULL. - - - - - BOOL param indicates whether the cam should be destroyed if it belongs to the calling script. - - - - - BOOL param indicates whether the cam should be destroyed if it belongs to the calling script. - - - - - Destroys a DUI browser. - - The DUI browser handle. - - - - Destroys the currently active mobile phone. - - - - - Hash collision - - - - - p1 and p2 have no effect - maybe a quick disassembly will tell us what they do - the statement below seems to be false. when I tried it with 2 vehicles: - if p2 is set to true, the both entities won't collide with the other until the distance between them is above 4 meters. - - - - - First two parameters swapped. Scripts verify that towTruck is the first parameter, not the second. - - - - - Public Sub detatchTrailer(vh1 As Vehicle) - Native.Function.Call(Hash.DETACH_VEHICLE_FROM_TRAILER, vh1) - End Sub - - - - - Detaches the vehicle's windscreen. - For further information, see : gtaforums.com/topic/859570-glass/#entry1068894566 - - - - - Hash collision!!! - Returns a blip handle. - - - - - control values and meaning: github.com/crosire/scripthookvdotnet/blob/dev_v3/source/scripting/Controls.cs - 0, 1 and 2 used in the scripts. 0 is by far the most common of them. - Control values from the decompiled scripts: 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27, - 28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,53,5 - 4,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78, - 79,80,81,82,85,86,87,88,89,90,91,92,93,95,96,97,98,99,100,101,102,103,105, - 107,108,109,110,111,112,113,114,115,116,117,118,119,123,126,129,130,131,132, - 133,134,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152, - 153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172 - ,177,187,188,189,190,195,196,199,200,201,202,203,205,207,208,209,211,212,213, 217,219,220,221,225,226,230,234,235,236,237,238,239,240,241,242,243,244,257, - 261,262,263,264,265,270,271,272,273,274,278,279,280,281,282,283,284,285,286, - 287,288,289,337. - Example: CONTROLS::DISABLE_CONTROL_ACTION(2, 19, true) disables the switching UI from appearing both when using a keyboard and Xbox 360 controller. Needs to be executed each frame. - Control group 1 and 0 gives the same results as 2. Same results for all players. - - - - - Disables first person camera for the current frame. - Found in decompiled scripts: - GRAPHICS::DRAW_DEBUG_TEXT_2D("Disabling First Person Cam", 0.5, 0.8, 0.0, 0, 0, 255, 255); - CAM::_DE2EF5DA284CC8DF(); - - - - - The game by default has 5 hospital respawn points. Disabling them all will cause the player to respawn at the last position they were. - Doesn't work.... - - - - - Example: - This removes the interior from the strip club and when trying to walk inside the player just falls: - INTERIOR::DISABLE_INTERIOR(118018, true); - - - - - Disables the phone up-button, oddly enough. - i.e.: When the phone is out, and this method is called with false as it's parameter, the phone will not be able to scroll up. However, when you use the down arrow key, it's functionality still, works on the phone. - When the phone is not out, and this method is called with false as it's parameter, you will not be able to bring up the phone. Although the up arrow key still works for whatever functionality it's used for, just not for the phone. - This can be used for creating menu's when trying to disable the phone from being used. - You do not have to call the function again with false as a parameter, as soon as the function stops being called, the phone will again be usable. - - - - - Disables the phone up-button, oddly enough. - i.e.: When the phone is out, and this method is called with false as it's parameter, the phone will not be able to scroll up. However, when you use the down arrow key, it's functionality still, works on the phone. - When the phone is not out, and this method is called with false as it's parameter, you will not be able to bring up the phone. Although the up arrow key still works for whatever functionality it's used for, just not for the phone. - This can be used for creating menu's when trying to disable the phone from being used. - You do not have to call the function again with false as a parameter, as soon as the function stops being called, the phone will again be usable. - - - - - hash collision??? - Don't think so. It fits alphabetically and it used with a plane in the scripts - Ailerons are responsible for the rolling motion of a plane. - - - - - Inhibits the player from using any method of combat including melee and firearms. - NOTE: Only disables the firing for one frame - - - - - Disables the spawn point at the police house on the specified index. - policeIndex: The police house index. - toggle: true to enable the spawn point, false to disable. - - - - - confirmed working - - - - - if set to true, prevents vehicle sirens from having sound, leaving only the lights. - HASH COLLISION !!! Please change to _SET_DISABLE_VEHICLE_SIREN_SOUND - ----- - SET_VEHICLE_HAS_* - - - - - how does this work? - - - - - "DISPLAY_CASH(false);" makes the cash amount render on the screen when appropriate - "DISPLAY_CASH(true);" disables cash amount rendering - - - - - Toggles to render distant vehicles. They may not be vehicles but images to look like vehicles. - - - - - Toggles to render distant vehicles. They may not be vehicles but images to look like vehicles. - - - - - The messages are localized strings. - Examples: - "No_bus_money" - "Enter_bus" - "Tour_help" - "LETTERS_HELP2" - "Dummy" - **The bool appears to always be false (if it even is a bool, as it's represented by a zero)** - -------- - p1 doesn't seem to make a difference, regardless of the state it's in. - picture of where on the screen this is displayed? - - - - - If Hud should be displayed - - - - - Shows a hud element for reporting jobs - - - - - Shows a hud element for reporting jobs - - - - - note, p0 is set to 6 for PC platform in at least 1 script, or to `unk::_get_ui_language_id() == 0` otherwise. - NOTE: windowTitle uses text labels, and an invalid value will display nothing. - Dr. Underscore: `UNK::_GET_UI_LANGUAGE_ID()` is now `UNK::_GET_CURRENT_LANGUAGE_ID()` - www.gtaforums.com/topic/788343-vrel-script-hook-v/?p=1067380474 - windowTitle's - ----------------- - CELL_EMAIL_BOD = "Enter your Eyefind message" - CELL_EMAIL_BODE = "Message too long. Try again" - CELL_EMAIL_BODF = "Forbidden message. Try again" - CELL_EMAIL_SOD = "Enter your Eyefind subject" - CELL_EMAIL_SODE = "Subject too long. Try again" - CELL_EMAIL_SODF = "Forbidden text. Try again" - CELL_EMASH_BOD = "Enter your Eyefind message" - CELL_EMASH_BODE = "Message too long. Try again" - CELL_EMASH_BODF = "Forbidden message. Try again" - CELL_EMASH_SOD = "Enter your Eyefind subject" - CELL_EMASH_SODE = "Subject too long. Try again" - CELL_EMASH_SODF = "Forbidden Text. Try again" - FMMC_KEY_TIP10 = "Enter Synopsis" - FMMC_KEY_TIP12 = "Enter Custom Team Name" - FMMC_KEY_TIP12F = "Forbidden Text. Try again" - FMMC_KEY_TIP12N = "Custom Team Name" - FMMC_KEY_TIP8 = "Enter Message" - FMMC_KEY_TIP8F = "Forbidden Text. Try again" - FMMC_KEY_TIP8FS = "Invalid Message. Try again" - FMMC_KEY_TIP8S = "Enter Message" - FMMC_KEY_TIP9 = "Enter Outfit Name" - FMMC_KEY_TIP9F = "Invalid Outfit Name. Try again" - FMMC_KEY_TIP9N = "Outfit Name" - PM_NAME_CHALL = "Enter Challenge Name" - - - - - only documented to be continued... - - - - - only documented to be continued... - - - - - If Minimap / Radar should be displayed. - - - - - Displays the crosshair for this frame. - - - - - Purpose of the BOOL currently unknown. - Both, true and false, work - - - - - Fades the screen in. - duration: The time the fade should take, in milliseconds. - - - - - Fades the screen out. - duration: The time the fade should take, in milliseconds. - - - - - Returns whether or not the passed camera handle exists. - - - - - Returns true only when the hook is active, will return false if the magnet is active - - - - - Returns true only when the hook is active, will return false if the magnet is active - - - - - Returns true only when the magnet is active, will return false if the hook is active - console hash 0x4778CA0A - - - - - Returns true only when the magnet is active, will return false if the hook is active - console hash 0x4778CA0A - - - - - Returns true if a destructible object with this handle exists, false otherwise. - - - - - Returns true if a destructible object with this handle exists, false otherwise. - - - - - Example: - if (OBJECT::_DOES_DOOR_EXIST(doorHash)) - { - OBJECT::REMOVE_DOOR_FROM_SYSTEM(doorHash); - } - - - - - Example: - if (OBJECT::_DOES_DOOR_EXIST(doorHash)) - { - OBJECT::REMOVE_DOOR_FROM_SYSTEM(doorHash); - } - - - - - Checks via CVehicleModelInfo - - - - - p5 is usually 0. - - - - - Returns whether the ped's blip is controlled by the game. - It's the default blip you can see on enemies during freeroam in singleplayer (the one that fades out quickly). - - - - - Ptr is correct - - - - - Occurrences in the b617d scripts: - "ARMY_GUARD", - "ARMY_HELI", - "Cinema_Downtown", - "Cinema_Morningwood", - "Cinema_Textile", - "City_Banks", - "Countryside_Banks", - "DEALERSHIP", - "GRAPESEED_PLANES", - "KORTZ_SECURITY", - "LOST_BIKERS", - "LSA_Planes", - "LSA_Planes", - "MP_POLICE", - "Observatory_Bikers", - "POLICE_POUND1", - "POLICE_POUND2", - "POLICE_POUND3", - "POLICE_POUND4", - "POLICE_POUND5" - "QUARRY", - "SANDY_PLANES", - "SCRAP_SECURITY", - "SEW_MACHINE", - "SOLOMON_GATE", - "Triathlon_1_Start", - "Triathlon_2_Start", - "Triathlon_3_Start" - Sometimes used with IS_SCENARIO_GROUP_ENABLED: - if (AI::DOES_SCENARIO_GROUP_EXIST("Observatory_Bikers") && (!AI::IS_SCENARIO_GROUP_ENABLED("Observatory_Bikers"))) { - else if (AI::IS_SCENARIO_GROUP_ENABLED("BLIMP")) { - - - - - For a full list, see here: pastebin.com/yLNWicUi - - - - - formerly _IS_STREAMED_SCRIPT_RUNNING - Jenkins hash: 0x19EAE282 - - - - - formerly _IS_STREAMED_SCRIPT_RUNNING - Jenkins hash: 0x19EAE282 - - - - - Checks if there is a cover point at position - - - - - Checks if the passed gxt name exists in the game files. - - - - - This function is called before ADD_CLAN_DECAL_TO_VEHICLE to see if it needs to run. IDK if it's for clan decal or not, but the 2nd parameter might be decal index? It's always passed 0. Not sure what this function really does. But it does return 0 if the clan tag is not on, and 1 if it is. - - - - - This function is called before ADD_CLAN_DECAL_TO_VEHICLE to see if it needs to run. IDK if it's for clan decal or not, but the 2nd parameter might be decal index? It's always passed 0. Not sure what this function really does. But it does return 0 if the clan tag is not on, and 1 if it is. - - - - - Maximum amount of vehicles with vehicle stuck check appears to be 16. - - - - - OBJECT::_9B12F9A24FABEDB0(${prop_gate_prison_01}, 1845.0, 2605.0, 45.0, 0, 0.0, 50.0, 0); //door unlocked - OBJECT::_9B12F9A24FABEDB0(${prop_gate_prison_01}, 1845.0, 2605.0, 45.0, 1, 0.0, 50.0, 0); //door locked - locked simply tells the game whether or not the door is locked. - x,y,z RotMult are multipliers that specify how fast the door/gate will rotate in degrees per second. - - - - - Downloads prod.cloud.rockstargames.com/titles/gta5/<platform>/check.json - - - - - Downloads prod.cloud.rockstargames.com/titles/gta5/<platform>/check.json - - - - - x,y,z = start pos - x2,y2,z2 = end pos - Draw's a 3D Box between the two x,y,z coords. - -------------- - Keep in mind that the edges of the box do only align to the worlds base-vectors. Therefore something like rotation cannot be applied. That means this function is pretty much useless, unless you want a static unicolor box somewhere. - I recommend using a predefined function to call this. - [VB.NET] - Public Sub DrawBox(a As Vector3, b As Vector3, col As Color) - [Function].Call(Hash.DRAW_BOX,a.X, a.Y, a.Z,b.X, b.Y, b.Z,col.R, col.G, col.B, col.A) - End Sub - [C#] - public void DrawBox(Vector3 a, Vector3 b, Color col) - { - Function.Call(Hash.DRAW_BOX,a.X, a.Y, a.Z,b.X, b.Y, b.Z,col.R, col.G, col.B, col.A); - } - - - - - NOTE: Debugging functions are not present in the retail version of the game. - - - - - NOTE: Debugging functions are not present in the retail version of the game. - - - - - NOTE: Debugging functions are not present in the retail version of the game. - - - - - NOTE: Debugging functions are not present in the retail version of the game. - - - - - NOTE: Debugging functions are not present in the retail version of the game. - - - - - NOTE: Debugging functions are not present in the retail version of the game. - - - - - NOTE: Debugging functions are not present in the retail version of the game. - - - - - instructionalKey enum list: - ``` - Buttons = { - Empty = 0, - Select = 1, -- (RETURN) - Ok = 2, -- (RETURN) - Yes = 4, -- (RETURN) - Back = 8, -- (ESC) - Cancel = 16, -- (ESC) - No = 32, -- (ESC) - RetrySpace = 64, -- (SPACE) - Restart = 128, -- (SPACE) - Skip = 256, -- (SPACE) - Quit = 512, -- (ESC) - Adjust = 1024, -- (ARROWS) - SpaceKey = 2048, -- (SPACE) - Share = 4096, -- (SPACE) - SignIn = 8192, -- (SPACE) - Continue = 16384, -- (RETURN) - AdjustLeftRight = 32768, -- (SCROLL L/R) - AdjustUpDown = 65536, -- (SCROLL U/D) - Overwrite = 131072, -- (SPACE) - SocialClubSignup = 262144, -- (RETURN) - Confirm = 524288, -- (RETURN) - Queue = 1048576, -- (RETURN) - RetryReturn = 2097152, -- (RETURN) - BackEsc = 4194304, -- (ESC) - SocialClub = 8388608, -- (RETURN) - Spectate = 16777216, -- (SPACE) - OkEsc = 33554432, -- (ESC) - CancelTransfer = 67108864, -- (ESC) - LoadingSpinner = 134217728, - NoReturnToGTA = 268435456, -- (ESC) - CancelEsc = 536870912, -- (ESC) - } - Alt = { - Empty = 0, - No = 1, -- (SPACE) - Host = 2, -- (ESC) - SearchForJob = 4, -- (RETURN) - ReturnKey = 8, -- (TURN) - Freemode = 16, -- (ESC) - } - ``` - **Result of the example code:** <https://i.imgur.com/TvmNF4k.png> - - Label of the alert's title. - Label of the alert's message. - This is an enum, check the description for a list. - This is an enum, check the description for a list. - Label of another message line - usually 0 - usually -1 - usually 0 - unknown label - unknown label - Set to anything other than 0 or false (even any string) and it will draw a background. Setting it to 0 or false will draw no background. - unknown value default false, it shows an error code at the bottom left - - - - instructionalKey enum list: - ``` - Buttons = { - Empty = 0, - Select = 1, -- (RETURN) - Ok = 2, -- (RETURN) - Yes = 4, -- (RETURN) - Back = 8, -- (ESC) - Cancel = 16, -- (ESC) - No = 32, -- (ESC) - RetrySpace = 64, -- (SPACE) - Restart = 128, -- (SPACE) - Skip = 256, -- (SPACE) - Quit = 512, -- (ESC) - Adjust = 1024, -- (ARROWS) - SpaceKey = 2048, -- (SPACE) - Share = 4096, -- (SPACE) - SignIn = 8192, -- (SPACE) - Continue = 16384, -- (RETURN) - AdjustLeftRight = 32768, -- (SCROLL L/R) - AdjustUpDown = 65536, -- (SCROLL U/D) - Overwrite = 131072, -- (SPACE) - SocialClubSignup = 262144, -- (RETURN) - Confirm = 524288, -- (RETURN) - Queue = 1048576, -- (RETURN) - RetryReturn = 2097152, -- (RETURN) - BackEsc = 4194304, -- (ESC) - SocialClub = 8388608, -- (RETURN) - Spectate = 16777216, -- (SPACE) - OkEsc = 33554432, -- (ESC) - CancelTransfer = 67108864, -- (ESC) - LoadingSpinner = 134217728, - NoReturnToGTA = 268435456, -- (ESC) - CancelEsc = 536870912, -- (ESC) - } - Alt = { - Empty = 0, - No = 1, -- (SPACE) - Host = 2, -- (ESC) - SearchForJob = 4, -- (RETURN) - ReturnKey = 8, -- (TURN) - Freemode = 16, -- (ESC) - } - ``` - **Result of the example code:** <https://i.imgur.com/TvmNF4k.png> - - Label of the alert's title. - Label of the alert's message. - This is an enum, check the description for a list. - This is an enum, check the description for a list. - Label of another message line - usually 0 - usually -1 - usually 0 - unknown label - unknown label - Set to anything other than 0 or false (even any string) and it will draw a background. Setting it to 0 or false will draw no background. - unknown value default false, it shows an error code at the bottom left - - - - Similar to [\_DRAW_SPRITE](#_0xE7FFAE5EBF23D890), but seems to be some kind of "interactive" sprite, at least used by render targets. - These seem to be the only dicts ever requested by this native: - ``` - prop_screen_biker_laptop - Prop_Screen_GR_Disruption - Prop_Screen_TaleOfUs - prop_screen_nightclub - Prop_Screen_IE_Adhawk - prop_screen_sm_free_trade_shipping - prop_screen_hacker_truck - MPDesktop - Prop_Screen_Nightclub - And a few others - ``` - - Name of texture dictionary to load texture from - Name of texture to load from texture dictionary - Screen X - Screen Y - Scale X - Scale Y - Texture rotation in degrees (default = 0.0) positive is clockwise, measured in degrees - Color - Color - Color - Opacity level - - - - Similar to [\_DRAW_SPRITE](#_0xE7FFAE5EBF23D890), but seems to be some kind of "interactive" sprite, at least used by render targets. - These seem to be the only dicts ever requested by this native: - ``` - prop_screen_biker_laptop - Prop_Screen_GR_Disruption - Prop_Screen_TaleOfUs - prop_screen_nightclub - Prop_Screen_IE_Adhawk - prop_screen_sm_free_trade_shipping - prop_screen_hacker_truck - MPDesktop - Prop_Screen_Nightclub - And a few others - ``` - - Name of texture dictionary to load texture from - Name of texture to load from texture dictionary - Screen X - Screen Y - Scale X - Scale Y - Texture rotation in degrees (default = 0.0) positive is clockwise, measured in degrees - Color - Color - Color - Opacity level - - - - Draws a depth-tested line from one point to another. - ---------------- - x1, y1, z1 : Coordinates for the first point - x2, y2, z2 : Coordinates for the second point - r, g, b, alpha : Color with RGBA-Values - I recommend using a predefined function to call this. - [VB.NET] - Public Sub DrawLine(from As Vector3, [to] As Vector3, col As Color) - [Function].Call(Hash.DRAW_LINE, from.X, from.Y, from.Z, [to].X, [to].Y, [to].Z, col.R, col.G, col.B, col.A) - End Sub - [C#] - public void DrawLine(Vector3 from, Vector3 to, Color col) - { - Function.Call(Hash.DRAW_LINE, from.X, from.Y, from.Z, to.X, to.Y, to.Z, col.R, col.G, col.B, col.A); - } - - - - - Draws a marker with the specified appearance at the target location. This has to be called every frame, e.g. in a `Wait(0)` loop. - Available marker types: - <!-- - [...document.querySelectorAll('img')].filter(a => a.src.match(/100x100/)).map((a, i) => `| ${a.alt} | ${i} | ![${a.alt}](${a.src}) |`).join('\n') - https://forum.fivem.net/t/resource-available-markers/99384 - --> - | NAME | ID | IMAGE | - | -------------------------------------- | --- | ------------------------------------------------------------------------------ | - | MarkerTypeUpsideDownCone | 0 | ![MarkerTypeUpsideDownCone](https://d.fivem.dev/marker_00.png) | - | MarkerTypeVerticalCylinder | 1 | ![MarkerTypeVerticalCylinder.1](https://d.fivem.dev/marker_01.png) | - | MarkerTypeThickChevronUp | 2 | ![MarkerTypeThickChevronUp](https://d.fivem.dev/marker_02.png) | - | MarkerTypeThinChevronUp | 3 | ![MarkerTypeThinChevronUp](https://d.fivem.dev/marker_03.png) | - | MarkerTypeCheckeredFlagRect | 4 | ![MarkerTypeCheckeredFlagRect](https://d.fivem.dev/marker_04.png) | - | MarkerTypeCheckeredFlagCircle | 5 | ![MarkerTypeCheckeredFlagCircle](https://d.fivem.dev/marker_05.png) | - | MarkerTypeVerticleCircle | 6 | ![MarkerTypeVerticleCircle](https://d.fivem.dev/marker_06.png) | - | MarkerTypePlaneModel | 7 | ![1](https://d.fivem.dev/marker_07.png) | - | MarkerTypeLostMCTransparent | 8 | ![MarkerTypeLostMCTransparent.1](https://d.fivem.dev/marker_08.png) | - | MarkerTypeLostMC | 9 | ![MarkerTypeLostMC.1](https://d.fivem.dev/marker_09.png) | - | MarkerTypeNumber0 | 10 | ![MarkerTypeNumber0](https://d.fivem.dev/marker_10.png) | - | MarkerTypeNumber1 | 11 | ![MarkerTypeNumber1](https://d.fivem.dev/marker_11.png) | - | MarkerTypeNumber2 | 12 | ![MarkerTypeNumber2](https://d.fivem.dev/marker_12.png) | - | MarkerTypeNumber3 | 13 | ![MarkerTypeNumber3](https://d.fivem.dev/marker_13.png) | - | MarkerTypeNumber4 | 14 | ![MarkerTypeNumber4](https://d.fivem.dev/marker_14.png) | - | MarkerTypeNumber5 | 15 | ![MarkerTypeNumber5](https://d.fivem.dev/marker_15.png) | - | MarkerTypeNumber6 | 16 | ![MarkerTypeNumber6](https://d.fivem.dev/marker_16.png) | - | MarkerTypeNumber7 | 17 | ![MarkerTypeNumber7](https://d.fivem.dev/marker_17.png) | - | MarkerTypeNumber8 | 18 | ![MarkerTypeNumber8](https://d.fivem.dev/marker_18.png) | - | MarkerTypeNumber9 | 19 | ![MarkerTypeNumber9](https://d.fivem.dev/marker_19.png) | - | MarkerTypeChevronUpx1 | 20 | ![MarkerTypeChevronUpx1](https://d.fivem.dev/marker_20.png) | - | MarkerTypeChevronUpx2 | 21 | ![MarkerTypeChevronUpx2](https://d.fivem.dev/marker_21.png) | - | MarkerTypeChevronUpx3 | 22 | ![MarkerTypeChevronUpx3](https://d.fivem.dev/marker_22.png) | - | MarkerTypeHorizontalCircleFat | 23 | ![MarkerTypeHorizontalCircleFat.1](https://d.fivem.dev/marker_23.png) | - | MarkerTypeReplayIcon | 24 | ![MarkerTypeReplayIcon](https://d.fivem.dev/marker_24.png) | - | MarkerTypeHorizontalCircleSkinny | 25 | ![MarkerTypeHorizontalCircleSkinny.1](https://d.fivem.dev/marker_25.png) | - | MarkerTypeHorizontalCircleSkinny_Arrow | 26 | ![MarkerTypeHorizontalCircleSkinny_Arrow.1](https://d.fivem.dev/marker_26.png) | - | MarkerTypeHorizontalSplitArrowCircle | 27 | ![MarkerTypeHorizontalSplitArrowCircle.1](https://d.fivem.dev/marker_27.png) | - | MarkerTypeDebugSphere | 28 | ![MarkerTypeDebugSphere](https://d.fivem.dev/marker_28.png) | - | MarkerTypeDollarSign | 29 | ![MarkerTypeDollarSign](https://d.fivem.dev/marker_29.png) | - | MarkerTypeHorizontalBars | 30 | ![MarkerTypeHorizontalBars](https://d.fivem.dev/marker_30.png) | - | MarkerTypeWolfHead | 31 | ![MarkerTypeWolfHead](https://d.fivem.dev/marker_31.png) | - | MarkerTypeQuestionMark | 32 | ![MarkerTypeQuestionMark](https://d.fivem.dev/marker_32.png) | - | MarkerTypePlaneSymbol | 33 | ![MarkerTypePlaneSymbol](https://d.fivem.dev/marker_33.png) | - | MarkerTypeHelicopterSymbol | 34 | ![MarkerTypeHelicopterSymbol](https://d.fivem.dev/marker_34.png) | - | MarkerTypeBoatSymbol | 35 | ![MarkerTypeBoatSymbol](https://d.fivem.dev/marker_35.png) | - | MarkerTypeCarSymbol | 36 | ![MarkerTypeCarSymbol](https://d.fivem.dev/marker_36.png) | - | MarkerTypeMotorcycleSymbol | 37 | ![MarkerTypeMotorcycleSymbol](https://d.fivem.dev/marker_37.png) | - | MarkerTypeBikeSymbol | 38 | ![MarkerTypeBikeSymbol](https://d.fivem.dev/marker_38.png) | - | MarkerTypeTruckSymbol | 39 | ![MarkerTypeTruckSymbol](https://d.fivem.dev/marker_39.png) | - | MarkerTypeParachuteSymbol | 40 | ![MarkerTypeParachuteSymbol](https://d.fivem.dev/marker_40.png) | - | ? | 41 | ![](https://d.fivem.dev/marker_41.png) | - | MarkerTypeSawbladeSymbol | 42 | ![](https://d.fivem.dev/marker_42.png) | - | ? | 43 | ![](https://d.fivem.dev/marker_43.png) | - - The marker type to draw. - The X coordinate to draw the marker at. - The Y coordinate to draw the marker at. - The Z coordinate to draw the marker at. - The X component of the direction vector for the marker, or 0.0 to use rotX/Y/Z. - The Y component of the direction vector for the marker, or 0.0 to use rotX/Y/Z. - The Z component of the direction vector for the marker, or 0.0 to use rotX/Y/Z. - The X rotation for the marker. Only used if the direction vector is 0.0. - The Y rotation for the marker. Only used if the direction vector is 0.0. - The Z rotation for the marker. Only used if the direction vector is 0.0. - The scale for the marker on the X axis. - The scale for the marker on the Y axis. - The scale for the marker on the Z axis. - The red component of the marker color, on a scale from 0-255. - The green component of the marker color, on a scale from 0-255. - The blue component of the marker color, on a scale from 0-255. - The alpha component of the marker color, on a scale from 0-255. - Whether or not the marker should slowly animate up/down. - Whether the marker should be a 'billboard', as in, should constantly face the camera. - Typically set to `2`. Does not seem to matter directly. - Rotations only apply to the heading. - A texture dictionary to draw the marker with, or NULL. Example: 'GolfPutting' - A texture name in `textureDict` to draw the marker with, or NULL. Example: 'PuttingMarker' - Whether or not the marker should draw on intersecting entities. - - - - Draws a notification above the map and returns the notifications handle - Color syntax: - ~r~ = Red - ~b~ = Blue - ~g~ = Green - ~y~ = Yellow - ~p~ = Purple - ~o~ = Orange - ~c~ = Grey - ~m~ = Darker Grey - ~u~ = Black - ~n~ = New Line - ~s~ = Default White - ~w~ = White - ~h~ = Bold Text - ~nrt~ = ??? - Special characters: - ¦ = Rockstar Verified Icon (U+00A6:Broken Bar - Alt+0166) - ÷ = Rockstar Icon (U+00F7:Division Sign - Alt+0247) - ∑ = Rockstar Icon 2 (U+2211:N-Ary Summation) - Example C#: - Function.Call(Hash._ADD_TEXT_COMPONENT_STRING3, "Now I need you to bring the ~b~vehicle~w~ back to me!"); - ---- - showInBrief==true: the notification will appear in the "Brief/Info" -> "Notifications" tab in the pause menu. - showInBrief==false: the notification will NOT appear in the pause menu. - - - - - This function and the one below it are for after you receive an invite, not sending it. - p0 = 1 or 0 - nothin doin. - int invite(Player player) - { - int iVar2, iVar3; - networkHandleMgr handle; - NETWORK_HANDLE_FROM_PLAYER(player, &handle.netHandle, 13); - networkClanMgr clan; - char *playerName = GET_PLAYER_NAME(player); - _SET_NOTIFICATION_TEXT_ENTRY("STRING"); - _SET_NOTIFACTION_COLOR_NEXT(0); - ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(playerName); - if (NETWORK_CLAN_PLAYER_GET_DESC(&clan, 35, &handle.netHandle)) - { - iVar2 = 0; - if (ARE_STRINGS_EQUAL(clan.unk22, "Leader") && clan.unk30 == 0) - { - iVar2 = 1; - } - if (clan.unk21 > 0) - { - iVar3 = 0; - } - else - { - iVar3 = 1; - } - BOOL unused = _0x54E79E9C(&clan.clanHandle, 35); - return _DRAW_NOTIFICATION_APARTMENT_INVITE(iVar3, 0 -- [[unused]] , &clan.unk17, clan.unk30, iVar2, 0, clan.clanHandle, 0, 0, 0); - } - } - - - - - This function and the one below it are for after you receive an invite, not sending it. - p0 = 1 or 0 - nothin doin. - int invite(Player player) - { - int iVar2, iVar3; - networkHandleMgr handle; - NETWORK_HANDLE_FROM_PLAYER(player, &handle.netHandle, 13); - networkClanMgr clan; - char *playerName = GET_PLAYER_NAME(player); - _SET_NOTIFICATION_TEXT_ENTRY("STRING"); - _SET_NOTIFACTION_COLOR_NEXT(0); - ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(playerName); - if (NETWORK_CLAN_PLAYER_GET_DESC(&clan, 35, &handle.netHandle)) - { - iVar2 = 0; - if (ARE_STRINGS_EQUAL(clan.unk22, "Leader") && clan.unk30 == 0) - { - iVar2 = 1; - } - if (clan.unk21 > 0) - { - iVar3 = 0; - } - else - { - iVar3 = 1; - } - BOOL unused = _0x54E79E9C(&clan.clanHandle, 35); - return _DRAW_NOTIFICATION_APARTMENT_INVITE(iVar3, 0 -- [[unused]] , &clan.unk17, clan.unk30, iVar2, 0, clan.clanHandle, 0, 0, 0); - } - } - - - - - This function and the one below it are for after you receive an invite, not sending it. - p0 = 1 or 0 - nothin doin. - int invite(Player player) - { - int iVar2, iVar3; - networkHandleMgr handle; - NETWORK_HANDLE_FROM_PLAYER(player, &handle.netHandle, 13); - networkClanMgr clan; - char *playerName = GET_PLAYER_NAME(player); - _SET_NOTIFICATION_TEXT_ENTRY("STRING"); - _SET_NOTIFACTION_COLOR_NEXT(0); - ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(playerName); - if (NETWORK_CLAN_PLAYER_GET_DESC(&clan, 35, &handle.netHandle)) - { - iVar2 = 0; - if (ARE_STRINGS_EQUAL(clan.unk22, "Leader") && clan.unk30 == 0) - { - iVar2 = 1; - } - if (clan.unk21 > 0) - { - iVar3 = 0; - } - else - { - iVar3 = 1; - } - BOOL unused = _0x54E79E9C(&clan.clanHandle, 35); - return _DRAW_NOTIFICATION_APARTMENT_INVITE(iVar3, 0 -- [[unused]] , &clan.unk17, clan.unk30, iVar2, 0, clan.clanHandle, 0, 0, 0); - } - } - - - - - Shows an "award" notification above the minimap, lua example result: - ![](https://i.imgur.com/e2DNaKX.png) - Old description: - ``` - Example: - UI::_SET_NOTIFICATION_TEXT_ENTRY("HUNT"); - UI::_0xAA295B6F28BD587D("Hunting", "Hunting_Gold_128", 0, 109, "HUD_MED_UNLKED"); - ``` - - The texture dictionary name for the icon on the left. - The texture name for the icon on the left. - The gained "RP" amount that will be displayed on the right side of the notification. - Hudcolor overlay that gets applied on top of the notification, fucks up text/image visibility in most cases if set to something other than 0. - The label that will be displayed at the top of the notification (title). - The notification handle. - - - - Shows an "award" notification above the minimap, lua example result: - ![](https://i.imgur.com/e2DNaKX.png) - Old description: - ``` - Example: - UI::_SET_NOTIFICATION_TEXT_ENTRY("HUNT"); - UI::_0xAA295B6F28BD587D("Hunting", "Hunting_Gold_128", 0, 109, "HUD_MED_UNLKED"); - ``` - - The texture dictionary name for the icon on the left. - The texture name for the icon on the left. - The gained "RP" amount that will be displayed on the right side of the notification. - Hudcolor overlay that gets applied on top of the notification, fucks up text/image visibility in most cases if set to something other than 0. - The label that will be displayed at the top of the notification (title). - The notification handle. - - - - Shows an "award" notification above the minimap, lua example result: - ![](https://i.imgur.com/e2DNaKX.png) - Old description: - ``` - Example: - UI::_SET_NOTIFICATION_TEXT_ENTRY("HUNT"); - UI::_0xAA295B6F28BD587D("Hunting", "Hunting_Gold_128", 0, 109, "HUD_MED_UNLKED"); - ``` - - The texture dictionary name for the icon on the left. - The texture name for the icon on the left. - The gained "RP" amount that will be displayed on the right side of the notification. - Hudcolor overlay that gets applied on top of the notification, fucks up text/image visibility in most cases if set to something other than 0. - The label that will be displayed at the top of the notification (title). - The notification handle. - - - - p0 = 1 or 0 - crashes my game... - this is for sending invites to network players - jobs/apartment/ect... - return notification handle - int invite(Player player) - { - networkHandleMgr netHandle; - networkClanMgr clan; - char *playerName = GET_PLAYER_NAME(player); - _SET_NOTIFICATION_TEXT_ENTRY("STRING"); - _SET_NOTIFACTION_COLOR_NEXT(1); - ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(playerName); - NETWORK_HANDLE_FROM_PLAYER(player, &netHandle.netHandle, 13); - if (NETWORK_CLAN_PLAYER_IS_ACTIVE(&netHandle.netHandle)) - { - NETWORK_CLAN_PLAYER_GET_DESC(&clan.clanHandle, 35, &netHandle.netHandle); - _DRAW_NOTIFICATION_CLAN_INVITE(0, _0x54E79E9C(&clan.clanHandle, 35), &clan.unk17, clan.isLeader, 0, 0, clan.clanHandle, playerName, 0, 0, 0); - } - } - - - - - p0 = 1 or 0 - crashes my game... - this is for sending invites to network players - jobs/apartment/ect... - return notification handle - int invite(Player player) - { - networkHandleMgr netHandle; - networkClanMgr clan; - char *playerName = GET_PLAYER_NAME(player); - _SET_NOTIFICATION_TEXT_ENTRY("STRING"); - _SET_NOTIFACTION_COLOR_NEXT(1); - ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(playerName); - NETWORK_HANDLE_FROM_PLAYER(player, &netHandle.netHandle, 13); - if (NETWORK_CLAN_PLAYER_IS_ACTIVE(&netHandle.netHandle)) - { - NETWORK_CLAN_PLAYER_GET_DESC(&clan.clanHandle, 35, &netHandle.netHandle); - _DRAW_NOTIFICATION_CLAN_INVITE(0, _0x54E79E9C(&clan.clanHandle, 35), &clan.unk17, clan.isLeader, 0, 0, clan.clanHandle, playerName, 0, 0, 0); - } - } - - - - - p0 = 1 or 0 - crashes my game... - this is for sending invites to network players - jobs/apartment/ect... - return notification handle - int invite(Player player) - { - networkHandleMgr netHandle; - networkClanMgr clan; - char *playerName = GET_PLAYER_NAME(player); - _SET_NOTIFICATION_TEXT_ENTRY("STRING"); - _SET_NOTIFACTION_COLOR_NEXT(1); - ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(playerName); - NETWORK_HANDLE_FROM_PLAYER(player, &netHandle.netHandle, 13); - if (NETWORK_CLAN_PLAYER_IS_ACTIVE(&netHandle.netHandle)) - { - NETWORK_CLAN_PLAYER_GET_DESC(&clan.clanHandle, 35, &netHandle.netHandle); - _DRAW_NOTIFICATION_CLAN_INVITE(0, _0x54E79E9C(&clan.clanHandle, 35), &clan.unk17, clan.isLeader, 0, 0, clan.clanHandle, playerName, 0, 0, 0); - } - } - - - - - returns a notification handle, prints out a notification like below: - type range: 0 - if you set type to 1, button accepts "~INPUT_SOMETHING~" - example: - UI::_0xDD6CB2CCE7C2735C(1, "~INPUT_TALK~", "Who you trynna get crazy with, ese? Don't you know I'm LOCO?!"); - - imgur.com/UPy0Ial - Examples from the scripts: - l_D1[1 -- [[1]] ]=UI::_DD6CB2CCE7C2735C(1,"~INPUT_REPLAY_START_STOP_RECORDING~",""); - l_D1[2 -- [[1]] ]=UI::_DD6CB2CCE7C2735C(1,"~INPUT_SAVE_REPLAY_CLIP~",""); - l_D1[1 -- [[1]] ]=UI::_DD6CB2CCE7C2735C(1,"~INPUT_REPLAY_START_STOP_RECORDING~",""); - l_D1[2 -- [[1]] ]=UI::_DD6CB2CCE7C2735C(1,"~INPUT_REPLAY_START_STOP_RECORDING_SECONDARY~",""); - - - - - returns a notification handle, prints out a notification like below: - type range: 0 - if you set type to 1, button accepts "~INPUT_SOMETHING~" - example: - UI::_0xDD6CB2CCE7C2735C(1, "~INPUT_TALK~", "Who you trynna get crazy with, ese? Don't you know I'm LOCO?!"); - - imgur.com/UPy0Ial - Examples from the scripts: - l_D1[1 -- [[1]] ]=UI::_DD6CB2CCE7C2735C(1,"~INPUT_REPLAY_START_STOP_RECORDING~",""); - l_D1[2 -- [[1]] ]=UI::_DD6CB2CCE7C2735C(1,"~INPUT_SAVE_REPLAY_CLIP~",""); - l_D1[1 -- [[1]] ]=UI::_DD6CB2CCE7C2735C(1,"~INPUT_REPLAY_START_STOP_RECORDING~",""); - l_D1[2 -- [[1]] ]=UI::_DD6CB2CCE7C2735C(1,"~INPUT_REPLAY_START_STOP_RECORDING_SECONDARY~",""); - - - - - returns a notification handle, prints out a notification like below: - type range: 0 - if you set type to 1, image goes from 0 - 39 - Xbox you can add text to - example: - UI::_0xD202B92CBF1D816F(1, 20, "Who you trynna get crazy with, ese? Don't you know I'm LOCO?!"); - - - - - returns a notification handle, prints out a notification like below: - type range: 0 - if you set type to 1, image goes from 0 - 39 - Xbox you can add text to - example: - UI::_0xD202B92CBF1D816F(1, 20, "Who you trynna get crazy with, ese? Don't you know I'm LOCO?!"); - - - - - x/y/z - Location of a vertex (in world coords), presumably. - ---------------- - x1, y1, z1 : Coordinates for the first point - x2, y2, z2 : Coordinates for the second point - x3, y3, z3 : Coordinates for the third point - r, g, b, alpha : Color with RGBA-Values - Keep in mind that only one side of the drawn triangle is visible: It's the side, in which the vector-product of the vectors heads to: (b-a)x(c-a) Or (b-a)x(c-b). - But be aware: The function seems to work somehow differently. I have trouble having them drawn in rotated orientation. Try it yourself and if you somehow succeed, please edit this and post your solution. - I recommend using a predefined function to call this. - [VB.NET] - Public Sub DrawPoly(a As Vector3, b As Vector3, c As Vector3, col As Color) - [Function].Call(Hash.DRAW_POLY, a.X, a.Y, a.Z, b.X, b.Y, b.Z, c.X, c.Y, c.Z, col.R, col.G, col.B, col.A) - End Sub - [C#] - public void DrawPoly(Vector3 a, Vector3 b, Vector3 c, Color col) - { - Function.Call(Hash.DRAW_POLY, a.X, a.Y, a.Z, b.X, b.Y, b.Z, c.X, c.Y, c.Z, col.R, col.G, col.B, col.A); - } - BTW: Intersecting triangles are not supported: They overlap in the order they were called. - - - - - Draws a rectangle on the screen. - -x: The relative X point of the center of the rectangle. (0.0-1.0, 0.0 is the left edge of the screen, 1.0 is the right edge of the screen) - -y: The relative Y point of the center of the rectangle. (0.0-1.0, 0.0 is the top edge of the screen, 1.0 is the bottom edge of the screen) - -width: The relative width of the rectangle. (0.0-1.0, 1.0 means the whole screen width) - -height: The relative height of the rectangle. (0.0-1.0, 1.0 means the whole screen height) - -R: Red part of the color. (0-255) - -G: Green part of the color. (0-255) - -B: Blue part of the color. (0-255) - -A: Alpha part of the color. (0-255, 0 means totally transparent, 255 means totally opaque) - The total number of rectangles to be drawn in one frame is apparently limited to 399. - - - - - GTA V Scaleforms Decompiled - pastebin.com/mmNdjX2k - - - - - unk is not used so no need - - - - - sharpness goes from 0.0 to 1.0 - - - - - sharpness goes from 0.0 to 1.0 - - - - - what the heck does this one do differently from the one above? - - - - - what the heck does this one do differently from the one above? - - - - - It's called after 0xD3A10FC7FD8D98CD and 0xF1CEA8A4198D8E9A - p0 was always "CELEBRATION_WINNER" - - - - - It's called after 0xD3A10FC7FD8D98CD and 0xF1CEA8A4198D8E9A - p0 was always "CELEBRATION_WINNER" - - - - - Parameters: - * pos - coordinate where the spotlight is located - * dir - the direction vector the spotlight should aim at from its current position - * r,g,b - color of the spotlight - * distance - the maximum distance the light can reach - * brightness - the brightness of the light - * roundness - "smoothness" of the circle edge - * radius - the radius size of the spotlight - * falloff - the falloff size of the light's edge (example: www.i.imgur.com/DemAWeO.jpg) - Example in C# (spotlight aims at the closest vehicle): - Vector3 myPos = Game.Player.Character.Position; - Vehicle nearest = World.GetClosestVehicle(myPos , 1000f); - Vector3 destinationCoords = nearest.Position; - Vector3 dirVector = destinationCoords - myPos; - dirVector.Normalize(); - Function.Call(Hash.DRAW_SPOT_LIGHT, pos.X, pos.Y, pos.Z, dirVector.X, dirVector.Y, dirVector.Z, 255, 255, 255, 100.0f, 1f, 0.0f, 13.0f, 1f); - - - - - shadowId: each call to this native in the same tick should have a different value passed to this parameter, if two or more calls have the same values, only the first one will render its shadow properly - - - - - Draws a 2D sprite on the screen. - Parameters: - textureDict - Name of texture dictionary to load texture from (e.g. "CommonMenu", "MPWeaponsCommon", etc.) - textureName - Name of texture to load from texture dictionary (e.g. "last_team_standing_icon", "tennis_icon", etc.) - screenX/Y - Screen offset (0.5 = center) - scaleX/Y - Texture scaling. Negative values can be used to flip the texture on that axis. (0.5 = half) - heading - Texture rotation in degrees (default = 0.0) positive is clockwise, measured in degrees - red,green,blue - Sprite color (default = 255/255/255) - alpha - opacity level - - - - - All calls to this native are preceded by calls to GRAPHICS::_0x61BB1D9B3A95D802 and GRAPHICS::_0xC6372ECD45D73BCD, respectively. - "act_cinema.ysc", line 1483: - UI::SET_HUD_COMPONENT_POSITION(15, 0.0, -0.0375); - UI::SET_TEXT_RENDER_ID(l_AE); - GRAPHICS::_0x61BB1D9B3A95D802(4); - GRAPHICS::_0xC6372ECD45D73BCD(1); - if (GRAPHICS::_0x0AD973CA1E077B60(${movie_arthouse})) { - GRAPHICS::DRAW_TV_CHANNEL(0.5, 0.5, 0.7375, 1.0, 0.0, 255, 255, 255, 255); - } else { - GRAPHICS::DRAW_TV_CHANNEL(0.5, 0.5, 1.0, 1.0, 0.0, 255, 255, 255, 255); - } - "am_mp_property_int.ysc", line 102545: - if (ENTITY::DOES_ENTITY_EXIST(a_2._f3)) { - if (UI::IS_NAMED_RENDERTARGET_LINKED(ENTITY::GET_ENTITY_MODEL(a_2._f3))) { - UI::SET_TEXT_RENDER_ID(a_2._f1); - GRAPHICS::_0x61BB1D9B3A95D802(4); - GRAPHICS::_0xC6372ECD45D73BCD(1); - GRAPHICS::DRAW_TV_CHANNEL(0.5, 0.5, 1.0, 1.0, 0.0, 255, 255, 255, 255); - if (GRAPHICS::GET_TV_CHANNEL() == -1) { - sub_a8fa5(a_2, 1); - } else { - sub_a8fa5(a_2, 1); - GRAPHICS::ATTACH_TV_AUDIO_TO_ENTITY(a_2._f3); - } - UI::SET_TEXT_RENDER_ID(UI::GET_DEFAULT_SCRIPT_RENDERTARGET_RENDER_ID()); - } - } - - - - - ADD_E* (most likely ADD_ENTITY_*) - All found occurrences in b678d: - pastebin.com/ceu67jz8 - Still not sure on the functionality of this native but it has something to do with dynamic mixer groups defined in dynamix.dat15 - - - - - ADD_E* (most likely ADD_ENTITY_*) - All found occurrences in b678d: - pastebin.com/ceu67jz8 - Still not sure on the functionality of this native but it has something to do with dynamic mixer groups defined in dynamix.dat15 - - - - - Creates cartoon effect when Michel smokes the weed - - - - - Creates cartoon effect when Michel smokes the weed - - - - - control values and meaning: github.com/crosire/scripthookvdotnet/blob/dev_v3/source/scripting/Control.cs - and - wiki.fivem.net/wiki/Controls - 0, 1 and 2 used in the scripts. - Control values from the decompiled scripts: - 0,1,2,3,4,5,6,8,9,10,11,14,15,16,17,19,21,22,24,25,26,30,31,32,33,34,35,36, - 37,44,46,47,59,60,65,68,69,70,71,72,73,74,75,76,79,80,81,82,86,95,98,99,100 - ,101,114,140,141,143,172,173,174,175,176,177,178,179,180,181,187,188,189,19 - 0,195,196,197,198,199,201,202,203,204,205,206,207,208,209,210,217,218,219,2 - 20,221,225,228,229,230,231,234,235,236,237,238,239,240,241,242,245,246,257, - 261,262,263,264,286,287,288,289,337,338,339,340,341,342,343 - INPUTGROUP_MOVE - INPUTGROUP_LOOK - INPUTGROUP_WHEEL - INPUTGROUP_CELLPHONE_NAVIGATE - INPUTGROUP_CELLPHONE_NAVIGATE_UD - INPUTGROUP_CELLPHONE_NAVIGATE_LR - INPUTGROUP_FRONTEND_DPAD_ALL - INPUTGROUP_FRONTEND_DPAD_UD - INPUTGROUP_FRONTEND_DPAD_LR - INPUTGROUP_FRONTEND_LSTICK_ALL - INPUTGROUP_FRONTEND_RSTICK_ALL - INPUTGROUP_FRONTEND_GENERIC_UD - INPUTGROUP_FRONTEND_GENERIC_LR - INPUTGROUP_FRONTEND_GENERIC_ALL - INPUTGROUP_FRONTEND_BUMPERS - INPUTGROUP_FRONTEND_TRIGGERS - INPUTGROUP_FRONTEND_STICKS - INPUTGROUP_SCRIPT_DPAD_ALL - INPUTGROUP_SCRIPT_DPAD_UD - INPUTGROUP_SCRIPT_DPAD_LR - INPUTGROUP_SCRIPT_LSTICK_ALL - INPUTGROUP_SCRIPT_RSTICK_ALL - INPUTGROUP_SCRIPT_BUMPERS - INPUTGROUP_SCRIPT_TRIGGERS - INPUTGROUP_WEAPON_WHEEL_CYCLE - INPUTGROUP_FLY - INPUTGROUP_SUB - INPUTGROUP_VEH_MOVE_ALL - INPUTGROUP_CURSOR - INPUTGROUP_CURSOR_SCROLL - INPUTGROUP_SNIPER_ZOOM_SECONDARY - INPUTGROUP_VEH_HYDRAULICS_CONTROL - Took those in IDA Pro.Not sure in which order they go - - - - - Shows the crosshair even if it wouldn't show normally. Only works for one frame, so make sure to call it repeatedly. - - - - - Please change back to _0x4895BDEA16E7C080 (hash collision) - - - - - Directly from R*: - enum eDispatchType : UINT16 - { - DT_PoliceAutomobile = 1, - DT_PoliceHelicopter = 2, - DT_FireDepartment = 3, - DT_SwatAutomobile = 4, - DT_AmbulanceDepartment = 5, - DT_PoliceRiders = 6, - DT_PoliceVehicleRequest = 7, - DT_PoliceRoadBlock = 8, - DT_PoliceAutomobileWaitPulledOver = 9, - DT_PoliceAutomobileWaitCruising = 10, - DT_Gangs = 11, - DT_SwatHelicopter = 12, - DT_PoliceBoat = 13, - DT_ArmyVehicle = 14, - DT_BikerBackup = 15 - }; - By making toggle false it disables the dispatch. - curious if this is what they used when you toggled on and off cops in a GTA IV freemode you hosted. Sad they got rid of the option to make a private session without cops. - Also on x360 seems with or without neverWanted on, setting these to all false in SP of course doesn't seem to work. I would understand getting stars, but cops are still dispatched and combat you. - - - - - Directly from R*: - enum eDispatchType : UINT16 - { - DT_PoliceAutomobile = 1, - DT_PoliceHelicopter = 2, - DT_FireDepartment = 3, - DT_SwatAutomobile = 4, - DT_AmbulanceDepartment = 5, - DT_PoliceRiders = 6, - DT_PoliceVehicleRequest = 7, - DT_PoliceRoadBlock = 8, - DT_PoliceAutomobileWaitPulledOver = 9, - DT_PoliceAutomobileWaitCruising = 10, - DT_Gangs = 11, - DT_SwatHelicopter = 12, - DT_PoliceBoat = 13, - DT_ArmyVehicle = 14, - DT_BikerBackup = 15 - }; - By making toggle false it disables the dispatch. - curious if this is what they used when you toggled on and off cops in a GTA IV freemode you hosted. Sad they got rid of the option to make a private session without cops. - Also on x360 seems with or without neverWanted on, setting these to all false in SP of course doesn't seem to work. I would understand getting stars, but cops are still dispatched and combat you. - - - - - More info: http://gtaforums.com/topic/836367-adding-props-to-interiors/ - - - - - More info: http://gtaforums.com/topic/836367-adding-props-to-interiors/ - - - - - Enables laser sight on any weapon. - It doesn't work. Neither on tick nor OnKeyDown - - - - - #4 - - - - - Makes the ped jump around like they're in a tennis match - - - - - Pops and calls the Scaleform function on the stack - - - - - Pops and calls the Scaleform function on the stack - - - - - Pops and calls the Scaleform movie on the stack. Returns data from the function (not sure if this is a string). - - - - - Pops and calls the Scaleform movie on the stack. Returns data from the function (not sure if this is a string). - - - - - Clear the current srl and stop rendering the area selected by PrefetchSrl and started with BeginSrl. - - - - - This does NOT get called per frame. Call it once to show, then use UI::_REMOVE_LOADING_PROMPT to remove it - Changes the the above native's (UI::_SET_LOADING_PROMPT_TEXT_ENTRY) spinning circle type. - Types: - enum LoadingPromptTypes - { - LOADING_PROMPT_LEFT, - LOADING_PROMPT_LEFT_2, - LOADING_PROMPT_LEFT_3, - SAVE_PROMPT_LEFT, - LOADING_PROMPT_RIGHT, - }; - - - - - This does NOT get called per frame. Call it once to show, then use UI::_REMOVE_LOADING_PROMPT to remove it - Changes the the above native's (UI::_SET_LOADING_PROMPT_TEXT_ENTRY) spinning circle type. - Types: - enum LoadingPromptTypes - { - LOADING_PROMPT_LEFT, - LOADING_PROMPT_LEFT_2, - LOADING_PROMPT_LEFT_3, - SAVE_PROMPT_LEFT, - LOADING_PROMPT_RIGHT, - }; - - - - - This does NOT get called per frame. Call it once to show, then use UI::_REMOVE_LOADING_PROMPT to remove it - Changes the the above native's (UI::_SET_LOADING_PROMPT_TEXT_ENTRY) spinning circle type. - Types: - enum LoadingPromptTypes - { - LOADING_PROMPT_LEFT, - LOADING_PROMPT_LEFT_2, - LOADING_PROMPT_LEFT_3, - SAVE_PROMPT_LEFT, - LOADING_PROMPT_RIGHT, - }; - - - - - ----------- - p3 (duration in MS) was previously mentioned as "shape", but with some more testing it seems that it's more likely to be a duration in MS. (Tested this when not calling it every tick, but instead only once and let it display for the specified duration). - -1 seems to be default delay (around 3 seconds), 5000 (ms) seems to be the max. Anything > 5000 will still result in 5 seconds of display time. - Old p3 (shape) description: "shape goes from -1 to 50 (may be more)." - -------------- - p0 is always 0. - Example: - void FloatingHelpText(char* text) - { - BEGIN_TEXT_COMMAND_DISPLAY_HELP("STRING"); - ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(text); - END_TEXT_COMMAND_DISPLAY_HELP (0, 0, 1, -1); - } - Image: - - imgbin.org/images/26209.jpg - more inputs/icons: - - pastebin.com/nqNYWMSB - Used to be known as _DISPLAY_HELP_TEXT_FROM_STRING_LABEL - - - - - ----------- - p3 (duration in MS) was previously mentioned as "shape", but with some more testing it seems that it's more likely to be a duration in MS. (Tested this when not calling it every tick, but instead only once and let it display for the specified duration). - -1 seems to be default delay (around 3 seconds), 5000 (ms) seems to be the max. Anything > 5000 will still result in 5 seconds of display time. - Old p3 (shape) description: "shape goes from -1 to 50 (may be more)." - -------------- - p0 is always 0. - Example: - void FloatingHelpText(char* text) - { - BEGIN_TEXT_COMMAND_DISPLAY_HELP("STRING"); - ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(text); - END_TEXT_COMMAND_DISPLAY_HELP (0, 0, 1, -1); - } - Image: - - imgbin.org/images/26209.jpg - more inputs/icons: - - pastebin.com/nqNYWMSB - Used to be known as _DISPLAY_HELP_TEXT_FROM_STRING_LABEL - - - - - After applying the properties to the text (See UI::SET_TEXT_), this will draw the text in the applied position. Also 0.0f < x, y < 1.0f, percentage of the axis. - Used to be known as _DRAW_TEXT - - - - - After applying the properties to the text (See UI::SET_TEXT_), this will draw the text in the applied position. Also 0.0f < x, y < 1.0f, percentage of the axis. - Used to be known as _DRAW_TEXT - - - - - Used with _BEGIN_TEXT_COMMAND_WIDTH. - In scripts, p0 is false when used in combination with "ESMINDOLLA" or "ESDOLLA", otherwise it's true. - Returns from range 0 to 1. - - - - - Used with _BEGIN_TEXT_COMMAND_WIDTH. - In scripts, p0 is false when used in combination with "ESMINDOLLA" or "ESDOLLA", otherwise it's true. - Returns from range 0 to 1. - - - - - p0 is always false in scripts. - - - - - p0 is always false in scripts. - - - - - Draws the subtitle at middle center of the screen. - int duration = time in milliseconds to show text on screen before disappearing - drawImmediately = If true, the text will be drawn immediately, if false, the text will be drawn after the previous subtitle has finished - Used to be known as _DRAW_SUBTITLE_TIMED - - - - - Draws the subtitle at middle center of the screen. - int duration = time in milliseconds to show text on screen before disappearing - drawImmediately = If true, the text will be drawn immediately, if false, the text will be drawn after the previous subtitle has finished - Used to be known as _DRAW_SUBTITLE_TIMED - - - - - Previously called _END_TEXT_COMPONENT - - - - - Previously called _END_TEXT_COMPONENT - - - - - Finalizes a text command started with [`BEGIN_TEXT_COMMAND_SET_BLIP_NAME`](#_0xF9113A30DE5C6670), setting the name - of the specified blip. - - The blip to change the name for. - - - - Only found twice in decompiled scripts. Something to do with an entity/object? - On a side note, it's very interesting how the hash for this native is "DEADC0DE" - this is usually used as padding for initializing a buffer of some sort. I wonder if this native is actually "dead"? - "carmod_shop.ysc", line 9520: - if (ENTITY::DOES_ENTITY_EXIST(l_324._f6)) { - GRAPHICS::_0xDEADC0DEDEADC0DE(l_324._f6); - } - "fm_mission_controller.ysc", line 189641: - if (GAMEPLAY::IS_BIT_SET(g_1870E1._f7B64[a_0 -- [[104]] ]._f25, 28)) { - GRAPHICS::_0xDEADC0DEDEADC0DE(NETWORK::NET_TO_OBJ(l_4064._f26A._f87[a_0 -- [[1]] ])); - if (!GAMEPLAY::IS_BIT_SET(g_1870E1._f7B64[a_0 -- [[104]] ]._f25, 31)) { - if (!ENTITY::IS_ENTITY_DEAD(v_7)) { - AUDIO::PLAY_SOUND_FROM_ENTITY(-1, "EMP_Vehicle_Hum", v_7, "DLC_HEIST_BIOLAB_DELIVER_EMP_SOUNDS", 0, 0); - GAMEPLAY::SET_BIT(&g_1870E1._f7B64[a_0 -- [[104]] ]._f25, 31); - } - } - } - Console Hash: 0xC12AC47A - ---------- - It's most likely named UPDATE_* (like UPDATE_ENTITY_SHIT_OR_SOMETHING). - - - - - Only found twice in decompiled scripts. Something to do with an entity/object? - On a side note, it's very interesting how the hash for this native is "DEADC0DE" - this is usually used as padding for initializing a buffer of some sort. I wonder if this native is actually "dead"? - "carmod_shop.ysc", line 9520: - if (ENTITY::DOES_ENTITY_EXIST(l_324._f6)) { - GRAPHICS::_0xDEADC0DEDEADC0DE(l_324._f6); - } - "fm_mission_controller.ysc", line 189641: - if (GAMEPLAY::IS_BIT_SET(g_1870E1._f7B64[a_0 -- [[104]] ]._f25, 28)) { - GRAPHICS::_0xDEADC0DEDEADC0DE(NETWORK::NET_TO_OBJ(l_4064._f26A._f87[a_0 -- [[1]] ])); - if (!GAMEPLAY::IS_BIT_SET(g_1870E1._f7B64[a_0 -- [[104]] ]._f25, 31)) { - if (!ENTITY::IS_ENTITY_DEAD(v_7)) { - AUDIO::PLAY_SOUND_FROM_ENTITY(-1, "EMP_Vehicle_Hum", v_7, "DLC_HEIST_BIOLAB_DELIVER_EMP_SOUNDS", 0, 0); - GAMEPLAY::SET_BIT(&g_1870E1._f7B64[a_0 -- [[104]] ]._f25, 31); - } - } - } - Console Hash: 0xC12AC47A - ---------- - It's most likely named UPDATE_* (like UPDATE_ENTITY_SHIT_OR_SOMETHING). - - - - - Will change world AABB so that given point will be inside of the world limits. - Example: - You want world limits to be -9000<X<10000 -11000<Y<12000 and leave Z limits as is. - You should call this function two times: - _EXPAND_WORLD_LIMITS(-9000.0,-11000.0,30.0) - _EXPAND_WORLD_LIMITS(10000.0,12000.0,30.0) - Appears only 3 times in the scripts, more specifically in michael1.ysc - Console hash: 0x64ddb07d - - - This can be used to prevent dying if you are "out of the world" - - - - - Will change world AABB so that given point will be inside of the world limits. - Example: - You want world limits to be -9000<X<10000 -11000<Y<12000 and leave Z limits as is. - You should call this function two times: - _EXPAND_WORLD_LIMITS(-9000.0,-11000.0,30.0) - _EXPAND_WORLD_LIMITS(10000.0,12000.0,30.0) - Appears only 3 times in the scripts, more specifically in michael1.ysc - Console hash: 0x64ddb07d - - - This can be used to prevent dying if you are "out of the world" - - - - - This native is not implemented. - - - - - This native is not implemented. - - - - - This native is not implemented. - - - - - This native is not implemented. - - - - - Forces the ped to fall back and kills it. - It doesn't really explode the ped's head but it kills the ped - - - - - WEAPON::EXPLODE_PROJECTILES(PLAYER::PLAYER_PED_ID(), func_221(0x00000003), 0x00000001); - - - - - Explodes a selected vehicle. - Vehicle vehicle = Vehicle you want to explode. - BOOL isAudible = If explosion makes a sound. - BOOL isInvisible = If the explosion is invisible or not. - First BOOL does not give any visual explosion, the vehicle just falls apart completely but slowly and starts to burn. - - - - - GTA Online character creation - - - - - GTA Online character creation - - - - - milestoneId: - 0 = "percentcomplete" - 1 = "storycomplete" - 2 = "vehicles" - 3 = "properties" - 4 = "psych" - 5 = "mapreveal" - 6 = "prologue" - - - - - milestoneId: - 0 = "percentcomplete" - 1 = "storycomplete" - 2 = "vehicles" - 3 = "properties" - 4 = "psych" - 5 = "mapreveal" - 6 = "prologue" - - - - - Fades nearby decals within the range specified - - - - - Hardcoded to not work in SP. - - - - - In the script "player_scene_t_bbfight.c4": - "if (ENTITY::FIND_ANIM_EVENT_PHASE(&l_16E, &l_19F[v_4 -- [[16]] ], v_9, &v_A, &v_B))" - -- &l_16E (p0) is requested as an anim dictionary earlier in the script. - -- &l_19F[v_4 -- [[16]] ] (p1) is used in other natives in the script as the "animation" param. - -- v_9 (p2) is instantiated as "victim_fall"; I'm guessing that's another anim - --v_A and v_B (p3 & p4) are both set as -1.0, but v_A is used immediately after this native for: - "if (v_A < ENTITY::GET_ENTITY_ANIM_CURRENT_TIME(...))" - Both v_A and v_B are seemingly used to contain both Vector3's and floats, so I can't say what either really is other than that they are both output parameters. p4 looks more like a *Vector3 though - -alphazolam - Animations list : www.los-santos-multiplayer.com/dev.airdancer?cxt=anim - - - - - Finds a position ahead of the player by predicting the players next actions. - The positions match path finding node positions. - When roads diverge, the position may rapidly change between two or more positions. This is due to the engine not being certain of which path the player will take. - ======================================================= - I may sort this with alter research, but if someone - already knows please tell what the difference in - X2, Y2, Z2 is. I doubt it's rotation. Is it like - checkpoints where X1, Y1, Z1 is your/a position and - X2, Y2, Z2 is a given position ahead of that position? - ======================================================= - - - - - If set to true ability bar will flash - - - - - adds a short flash to the Radar/Minimap - Usage: UI.FLASH_MINIMAP_DISPLAY - - - - - if value is set to true, and ambient siren sound will be played. - ------------------------------------------------------------------------- - Appears to enable/disable an audio flag. - - - - - if value is set to true, and ambient siren sound will be played. - ------------------------------------------------------------------------- - Appears to enable/disable an audio flag. - - - - - used with 1,2,8,64,128 in the scripts - - - - - PLAYER::FORCE_CLEANUP_FOR_ALL_THREADS_WITH_THIS_NAME("pb_prostitute", 1); // Found in decompilation - - - - - Based on carmod_shop script decompile this takes a vehicle parameter. It is called when repair is done on initial enter. - - - - - Some motionstate hashes are - 0xec17e58 (standing idle), 0xbac0f10b (nothing?), 0x3f67c6af (aiming with pistol 2-h), 0x422d7a25 (stealth), 0xbd8817db, 0x916e828c - and those for the strings - "motionstate_idle", "motionstate_walk", "motionstate_run", "motionstate_actionmode_idle", and "motionstate_actionmode_walk". - Regarding p2, p3 and p4: Most common is 0, 0, 0); followed by 0, 1, 0); and 1, 1, 0); in the scripts. p4 is very rarely something other than 0. - [31/03/2017] ins1de : - enum MotionState - { - StopRunning = -530524, - StopWalking = -668482597, - Idle = 247561816, // 1, 1, 0 - Idl2 = -1871534317, - SkyDive =-1161760501, // 0, 1, 0 - Stealth = 1110276645, - Sprint = -1115154469, - Swim = -1855028596, - Unknown1 = 1063765679, - Unknown2 = -633298724, - } - - - - - Forces the particular room in an interior to load incase not teleporting into the portal. - - - - - Exits the game and downloads a fresh social club update on next restart. - - - - - This native sets the audio of the specified vehicle to audioName (p1). - Use the audioNameHash found in vehicles.meta - Example: - _FORCE_VEHICLE_ENGINE_SOUND(veh, "ADDER"); - The selected vehicle will now have the audio of the Adder. - FORCE_VEHICLE_??? - - - - - This native sets the audio of the specified vehicle to audioName (p1). - Use the audioNameHash found in vehicles.meta - Example: - _FORCE_VEHICLE_ENGINE_SOUND(veh, "ADDER"); - The selected vehicle will now have the audio of the Adder. - FORCE_VEHICLE_??? - - - - - This native sets the audio of the specified vehicle to audioName (p1). - Use the audioNameHash found in vehicles.meta - Example: - _FORCE_VEHICLE_ENGINE_SOUND(veh, "ADDER"); - The selected vehicle will now have the audio of the Adder. - FORCE_VEHICLE_??? - - - - - No, this should be called SET_ENTITY_KINEMATIC. It does more than just "freeze" it's position. - ^Rockstar Devs named it like that, Now cry about it. - - - - - Usage example: - Public Function GenerateDirectionsToCoord(Pos As Vector3) As Tuple(Of String, Single, Single) - Dim f4, f5, f6 As New OutputArgument() - Native.Function.Call(Hash.GENERATE_DIRECTIONS_TO_COORD, Pos.X, Pos.Y, Pos.Z, True, f4, f5, f6) - Dim direction As String = f4.GetResult(Of Single)() - Return New Tuple(Of String, Single, Single)(direction.Substring(0, 1), f5.GetResult(Of Single)(), f6.GetResult(Of Single)()) - End Function - p3 I use 1 - direction: - 0 = You Have Arrived - 1 = Recalculating Route, Please make a u-turn where safe - 2 = Please Proceed the Highlighted Route - 3 = In (distToNxJunction) Turn Left - 4 = In (distToNxJunction) Turn Right - 5 = In (distToNxJunction) Go Straight - 6 = In (distToNxJunction) Keep Left - 7 = In (distToNxJunction) Keep Right - 8 = In (distToNxJunction) Join the freeway - 9 = In (distToNxJunction) Exit Freeway - return value set to 0 always - - - - - p0 = int (?) - Dr. Underscore (1/6/18): - This gets the progression of an achievement. Returns 0 if the achievement cannot be progressed. - - - - - p0 = int (?) - Dr. Underscore (1/6/18): - This gets the progression of an achievement. Returns 0 if the achievement cannot be progressed. - - - - - Returns current screen resolution. - - - - - Returns current screen resolution. - - - - - native only found once in appinternet.c4 - same thing as this but does not need websiteID - Any _0xE3B05614DCE1D014(Any p0) // 0xE3B05614DCE1D014 0xD217EE7E - returns current websitePageID - - - - - native only found once in appinternet.c4 - same thing as this but does not need websiteID - Any _0xE3B05614DCE1D014(Any p0) // 0xE3B05614DCE1D014 0xD217EE7E - returns current websitePageID - - - - - Returns the current AI BLIP for the specified ped - - - - - Returns the current AI BLIP for the specified ped - - - - - Gets the amount of bombs that this vehicle has. As far as I know, this does _not_ impact vehicle weapons or the ammo of those weapons in any way, it is just a way to keep track of the amount of bombs in a specific plane. - In decompiled scripts this is used to check if the vehicle has enough bombs before a bomb can be dropped (bombs are dropped by using [`_SHOOT_SINGLE_BULLET_BETWEEN_COORDS_WITH_EXTRA_PARAMS`](#_0xBFE5756E7407064A)). - Use [`_SET_AIRCRAFT_BOMB_COUNT`](#_0xF4B2ED59DEB5D774) to set the amount of bombs on that vehicle. - - The vehicle to get the amount of bombs from. - An int indicating the amount of bombs remaining on that plane. - - - - Gets the amount of bombs that this vehicle has. As far as I know, this does _not_ impact vehicle weapons or the ammo of those weapons in any way, it is just a way to keep track of the amount of bombs in a specific plane. - In decompiled scripts this is used to check if the vehicle has enough bombs before a bomb can be dropped (bombs are dropped by using [`_SHOOT_SINGLE_BULLET_BETWEEN_COORDS_WITH_EXTRA_PARAMS`](#_0xBFE5756E7407064A)). - Use [`_SET_AIRCRAFT_BOMB_COUNT`](#_0xF4B2ED59DEB5D774) to set the amount of bombs on that vehicle. - - The vehicle to get the amount of bombs from. - An int indicating the amount of bombs remaining on that plane. - - - - Similar to [`_GET_AIRCRAFT_BOMB_COUNT`](#_0xEA12BD130D7569A1), this gets the amount of countermeasures that are present on this vehicle. - Use [`_SET_AIRCRAFT_COUNTERMEASURE_COUNT`](#_0x9BDA23BF666F0855) to set the current amount. - - The vehicle to get the amount of countermeasures from. - An int indicating the amount of countermeasures remaining on that plane. - - - - Similar to [`_GET_AIRCRAFT_BOMB_COUNT`](#_0xEA12BD130D7569A1), this gets the amount of countermeasures that are present on this vehicle. - Use [`_SET_AIRCRAFT_COUNTERMEASURE_COUNT`](#_0x9BDA23BF666F0855) to set the current amount. - - The vehicle to get the amount of countermeasures from. - An int indicating the amount of countermeasures remaining on that plane. - - - - WEAPON::GET_AMMO_IN_PED_WEAPON(PLAYER::PLAYER_PED_ID(), a_0) - From decompiled scripts - Returns total ammo in weapon - GTALua Example : - natives.WEAPON.GET_AMMO_IN_PED_WEAPON(plyPed, WeaponHash) - - - - - Returns the degree of angle between (x1, y1) and (x2, y2) lines in 2D coordinate system. - - - - - Console Hash: 0x8B5E3E3D = GET_ANIM_DURATION - Animations list : www.los-santos-multiplayer.com/dev.airdancer?cxt=anim - - - - - Animations list : www.los-santos-multiplayer.com/dev.airdancer?cxt=anim - - - - - Animations list : www.los-santos-multiplayer.com/dev.airdancer?cxt=anim - - - - - p1 is always 0 in the scripts. - - - - - Returns the Blip handle of given Entity. - - - - - This function is hard-coded to always return 0. - - - - - Returns a value based on what the blip is attached to - 1 - 2 - 3 - 4 - 5 - 6 - 7 - - - - - Blips Images + IDs: - gtaxscripting.blogspot.com/2016/05/gta-v-blips-id-and-image.html - - - - - Console Hash: 0xE97A4F5E - - - - - Returns the world matrix of the specified camera. To turn this into a view matrix, calculate the inverse. - - - - - The last parameter, as in other "ROT" methods, is usually 2. - - - - - I named the beginning from Any to BOOL as this native is used in an if statement as well. - Big surprise it returns an int. - - - - - I'm pretty sure the parameter is the camera as usual, but I am not certain so I'm going to leave it as is. - - - - - Can use this with SET_CAM_SPLINE_PHASE to set the float it this native returns. - (returns 1.0f when no nodes has been added, reached end of non existing spline) - - - - - Gets the position of the cargobob hook, in world coords. - - - - - Gets the position of the cargobob hook, in world coords. - - - - - Gets the current day of the week. - 0: Sunday - 1: Monday - 2: Tuesday - 3: Wednesday - 4: Thursday - 5: Friday - 6: Saturday - - - - - Gets the current ingame hour, expressed without zeros. (09:34 will be represented as 9) - - - - - Gets the current ingame clock minute. - - - - - Gets the current ingame clock second. Note that ingame clock seconds change really fast since a day in GTA is only 48 minutes in real life. - - - - - Returns TRUE if it found something. FALSE if not. - - - - - Get the closest vehicle node to a given position, unknown1 = 3.0, unknown2 = 0 - - - - - Has 8 params in the latest patches. - isMission - if true doesn't return mission objects - - - - - Gets the closest ped in a radius. - Ped Types: - Any ped = -1 - Player = 1 - Male = 4 - Female = 5 - Cop = 6 - Human = 26 - SWAT = 27 - Animal = 28 - Army = 29 - ------------------ - P4 P5 P7 P8 - 1 0 x x = return nearest walking Ped - 1 x 0 x = return nearest walking Ped - x 1 1 x = return Ped you are using - 0 0 x x = no effect - 0 x 0 x = no effect - x = can be 1 or 0. Does not have any obvious changes. - This function does not return ped who is: - 1. Standing still - 2. Driving - 3. Fleeing - 4. Attacking - This function only work if the ped is: - 1. walking normally. - 2. waiting to cross a road. - Note: PED::GET_PED_NEARBY_PEDS works for more peds. - - - - - p1 seems to be always 1.0f in the scripts - - - - - Example usage - VEHICLE::GET_CLOSEST_VEHICLE(x, y, z, radius, hash, unknown leave at 70) - x, y, z: Position to get closest vehicle to. - radius: Max radius to get a vehicle. - modelHash: Limit to vehicles with this model. 0 for any. - flags: The bitwise flags altering the function's behaviour. - Does not return police cars or helicopters. - It seems to return police cars for me, does not seem to return helicopters, planes or boats for some reason - Only returns non police cars and motorbikes with the flag set to 70 and modelHash to 0. ModelHash seems to always be 0 when not a modelHash in the scripts, as stated above. - These flags were found in the b617d scripts: 0,2,4,6,7,23,127,260,2146,2175,12294,16384,16386,20503,32768,67590,67711,98309,100359. - Converted to binary, each bit probably represents a flag as explained regarding another native here: gtaforums.com/topic/822314-guide-driving-styles - Conversion of found flags to binary: pastebin.com/kghNFkRi - At exactly 16384 which is 0100000000000000 in binary and 4000 in hexadecimal only planes are returned. - It's probably more convenient to use worldGetAllVehicles(int *arr, int arrSize) and check the shortest distance yourself and sort if you want by checking the vehicle type with for example VEHICLE::IS_THIS_MODEL_A_BOAT - ------------------------------------------------------------------------- - Conclusion: This native is not worth trying to use. Use something like this instead: pastebin.com/xiFdXa7h - - - - - FYI: When falling through the map (or however you got under it) you will respawn when your player ped's height is <= -200.0 meters (I think you all know this) and when in a vehicle you will actually respawn at the closest vehicle node. - ---------- - Vector3 nodePos; - GET_CLOSEST_VEHICLE_NODE(x,y,z,&nodePos,...) - p4 is either 0, 1 or 8. 1 means any path/road. 0 means node in the middle of the closest main (asphalt) road. - p5, p6 are always the same: - 0x40400000 (3.0), 0 - p5 can also be 100.0 and p6 can be 2.5: - PATHFIND::GET_CLOSEST_VEHICLE_NODE(a_0, &v_5, v_9, 100.0, 2.5) - Known node types: simple path/asphalt road, only asphalt road, water, under the map at always the same coords. - The node types follows a pattern. For example, every fourth node is of the type water i.e. 3, 7, 11, 15, 19, 23, 27, 31, 35, 39... 239. Could not see any difference between nodes within certain types. - Starting at 2, every fourth node is under the map, always same coords. - Same with only asphalt road (0, 4, 8, etc) and simple path/asphalt road (1, 5, 9, etc). - gtaforums.com/topic/843561-pathfind-node-types - - - - - p5, p6 and p7 seems to be about the same as p4, p5 and p6 for GET_CLOSEST_VEHICLE_NODE. p6 and/or p7 has something to do with finding a node on the same path/road and same direction(at least for this native, something to do with the heading maybe). Edit this when you find out more. - p5 is either 1 or 12. 1 means any path/road. 12, 8, 0 means node in the middle of the closest main (asphalt) road. - p6 is always 3.0 - p7 is always 0. - Known node types: simple path/asphalt road, only asphalt road, water, under the map at always the same coords. - The node types follows a pattern. For example, every fourth node is of the type water i.e. 3, 7, 11, 15, 19, 23, 27, 31, 35, 39... 239. Could not see any difference between nodes within certain types. - Starting at 2, every fourth node is under the map, always same coords. - Same with only asphalt road (0, 4, 8, etc) and simple path/asphalt road (1, 5, 9, etc). - gtaforums.com/topic/843561-pathfind-node-types - Example of usage, moving vehicle to closest path/road: - Vector3 coords = ENTITY::GET_ENTITY_COORDS(playerVeh, true); - Vector3 closestVehicleNodeCoords; - float roadHeading; - PATHFIND::GET_CLOSEST_VEHICLE_NODE_WITH_HEADING(coords.x, coords.y, coords.z, &closestVehicleNodeCoords, &roadHeading, 1, 3, 0); - ENTITY::SET_ENTITY_HEADING(playerVeh, roadHeading); - ENTITY::SET_ENTITY_COORDS(playerVeh, closestVehicleNodeCoords.x, closestVehicleNodeCoords.y, closestVehicleNodeCoords.z, 1, 0, 0, 1); - VEHICLE::SET_VEHICLE_ON_GROUND_PROPERLY(playerVeh); - ------------------------------------------------------------------ - C# Example (ins1de) : pastebin.com/fxtMWAHD - - - - - Returns POSIX timestamp. - Renamed from `_GET_POSIX_TIME` to `GET_CLOUD_TIME_AS_INT` because of conflicting native names ([`0xDA488F299A5B164E`](#_0xDA488F299A5B164E)) - - An int representing the cloud time. - - - - Returns POSIX timestamp. - Renamed from `_GET_POSIX_TIME` to `GET_CLOUD_TIME_AS_INT` because of conflicting native names ([`0xDA488F299A5B164E`](#_0xDA488F299A5B164E)) - - An int representing the cloud time. - - - - p0: Ped Handle - p1: int i | 0 <= i <= 27 - p1 probably refers to the attributes configured in combatbehavior.meta. There are 13. Example: - <BlindFireChance value="0.1"/> - <WeaponShootRateModifier value="1.0"/> - <TimeBetweenBurstsInCover value="1.25"/> - <BurstDurationInCover value="2.0"/> - <TimeBetweenPeeks value="10.0"/> - <WeaponAccuracy value="0.18"/> - <FightProficiency value="0.8"/> - <StrafeWhenMovingChance value="1.0"/> - <WalkWhenStrafingChance value="0.0"/> - <AttackWindowDistanceForCover value="55.0"/> - <TimeToInvalidateInjuredTarget value="9.0"/> - <TriggerChargeTime_Near value="4.0"/> - <TriggerChargeTime_Far value="10.0"/> - -------------Confirmed by editing combatbehavior.meta: - p1: - 0=BlindFireChance - 1=BurstDurationInCover - 3=TimeBetweenBurstsInCover - 4=TimeBetweenPeeks - 5=StrafeWhenMovingChance - 8=WalkWhenStrafingChance - 11=AttackWindowDistanceForCover - 12=TimeToInvalidateInjuredTarget - 16=OptimalCoverDistance - - - - - Return the mission id of a job. - - - - - Return the mission id of a job. - - - - - formerly called _GET_CONTROL_ACTION_NAME incorrectly - p2 appears to always be true. - p2 is unused variable in function. - EG: - GET_CONTROL_INSTRUCTIONAL_BUTTON (2, 201, 1) -- [[INPUT_FRONTEND_ACCEPT (e.g. Enter button)]] - GET_CONTROL_INSTRUCTIONAL_BUTTON (2, 202, 1) -- [[INPUT_FRONTEND_CANCEL (e.g. ESC button)]] - GET_CONTROL_INSTRUCTIONAL_BUTTON (2, 51, 1) -- [[INPUT_CONTEXT (e.g. E button)]] - gtaforums.com/topic/819070-c-draw-instructional-buttons-scaleform-movie/#entry1068197378 - 0, 1 and 2 used in the scripts. 0 is by far the most common of them. - - - - - formerly called _GET_CONTROL_ACTION_NAME incorrectly - p2 appears to always be true. - p2 is unused variable in function. - EG: - GET_CONTROL_INSTRUCTIONAL_BUTTON (2, 201, 1) -- [[INPUT_FRONTEND_ACCEPT (e.g. Enter button)]] - GET_CONTROL_INSTRUCTIONAL_BUTTON (2, 202, 1) -- [[INPUT_FRONTEND_CANCEL (e.g. ESC button)]] - GET_CONTROL_INSTRUCTIONAL_BUTTON (2, 51, 1) -- [[INPUT_CONTEXT (e.g. E button)]] - gtaforums.com/topic/819070-c-draw-instructional-buttons-scaleform-movie/#entry1068197378 - 0, 1 and 2 used in the scripts. 0 is by far the most common of them. - - - - - Returns the value of CONTROLS::GET_CONTROL_VALUE Normalized (ie a real number value between -1 and 1) - 0, 1 and 2 used in the scripts. 0 is by far the most common of them. - - - - - 0, 1 and 2 used in the scripts. 0 is by far the most common of them. - - - - - 0 -> up - 1 -> lowering down - 2 -> down - 3 -> raising up - enum RoofState - { - ROOFSTATE_UP = 0; - ROOFSTATE_LOWERING, - ROOFSTATE_DOWN, - ROOFSTATE_RAISING - }; - - - - - if (UI::_2309595AD6145265() == ${fe_menu_version_empty_no_background}) - Seems to get the current frontend menu - - - - - if (UI::_2309595AD6145265() == ${fe_menu_version_empty_no_background}) - Seems to get the current frontend menu - - - - - Gets the aggressiveness factor of the ocean waves. - - - - - Gets the aggressiveness factor of the ocean waves. - - - - - Gets the aggressiveness factor of the ocean waves. - - - - - american = 0 - french = 1 - german = 2 - italian =3 - spanish = 4 - portuguese = 5 - polish = 6 - russian = 7 - korean = 8 - chinese = 9 - japanese = 10 - mexican = 11 - - - - - american = 0 - french = 1 - german = 2 - italian =3 - spanish = 4 - portuguese = 5 - polish = 6 - russian = 7 - korean = 8 - chinese = 9 - japanese = 10 - mexican = 11 - - - - - Returns the handle for the notification currently displayed on the screen. - - - - - Returns the handle for the notification currently displayed on the screen. - - - - - Example in VB - Public Shared Function GetVehicleCurrentWeapon(Ped As Ped) As Integer - Dim arg As New OutputArgument() - Native.Function.Call(Hash.GET_CURRENT_PED_VEHICLE_WEAPON, Ped, arg) - Return arg.GetResult(Of Integer)() - End Function - Usage: - If GetVehicleCurrentWeapon(Game.Player.Character) = -821520672 Then ...Do something - Note: -821520672 = VEHICLE_WEAPON_PLANE_ROCKET - - - - - The return value seems to indicate returns true if the hash of the weapon object weapon equals the weapon hash. - p2 seems to be 1 most of the time. - p2 is not implemented - disassembly said that? - ------ - yes on disassembly p2 it seems not implemented i just have: - bool __fastcall sub_7FF6C56CE684(__int64 a1, _DWORD *a2) - Found At: 7ff6c56ce684 - - - - - Returns the name of the currently executing resource. - - The name of the resource. - - - - Returns the peer address of the remote game server that the user is currently connected to. - - The peer address of the game server (e.g. `127.0.0.1:30120`), or NULL if not available. - - - - Takes the specified time and writes it to the structure specified in the second argument. - struct date_time - { - alignas(8) int year; - alignas(8) int month; - alignas(8) int day; - alignas(8) int hour; - alignas(8) int minute; - alignas(8) int second; - }; - - - - - This function is hard-coded to always return 1. - - - - - Gets a destructible object's handle - Example: - OBJECT::_B48FCED898292E52(-809.9619750976562, 170.919, 75.7406997680664, 3.0, "des_tvsmash"); - All found arguments for p4 starts with "des_" like "DES_FIB_Floor" and "des_shipsink". - - - - - Gets a destructible object's handle - Example: - OBJECT::_B48FCED898292E52(-809.9619750976562, 170.919, 75.7406997680664, 3.0, "des_tvsmash"); - All found arguments for p4 starts with "des_" like "DES_FIB_Floor" and "des_shipsink". - - - - - Get a destrictible object's state. - Substract 1 to get the real state. - See _SET_DES_OBJECT_STATE to see the different states - For example, if the object just spawned (state 2), the native will return 3. - - - - - Get a destrictible object's state. - Substract 1 to get the real state. - See _SET_DES_OBJECT_STATE to see the different states - For example, if the object just spawned (state 2), the native will return 3. - - - - - control - c# works with (int)GTA.Control.CursorY / (int)GTA.Control.CursorX and returns the mouse movement (additive). - 0, 1 and 2 used in the scripts. 0 is by far the most common of them. - - - - - Returns model name of vehicle in all caps. Needs to be displayed through localizing text natives to get proper display name. - ----------------------------------------------------------------------------------------------------------------------------------------- - While often the case, this does not simply return the model name of the vehicle (which could be hashed to return the model hash). Variations of the same vehicle may also use the same display name. - ----------------------------------------------------------------------------------------------------------------------------------------- - Returns "CARNOTFOUND" if the hash doesn't match a vehicle hash. - Using UI::_GET_LABEL_TEXT, you can get the localized name. - For a full list, see here: pastebin.com/wvpyS4kS (pastebin.com/dA3TbkZw) - - - - - Returns the distance between two three-dimensional points, optionally ignoring the Z values. - You'll most likely want to use your language's native vector functionality instead. - - The X coordinate of the first point. - The Y coordinate of the first point. - The Z coordinate of the first point. - The X coordinate of the second point. - The Y coordinate of the second point. - The Z coordinate of the second point. - Whether or not to use the Z coordinate. - The distance between the passed points in units. - - - - dlcVehicleIndex takes a number from 0 - GET_NUM_DLC_VEHICLES() - 1. - outData is a struct of 3 8-byte items. - The Second item in the struct *(Hash *)(outData + 1) is the vehicle hash. - - - - - dlcVehicleIndex is 0 to GET_NUM_DLC_VEHICLS() - - - - - p0 seems to be the weapon index - p1 seems to be the weapon component index - struct DlcComponentData{ - int attachBone; - int padding1; - int bActiveByDefault; - int padding2; - int unk; - int padding3; - int componentHash; - int padding4; - int unk2; - int padding5; - int componentCost; - int padding6; - char nameLabel[64]; - char descLabel[64]; - }; - - - - - dlcWeaponIndex takes a number from 0 - GET_NUM_DLC_WEAPONS() - 1. - struct DlcWeaponData - { - int emptyCheck; //use DLC1::_IS_DLC_DATA_EMPTY on this - int padding1; - int weaponHash; - int padding2; - int unk; - int padding3; - int weaponCost; - int padding4; - int ammoCost; - int padding5; - int ammoType; - int padding6; - int defaultClipSize; - int padding7; - char nameLabel[64]; - char descLabel[64]; - char desc2Label[64]; // usually "the" + name - char upperCaseNameLabel[64]; - }; - - - - - Returns the NUI window handle for a specified DUI browser object. - - The DUI browser handle. - The NUI window handle, for use in e.g. CREATE_RUNTIME_TEXTURE_FROM_DUI_HANDLE. - - - - Returns a float value representing animation's current playtime with respect to its total playtime. This value increasing in a range from [0 to 1] and wrap back to 0 when it reach 1. - Example: - 0.000000 - mark the starting of animation. - 0.500000 - mark the midpoint of the animation. - 1.000000 - mark the end of animation. - Animations list : www.los-santos-multiplayer.com/dev.airdancer?cxt=anim - - - - - Returns a float value representing animation's total playtime in milliseconds. - Example: - GET_ENTITY_ANIM_TOTAL_TIME(PLAYER_ID(),"amb@world_human_yoga@female@base","base_b") - return 20800.000000 - Animations list : www.los-santos-multiplayer.com/dev.airdancer?cxt=anim - - - - - Returns the index of the bone. If the bone was not found, -1 will be returned. - list: - pastebin.com/D7JMnX1g - BoneNames: - chassis, - windscreen, - seat_pside_r, - seat_dside_r, - bodyshell, - suspension_lm, - suspension_lr, - platelight, - attach_female, - attach_male, - bonnet, - boot, - chassis_dummy, //Center of the dummy - chassis_Control, //Not found yet - door_dside_f, //Door left, front - door_dside_r, //Door left, back - door_pside_f, //Door right, front - door_pside_r, //Door right, back - Gun_GripR, - windscreen_f, - platelight, //Position where the light above the numberplate is located - VFX_Emitter, - window_lf, //Window left, front - window_lr, //Window left, back - window_rf, //Window right, front - window_rr, //Window right, back - engine, //Position of the engine - gun_ammo, - ROPE_ATTATCH, //Not misspelled. In script "finale_heist2b.c4". - wheel_lf, //Wheel left, front - wheel_lr, //Wheel left, back - wheel_rf, //Wheel right, front - wheel_rr, //Wheel right, back - exhaust, //Exhaust. shows only the position of the stock-exhaust - overheat, //A position on the engine(not exactly sure, how to name it) - misc_e, //Not a car-bone. - seat_dside_f, //Driver-seat - seat_pside_f, //Seat next to driver - Gun_Nuzzle, - seat_r - I doubt that the function is case-sensitive, since I found a "Chassis" and a "chassis". - Just tested: Definitely not case-sensitive. - - - - - console hash: 0xE8C0C629 - - - - - console hash: 0xE8C0C629 - - - - - Gets the current coordinates for a specified entity. - - The entity to get the coordinates from. - Unused by the game, potentially used by debug builds of GTA in order to assert whether or not an entity was alive. - The current entity coordinates. - - - - Gets the entity's forward vector. - - - - - Gets the X-component of the entity's forward vector. - - - - - Gets the Y-component of the entity's forward vector. - - - - - Returns the heading of the entity in degrees. Also know as the "Yaw" of an entity. - - - - - Returns an integer value of entity's current health. - Example of range for ped: - - Player [0 to 200] - - Ped [100 to 200] - - Vehicle [0 to 1000] - - Object [0 to 1000] - Health is actually a float value but this native casts it to int. - In order to get the actual value, do: - float health = *(float *)(entityAddress + 0x280); - - - - - Return height (z-dimension) above ground. - Example: The pilot in a titan plane is 1.844176 above ground. - How can i convert it to meters? - Everything seems to be in meters, probably this too. - - - - - Returns the LOD distance of an entity. - - - - - Return an integer value of entity's maximum health. - Example: - - Player = 200 - - - - - Returns the model hash from the entity - Sometimes throws an exception, idk what causes it though. - - - - - Gets the heading of the entity physics in degrees, which tends to be more accurate than just "GET_ENTITY_HEADING". This can be clearly seen while, for example, ragdolling a ped/player. - NOTE: The name and description of this native are based on independent research. If you find this native to be more suitable under a different name and/or described differently, please feel free to do so. - - - - - Gets the heading of the entity physics in degrees, which tends to be more accurate than just "GET_ENTITY_HEADING". This can be clearly seen while, for example, ragdolling a ped/player. - NOTE: The name and description of this native are based on independent research. If you find this native to be more suitable under a different name and/or described differently, please feel free to do so. - - - - - Returns TRUE if it found an entity in your crosshair within range of your weapon. Assigns the handle of the target to the *entity that you pass it. - Returns false if no entity found. - - - - - Gets an entity's population type. - **Valid population types:** - ```cpp - enum ePopulationType - { - POPTYPE_UNKNOWN = 0, - POPTYPE_RANDOM_PERMANENT, - POPTYPE_RANDOM_PARKED, - POPTYPE_RANDOM_PATROL, - POPTYPE_RANDOM_SCENARIO, - POPTYPE_RANDOM_AMBIENT, - POPTYPE_PERMANENT, - POPTYPE_MISSION, - POPTYPE_REPLAY, - POPTYPE_CACHE, - POPTYPE_TOOL - }; - ``` - - The entity to obtain the population type from. - A population type, from the enumeration above. - - - - w is the correct parameter name! - - - - - Displays the current ROLL axis of the entity [-180.0000/180.0000+] - (Sideways Roll) such as a vehicle tipped on its side - - - - - rotationOrder refers to the order yaw pitch roll is applied - value ranges from 0 to 5. What you use for rotationOrder when getting must be the same as rotationOrder when setting the rotation. - Unsure what value corresponds to what rotation order, more testing will be needed for that. - ------ - rotationOrder is usually 2 in scripts - ------ - ENTITY::GET_ENTITY_ROTATION(Any p0, false or true); - if false than return from -180 to 180 - if true than return from -90 to 90 - --- - As said above, the value of p1 affects the outcome. R* uses 1 and 2 instead of 0 and 1, so I marked it as an int. - What it returns is the yaw on the z part of the vector, which makes sense considering R* considers z as vertical. Here's a picture for those of you who don't understand pitch, yaw, and roll: - www.allstar.fiu.edu/aero/images/pic5-1.gif - I don't know why it returns a Vec3, but sometimes the values x and y go negative, yet they're always zero. Just use GET_ENTITY_PITCH and GET_ENTITY_ROLL for pitch and roll. - - - - - ANGULAR_VELOCITY* - - - - - All ambient entities in-world seem to have the same value for the second argument (Any *script), depending on when the scripthook was activated/re-activated. I've seen numbers from ~5 to almost 70 when the value was translated with to_string. The function return value seems to always be 0. - - - - - result is in meters per second - ------------------------------------------------------------ - So would the conversion to mph and km/h, be along the lines of this. - float speed = GET_ENTITY_SPEED(veh); - float kmh = (speed * 3.6); - float mph = (speed * 2.236936); - - - - - Relative can be used for getting speed relative to the frame of the vehicle, to determine for example, if you are going in reverse (-y speed) or not (+y speed). - - - - - Get how much of the entity is submerged. 1.0f is whole entity. - - - - - Returns: - 0 = no entity - 1 = ped - 2 = vehicle - 3 = object - This is weird, because in memory atleast on xbox360 it stores it from testing with a variety of (ped, vehicle, and objects). - 03 - 04 - 05 - The above is more then likely true for the native's return, but if you were to skip using the native it's a bit weird it returns different results. - - - - - the unit is m/s along each axis - GET_ENTITY_VELOCITY(aEntity) is the same as GET_ENTITY_SPEED_VECTOR(aEntity,false) - - - - - eventGroup: 0 = CEventGroupScriptAI, 1 = CEventGroupScriptNetwork - - - - - eventGroup: 0 = CEventGroupScriptAI, 1 = CEventGroupScriptNetwork - - - - - eventGroup: 0 = CEventGroupScriptAI, 1 = CEventGroupScriptNetwork - - - - - See [`GetTimecycleModifierIndex`](#_0xFDF3D97C674AFB66) for use, works the same just for the secondary timecycle modifier. - - An integer representing the Timecycle modifier - - - - 8 = waypoint - - - - - Type equals 0 for male non-dlc, 1 for female non-dlc, 2 for male dlc, and 3 for female dlc. - Used when calling SET_PED_HEAD_BLEND_DATA. - - - - - Returns - 0 - Third Person Close - 1 - Third Person Mid - 2 - Third Person Far - 4 - First Person - - - - - Returns the type of camera: - 0 - Third Person Close - 1 - Third Person Mid - 2 - Third Person Far - 4 - First Person - - - - - Gets the gameplay camera's far clipping plane. - - - - - Gets the gameplay camera's far clipping plane. - - - - - Gets the gameplay camera's far depth of field distance. - - - - - Gets the gameplay camera's far depth of field distance. - - - - - Gets the gameplay camera's near depth of field distance. - - - - - Gets the gameplay camera's near depth of field distance. - - - - - p0 dosen't seem to change much, I tried it with 0, 1, 2: - 0-Pitch(X): -70.000092 - 0-Roll(Y): -0.000001 - 0-Yaw(Z): -43.886459 - 1-Pitch(X): -70.000092 - 1-Roll(Y): -0.000001 - 1-Yaw(Z): -43.886463 - 2-Pitch(X): -70.000092 - 2-Roll(Y): -0.000002 - 2-Yaw(Z): -43.886467 - - - - - p0 seems to consistently be 2 across scripts - Function is called faily often by CAM::CREATE_CAM_WITH_PARAMS - - - - - it returns a reference to an empty string, the same empty string that's used by 1687 internal gta functions. if it was used in a script (and i cannot find an instance of it being used), it would be as the source for a StringCopy or somesuch. - - - - - it returns a reference to an empty string, the same empty string that's used by 1687 internal gta functions. if it was used in a script (and i cannot find an instance of it being used), it would be as the source for a StringCopy or somesuch. - - - - - only documented to be continued... - - - - - only documented to be continued... - - - - - Gets the ground elevation at the specified position. Note that if the specified position is below ground level, the function will output zero! - x: Position on the X-axis to get ground elevation at. - y: Position on the Y-axis to get ground elevation at. - z: Position on the Z-axis to get ground elevation at. - groundZ: The ground elevation at the specified position. - unk: Nearly always 0, very rarely 1 in the scripts. - - - - - p1 may be a BOOL representing whether or not the group even exists - - - - - Input: Haircolor index, value between 0 and 63 (inclusive). - Output: RGB values for the haircolor specified in the input. - This is used with the hair color swatches scaleform. - Use [`_0x013E5CFC38CD5387`](#_0x013E5CFC38CD5387) to get the makeup colors. - - The hair color index. Value between 0-63 (inclusive). - Output red value. - Output green value. - Output blue value. - - - - Input: Haircolor index, value between 0 and 63 (inclusive). - Output: RGB values for the haircolor specified in the input. - This is used with the hair color swatches scaleform. - Use [`_0x013E5CFC38CD5387`](#_0x013E5CFC38CD5387) to get the makeup colors. - - The hair color index. Value between 0-63 (inclusive). - Output red value. - Output green value. - Output blue value. - - - - Gets the (case-insensitive, lower-cased) hash value for the passed string. This uses the 'Jenkins one-at-a-time' hashing - algorithm. - - The string to hash. - The hash of `string`. - - - - Returns a hash representing which part of the map the given coords are located. - Possible return values: - (Hash of) city -> -289320599 - (Hash of) countryside -> 2072609373 - C# Example : - Ped player = Game.Player.Character; - Hash h = Function.Call<Hash>(Hash.GET_HASH_OF_MAP_AREA_AT_COORDS, player.Position.X, player.Position.Y, player.Position.Z); - - - - - dx = x1 - dy = y1 - - - - - Max 1000. - At -100 both helicopter rotors will stall. - - - - - Max 1000. - At 0 the main rotor will stall. - - - - - Max 1000. - At 0 the tail rotor will stall. - - - - - HUD colors and their values: pastebin.com/d9aHPbXN - - - - - MulleDK19: Gets the ID of the next active thread. - First call _BEGIN_ENUMERATE_THREADS (0xDADFADA5A20143A8). - Any subsequent call to this function will then return the ID of the next active thread. - If the function returns 0, the end of the enumeration has been reached. - ----------------------------------------------------------------------- - Here's an example: - std::vector<int> vecCurrentThreads; - void update_current_threads_list() - { - vecCurrentThreads.clear(); - _BEGIN_ENUMERATING_THREADS(); - int id = _GET_ID_OF_NEXT_THREAD_IN_ENUMERATION(); - while (id != 0) - { - id = _GET_ID_OF_NEXT_THREAD_IN_ENUMERATION(); - vecCurrentThreads.push_back(id); - } - } - - - - - MulleDK19: Gets the ID of the next active thread. - First call _BEGIN_ENUMERATE_THREADS (0xDADFADA5A20143A8). - Any subsequent call to this function will then return the ID of the next active thread. - If the function returns 0, the end of the enumeration has been reached. - ----------------------------------------------------------------------- - Here's an example: - std::vector<int> vecCurrentThreads; - void update_current_threads_list() - { - vecCurrentThreads.clear(); - _BEGIN_ENUMERATING_THREADS(); - int id = _GET_ID_OF_NEXT_THREAD_IN_ENUMERATION(); - while (id != 0) - { - id = _GET_ID_OF_NEXT_THREAD_IN_ENUMERATION(); - vecCurrentThreads.push_back(id); - } - } - - - - - x1, y1, z1 -- Coords of your ped model - x2, y2, z2 -- Coords of the ped you want to switch to - - - - - Returns interior ID from specified coordinates. If coordinates are outside, then it returns 0. - Example for VB.NET - Dim interiorID As Integer = Native.Function.Call(Of Integer)(Hash.GET_INTERIOR_AT_COORDS, X, Y, Z) - - - - - Returns the interior ID representing the requested interior at that location (if found?). The supplied interior string is not the same as the one used to load the interior. - Use: INTERIOR::UNPIN_INTERIOR(INTERIOR::GET_INTERIOR_AT_COORDS_WITH_TYPE(x, y, z, interior)) - Interior types include: "V_Michael", "V_Franklins", "V_Franklinshouse", etc.. you can find them in the scripts. - Not a very useful native as you could just use GET_INTERIOR_AT_COORDS instead and get the same result, without even having to specify the interior type. - - - - - Returns the interior ID representing the requested interior at that location (if found?). The supplied interior string is not the same as the one used to load the interior. - Use: INTERIOR::UNPIN_INTERIOR(INTERIOR::GET_INTERIOR_AT_COORDS_WITH_TYPE(x, y, z, interior)) - Interior types include: "V_Michael", "V_Franklins", "V_Franklinshouse", etc.. you can find them in the scripts. - Not a very useful native as you could just use GET_INTERIOR_AT_COORDS instead and get the same result, without even having to specify the interior type. - - - - - Returns the handle of the interior that the entity is in. Returns 0 if outside. - - - - - Returns the group ID of the specified interior. For example, regular interiors have group 0, subway interiors have group 1. There are a few other groups too. - - - - - false = Any resolution < 1280x720 - true = Any resolution >= 1280x720 - - - - - From the driver's perspective, is the left headlight broken. - - - - - From the driver's perspective, is the left headlight broken. - - - - - Hash collision - - - - - gadgetHash - was always 0xFBAB5776 ("GADGET_PARACHUTE"). - - - - - Dr. Underscore (1/6/18): - Works exactly like IS_PROJECTILE_TYPE_IN_AREA, but it puts the position of the projectile in the vector. - p8 is probably ownedByPlayer, but not known for sure. (see IS_PROJECTILE_IN_AREA for info) - Unsure of the hash name, could someone confirm this? - - - - - Dr. Underscore (1/6/18): - Works exactly like IS_PROJECTILE_TYPE_IN_AREA, but it puts the position of the projectile in the vector. - p8 is probably ownedByPlayer, but not known for sure. (see IS_PROJECTILE_IN_AREA for info) - Unsure of the hash name, could someone confirm this? - - - - - From the driver's perspective, is the right headlight broken. - - - - - From the driver's perspective, is the right headlight broken. - - - - - p0 = VEHICLE_NODE_ID - Returns true when the node is Offroad. Alleys, some dirt roads, and carparks return true. - Normal roads where plenty of Peds spawn will return false - - - - - p0 = VEHICLE_NODE_ID - Returns true when the node is Offroad. Alleys, some dirt roads, and carparks return true. - Normal roads where plenty of Peds spawn will return false - - - - - from docks_heistb.c4: - AI::GET_IS_TASK_ACTIVE(PLAYER::PLAYER_PED_ID(), 2)) - Known Tasks: pastebin.com/2gFqJ3Px - - - - - Returns true when in a vehicle, false whilst entering/exiting. - - - - - Returns true when in a vehicle, false whilst entering/exiting. - - - - - Check if Vehicle Secondary is avaliable for customize - - - - - For a full list, see here: pastebin.com/Tp0XpBMN - - - - - Setting Aspect Ratio Manually in game will return: - false - for Narrow format Aspect Ratios (3:2, 4:3, 5:4, etc. ) - true - for Wide format Aspect Ratios (5:3, 16:9, 16:10, etc. ) - Setting Aspect Ratio to "Auto" in game will return "false" or "true" based on the actual set Resolution Ratio. - - - - - Seems to do the exact same as INTERIOR::GET_ROOM_KEY_FROM_ENTITY - - - - - Gets a string literal from a label name. - - - - - ``` - Landing gear states: - 0: Deployed - 1: Closing (Retracting) - 3: Opening (Deploying) - 4: Retracted - ``` - Landing gear state 2 is never used. - - The vehicle to check. - The current state of the vehicles landing gear. - - - - ``` - Landing gear states: - 0: Deployed - 1: Closing (Retracting) - 3: Opening (Deploying) - 4: Retracted - ``` - Landing gear state 2 is never used. - - The vehicle to check. - The current state of the vehicles landing gear. - - - - Not exactly sure on this one, but here's a snippet of code: - if (PED::IS_PED_IN_ANY_VEHICLE(PLAYER::PLAYER_PED_ID(), 0)) { - v_2 = PED::GET_VEHICLE_PED_IS_IN(PLAYER::PLAYER_PED_ID(), 0); - } else { - v_2 = VEHICLE::_B2D06FAEDE65B577(); - } - - - - - Not exactly sure on this one, but here's a snippet of code: - if (PED::IS_PED_IN_ANY_VEHICLE(PLAYER::PLAYER_PED_ID(), 0)) { - v_2 = PED::GET_VEHICLE_PED_IS_IN(PLAYER::PLAYER_PED_ID(), 0); - } else { - v_2 = VEHICLE::_B2D06FAEDE65B577(); - } - - - - - Returns the length of the string passed (much like strlen). - - - - - gets the length of a null terminated string, without checking unicode encodings - - - - - gets the length of a null terminated string, without checking unicode encodings - - - - - Returns the string length of the string from the gxt string . - - - - - Second Param = LiveryIndex - example - int count = VEHICLE::GET_VEHICLE_LIVERY_COUNT(veh); - for (int i = 0; i < count; i++) - { - char* LiveryName = VEHICLE::GET_LIVERY_NAME(veh, i); - } - this example will work fine to fetch all names - for example for Sanchez we get - SANC_LV1 - SANC_LV2 - SANC_LV3 - SANC_LV4 - SANC_LV5 - Use _GET_LABEL_TEXT, to get the localized livery name. - ----------- - NOTE: You may need to set the vehicle's modKit to 0 by using this function: SET_VEHICLE_MOD_KIT() before getting the name, otherwise this native may return NULL. - dev-c.com/nativedb/func/info/1f2aa07f00b3217a - - - - - Gets local system time as year, month, day, hour, minute and second. - Example usage: - int year; - int month; - int day; - int hour; - int minute; - int second; - or use std::tm struct - TIME::GET_LOCAL_TIME(&year, &month, &day, &hour, &minute, &second); - - - - - Input: Makeup color index, value between 0 and 63 (inclusive). - Output: RGB values for the makeup color specified in the input. - This is used with the makeup color swatches scaleform. - Use [`_0x4852FC386E2E1BB5`](#_0x4852FC386E2E1BB5) to get the hair colors. - - The hair color index. Value between 0-63 (inclusive). - Output red value. - Output green value. - Output blue value. - - - - Input: Makeup color index, value between 0 and 63 (inclusive). - Output: RGB values for the makeup color specified in the input. - This is used with the makeup color swatches scaleform. - Use [`_0x4852FC386E2E1BB5`](#_0x4852FC386E2E1BB5) to get the hair colors. - - The hair color index. Value between 0-63 (inclusive). - Output red value. - Output green value. - Output blue value. - - - - p2 is mostly 1 in the scripts. - - - - - Gets the maximum wanted level the player can get. - Ranges from 0 to 5. - - - - - This function is hard-coded to always return 0. - Limit is 96, see _GET_MAXIMUM_NUMBER_OF_PHOTOS_2 (0xDC54A7AF8B3A14EF). - - - - - This is the "actual" GET_MAXIMUM_NUMBER_OF_PHOTOS native. Always returns 96. - - - - - This is the "actual" GET_MAXIMUM_NUMBER_OF_PHOTOS native. Always returns 96. - - - - - Returns the name for the type of vehicle mod(Armour, engine etc) - ----------- - for some reason this native seems unreliable: sometimes returns NULL, and when retval != NULL the string can be empty - - - - - Returns the text label of a mod type for a given vehicle - Use _GET_LABEL_TEXT to get the part name in the game's language - - - - - Gets the dimensions of a model. - Calculate (maximum - minimum) to get the size, in which case, Y will be how long the model is. - Vector3 GetDimensions(Hash model) - { - Vector3 right, left; - GET_MODEL_DIMENSIONS(model, &right, &left); - return Vector3::Subtract(left, right); - } - Example from the scripts: GAMEPLAY::GET_MODEL_DIMENSIONS(ENTITY::GET_ENTITY_MODEL(PLAYER::PLAYER_PED_ID()), &v_1A, &v_17); - - - - - Function just returns 0 - void __fastcall ped__get_mount(NativeContext *a1) - { - NativeContext *v1; // rbx@1 - v1 = a1; - GetAddressOfPedFromScriptHandle(a1->Args->Arg1); - v1->Returns->Item1= 0; - } - - - - - The reversed code looks like this (Sasuke78200) - // - char g_szScriptName[64]; - char* _0xBE7ACD89(int a_iThreadID) - { - scrThread* l_pThread; - // Get the script thread - l_pThread = GetThreadByID(a_iThreadID); - if(l_pThread == 0 || l_pThread->m_iThreadState == 2) - { - strncpy(g_szScriptName, "", 64); - } - else - { - strncpy(g_szScriptName, l_pThread->m_szScriptName, 64); - } - return g_szScriptName; - } - - - - - The reversed code looks like this (Sasuke78200) - // - char g_szScriptName[64]; - char* _0xBE7ACD89(int a_iThreadID) - { - scrThread* l_pThread; - // Get the script thread - l_pThread = GetThreadByID(a_iThreadID); - if(l_pThread == 0 || l_pThread->m_iThreadState == 2) - { - strncpy(g_szScriptName, "", 64); - } - else - { - strncpy(g_szScriptName, l_pThread->m_szScriptName, 64); - } - return g_szScriptName; - } - - - - - AIRP = Los Santos International Airport - ALAMO = Alamo Sea - ALTA = Alta - ARMYB = Fort Zancudo - BANHAMC = Banham Canyon Dr - BANNING = Banning - BEACH = Vespucci Beach - BHAMCA = Banham Canyon - BRADP = Braddock Pass - BRADT = Braddock Tunnel - BURTON = Burton - CALAFB = Calafia Bridge - CANNY = Raton Canyon - CCREAK = Cassidy Creek - CHAMH = Chamberlain Hills - CHIL = Vinewood Hills - CHU = Chumash - CMSW = Chiliad Mountain State Wilderness - CYPRE = Cypress Flats - DAVIS = Davis - DELBE = Del Perro Beach - DELPE = Del Perro - DELSOL = La Puerta - DESRT = Grand Senora Desert - DOWNT = Downtown - DTVINE = Downtown Vinewood - EAST_V = East Vinewood - EBURO = El Burro Heights - ELGORL = El Gordo Lighthouse - ELYSIAN = Elysian Island - GALFISH = Galilee - GOLF = GWC and Golfing Society - GRAPES = Grapeseed - GREATC = Great Chaparral - HARMO = Harmony - HAWICK = Hawick - HORS = Vinewood Racetrack - HUMLAB = Humane Labs and Research - JAIL = Bolingbroke Penitentiary - KOREAT = Little Seoul - LACT = Land Act Reservoir - LAGO = Lago Zancudo - LDAM = Land Act Dam - LEGSQU = Legion Square - LMESA = La Mesa - LOSPUER = La Puerta - MIRR = Mirror Park - MORN = Morningwood - MOVIE = Richards Majestic - MTCHIL = Mount Chiliad - MTGORDO = Mount Gordo - MTJOSE = Mount Josiah - MURRI = Murrieta Heights - NCHU = North Chumash - NOOSE = N.O.O.S.E - OCEANA = Pacific Ocean - PALCOV = Paleto Cove - PALETO = Paleto Bay - PALFOR = Paleto Forest - PALHIGH = Palomino Highlands - PALMPOW = Palmer-Taylor Power Station - PBLUFF = Pacific Bluffs - PBOX = Pillbox Hill - PROCOB = Procopio Beach - RANCHO = Rancho - RGLEN = Richman Glen - RICHM = Richman - ROCKF = Rockford Hills - RTRAK = Redwood Lights Track - SANAND = San Andreas - SANCHIA = San Chianski Mountain Range - SANDY = Sandy Shores - SKID = Mission Row - SLAB = Stab City - STAD = Maze Bank Arena - STRAW = Strawberry - TATAMO = Tataviam Mountains - TERMINA = Terminal - TEXTI = Textile City - TONGVAH = Tongva Hills - TONGVAV = Tongva Valley - VCANA = Vespucci Canals - VESP = Vespucci - VINE = Vinewood - WINDF = Ron Alternates Wind Farm - WVINE = West Vinewood - ZANCUDO = Zancudo River - ZP_ORT = Port of South Los Santos - ZQ_UAR = Davis Quartz - - - - - Looks like the last parameter returns true if the path has been calculated, while the first returns the remaining distance to the end of the path. - Return value of native is the same as GET_NAVMESH_ROUTE_RESULT - Looks like the native returns an int for the path's state: - 1 - ??? - 2 - 3 - Finished Generating - - - - - See GET_NAVMESH_ROUTE_DISTANCE_REMAINING for more details. - - - - - Could this be used alongside either, - SET_NETWORK_ID_EXISTS_ON_ALL_MACHINES or _SET_NETWORK_ID_SYNC_TO_PLAYER to make it so other players can hear the sound while online? It'd be a bit troll-fun to be able to play the Zancudo UFO creepy sounds globally. - - - - - Returns weather name hash - - - - - Returns weather name hash - - - - - Needs more research. Gets the stat name of a masked bool? - p4 - Usually "_NGPSTAT_BOOL" or "_NGTATPSTAT_BOOL". There may be more that I missed. - - - - - Needs more research. Gets the stat name of a masked bool? - p4 - Usually "_NGPSTAT_BOOL" or "_NGTATPSTAT_BOOL". There may be more that I missed. - - - - - Needs more research. Gets the stat name of a masked int? - p4 - Usually one of the following (there may be more that I missed): - -----> "_APAPSTAT_INT" - -----> "_LRPSTAT_INT" - -----> "_NGPSTAT_INT" - -----> "_MP_APAPSTAT_INT" - -----> "_MP_LRPSTAT_INT" - - - - - Needs more research. Gets the stat name of a masked int? - p4 - Usually one of the following (there may be more that I missed): - -----> "_APAPSTAT_INT" - -----> "_LRPSTAT_INT" - -----> "_NGPSTAT_INT" - -----> "_MP_APAPSTAT_INT" - -----> "_MP_LRPSTAT_INT" - - - - - See gtaforums.com/topic/843561-pathfind-node-types for node type info. 0 = paved road only, 1 = any road, 3 = water - p10 always equal 0x40400000 - p11 always equal 0 - - - - - Returns the id. - - - - - Get the nth closest vehicle node and its heading. (unknown2 = 9, unknown3 = 3.0, unknown4 = 2.5) - - - - - only documented to be continued... - - - - - only documented to be continued... - - - - - Allowed Values from 0 - DLC1::GET_NUM_DLC_WEAPONS() - - - - - Gets the total number of DLC weapons. - - - - - Returns number of possible values of the componentId argument of GET_FORCED_COMPONENT. - - - - - Used for freemode (online) characters. - - - - - Used with freemode (online) characters. - - - - - Type equals 0 for male non-dlc, 1 for female non-dlc, 2 for male dlc, and 3 for female dlc. - - - - - character is 0 for Michael, 1 for Franklin, 2 for Trevor, 3 for freemode male, and 4 for freemode female. - componentId is between 0 and 11 and corresponds to the usual component slots. - p1 could be the outfit number; unsure. - p2 is usually -1; unknown function. - p3 appears to be a boolean flag; unknown function. - p4 is usually -1; unknown function. - - - - - p0 appears to be for MP - - - - - p0 appears to be for MP - - - - - p0 appears to be for MP - - - - - Gets the amount of metadata values with the specified key existing in the specified resource's manifest. - See also: [Resource manifest](https://docs.fivem.net/resources/manifest/) - - The resource name. - The key to look up in the resource manifest. - - - - Returns how many possible mods a vehicle has for a given mod type - - - - - eventGroup: 0 = CEventGroupScriptAI, 1 = CEventGroupScriptNetwork - - - - - Gets the number of instances of the specified script is currently running. - Actually returns numInstances - 1. - if (scriptPtr) - v3 = GetNumberOfInstancesOfScript(scriptPtr) - 1; - return v3; - - - - - Gets the number of instances of the specified script is currently running. - Actually returns numInstances - 1. - if (scriptPtr) - v3 = GetNumberOfInstancesOfScript(scriptPtr) - 1; - return v3; - - - - - List of component/props ID - gtaxscripting.blogspot.com/2016/04/gta-v-peds-component-and-props.html - - - - - List of component/props ID - gtaxscripting.blogspot.com/2016/04/gta-v-peds-component-and-props.html - - - - - Need to check behavior when drawableId = -1 - - Doofy.Ass - Why this function doesn't work and return nill value? - GET_NUMBER_OF_PED_PROP_TEXTURE_VARIATIONS(PLAYER.PLAYER_PED_ID(), 0, 5) - tick: scripts/addins/menu_execute.lua:51: attempt to call field 'GET_NUMBER_OF_PED_PROP_TEXTURE_VARIATIONS' (a nil value) - List of component/props ID - gtaxscripting.blogspot.com/2016/04/gta-v-peds-component-and-props.html - - - - - List of component/props ID - gtaxscripting.blogspot.com/2016/04/gta-v-peds-component-and-props.html - - - - - Actually number of color combinations - - - - - Returns the number of *types* of licence plates, enumerated below in SET_VEHICLE_NUMBER_PLATE_TEXT_INDEX. - - - - - Simply returns whatever is passed to it (Regardless of whether the handle is valid or not). - - - - - Converts world coords (posX - Z) to coords relative to the entity - Example: - posX = 50 - posY = 1000 - posZ = 60 - Entity's coords are: x=30, y=1000, z=60. - All three returned coords will then be in range of [-20,20] depending on rotation of the entity. - - - - - Offset values are relative to the entity. - x = left/right - y = forward/backward - z = up/down - - - - - Online version is defined here: update\update.rpf\common\data\version.txt - Example: - [ONLINE_VERSION_NUMBER] - 1.33 - _GET_ONLINE_VERSION() will return "1.33" - Belongs in NETWORK - - - - - Online version is defined here: update\update.rpf\common\data\version.txt - Example: - [ONLINE_VERSION_NUMBER] - 1.33 - _GET_ONLINE_VERSION() will return "1.33" - Belongs in NETWORK - - - - - Returns NULL unless UPDATE_ONSCREEN_KEYBOARD() returns 1 in the same tick. - - - - - Returns: - 5 - 10 - 15 - 20 - 25 - 30 - 35 - - - - - Returns the ped's alertness (0-3). - Values : - 0 : Neutral - 1 : Heard something (gun shot, hit, etc) - 2 : Knows (the origin of the event) - 3 : Fully alerted (is facing the event?) - If the Ped does not exist, returns -1. - - - - - Returns an ammo type hash, which is defined in AmmoInfo. - - - - - Returns an ammo type hash, which is defined in AmmoInfo. - - - - - from fm_mission_controller.c4 (variable names changed for clarity): - int groupID = PLAYER::GET_PLAYER_GROUP(PLAYER::PLAYER_ID()); - PED::GET_GROUP_SIZE(group, &unused, &groupSize); - if (groupSize >= 1) { - . . . . for (int memberNumber = 0; memberNumber < groupSize; memberNumber++) { - . . . . . . . . Ped ped1 = PED::GET_PED_AS_GROUP_MEMBER(groupID, memberNumber); - . . . . . . . . //and so on - - - - - Gets the position of the specified bone of the specified ped. - ped: The ped to get the position of a bone from. - boneId: The ID of the bone to get the position from. This is NOT the index. - offsetX: The X-component of the offset to add to the position relative to the bone's rotation. - offsetY: The Y-component of the offset to add to the position relative to the bone's rotation. - offsetZ: The Z-component of the offset to add to the position relative to the bone's rotation. - - - - - Bone ID enum: pastebin.com/3pz17QGd - - - - - Returns the hash of the weapon/model/object that killed the ped. - - - - - p2 is always 1 in the scripts. - if (GET_PED_CONFIG_FLAG(ped, 78, 1)) - = returns true if ped is aiming/shooting a gun - - - - - Ids - 1 - 2 - 3 - 4 - 5 - 6 - 7 - ------ - 8 - Accessories 1 - 9 - Accessories 2 - 10 - 11 - Auxiliary parts for torso - - - - - Gets the offset the specified ped has moved since the previous tick. - If worldSpace is false, the returned offset is relative to the ped. That is, if the ped has moved 1 meter right and 5 meters forward, it'll return 1,5,0. - If worldSpace is true, the returned offset is relative to the world. That is, if the ped has moved 1 meter on the X axis and 5 meters on the Y axis, it'll return 1,5,0. - - - - - A getter for [\_SET_PED_EYE_COLOR](#_0x50B56988B170AFDF). Returns -1 if fails to get. - - The target ped - Returns ped's eye colour, or -1 if fails to get. - - - - A getter for [\_SET_PED_FACE_FEATURE](#_0x71A5C1DBA060049E). Returns 0.0 if fails to get. - - The target ped - Face feature index - Returns ped's face feature value, or 0.0 if fails to get. - - - - hash collision??? - - - - - Returns the group id of which the specified ped is a member of. - - - - - The pointer is to a padded struct that matches the arguments to SET_PED_HEAD_BLEND_DATA(...). There are 4 bytes of padding after each field. - (Edit) Console Hash: 0x44E1680C - pass this struct in the second parameter - typedef struct - { - int shapeFirst, shapeSecond, shapeThird; - int skinFirst, skinSecond, skinThird; - float shapeMix, skinMix, thirdMix; - } headBlendData; - - - - - A getter for [SET_PED_HEAD_OVERLAY](#_0x48F44967FA05CC1E) and [\_SET_PED_HEAD_OVERLAY_COLOR](#_0x497BF74A7B9CB952) natives. - - The target ped - Overlay index - Overlay value pointer - Colour type pointer - First colour pointer - Second colour pointer - Opacity pointer - Returns ped's head overlay data. - - - - Likely a char, if that overlay is not set, e.i. "None" option, returns 255; - - - - - Use [`SetPedIlluminatedClothingGlowIntensity`](#_0x4E90D746056E273D) to set the illuminated clothing glow intensity for a specific ped. - - The ped to get the glow intensity from. - A float between 0.0 and 1.0 representing the current illuminated clothing glow intensity. - - - - Use [`SetPedIlluminatedClothingGlowIntensity`](#_0x4E90D746056E273D) to set the illuminated clothing glow intensity for a specific ped. - - The ped to get the glow intensity from. - A float between 0.0 and 1.0 representing the current illuminated clothing glow intensity. - - - - -1 (driver) <= index < GET_VEHICLE_MAX_NUMBER_OF_PASSENGERS(vehicle) - - - - - Simply returns whatever is passed to it (Regardless of whether the handle is valid or not). - - - - - Returns a handle to the first entity within the a circle spawned inside the 2 points from a radius. It could return a ped or an entity, but the scripts expect a ped, but still check if it's a ped. - - - - - Pretty sure outBone is an int. - - - - - Pass ped. Pass address of Vector3. - The coord will be put into the Vector3. - The return will determine whether there was a coord found or not. - - - - - sizeAndPeds - is a pointer to an array. The array is filled with peds found nearby the ped supplied to the first argument. - ignore - ped type to ignore - Return value is the number of peds found and added to the array passed. - ----------------------------------- - To make this work in most menu bases at least in C++ do it like so, - Formatted Example: pastebin.com/D8an9wwp - ----------------------------------- - Example: gtaforums.com/topic/789788-function-args-to-pedget-ped-nearby-peds/?p=1067386687 - Here's the right way to do it (console and pc): - pastebin.com/SsFej963 - - - - - Returns size of array, passed into the second variable. - See below for usage information. - This function actually requires a struct, where the first value is the maximum number of elements to return. Here is a sample of how I was able to get it to work correctly, without yet knowing the struct format. - //Setup the array - const int numElements = 10; - const int arrSize = numElements * 2 + 2; - Any veh[arrSize]; - //0 index is the size of the array - veh[0] = numElements; - int count = PED::GET_PED_NEARBY_VEHICLES(PLAYER::PLAYER_PED_ID(), veh); - if (veh != NULL) - { - //Simple loop to go through results - for (int i = 0; i < count; i++) - { - int offsettedID = i * 2 + 2; - //Make sure it exists - if (veh[offsettedID] != NULL && ENTITY::DOES_ENTITY_EXIST(veh[offsettedID])) - { - //Do something - } - } - } - Here's the right way to do it (console and pc): - pastebin.com/SsFej963 - - - - - List of component/props ID - gtaxscripting.blogspot.com/2016/04/gta-v-peds-component-and-props.html - - - - - -1: no landing - 0: landing on both feet - 1: stumbling - 2: rolling - 3: ragdoll - - - - - Returns: - -1: Normal - 0: Wearing parachute on back - 1: Parachute opening - 2: Parachute open - 3: Falling to doom (e.g. after exiting parachute) - Normal means no parachute? - - - - - List of component/props ID - gtaxscripting.blogspot.com/2016/04/gta-v-peds-component-and-props.html - - - - - List of component/props ID - gtaxscripting.blogspot.com/2016/04/gta-v-peds-component-and-props.html - - - - - Returns the Entity (Ped, Vehicle, or ?Object?) that killed the 'ped' - Is best to check if the Ped is dead before asking for its killer. - - - - - Returns the Entity (Ped, Vehicle, or ?Object?) that killed the 'ped' - Is best to check if the Ped is dead before asking for its killer. - - - - - Returns whether the entity is in stealth mode - - - - - List of component/props ID - gtaxscripting.blogspot.com/2016/04/gta-v-peds-component-and-props.html - - - - - Ped Types: (ordered by return priority) - Michael = 0 - Franklin = 1 - Trevor = 2 - Army = 29 - Animal = 28 - SWAT = 27 - LSFD = 21 - Paramedic = 20 - Cop = 6 - Male = 4 - Female = 5 - Human = 26 - Note/Exception - hc_gunman : 4 // Mix male and female - hc_hacker : 4 // Mix male and female - mp_f_misty_01 : 4 // Female character - s_f_y_ranger_01 : 5 // Ranger - s_m_y_ranger_01 : 4 // Ranger - s_m_y_uscg_01 : 6 // US Coast Guard - - - - - Quick disassembly and test seems to indicate that this native gets the Ped currently using the specified door. - - - - - Quick disassembly and test seems to indicate that this native gets the Ped currently using the specified door. - - - - - Returns the progress percent to current waypoint. - - - - - gtaforums.com/topic/885580-ped-headshotmugshot-txd/ - - - - - returns pickup hash. - - - - - returns pickup hash. - - - - - Returns the group ID the player is member of. - - - - - Called 5 times in the scripts. All occurrences found in b617d, sorted alphabetically and identical lines removed: - AUDIO::GET_PLAYER_HEADSET_SOUND_ALTERNATE("INOUT", 0.0); - AUDIO::GET_PLAYER_HEADSET_SOUND_ALTERNATE("INOUT", 1.0); - - - - - Returns the same as PLAYER_ID and NETWORK_PLAYER_ID_TO_INT - - - - - Returns the Player's Invincible status. - This function will always return false if 0x733A643B5B0C53C1 is used to set the invincibility status. To always get the correct result, use this: - bool IsPlayerInvincible(Player player) - { - auto addr = getScriptHandleBaseAddress(GET_PLAYER_PED(player)); - if (addr) - { - DWORD flag = *(DWORD *)(addr + 0x188); - return ((flag & (1 << 8)) != 0) || ((flag & (1 << 9)) != 0); - } - return false; - } - ============================================================ - This has bothered me for too long, whoever may come across this, where did anyone ever come up with this made up hash? 0x733A643B5B0C53C1 I've looked all over old hash list, and this nativedb I can not find that PC hash anywhere. What native name is it now or was it? - - - - - Returns the players name - - - - - Tints: - None = -1, - Rainbow = 0, - Red = 1, - SeasideStripes = 2, - WidowMaker = 3, - Patriot = 4, - Blue = 5, - Black = 6, - Hornet = 7, - AirFocce = 8, - Desert = 9, - Shadow = 10, - HighAltitude = 11, - Airbone = 12, - Sunrise = 13, - - - - - Gets the ped for a specified player index. - - The player index, or -1 to get the local player ped. - The specified player's ped, or 0 if invalid. - - - - Does the same like PLAYER::GET_PLAYER_PED<br/> - - - - - Returns 255 (radio off index) if the function fails. - - - - - Returns active radio station name - - - - - Tints: - None = -1, - Rainbow = 0, - Red = 1, - SeasideStripes = 2, - WidowMaker = 3, - Patriot = 4, - Blue = 5, - Black = 6, - Hornet = 7, - AirFocce = 8, - Desert = 9, - Shadow = 10, - HighAltitude = 11, - Airbone = 12, - Sunrise = 13, - - - - - Returns RGB color of the player - - - - - Assigns the handle of locked-on melee target to *entity that you pass it. - Returns false if no entity found. - - - - - Gets the player's team. - Does nothing in singleplayer. - - - - - Alternative: GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID(), 1); - - - - - p1 is some kind of tolerance - - - - - Gets system time as year, month, day, hour, minute and second. - Example usage: - int year; - int month; - int day; - int hour; - int minute; - int second; - TIME::GET_POSIX_TIME(&year, &month, &day, &hour, &minute, &second); - - - - - Returns current weather name hash - - - - - Returns current weather name hash - - - - - gtaforums.com/topic/799843-stats-profile-settings/ - - - - - only documented to be continued... - Dr. Underscore (1/6/18): - Exactly like _GET_PROJECTILE_NEAR_PED_COORDS (_0xDFB4138EEFED7B81), but it gives us the Entity that was found aswell. - p6 is (most likely) ownedByPlayer. (see IS_PROJECTILE_IN_AREA for info) - - - - - only documented to be continued... - Dr. Underscore (1/6/18): - Exactly like _GET_PROJECTILE_NEAR_PED_COORDS (_0xDFB4138EEFED7B81), but it gives us the Entity that was found aswell. - p6 is (most likely) ownedByPlayer. (see IS_PROJECTILE_IN_AREA for info) - - - - - From a quick disassembly I can say that this has something to do with weapons. - Added params according to what I could see in IDA. - Dr. Underscore (1/6/18): - Returns if any projectiles of projHash type are in a radius around this ped. If true, projPos is filled with the position of that entity. - This native was only ever used with projectiles, but may not be limited to. - p4 isn't an Entity*, it's actually a Vector3*, which outputs the position of the found entity. - p5 is (most likely) ownedByPlayer. (see IS_PROJECTILE_IN_AREA for info) - - - - - From a quick disassembly I can say that this has something to do with weapons. - Added params according to what I could see in IDA. - Dr. Underscore (1/6/18): - Returns if any projectiles of projHash type are in a radius around this ped. If true, projPos is filled with the position of that entity. - This native was only ever used with projectiles, but may not be limited to. - p4 isn't an Entity*, it's actually a Vector3*, which outputs the position of the found entity. - p5 is (most likely) ownedByPlayer. (see IS_PROJECTILE_IN_AREA for info) - - - - - outfit = a structure passing though it - see GET_SHOP_PED_QUERY_OUTFIT - slot - outfit slot - item - hold 3 ints in a struct, you can use Vector3 structure - GET_SHOP_PED_??? - - - - - Returns String with radio station name. - - - - - Another extremely useful native. - You can use it simply like: - if (GAMEPLAY::GET_RANDOM_INT_IN_RANGE(0, 2)) - - - - - Gets a random ped in the x/y/zRadius near the x/y/z coordinates passed. - Ped Types: - Any = -1 - Player = 1 - Male = 4 - Female = 5 - Cop = 6 - Human = 26 - SWAT = 27 - Animal = 28 - Army = 29 - - - - - Gets a random vehicle in a sphere at the specified position, of the specified radius. - x: The X-component of the position of the sphere. - y: The Y-component of the position of the sphere. - z: The Z-component of the position of the sphere. - radius: The radius of the sphere. Max is 9999.9004. - modelHash: The vehicle model to limit the selection to. Pass 0 for any model. - flags: The bitwise flags that modifies the behaviour of this function. - - - - - Not present in the retail version! It's just a nullsub. - p0 always true (except in one case) - p1 a random vehicle hash loaded in memory - p2 0 if success, -1 if failed - - - - - Returns all commands that are registered in the command system. - The data returned adheres to the following layout: - ``` - [ - { - "name": "cmdlist" - }, - { - "name": "command1" - } - ] - ``` - - An object containing registered commands. - - - - Gets the relationship between two groups. This should be called twice (once for each group). - Relationship types: - 0 = Companion - 1 = Respect - 2 = Like - 3 = Neutral - 4 = Dislike - 5 = Hate - 255 = Pedestrians - Example: - PED::GET_RELATIONSHIP_BETWEEN_GROUPS(l_1017, 0xA49E591C); - PED::GET_RELATIONSHIP_BETWEEN_GROUPS(0xA49E591C, l_1017); - - - - - Gets the relationship between two peds. This should be called twice (once for each ped). - Relationship types: - 0 = Companion - 1 = Respect - 2 = Like - 3 = Neutral - 4 = Dislike - 5 = Hate - 255 = Pedestrians - (Credits: Inco) - Example: - PED::GET_RELATIONSHIP_BETWEEN_PEDS(2, l_1017, 0xA49E591C); - PED::GET_RELATIONSHIP_BETWEEN_PEDS(2, 0xA49E591C, l_1017); - - - - - Gets the metadata value at a specified key/index from a resource's manifest. - See also: [Resource manifest](https://docs.fivem.net/resources/manifest/) - - The resource name. - The key in the resource manifest. - The value index, in a range from [0..GET_NUM_RESOURCE_METDATA-1]. - - - - Returns the current state of the specified resource. - - The name of the resource. - The resource state. One of `"missing", "started", "starting", "stopped", "stopping", "uninitialized" or "unknown"`. - - - - Gets the room hash key from the room that the specified entity is in. Each room in every interior has a unique key. Returns 0 if the entity is outside. - - - - - Returns the room hash key from the current gameplay cam. - - - - - Returns the room hash key from the current gameplay cam. - - - - - Return the root content id of a job. - - - - - Return the root content id of a job. - - - - - Get a rope's length. Can be modified with ROPE_FORCE_LENGTH - - - - - Gets the height of the specified runtime texture. - - A handle to the runtime texture. - The height in pixels. - - - - Gets the row pitch of the specified runtime texture, for use when creating data for `SET_RUNTIME_TEXTURE_ARGB_DATA`. - - A handle to the runtime texture. - The row pitch in bytes. - - - - Gets the width of the specified runtime texture. - - A handle to the runtime texture. - The width in pixels. - - - - When onGround == true outPosition is a position located on the nearest pavement. - When a safe coord could not be found the result of a function is false and outPosition == Vector3.Zero. - In the scripts these flags are used: 0, 14, 12, 16, 20, 21, 28. 0 is most commonly used, then 16. - 16 works for me, 0 crashed the script. - - - - - Gets the scale of safe zone. if the safe zone size scale is max, it will return 1.0. - - - - - Seems to take data that is returned from "_POP_SCALEFORM_MOVIE_FUNCTION" and checks to see if it's not null/empty. - "agency_heist3b.ysc", line 71836: - if (CONTROLS::IS_CONTROL_JUST_PRESSED(2, 201) || CONTROLS::IS_CONTROL_JUST_PRESSED(2, 237)) { - GRAPHICS::_PUSH_SCALEFORM_MOVIE_FUNCTION(l_46, "SET_INPUT_EVENT_SELECT"); - l_45 = GRAPHICS::_POP_SCALEFORM_MOVIE_FUNCTION(); - } - if (GRAPHICS::_0x768FF8961BA904D6(l_45)) { - v_13 = GRAPHICS::_0x2DE7EFA66B906036(l_45); - if (v_13 == 6) { - sub_73269(a_0); - } - } - - - - - Seems to take data that is returned from "_POP_SCALEFORM_MOVIE_FUNCTION" and checks to see if it's not null/empty. - "agency_heist3b.ysc", line 71836: - if (CONTROLS::IS_CONTROL_JUST_PRESSED(2, 201) || CONTROLS::IS_CONTROL_JUST_PRESSED(2, 237)) { - GRAPHICS::_PUSH_SCALEFORM_MOVIE_FUNCTION(l_46, "SET_INPUT_EVENT_SELECT"); - l_45 = GRAPHICS::_POP_SCALEFORM_MOVIE_FUNCTION(); - } - if (GRAPHICS::_0x768FF8961BA904D6(l_45)) { - v_13 = GRAPHICS::_0x2DE7EFA66B906036(l_45); - if (v_13 == 6) { - sub_73269(a_0); - } - } - - - - - Needs a bit more research, but it seems to return an int. - Testing with the scaleform "HACKING_PC" it seems to return an int depending on the clicked App/Program ID - "agency_heist3b.ysc", line 71836: - if (CONTROLS::IS_CONTROL_JUST_PRESSED(2, 201) || CONTROLS::IS_CONTROL_JUST_PRESSED(2, 237)) { - GRAPHICS::_PUSH_SCALEFORM_MOVIE_FUNCTION(l_46, "SET_INPUT_EVENT_SELECT"); - l_45 = GRAPHICS::_POP_SCALEFORM_MOVIE_FUNCTION(); - } - if (GRAPHICS::_0x768FF8961BA904D6(l_45)) { - v_13 = GRAPHICS::_0x2DE7EFA66B906036(l_45); - if (v_13 == 6) { - sub_73269(a_0); - } - } - - - - - Needs a bit more research, but it seems to return an int. - Testing with the scaleform "HACKING_PC" it seems to return an int depending on the clicked App/Program ID - "agency_heist3b.ysc", line 71836: - if (CONTROLS::IS_CONTROL_JUST_PRESSED(2, 201) || CONTROLS::IS_CONTROL_JUST_PRESSED(2, 237)) { - GRAPHICS::_PUSH_SCALEFORM_MOVIE_FUNCTION(l_46, "SET_INPUT_EVENT_SELECT"); - l_45 = GRAPHICS::_POP_SCALEFORM_MOVIE_FUNCTION(); - } - if (GRAPHICS::_0x768FF8961BA904D6(l_45)) { - v_13 = GRAPHICS::_0x2DE7EFA66B906036(l_45); - if (v_13 == 6) { - sub_73269(a_0); - } - } - - - - - This returns the name of the scaleform movie. - - - - - This returns the name of the scaleform movie. - - - - - World to relative screen coords - this world to screen will keep the text on screen. it will keep it in the screen pos. good for a deer hunting mod - - - - - World to relative screen coords - this world to screen will keep the text on screen. it will keep it in the screen pos. good for a deer hunting mod - - - - - Convert a world coordinate into its relative screen coordinate. (WorldToScreen) - Returns a boolean; whether or not the operation was successful. It will return false if the coordinates given are not visible to the rendering camera. - For .NET users... - VB: - Public Shared Function World3DToScreen2d(pos as vector3) As Vector2 - Dim x2dp, y2dp As New Native.OutputArgument - Native.Function.Call(Of Boolean)(Native.Hash.GET_SCREEN_COORD_FROM_WORLD_COORD , pos.x, pos.y, pos.z, x2dp, y2dp) - Return New Vector2(x2dp.GetResult(Of Single), y2dp.GetResult(Of Single)) - End Function - C#: - Vector2 World3DToScreen2d(Vector3 pos) - { - var x2dp = new OutputArgument(); - var y2dp = new OutputArgument(); - Function.Call<bool>(Hash.GET_SCREEN_COORD_FROM_WORLD_COORD , pos.X, pos.Y, pos.Z, x2dp, y2dp); - return new Vector2(x2dp.GetResult<float>(), y2dp.GetResult<float>()); - } - //USE VERY SMALL VALUES FOR THE SCALE OF RECTS/TEXT because it is dramatically larger on screen than in 3D, e.g '0.05' small. - Used to be called _WORLD3D_TO_SCREEN2D - I thought we lost you from the scene forever. It does seem however that calling SET_DRAW_ORIGIN then your natives, then ending it. Seems to work better for certain things such as keeping boxes around people for a predator missile e.g. - - - - - Convert a world coordinate into its relative screen coordinate. (WorldToScreen) - Returns a boolean; whether or not the operation was successful. It will return false if the coordinates given are not visible to the rendering camera. - For .NET users... - VB: - Public Shared Function World3DToScreen2d(pos as vector3) As Vector2 - Dim x2dp, y2dp As New Native.OutputArgument - Native.Function.Call(Of Boolean)(Native.Hash.GET_SCREEN_COORD_FROM_WORLD_COORD , pos.x, pos.y, pos.z, x2dp, y2dp) - Return New Vector2(x2dp.GetResult(Of Single), y2dp.GetResult(Of Single)) - End Function - C#: - Vector2 World3DToScreen2d(Vector3 pos) - { - var x2dp = new OutputArgument(); - var y2dp = new OutputArgument(); - Function.Call<bool>(Hash.GET_SCREEN_COORD_FROM_WORLD_COORD , pos.X, pos.Y, pos.Z, x2dp, y2dp); - return new Vector2(x2dp.GetResult<float>(), y2dp.GetResult<float>()); - } - //USE VERY SMALL VALUES FOR THE SCALE OF RECTS/TEXT because it is dramatically larger on screen than in 3D, e.g '0.05' small. - Used to be called _WORLD3D_TO_SCREEN2D - I thought we lost you from the scene forever. It does seem however that calling SET_DRAW_ORIGIN then your natives, then ending it. Seems to work better for certain things such as keeping boxes around people for a predator missile e.g. - - - - - Returns whether the specified screen effect is active. - See the effects list in _START_SCREEN_EFFECT - Example and list of screen FX: www.pastebin.com/dafBAjs0 - - - - - int screenresx,screenresy; - GET_SCREEN_RESOLUTION(&screenresx,&screenresy); - Hardcoded to always return 1280 x 720 - - - - - Calculates the effective X/Y fractions when applying the values set by `SET_SCRIPT_GFX_ALIGN` and - `SET_SCRIPT_GFX_ALIGN_PARAMS`. - - The input X coordinate. - The input Y coordinate. - A pointer to the calculated X value. - A pointer to the calculated Y value. - - - - Calculates the effective X/Y fractions when applying the values set by `SET_SCRIPT_GFX_ALIGN` and - `SET_SCRIPT_GFX_ALIGN_PARAMS`. - - The input X coordinate. - The input Y coordinate. - A pointer to the calculated X value. - A pointer to the calculated Y value. - - - - Gets the status of a script-assigned task. The hash does not seem to match the actual native name, but is assigned hardcoded from the executable during task creation. - Statuses are specific to tasks, in addition '7' means the specified task is not assigned to the ped. - A few hashes found in the executable (although not a complete list) can be found at pastebin.com/R9iK6M9W as it was too long for this wiki. - - - - - Returns the hash of the weapon. - var num7 = WEAPON::GET_SELECTED_PED_WEAPON(num4); - sub_27D3(num7); - switch (num7) - { - case 0x24B17070: - Also see WEAPON::GET_CURRENT_PED_WEAPON. Difference? - ------------------------------------------------------------------------- - The difference is that GET_SELECTED_PED_WEAPON simply returns the ped's current weapon hash but GET_CURRENT_PED_WEAPON also checks the weapon object and returns true if the hash of the weapon object equals the weapon hash - - - - - returned values: - 0 to 7 = task that's currently in progress, 0 meaning the first one. - - - - - Parameters: - rayHandle - Ray Handle from a casted ray, as returned by CAST_RAY_POINT_TO_POINT - hit - Where to store whether or not it hit anything. False is when the ray reached its destination. - endCoords - Where to store the world-coords of where the ray was stopped (by hitting its desired max range or by colliding with an entity/the map) - surfaceNormal - Where to store the surface-normal coords (NOT relative to the game world) of where the entity was hit by the ray - entityHit - Where to store the handle of the entity hit by the ray - Returns: - Result? Some type of enum. - NOTE: To get the offset-coords of where the ray hit relative to the entity that it hit (which is NOT the same as surfaceNormal), you can use these two natives: - Vector3 offset = ENTITY::GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(entityHit, endCoords.x, endCoords.y, endCoords.z); - Vector3 entitySpotCoords = ENTITY::GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(entityHit, offset.x, offset.y, offset.z); - Use ENTITY::GET_ENTITY_TYPE(entityHit) to quickly distinguish what type of entity you hit (ped/vehicle/object - 1/2/3) - - - - - Parameters: - rayHandle - Ray Handle from a casted ray, as returned by CAST_RAY_POINT_TO_POINT - hit - Where to store whether or not it hit anything. False is when the ray reached its destination. - endCoords - Where to store the world-coords of where the ray was stopped (by hitting its desired max range or by colliding with an entity/the map) - surfaceNormal - Where to store the surface-normal coords (NOT relative to the game world) of where the entity was hit by the ray - entityHit - Where to store the handle of the entity hit by the ray - Returns: - Result? Some type of enum. - NOTE: To get the offset-coords of where the ray hit relative to the entity that it hit (which is NOT the same as surfaceNormal), you can use these two natives: - Vector3 offset = ENTITY::GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(entityHit, endCoords.x, endCoords.y, endCoords.z); - Vector3 entitySpotCoords = ENTITY::GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(entityHit, offset.x, offset.y, offset.z); - Use ENTITY::GET_ENTITY_TYPE(entityHit) to quickly distinguish what type of entity you hit (ped/vehicle/object - 1/2/3) - - - - - behaves exactly the same way as GET_SHAPE_TEST_RESULT except it has one extra parameter (_materialHash). - Quick disassembly seems to indicate that the unknown is a hash. EDIT: Seems to be the hash of the hit material or surface type. - found a materialFX.dat list of them but not sure if it has to do with this native yet. - materials (full list): pastebin.com/gyHjsYBK - - - - - behaves exactly the same way as GET_SHAPE_TEST_RESULT except it has one extra parameter (_materialHash). - Quick disassembly seems to indicate that the unknown is a hash. EDIT: Seems to be the hash of the hit material or surface type. - found a materialFX.dat list of them but not sure if it has to do with this native yet. - materials (full list): pastebin.com/gyHjsYBK - - - - - struct Outfit_s - { - int mask, torso, pants, parachute, shoes, misc1, tops1, armour, crew, tops2, hat, glasses, earpiece; - int maskTexture, torsoTexture, pantsTexture, parachuteTexture, shoesTexture, misc1Texture, tops1Texture, - armourTexture, crewTexture, tops2Texture, hatTexture, glassesTexture, earpieceTexture; - }; - - - - - locked is 0 if no door is found - locked is 0 if door is unlocked - locked is 1 if door is found and unlocked. - ------------- - the locked bool is either 0(unlocked)(false) or 1(locked)(true) - - - - - Determines the name of the street which is the closest to the given coordinates. - x,y,z - the coordinates of the street - streetName - returns a hash to the name of the street the coords are on - crossingRoad - if the coordinates are on an intersection, a hash to the name of the crossing road - Note: the names are returned as hashes, the strings can be returned using the function UI::GET_STREET_NAME_FROM_HASH_KEY. - - - - - This functions converts the hash of a street name into a readable string. - For how to get the hashes, see PATHFIND::GET_STREET_NAME_AT_COORD. - - - - - p0 = VEHICLE_NODE_ID - Returns false for nodes that aren't used for GPS routes. - Example: - Nodes in Fort Zancudo and LSIA are false - - - - - p0 = VEHICLE_NODE_ID - Returns false for nodes that aren't used for GPS routes. - Example: - Nodes in Fort Zancudo and LSIA are false - - - - - Character types: - ``` - 0 = Michael, - 1 = Franklin, - 2 = Trevor, - 3 = MPMale, - 4 = MPFemale - ``` - ```csharp - enum TattooZoneData - { - ZONE_TORSO = 0, - ZONE_HEAD = 1, - ZONE_LEFT_ARM = 2, - ZONE_RIGHT_ARM = 3, - ZONE_LEFT_LEG = 4, - ZONE_RIGHT_LEG = 5, - ZONE_UNKNOWN = 6, - ZONE_NONE = 7, - }; - struct outComponent - { - // these vars are suffixed with 4 bytes of padding each. - uint unk; - int unk2; - uint tattooCollectionHash; - uint tattooNameHash; - int unk3; - TattooZoneData zoneId; - uint unk4; - uint unk5; - // maybe more, not sure exactly, decompiled scripts are very vague around this part. - } - ``` - - Character types 0 = Michael, 1 = Franklin, 2 = Trevor, 3 = MPMale, 4 = MPFemale. - Tattoo index, value between 0 and GetNumDecorations(characterType). - The referenced struct. - A bool indicating that the tattoo data could be fetched(?) - - - - Character types: - ``` - 0 = Michael, - 1 = Franklin, - 2 = Trevor, - 3 = MPMale, - 4 = MPFemale - ``` - ```csharp - enum TattooZoneData - { - ZONE_TORSO = 0, - ZONE_HEAD = 1, - ZONE_LEFT_ARM = 2, - ZONE_RIGHT_ARM = 3, - ZONE_LEFT_LEG = 4, - ZONE_RIGHT_LEG = 5, - ZONE_UNKNOWN = 6, - ZONE_NONE = 7, - }; - struct outComponent - { - // these vars are suffixed with 4 bytes of padding each. - uint unk; - int unk2; - uint tattooCollectionHash; - uint tattooNameHash; - int unk3; - TattooZoneData zoneId; - uint unk4; - uint unk5; - // maybe more, not sure exactly, decompiled scripts are very vague around this part. - } - ``` - - Character types 0 = Michael, 1 = Franklin, 2 = Trevor, 3 = MPMale, 4 = MPFemale. - Tattoo index, value between 0 and GetNumDecorations(characterType). - The referenced struct. - A bool indicating that the tattoo data could be fetched(?) - - - - Returns the zoneID for the overlay if it is a member of collection. - enum TattooZoneData - { - ZONE_TORSO = 0, - ZONE_HEAD = 1, - ZONE_LEFT_ARM = 2, - ZONE_RIGHT_ARM = 3, - ZONE_LEFT_LEG = 4, - ZONE_RIGHT_LEG = 5, - ZONE_UNKNOWN = 6, - ZONE_NONE = 7, - }; - - - - - This get's the height of the FONT and not the total text. You need to get the number of lines your text uses, and get the height of a newline (I'm using a smaller value) to get the total text height. - - - - - This get's the height of the FONT and not the total text. You need to get the number of lines your text uses, and get the height of a newline (I'm using a smaller value) to get the total text height. - - - - - Determines how many lines the text string will use when drawn on screen. - Must use _BEGIN_TEXT_COMMAND_LINE_COUNT for setting up - - - - - Determines how many lines the text string will use when drawn on screen. - Must use _BEGIN_TEXT_COMMAND_LINE_COUNT for setting up - - - - - Determines how many lines the text string will use when drawn on screen. - Must use _BEGIN_TEXT_COMMAND_LINE_COUNT for setting up - - - - - Returns a substring of a specified length starting at a specified position. - Example: - // Get "STRING" text from "MY_STRING" - subStr = UI::_GET_TEXT_SUBSTRING("MY_STRING", 3, 6); - - - - - Returns a substring of a specified length starting at a specified position. The result is guaranteed not to exceed the specified max length. - NOTE: The 'maxLength' parameter might actually be the size of the buffer that is returned. More research is needed. -CL69 - Example: - // Condensed example of how Rockstar uses this function - strLen = UI::GET_LENGTH_OF_LITERAL_STRING(GAMEPLAY::GET_ONSCREEN_KEYBOARD_RESULT()); - subStr = UI::_GET_TEXT_SUBSTRING_SAFE(GAMEPLAY::GET_ONSCREEN_KEYBOARD_RESULT(), 0, strLen, 63); - -- - "fm_race_creator.ysc", line 85115: - // parameters modified for clarity - BOOL sub_8e5aa(char *text, int length) { - for (i = 0; i <= (length - 2); i += 1) { - if (!GAMEPLAY::ARE_STRINGS_EQUAL(UI::_GET_TEXT_SUBSTRING_SAFE(text, i, i + 1, 1), " ")) { - return FALSE; - } - } - return TRUE; - } - - - - - Returns a substring that is between two specified positions. The length of the string will be calculated using (endPosition - startPosition). - Example: - // Get "STRING" text from "MY_STRING" - subStr = UI::_GET_TEXT_SUBSTRING_SLICE("MY_STRING", 3, 9); - // Overflows are possibly replaced with underscores (needs verification) - subStr = UI::_GET_TEXT_SUBSTRING_SLICE("MY_STRING", 3, 10); // "STRING_"? - - - - - Returns the texture resolution of the passed texture dict+name. - Note: Most texture resolutions are doubled compared to the console version of the game. - - - - - Previously named, '_FORMAT_TIME' for people who can't find it's uses in decompiled scripts. - - - - - Previously named, '_FORMAT_TIME' for people who can't find it's uses in decompiled scripts. - - - - - Subtracts the second argument from the first. - - - - - Adds the first argument to the second. - - - - - Returns the time since the character was arrested in (ms) milliseconds. - example - var time = Function.call<int>(Hash.GET_TIME_SINCE_LAST_ARREST(); - UI.DrawSubtitle(time.ToString()); - if player has not been arrested, the int returned will be -1. - - - - - Returns the time since the character died in (ms) milliseconds. - example - var time = Function.call<int>(Hash.GET_TIME_SINCE_LAST_DEATH(); - UI.DrawSubtitle(time.ToString()); - if player has not died, the int returned will be -1. - - - - - Only use for this in the PC scripts is: - if (GRAPHICS::GET_TIMECYCLE_MODIFIER_INDEX() != -1) - For a full list, see here: pastebin.com/cnk7FTF2 - can someone update this pastebin??? - - - - - Corrected p1. it's basically the 'carriage/trailer number'. So if the train has 3 trailers you'd call the native once with a var or 3 times with 1, 2, 3. - - - - - Return the content modifier id (the tunables context if you want) of a specific content. - It takes the content hash (which is the mission id hash), and return the content modifier id, used as the tunables context. - The mission id can be found on the Social club, for example, 'socialclub.rockstargames.com/games/gtav/jobs/job/A8M6Bz8MLEC5xngvDCzGwA' - 'A8M6Bz8MLEC5xngvDCzGwA' is the mission id, so the game hash this and use it as the parameter for this native. - - - - - Return the content modifier id (the tunables context if you want) of a specific content. - It takes the content hash (which is the mission id hash), and return the content modifier id, used as the tunables context. - The mission id can be found on the Social club, for example, 'socialclub.rockstargames.com/games/gtav/jobs/job/A8M6Bz8MLEC5xngvDCzGwA' - 'A8M6Bz8MLEC5xngvDCzGwA' is the mission id, so the game hash this and use it as the parameter for this native. - - - - - Returns the user's defined langauge as ID - english: 12 - french = 7 - german = 22 - italian = 21 - japanese = 9 - korean = 17 - portuguese = 16 - spanish = 10 - russian = 25 - - - - - console hash: 0xC589CD7D = GET_UTC_TIME - gets current UTC time - - - - - console hash: 0xC589CD7D = GET_UTC_TIME - gets current UTC time - - - - - static - max acceleration - - - - - Returns attached vehicle (Vehicle in parameter must be cargobob) - - - - - Get the vehicle attached to the object/entity? May also just convert it to a vehicle, but I'm not sure. - - - - - Get the vehicle attached to the object/entity? May also just convert it to a vehicle, but I'm not sure. - - - - - Seems related to vehicle health, like the one in IV. - Max 1000, min 0. - Vehicle does not necessarily explode or become undrivable at 0. - - - - - 0 min 100 max - starts at 100 - Seams to have health zones - Front of vehicle when damaged goes from 100-50 and stops at 50. - Rear can be damaged from 100-0 - Only tested with two cars. - any idea how this differs from the first one? - -- - May return the vehicle health on a scale of 0.0 - 100.0 (needs to be confirmed) - example: - v_F = ENTITY::GET_ENTITY_MODEL(v_3); - if (((v_F == ${tanker}) || (v_F == ${armytanker})) || (v_F == ${tanker2})) { - if (VEHICLE::_GET_VEHICLE_BODY_HEALTH_2(v_3) <= 1.0) { - NETWORK::NETWORK_EXPLODE_VEHICLE(v_3, 1, 1, -1); - } - } - - - - - iVar3 = get_vehicle_cause_of_destruction(uLocal_248[iVar2]); - if (iVar3 == joaat("weapon_stickybomb")) - { - func_171(726); - iLocal_260 = 1; - } - - - - - Returns an int - Vehicle Classes: - 0: Compacts - 1: Sedans - 2: SUVs - 3: Coupes - 4: Muscle - 5: Sports Classics - 6: Sports - 7: Super - 8: Motorcycles - 9: Off-road - 10: Industrial - 11: Utility - 12: Vans - 13: Cycles - 14: Boats - 15: Helicopters - 16: Planes - 17: Service - 18: Emergency - 19: Military - 20: Commercial - 21: Trains - char buffer[128]; - std::sprintf(buffer, "VEH_CLASS_%i", VEHICLE::GET_VEHICLE_CLASS(vehicle)); - char* className = UI::_GET_LABEL_TEXT(buffer); - - - - - For a full enum, see here : pastebin.com/i2GGAjY0 - char buffer[128]; - std::sprintf(buffer, "VEH_CLASS_%i", VEHICLE::GET_VEHICLE_CLASS_FROM_NAME (hash)); - char* className = UI::_GET_LABEL_TEXT(buffer); - - - - - GET_VEHICLE_CLASS_MAX_* - - - - - GET_VEHICLE_CLASS_MAX_* - - - - - What's this for? Primary and Secondary RGB have their own natives and this one doesn't seem specific. - - - - - Returns hash of default vehicle horn - Hash is stored in audVehicleAudioEntity - - - - - The only example I can find of this function in the scripts, is this: - struct _s = VEHICLE::GET_VEHICLE_DEFORMATION_AT_POS(rPtr((A_0) + 4), 1.21f, 6.15f, 0.3f); - ----------------------------------------------------------------------------------------------------------------------------------------- - PC scripts: - v_5 -- [[{3}]] = VEHICLE::GET_VEHICLE_DEFORMATION_AT_POS(a_0._f1, 1.21, 6.15, 0.3); - - - - - Dirt level 0..15 - - - - - example in vb: - Public Shared Function Get_Vehicle_Door_Angle(Vehicle As Vehicle, Door As VehicleDoor) As Single - Return Native.Function.Call(Of Single)(Hash.GET_VEHICLE_DOOR_ANGLE_RATIO, Vehicle.Handle, Door) - End Function - I'm Not MentaL - - - - - 2 seems to disable getting vehicle in modshop - - - - - Returns 1000.0 if the function is unable to get the address of the specified vehicle or if it's not a vehicle. - Minimum: -4000 - Maximum: 1000 - -4000: Engine is destroyed - 0 and below: Engine catches fire and health rapidly declines - 300: Engine is smoking and losing functionality - 1000: Engine is perfect - - - - - formerly known as _GET_VEHICLE_PAINT_FADE - The result is a value from 0-1, where 0 is fresh paint. - ----------------------------------------------------------------------- - The actual value isn't stored as a float but as an unsigned char (BYTE). - - - - - formerly known as _GET_VEHICLE_PAINT_FADE - The result is a value from 0-1, where 0 is fresh paint. - ----------------------------------------------------------------------- - The actual value isn't stored as a float but as an unsigned char (BYTE). - - - - - Returns the effective handling data of a vehicle as a floating-point value. - Example: `local fSteeringLock = GetVehicleHandlingFloat(vehicle, 'CHandlingData', 'fSteeringLock')` - - The vehicle to obtain data for. - The handling class to get. Only "CHandlingData" is supported at this time. - The field name to get. These match the keys in `handling.meta`. - A floating-point value. - - - - Returns the effective handling data of a vehicle as an integer value. - Example: `local modelFlags = GetVehicleHandlingInt(vehicle, 'CHandlingData', 'strModelFlags')` - - The vehicle to obtain data for. - The handling class to get. Only "CHandlingData" is supported at this time. - The field name to get. These match the keys in `handling.meta`. - An integer. - - - - Returns the effective handling data of a vehicle as a vector value. - Example: `local inertiaMultiplier = GetVehicleHandlingVector(vehicle, 'CHandlingData', 'vecInertiaMultiplier')` - - The vehicle to obtain data for. - The handling class to get. Only "CHandlingData" is supported at this time. - The field name to get. These match the keys in `handling.meta`. - An integer. - - - - Returns the headlight color index from the vehicle. Value between 0, 12. - Use [\_SET_VEHICLE_HEADLIGHTS_COLOUR](#_0xE41033B25D003A07) to set the headlights color for the vehicle. - Must enable xenon headlights before it'll take affect. - List of colors and ids: - ``` - enum headlightColors { - Default = -1, - White = 0, - Blue = 1, - Electric_Blue = 2, - Mint_Green = 3, - Lime_Green = 4, - Yellow = 5, - Golden_Shower = 6, - Orange = 7, - Red = 8, - Pony_Pink = 9, - Hot_Pink = 10, - Purple = 11, - Blacklight = 12 - } - ``` - - The vehicle to get the headlight color from. - Returns an int, value between 0-12 or 255 if no color is set. - - - - Returns the headlight color index from the vehicle. Value between 0, 12. - Use [\_SET_VEHICLE_HEADLIGHTS_COLOUR](#_0xE41033B25D003A07) to set the headlights color for the vehicle. - Must enable xenon headlights before it'll take affect. - List of colors and ids: - ``` - enum headlightColors { - Default = -1, - White = 0, - Blue = 1, - Electric_Blue = 2, - Mint_Green = 3, - Lime_Green = 4, - Yellow = 5, - Golden_Shower = 6, - Orange = 7, - Red = 8, - Pony_Pink = 9, - Hot_Pink = 10, - Purple = 11, - Blacklight = 12 - } - ``` - - The vehicle to get the headlight color from. - Returns an int, value between 0-12 or 255 if no color is set. - - - - Seems to get the hash of the vehicle's currently installed horn? - - - - - Seems to get the hash of the vehicle's currently installed horn? - - - - - A float indicating the percentage of the hover mode. 1.0 = in VTOL mode, 0.0 = in normal flying mode. - - The vehicle to check the hover mode on. - A float indicating the percentage of the hover mode. 1.0 = in VTOL mode, 0.0 = in normal flying mode. - - - - A float indicating the percentage of the hover mode. 1.0 = in VTOL mode, 0.0 = in normal flying mode. - - The vehicle to check the hover mode on. - A float indicating the percentage of the hover mode. 1.0 = in VTOL mode, 0.0 = in normal flying mode. - - - - A float indicating the percentage of the hover mode. 1.0 = in VTOL mode, 0.0 = in normal flying mode. - - The vehicle to check the hover mode on. - A float indicating the percentage of the hover mode. 1.0 = in VTOL mode, 0.0 = in normal flying mode. - - - - Simply returns whatever is passed to it (Regardless of whether the handle is valid or not). - - - - - Gets the vehicle indicator light state. 0 = off, 1 = left, 2 = right, 3 = both - - An integer. - - - - -1 = no livery - - - - - Returns -1 if the vehicle has no livery - - - - - In b944, there are 50 (0 - 49) mod types. - Returns -1 if the vehicle mod is stock - - - - - p3 seems to be the pearlescent highlight color. - Seems redondant with void GET_VEHICLE_EXTRA_COLOURS(Vehicle vehicle, int *pearlescentColor, int *wheelColor) - - - - - returns a string which is the codename of the vehicle's currently selected primary color - p1 is always 0 - - - - - returns a string which is the codename of the vehicle's currently selected primary color - p1 is always 0 - - - - - returns a string which is the codename of the vehicle's currently selected secondary color - - - - - returns a string which is the codename of the vehicle's currently selected secondary color - - - - - Can be used for IS_DLC_VEHICLE_MOD and _0xC098810437312FFF - - - - - Can be used for IS_DLC_VEHICLE_MOD and _0xC098810437312FFF - - - - - Returns true if the wheels are custom wheels - - - - - Returns the acceleration of the specified model. - For a full list, see here: pastebin.com/GaN6vT4R - - - - - GET_VEHICLE_MODEL_* - 9.8 * thrust if air vehicle, else 0.38 + drive force? - For a full list, see here: pastebin.com/bJQeDqNd - - - - - GET_VEHICLE_MODEL_* - 9.8 * thrust if air vehicle, else 0.38 + drive force? - For a full list, see here: pastebin.com/bJQeDqNd - - - - - GET_VEHICLE_MODEL_MAX_* - max braking if air vehicle, else max braking + 0.1 - ------------------- - For a full list, see here: pastebin.com/Cb9L1Cn0 - - - - - GET_VEHICLE_MODEL_MAX_* - max braking if air vehicle, else max braking + 0.1 - ------------------- - For a full list, see here: pastebin.com/Cb9L1Cn0 - - - - - Returns max braking of the specified vehicle model. - For a full list, see here: pastebin.com/3N8DVbpG - - - - - GET_VEHICLE_MODEL_* - Function pertains only to aviation vehicles. - For a full list, see here: pastebin.com/JwuGNp2K - - - - - GET_VEHICLE_MODEL_* - Function pertains only to aviation vehicles. - For a full list, see here: pastebin.com/JwuGNp2K - - - - - Returns max speed (without mods) of the specified vehicle model in m/s. - For a full list, see here: pastebin.com/AUuHHK06 - GET_VEHICLE_MODEL_* - - - - - Returns max traction of the specified vehicle model. - For a full list, see here: pastebin.com/ERnntVjK - - - - - GET_VEHICLE_MODEL_* - called if the vehicle is a boat -- returns vecMoveResistanceX? - For a full list, see here: pastebin.com/Pyb2RhZ9 - - - - - GET_VEHICLE_MODEL_* - called if the vehicle is a boat -- returns vecMoveResistanceX? - For a full list, see here: pastebin.com/Pyb2RhZ9 - - - - - Returns max number of passengers (including the driver) for the specified vehicle model. - For a full list, see here: pastebin.com/MdETCS1j - - - - - Returns max number of passengers (including the driver) for the specified vehicle model. - For a full list, see here: pastebin.com/MdETCS1j - - - - - Gets the color of the neon lights of the specified vehicle. - See _SET_VEHICLE_NEON_LIGHTS_COLOUR (0x8E0A582209A62695) for more information - - - - - Calling this with an invalid node id, will crash the game. - Note that IS_VEHICLE_NODE_ID_VALID simply checks if nodeId is not zero. It does not actually ensure that the id is valid. - Eg. IS_VEHICLE_NODE_ID_VALID(1) will return true, but will crash when calling GET_VEHICLE_NODE_POSITION(). - sfink: This native returns a pointer to a packed Vector3 struct in the RAX register, as do the following natives: - AI::WAYPOINT_RECORDING_GET_COORD - ENTITY::GET_ENTITY_MATRIX - FIRE::GET_CLOSEST_FIRE_POS - GAMEPLAY::FIND_SPAWN_POINT_IN_DIRECTION - GAMEPLAY::GET_MODEL_DIMENSIONS - GAMEPLAY::OVERRIDE_SAVE_HOUSE - GAMEPLAY::_0x82FDE6A57EE4EE44 - GAMEPLAY::_0x8BDC7BFC57A81E76 - GAMEPLAY::_0x8D7A43EC6A5FEA45 - GAMEPLAY::_0xA4A0065E39C9F25C - GAMEPLAY::_0xDFB4138EEFED7B81 - MOBILE::GET_MOBILE_PHONE_POSITION - MOBILE::GET_MOBILE_PHONE_ROTATION - NETWORK::NETWORK_GET_RESPAWN_RESULT - OBJECT::_0x163F8B586BC95F2A - PATHFIND::GET_CLOSEST_MAJOR_VEHICLE_NODE - PATHFIND::GET_CLOSEST_ROAD - PATHFIND::GET_CLOSEST_VEHICLE_NODE - PATHFIND::GET_CLOSEST_VEHICLE_NODE_WITH_HEADING - PATHFIND::GET_NTH_CLOSEST_VEHICLE_NODE - PATHFIND::GET_NTH_CLOSEST_VEHICLE_NODE_FAVOUR_DIRECTION - PATHFIND::GET_NTH_CLOSEST_VEHICLE_NODE_WITH_HEADING - PATHFIND::GET_RANDOM_VEHICLE_NODE - PATHFIND::GET_SAFE_COORD_FOR_PED - PATHFIND::GET_VEHICLE_NODE_POSITION - PATHFIND::_0x16F46FB18C8009E4 - VEHICLE::_0xA4822F1CF23F4810 - VEHICLE::_0xDF7E3EEB29642C38 - WATER::TEST_PROBE_AGAINST_ALL_WATER - WATER::TEST_PROBE_AGAINST_WATER - WEAPON::GET_PED_LAST_WEAPON_IMPACT_COORD - WORLDPROBE::_0xFF6BE494C7987F34 - WORLDPROBE::_GET_RAYCAST_RESULT - - - - - MulleDK19: Gets the density and flags of the closest node to the specified position. - Density is a value between 0 and 15, indicating how busy the road is. - Flags is a bit field. - - - - - Gets the number of passengers, NOT including the driver. Use IS_VEHICLE_SEAT_FREE(Vehicle, -1) to also check for the driver - - - - - Returns the license plate text from a vehicle. 8 chars maximum. - - - - - Returns the PlateType of a vehicle - Blue_on_White_1 = 3, - Blue_on_White_2 = 0, - Blue_on_White_3 = 4, - Yellow_on_Blue = 2, - Yellow_on_Black = 1, - North_Yankton = 5, - - - - - The resulting entity can be a Vehicle or Ped. - The native is stored between GET_VEHICLE_LIVERY_COUNT and GET_VEHICLE_MAX_BRAKING so the actual name is either GET_VEHICLE_L* or GET_VEHICLE_M* - ========================= - on a side note watching changes in memory this will only store your ped's entityPoolAddress if it's your personal vehicle. So seems to be related to personal vehicles or atleast a specific decor of it maybe. - - - - - Gets the vehicle the specified Ped is/was in depending on bool value. - [False = CurrentVehicle, True = LastVehicle] - - - - - Should be renamed GET_CAR_PED_IS_TRYING_TO_ENTER... - Because this works only for cars, not for helis, planes,motorcycles or bicycles... - From Calderon - This is what R* named it, deal with it. - - - - - Gets ID of vehicle player using. It means it can get ID at any interaction with vehicle. Enter\exit for example. And that means it is faster than GET_VEHICLE_PED_IS_IN but less safe. - - - - - 1000 is max health - Begins leaking gas at around 650 health - - - - - Gets the height of the vehicle's suspension. - The higher the value the lower the suspension. Each 0.002 corresponds with one more level lowered. - 0.000 is the stock suspension. - 0.008 is Ultra Suspension. - - - - - Gets the trailer of a vehicle and puts it into the trailer parameter. - - - - - Gets speed of a wheel at the tyre. - Max number of wheels can be retrieved with the native GET_VEHICLE_NUMBER_OF_WHEELS. - - An integer. - - - - Returns an int - Wheel Types: - 0: Sport - 1: Muscle - 2: Lowrider - 3: SUV - 4: Offroad - 5: Tuner - 6: Bike Wheels - 7: High End - Tested in Los Santos Customs - - - - - Returns the offset of the specified wheel relative to the wheel's axle center. - - - - - List of known states: - ``` - 1: Not wheeling. - 65: Vehicle is ready to do wheelie (burnouting). - 129: Vehicle is doing wheelie. - ``` - - Vehicle - Vehicle's current wheelie state. - - - - Remnant from GTA IV. Does nothing in GTA V. - - - - - Drft - - - - - This function set height to the value of z-axis of the water surface. - This function works with sea and lake. However it does not work with shallow rivers (e.g. raton canyon will return -100000.0f) - note: seems to return true when you are in water - - - - - // Returns the size of the default weapon component clip. - Use it like this: - char cClipSize[32]; - Hash cur; - if (WEAPON::GET_CURRENT_PED_WEAPON(playerPed, &cur, 1)) - { - if (WEAPON::IS_WEAPON_VALID(cur)) - { - int iClipSize = WEAPON::GET_WEAPON_CLIP_SIZE(cur); - sprintf_s(cClipSize, "ClipSize: %.d", iClipSize); - vDrawString(cClipSize, 0.5f, 0.5f); - } - } - - - - - This native does not return damages of weapons from the melee and explosive group. - - 0 in the decompiled scripts. - Damages of the weapon. - - - - This native does not return damages of weapons from the melee and explosive group. - - 0 in the decompiled scripts. - Damages of the weapon. - - - - 0=unknown (or incorrect weaponHash) - 1= no damage (flare,snowball, petrolcan) - 2=melee - 3=bullet - 4=force ragdoll fall - 5=explosive (RPG, Railgun, grenade) - 6=fire(molotov) - 8=fall(WEAPON_HELI_CRASH) - 10=electric - 11=barbed wire - 12=extinguisher - 13=gas - 14=water cannon(WEAPON_HIT_BY_WATER_CANNON) - - - - - returns the weapon hash of pickup - - - - - returns the weapon hash of pickup - - - - - // members should be aligned to 8 bytes by default but it's best to use alignas here, just to be sure - struct WeaponHudStatsData - { - alignas(8) uint8_t hudDamage; // 0x0000 - alignas(8) uint8_t hudSpeed; // 0x0008 - alignas(8) uint8_t hudCapacity; // 0x0010 - alignas(8) uint8_t hudAccuracy; // 0x0018 - alignas(8) uint8_t hudRange; // 0x0020 - }; - Usage: - WeaponHudStatsData data; - if (GET_WEAPON_HUD_STATS(weaponHash, (Any*)&data)) - { - // uint8_t damagePercentage = data.hudDamage etc... - } - - - - - Drops the current weapon and returns the object - Unknown behavior when unarmed. - - - - - Returns the model of any weapon. - Can also take an ammo hash? - sub_6663a(&l_115B, WEAPON::GET_WEAPONTYPE_MODEL(${ammo_rpg})); - - - - - changed any --> hash - progress_or_time --> percentWeather2, is not time but percent of the 2nd weather (0-1). - weatherType1 is same as GAMEPLAY::GET_PREV_WEATHER_TYPE_HASH_NAME() - and weatherType 2 GAMEPLAY::GET_NEXT_WEATHER_TYPE_HASH_NAME() - -QuantFC - - - - - Returns the coordinates of an entity-bone. - - - - - 'zoneName' corresponds to an entry in 'popzone.ipl'. - AIRP = Los Santos International Airport - ALAMO = Alamo Sea - ALTA = Alta - ARMYB = Fort Zancudo - BANHAMC = Banham Canyon Dr - BANNING = Banning - BEACH = Vespucci Beach - BHAMCA = Banham Canyon - BRADP = Braddock Pass - BRADT = Braddock Tunnel - BURTON = Burton - CALAFB = Calafia Bridge - CANNY = Raton Canyon - CCREAK = Cassidy Creek - CHAMH = Chamberlain Hills - CHIL = Vinewood Hills - CHU = Chumash - CMSW = Chiliad Mountain State Wilderness - CYPRE = Cypress Flats - DAVIS = Davis - DELBE = Del Perro Beach - DELPE = Del Perro - DELSOL = La Puerta - DESRT = Grand Senora Desert - DOWNT = Downtown - DTVINE = Downtown Vinewood - EAST_V = East Vinewood - EBURO = El Burro Heights - ELGORL = El Gordo Lighthouse - ELYSIAN = Elysian Island - GALFISH = Galilee - GOLF = GWC and Golfing Society - GRAPES = Grapeseed - GREATC = Great Chaparral - HARMO = Harmony - HAWICK = Hawick - HORS = Vinewood Racetrack - HUMLAB = Humane Labs and Research - JAIL = Bolingbroke Penitentiary - KOREAT = Little Seoul - LACT = Land Act Reservoir - LAGO = Lago Zancudo - LDAM = Land Act Dam - LEGSQU = Legion Square - LMESA = La Mesa - LOSPUER = La Puerta - MIRR = Mirror Park - MORN = Morningwood - MOVIE = Richards Majestic - MTCHIL = Mount Chiliad - MTGORDO = Mount Gordo - MTJOSE = Mount Josiah - MURRI = Murrieta Heights - NCHU = North Chumash - NOOSE = N.O.O.S.E - OCEANA = Pacific Ocean - PALCOV = Paleto Cove - PALETO = Paleto Bay - PALFOR = Paleto Forest - PALHIGH = Palomino Highlands - PALMPOW = Palmer-Taylor Power Station - PBLUFF = Pacific Bluffs - PBOX = Pillbox Hill - PROCOB = Procopio Beach - RANCHO = Rancho - RGLEN = Richman Glen - RICHM = Richman - ROCKF = Rockford Hills - RTRAK = Redwood Lights Track - SANAND = San Andreas - SANCHIA = San Chianski Mountain Range - SANDY = Sandy Shores - SKID = Mission Row - SLAB = Stab City - STAD = Maze Bank Arena - STRAW = Strawberry - TATAMO = Tataviam Mountains - TERMINA = Terminal - TEXTI = Textile City - TONGVAH = Tongva Hills - TONGVAV = Tongva Valley - VCANA = Vespucci Canals - VESP = Vespucci - VINE = Vinewood - WINDF = Ron Alternates Wind Farm - WVINE = West Vinewood - ZANCUDO = Zancudo River - ZP_ORT = Port of South Los Santos - ZQ_UAR = Davis Quartz - - - - - cellphone range 1- 5 used for signal bar in iFruit phone - - - - - Achievements from 0-57 - more achievements came with update 1.29 (freemode events update), I'd say that they now go to 60, but I'll need to check. - - - - - Gives a weapon to PED with a delay, example: - WEAPON::GIVE_DELAYED_WEAPON_TO_PED(PED::PLAYER_PED_ID(), GAMEPLAY::GET_HASH_KEY("WEAPON_PISTOL"), 1000, false) - ---------------------------------------------------------------------------------------------------------------------------------------- - Translation table: - pastebin.com/a39K8Nz8 - - - - - PoliceMotorcycleHelmet 1024 - RegularMotorcycleHelmet 4096 - FiremanHelmet 16384 - PilotHeadset 32768 - PilotHelmet 65536 - -- - p2 is generally 4096 or 16384 in the scripts. p1 varies between 1 and 0. - - - - - Sends the message that was created by a call to CREATE_NM_MESSAGE to the specified Ped. - If a message hasn't been created already, this function does nothing. - If the Ped is not ragdolled with Euphoria enabled, this function does nothing. - The following call can be used to ragdoll the Ped with Euphoria enabled: SET_PED_TO_RAGDOLL(ped, 4000, 5000, 1, 1, 1, 0); - Call order: - SET_PED_TO_RAGDOLL - CREATE_NM_MESSAGE - GIVE_PED_NM_MESSAGE - Multiple messages can be chained. Eg. to make the ped stagger and swing his arms around, the following calls can be made: - SET_PED_TO_RAGDOLL(ped, 4000, 5000, 1, 1, 1, 0); - CREATE_NM_MESSAGE(true, 0); // stopAllBehaviours - Stop all other behaviours, in case the Ped is already doing some Euphoria stuff. - GIVE_PED_NM_MESSAGE(ped); // Dispatch message to Ped. - CREATE_NM_MESSAGE(true, 1151); // staggerFall - Attempt to walk while falling. - GIVE_PED_NM_MESSAGE(ped); // Dispatch message to Ped. - CREATE_NM_MESSAGE(true, 372); // armsWindmill - Swing arms around. - GIVE_PED_NM_MESSAGE(ped); // Dispatch message to Ped. - - - - - p1 is either 1 or 2 in the PC scripts. - - - - - addonHash: - (use WEAPON::GET_WEAPON_COMPONENT_TYPE_MODEL() to get hash value) - ^ Wrong. - AddonHash is NOT a model hash, it's the weapon component hash. - ${component_at_ar_flsh}, ${component_at_ar_supp}, ${component_at_pi_flsh}, ${component_at_scope_large}, ${component_at_ar_supp_02} - - - - - isHidden - ???? - All weapon names (add to the list if something is missing), use GAMEPLAY::GET_HASH_KEY((char *)weaponNames[i]) to get get the hash: - static LPCSTR weaponNames[] = { - "WEAPON_KNIFE", "WEAPON_NIGHTSTICK", "WEAPON_HAMMER", "WEAPON_BAT", "WEAPON_GOLFCLUB", - "WEAPON_CROWBAR", "WEAPON_PISTOL", "WEAPON_COMBATPISTOL", "WEAPON_APPISTOL", "WEAPON_PISTOL50", - "WEAPON_MICROSMG", "WEAPON_SMG", "WEAPON_ASSAULTSMG", "WEAPON_ASSAULTRIFLE", - "WEAPON_CARBINERIFLE", "WEAPON_ADVANCEDRIFLE", "WEAPON_MG", "WEAPON_COMBATMG", "WEAPON_PUMPSHOTGUN", - "WEAPON_SAWNOFFSHOTGUN", "WEAPON_ASSAULTSHOTGUN", "WEAPON_BULLPUPSHOTGUN", "WEAPON_STUNGUN", "WEAPON_SNIPERRIFLE", - "WEAPON_HEAVYSNIPER", "WEAPON_GRENADELAUNCHER", "WEAPON_GRENADELAUNCHER_SMOKE", "WEAPON_RPG", "WEAPON_MINIGUN", - "WEAPON_GRENADE", "WEAPON_STICKYBOMB", "WEAPON_SMOKEGRENADE", "WEAPON_BZGAS", "WEAPON_MOLOTOV", - "WEAPON_FIREEXTINGUISHER", "WEAPON_PETROLCAN", "WEAPON_FLARE", "WEAPON_SNSPISTOL", "WEAPON_SPECIALCARBINE", - "WEAPON_HEAVYPISTOL", "WEAPON_BULLPUPRIFLE", "WEAPON_HOMINGLAUNCHER", "WEAPON_PROXMINE", "WEAPON_SNOWBALL", - "WEAPON_VINTAGEPISTOL", "WEAPON_DAGGER", "WEAPON_FIREWORK", "WEAPON_MUSKET", "WEAPON_MARKSMANRIFLE", - "WEAPON_HEAVYSHOTGUN", "WEAPON_GUSENBERG", "WEAPON_HATCHET", "WEAPON_RAILGUN", "WEAPON_COMBATPDW", - "WEAPON_KNUCKLE", "WEAPON_MARKSMANPISTOL", "WEAPON_FLASHLIGHT", "WEAPON_MACHETE", "WEAPON_MACHINEPISTOL", - "WEAPON_SWITCHBLADE", "WEAPON_REVOLVER", "WEAPON_COMPACTRIFLE", "WEAPON_DBSHOTGUN", "WEAPON_FLAREGUN", - "WEAPON_AUTOSHOTGUN", "WEAPON_BATTLEAXE", "WEAPON_COMPACTLAUNCHER", "WEAPON_MINISMG", "WEAPON_PIPEBOMB", - "WEAPON_POOLCUE", "WEAPON_SWEEPER", "WEAPON_WRENCH" - }; - ---------------------------------------------------------------------------------------------------------------------------------------- - Translation table: - pastebin.com/a39K8Nz8 - - - - - if (ENTITY::HAS_ANIM_EVENT_FIRED(PLAYER::PLAYER_PED_ID(), GAMEPLAY::GET_HASH_KEY("CreateObject"))) - - - - - Gets whether the specified animation set has finished loading. An animation set provides movement animations for a ped. See SET_PED_MOVEMENT_CLIPSET. - Animation set and clip set are synonymous. - - - - - Console Hash - - - - - Console Hash - - - - - p3 - possibly radius? - - - - - This native appears on the cheat_controller script and tracks a combination of buttons, which may be used to toggle cheats in-game. Credits to ThreeSocks for the info. The hash contains the combination, while the "amount" represents the amount of buttons used in a combination. The following page can be used to make a button combination: gta5offset.com/ts/hash/ - INT_SCORES_SCORTED was a hash collision - - - - - This native appears on the cheat_controller script and tracks a combination of buttons, which may be used to toggle cheats in-game. Credits to ThreeSocks for the info. The hash contains the combination, while the "amount" represents the amount of buttons used in a combination. The following page can be used to make a button combination: gta5offset.com/ts/hash/ - INT_SCORES_SCORTED was a hash collision - - - - - Get inputted "Cheat code", for example: - while (TRUE) - { - if (GAMEPLAY::_557E43C447E700A8(${fugitive})) - { - // Do something. - } - SYSTEM::WAIT(0); - } - Calling this will also set the last saved string hash to zero. - - - - - Get inputted "Cheat code", for example: - while (TRUE) - { - if (GAMEPLAY::_557E43C447E700A8(${fugitive})) - { - // Do something. - } - SYSTEM::WAIT(0); - } - Calling this will also set the last saved string hash to zero. - - - - - Alias for HAS_ANIM_SET_LOADED. - - - - - P3 is always 3 as far as i cant tell - Animations List : www.los-santos-multiplayer.com/dev.airdancer?cxt=anim - - - - - Entity 1 = Victim - Entity 2 = Attacker - p2 seems to always be 1 - - - - - It determines what weapons caused damage: - If youu want to define only a specific weapon, second parameter=weapon hash code, third parameter=0 - If you want to define any melee weapon, second parameter=0, third parameter=1. - If you want to identify any weapon (firearms, melee, rockets, etc.), second parameter=0, third parameter=2. - - - - - traceType is always 17 in the scripts. - There is other codes used for traceType: - 19 - in jewelry_prep1a - 126 - in am_hunt_the_beast - 256 & 287 - in fm_mission_controller - - - - - Has the entity1 got a clear line of sight to the other entity2 from the direction entity1 is facing. - This is one of the most CPU demanding BOOL natives in the game; avoid calling this in things like nested for-loops - - - - - Called on tick. - Tested with vehicles, returns true whenever the vehicle is touching any entity. - Note: for vehicles, the wheels can touch the ground and it will still return false, but if the body of the vehicle touches the ground, it will return true. - - - - - Check to see if hud component Scaleform has loaded? - - - - - Returns whether or not the specific minimap overlay has loaded. - - A minimap overlay ID. - A boolean indicating load status. - - - - Checks if the specified model has loaded into memory. - - - - - assetName = For example "core" - - - - - Pretty sure it's the real name (not 100% sure so I added the _ prefix); can someone else confirm it? - Only values used in the scripts are: - "heist_mp" - "heistmap_mp" - "instructional_buttons" - "heist_pre" - - - - - Pretty sure it's the real name (not 100% sure so I added the _ prefix); can someone else confirm it? - Only values used in the scripts are: - "heist_mp" - "heistmap_mp" - "instructional_buttons" - "heist_pre" - - - - - It determines what weapons caused damage: - If you want to define only a specific weapon, second parameter=weapon hash code, third parameter=0 - If you want to define any melee weapon, second parameter=0, third parameter=1. - If you want to identify any weapon (firearms, melee, rockets, etc.), second parameter=0, third parameter=2. - - - - - p2 should be FALSE, otherwise it seems to always return FALSE - Bool does not check if the weapon is current equipped, unfortunately. - - - - - Gets the player's info and calls a function that checks the player's ped position. - Here's the decompiled function that checks the position: pastebin.com/ZdHG2E7n - - - - - Returns if a script has been loaded into the game. Used to see if a script was loaded after requesting. - For a full list, see here: pastebin.com/yLNWicUi - - - - - Checks if the specified gxt has loaded into the passed slot. - - - - - Console Hash - - - - - Console Hash - - - - - Third Parameter = unsure, but pretty sure it is weapon hash - --> get_hash_key("weapon_stickybomb") - Fourth Parameter = unsure, almost always -1 - - - - - I think this works, but seems to prohibit switching to other weapons (or accessing the weapon wheel) - - - - - This is the native that is used to hide the exterior of GTA Online apartment buildings when you are inside an apartment. - More info: http://gtaforums.com/topic/836301-hiding-gta-online-apartment-exteriors/ - - - - - This is the native that is used to hide the exterior of GTA Online apartment buildings when you are inside an apartment. - More info: http://gtaforums.com/topic/836301-hiding-gta-online-apartment-exteriors/ - - - - - Hides the players weapon during a cutscene. - - - - - Hash collision - If used with a Ped that has an AI blip as the first argument: - - if p1 is true, a view cone is displayed with the AI blip - - - - - draws circular marker at pos - -1 = none - 0 = red - 1 = green - 2 = blue - 3 = green larger - 4 = nothing - 5 = green small - - - - - draws circular marker at pos - -1 = none - 0 = red - 1 = green - 2 = blue - 3 = green larger - 4 = nothing - 5 = green small - - - - - Simply returns whatever is passed to it (Regardless of whether the handle is valid or not). - -------------------------------------------------------- - if (NETWORK::NETWORK_IS_PARTICIPANT_ACTIVE(PLAYER::INT_TO_PARTICIPANTINDEX(i))) - - - - - Simply returns whatever is passed to it (Regardless of whether the handle is valid or not). - - - - - if "flag" is true, the AI blip will always be displayed for the specified ped, if it has an AI blip - If "flag" is false, the AI blip will only be displayed when the player is in combat with the specified ped, if it has an AI blip - - - - - if "flag" is true, the AI blip will always be displayed for the specified ped, if it has an AI blip - If "flag" is false, the AI blip will only be displayed when the player is in combat with the specified ped, if it has an AI blip - - - - - Example: - bool playing = AUDIO::IS_ALARM_PLAYING("PORT_OF_LS_HEIST_FORT_ZANCUDO_ALARMS"); - - - - - Common in the scripts: - AUDIO::IS_AMBIENT_SPEECH_DISABLED(PLAYER::PLAYER_PED_ID()); - - - - - if (GAMEPLAY::IS_AUSSIE_VERSION()) { - sub_127a9(&l_31, 1024); // l_31 |= 1024 - l_129 = 3; - sub_129d2("AUSSIE VERSION IS TRUE!?!?!"); // DEBUG - } - Used to block some of the prostitute stuff due to laws in Australia. - - - - - <!-- Native implemented by Disquse. 0xFFF65C63 --> - Returns true if the minimap is currently expanded. False if it's the normal minimap state. - Use [`IsBigmapFull`](#_0x66EE14B2) to check if the full map is currently revealed on the minimap. - - A bool indicating if the minimap is currently expanded or normal state. - - - - <!-- Native implemented by Disquse. 0x66EE14B2 --> - Returns true if the full map is currently revealed on the minimap. - Use [`IsBigmapActive`](#_0xFFF65C63) to check if the minimap is currently expanded or in it's normal state. - - Returns true if the full map is currently revealed on the minimap. - - - - Returns bit's boolean state from [offset] of [address]. - Example: - GAMEPLAY::IS_BIT_SET(bitAddress, 1); - To enable and disable bits, see: - GAMEPLAY::SET_BIT(&bitAddress, 1); // enable - GAMEPLAY::CLEAR_BIT(&bitAddress, 1); // disable - - - - - Returns whether or not the passed camera handle is active. - - - - - Animations list : www.los-santos-multiplayer.com/dev.airdancer?cxt=anim - - - - - Control Groups: - enum InputGroups - { - INPUTGROUP_MOVE = 0, - INPUTGROUP_LOOK = 1, - INPUTGROUP_WHEEL = 2, - INPUTGROUP_CELLPHONE_NAVIGATE = 3, - INPUTGROUP_CELLPHONE_NAVIGATE_UD = 4, - INPUTGROUP_CELLPHONE_NAVIGATE_LR = 5, - INPUTGROUP_FRONTEND_DPAD_ALL = 6, - INPUTGROUP_FRONTEND_DPAD_UD = 7, - INPUTGROUP_FRONTEND_DPAD_LR = 8, - INPUTGROUP_FRONTEND_LSTICK_ALL = 9, - INPUTGROUP_FRONTEND_RSTICK_ALL = 10, - INPUTGROUP_FRONTEND_GENERIC_UD = 11, - INPUTGROUP_FRONTEND_GENERIC_LR = 12, - INPUTGROUP_FRONTEND_GENERIC_ALL = 13, - INPUTGROUP_FRONTEND_BUMPERS = 14, - INPUTGROUP_FRONTEND_TRIGGERS = 15, - INPUTGROUP_FRONTEND_STICKS = 16, - INPUTGROUP_SCRIPT_DPAD_ALL = 17, - INPUTGROUP_SCRIPT_DPAD_UD = 18, - INPUTGROUP_SCRIPT_DPAD_LR = 19, - INPUTGROUP_SCRIPT_LSTICK_ALL = 20, - INPUTGROUP_SCRIPT_RSTICK_ALL = 21, - INPUTGROUP_SCRIPT_BUMPERS = 22, - INPUTGROUP_SCRIPT_TRIGGERS = 23, - INPUTGROUP_WEAPON_WHEEL_CYCLE = 24, - INPUTGROUP_FLY = 25, - INPUTGROUP_SUB = 26, - INPUTGROUP_VEH_MOVE_ALL = 27, - INPUTGROUP_CURSOR = 28, - INPUTGROUP_CURSOR_SCROLL = 29, - INPUTGROUP_SNIPER_ZOOM_SECONDARY = 30, - INPUTGROUP_VEH_HYDRAULICS_CONTROL = 31, - MAX_INPUTGROUPS = 32, - INPUTGROUP_INVALID = 33 - }; - 0, 1 and 2 used in the scripts. - - - - - Returns whether a [control](https://docs.fivem.net/game-references/controls/) was newly pressed since the last check. - - The control system instance to use. Usually set to 0. - The control ID to check. - True if the control was pressed. - - - - Returns whether a [control](https://docs.fivem.net/game-references/controls/) was newly released since the last check. - - The control system instance to use. Usually set to 0. - The control ID to check. - True if the control was recently released. - - - - Returns whether a [control](https://docs.fivem.net/game-references/controls/) is currently pressed. - - The control system instance to use. Usually set to 0. - The control ID to check. - True if the control was pressed. - - - - Returns whether a [control](https://docs.fivem.net/game-references/controls/) is currently _not_ pressed. - - The control system instance to use. Usually set to 0. - The control ID to check. - True if the control is not pressed. - - - - xyz - relative to the world origin. - - - - - Usage: - public bool isCopInRange(Vector3 Location, float Range) - { - return Function.Call<bool>(Hash.IS_COP_PED_IN_AREA_3D, Location.X - Range, Location.Y - Range, Location.Z - Range, Location.X + Range, Location.Y + Range, Location.Z + Range); - } - - - - - 0, 1 and 2 used in the scripts. 0 is by far the most common of them. - - - - - 0, 1 and 2 used in the scripts. 0 is by far the most common of them. - - - - - 0, 1 and 2 used in the scripts. 0 is by far the most common of them. - - - - - Example: - DLC2::IS_DLC_PRESENT($\mpbusiness2\); - ($ = gethashkey) - bruteforce these: - 0xB119F6D - 0x96F02EE6 - - - - - Use _GET_VEHICLE_MOD_DATA for modData - - - - - Use _GET_VEHICLE_MOD_DATA for modData - - - - - Returns whether or not a browser is created for a specified DUI browser object. - - The DUI browser handle. - A boolean indicating TRUE if the browser is created. - - - - Gets whether or not this is the CitizenFX server. - - A boolean value. - - - - XBOX ONE - MulleDK19: This function is hard-coded to always return 0. - - - - - Checks if entity is within x/y/zSize distance of x/y/z. - Last three are unknown ints, almost always p7 = 0, p8 = 1, p9 = 0 - - - - - Checks if entity1 is within the box defined by x/y/zSize of entity2. - Last three parameters are almost alwasy p5 = 0, p6 = 1, p7 = 0 - - - - - Creates a spherical cone at origin that extends to surface with the angle specified. Then returns true if the entity is inside the spherical cone - Angle is measured in degrees. - These values are constant, most likely bogus: - p8 = 0, p9 = 1, p10 = 0 - This method can also take two float<3> instead of 6 floats. - - - - - Returns true if the entity is in between the minimum and maximum values for the 2d screen coords. - This means that it will return true even if the entity is behind a wall for example, as long as you're looking at their location. - Chipping - - - - - See also PED::IS_SCRIPTED_SCENARIO_PED_USING_CONDITIONAL_ANIM 0x6EC47A344923E1ED 0x3C30B447 - Taken from ENTITY::IS_ENTITY_PLAYING_ANIM(PLAYER::PLAYER_PED_ID(), "creatures@shark@move", "attack_player", 3) - p4 is always 3 in the scripts. - Animations list : www.los-santos-multiplayer.com/dev.airdancer?cxt=anim - taskFlag: - 2 - Check synchronized scene - - - - - A static ped will not react to natives like "APPLY_FORCE_TO_ENTITY" or "SET_ENTITY_VELOCITY" and oftentimes will not react to task-natives like "AI::TASK_COMBAT_PED". The only way I know of to make one of these peds react is to ragdoll them (or sometimes to use CLEAR_PED_TASKS_IMMEDIATELY(). Static peds include almost all far-away peds, beach-combers, peds in certain scenarios, peds crossing a crosswalk, peds walking to get back into their cars, and others. If anyone knows how to make a ped non-static without ragdolling them, please edit this with the solution. - ^ Attach a phCollider to the ped. - - - - - // add this to your CSS to view code with formatting intact. - // pre + hr + p { white-space: pre; } // - - bool isEntityUpright(Entity e, float angle) { - bool bIsUpright; // bl@1 - CDynamicEntity* pEntity; // rdi@1 - bIsUpright = 0; - pEntity = getEntityAddressIfPhysical(e); - if (pEntity) { - bIsUpright = 0; - if (pEntity->Matrix.up.z >= cosf(angle * 0.017453292)) // radians(angle) - bIsUpright = 1; - } - return bIsUpright; - } - - - - - This function is hard-coded to always return 0. - - - - - Hardcoded to return 1 - - - - - Examples when this function will return 0 are: - - During busted screen. - - When player is coming out from a hospital. - - When player is coming out from a police station. - - - - - Doesn't appear to work, use IS_HELP_MESSAGE_BEING_DISPLAYED instead - - - - - Checks whether the horn of a vehicle is currently played. - - - - - Full list of components below - HUD = 0; - HUD_WANTED_STARS = 1; - HUD_WEAPON_ICON = 2; - HUD_CASH = 3; - HUD_MP_CASH = 4; - HUD_MP_MESSAGE = 5; - HUD_VEHICLE_NAME = 6; - HUD_AREA_NAME = 7; - HUD_VEHICLE_CLASS = 8; - HUD_STREET_NAME = 9; - HUD_HELP_TEXT = 10; - HUD_FLOATING_HELP_TEXT_1 = 11; - HUD_FLOATING_HELP_TEXT_2 = 12; - HUD_CASH_CHANGE = 13; - HUD_RETICLE = 14; - HUD_SUBTITLE_TEXT = 15; - HUD_RADIO_STATIONS = 16; - HUD_SAVING_GAME = 17; - HUD_GAME_STREAM = 18; - HUD_WEAPON_WHEEL = 19; - HUD_WEAPON_WHEEL_STATS = 20; - MAX_HUD_COMPONENTS = 21; - MAX_HUD_WEAPONS = 22; - MAX_SCRIPTED_HUD_COMPONENTS = 141; - - - - - Only occurrence was false, in maintransition. - - - - - Only occurrence was false, in maintransition. - - - - - ======================================================= - Correction, I have change this to int, instead of int* - as it doesn't use a pointer to the createdIncident. - If you try it you will crash (or) freeze. - ======================================================= - - - - - Seems to return true if the input is currently disabled. "_GET_LAST_INPUT_METHOD" didn't seem very accurate, but I've left the original description below. - -- - index usually 2 - returns true if the last input method was made with mouse + keyboard, false if it was made with a gamepad - 0, 1 and 2 used in the scripts. 0 is by far the most common of them. - - - - - Seems to return true if the input is currently disabled. "_GET_LAST_INPUT_METHOD" didn't seem very accurate, but I've left the original description below. - -- - index usually 2 - returns true if the last input method was made with mouse + keyboard, false if it was made with a gamepad - 0, 1 and 2 used in the scripts. 0 is by far the most common of them. - - - - - I may be wrong with this one, but from the looks of the scripts, it sets keyboard related stuff as soon as this returns true. - 0, 1 and 2 used in the scripts. 0 is by far the most common of them. - - - - - I may be wrong with this one, but from the looks of the scripts, it sets keyboard related stuff as soon as this returns true. - 0, 1 and 2 used in the scripts. 0 is by far the most common of them. - - - - - Returns a bool if interior rendering is disabled, if yes, all "normal" rendered interiors are invisible - - - - - List of all IPLs: pastebin.com/iNGLY32D - - - - - Returns whether the specified model represents a vehicle. - - - - - Check if model is in cdimage(rpf) - - - - - Returns whether the specified model exists in the game. - - - - - Returns whether navmesh for the region is loaded. The region is a rectangular prism defined by it's top left deepest corner to it's bottom right shallowest corner. - If you can re-word this so it makes more sense, please do. I'm horrible with words sometimes... - - - - - hash collision. - Definitely a hash collision, has something do to with your local player, not a vehicle - - - - - Gets whether or not NIGHTVISION is Active. - Note: When nightvision is actually active, this native will return TRUE! - - - - - Gets whether or not NIGHTVISION is Active. - Note: When nightvision is actually active, this native will return TRUE! - - - - - PS4 - MulleDK19: This function is hard-coded to always return 0. - Force67: I patched return result and got this : i.imgur.com/hUn7zSj.jpg - translate please? - - - - - MulleDK19: This function is hard-coded to always return 1. - - - - - Returns true if the given ped has a valid pointer to CPlayerInfo in its CPed class. That's it. - - - - - p1 is anywhere from 4 to 7 in the scripts. Might be a weapon wheel group? - ^It's kinda like that. - 7 returns true if you are equipped with any weapon except your fists. - 6 returns true if you are equipped with any weapon except melee weapons. - 5 returns true if you are equipped with any weapon except the Explosives weapon group. - 4 returns true if you are equipped with any weapon except Explosives weapon group AND melee weapons. - 3 returns true if you are equipped with either Explosives or Melee weapons (the exact opposite of 4). - 2 returns true only if you are equipped with any weapon from the Explosives weapon group. - 1 returns true only if you are equipped with any Melee weapon. - 0 never returns true. - Note: When I say "Explosives weapon group", it does not include the Jerry can and Fire Extinguisher. - - - - - This function is hard-coded to always return 0. - - - - - p1 is always 0 - - - - - Checks if the component variation is valid, this works great for randomizing components using loops. - List of component/props ID - gtaxscripting.blogspot.com/2016/04/gta-v-peds-component-and-props.html - - - - - l - - - - - This native returns a true or false value. - Ped ped = The ped whose weapon you want to check. - - - - - Seems to consistently return true if the ped is dead. - p1 is always passed 1 in the scripts. - I suggest to remove "OR_DYING" part, because it does not detect dying phase. - That's what the devs call it, cry about it. - lol - that's a good meme right there. - - - - - Presumably returns the Entity that the Ped is currently diving out of the way of. - var num3; - if (PED::IS_PED_EVASIVE_DIVING(A_0, &num3) != 0) - if (ENTITY::IS_ENTITY_A_VEHICLE(num3) != 0) - - - - - angle is ped's view cone - - - - - Gets a value indicating whether this ped's health is below its fatally injured threshold. The default threshold is 100. - If the handle is invalid, the function returns true. - - - - - Returns true/false if the ped is/isn't humanoid. - - - - - Returns whether the specified ped is hurt. - - - - - Returns whether the specified ped is in any vehicle. If `atGetIn` is set to true, also returns true if the ped is - currently in the process of entering a vehicle (a specific stage check for `CTaskEnterVehicle`). - - The ped to check. - `true` to also consider attempting to enter a vehicle. - Whether or not the ped is currently involved in any vehicle. - - - - Checks to see if ped and target are in combat with eachother. Only goes one-way: if target is engaged in combat with ped but ped has not yet reacted, the function will return false until ped starts fighting back. - p1 is usually 0 in the scripts because it gets the ped id during the task sequence. For instance: PED::IS_PED_IN_COMBAT(l_42E[4 -- [[14]] ], PLAYER::PLAYER_PED_ID()) // armenian2.ct4: 43794 - - - - - p1 is nearly always 0 in the scripts. - - - - - Notes: The function only returns true while the ped is: - A.) Swinging a random melee attack (including pistol-whipping) - B.) Reacting to being hit by a melee attack (including pistol-whipping) - C.) Is locked-on to an enemy (arms up, strafing/skipping in the default fighting-stance, ready to dodge+counter). - You don't have to be holding the melee-targetting button to be in this stance; you stay in it by default for a few seconds after swinging at someone. If you do a sprinting punch, it returns true for the duration of the punch animation and then returns false again, even if you've punched and made-angry many peds - - - - - Gets a value indicating whether the specified ped is in the specified vehicle. - If 'atGetIn' is false, the function will not return true until the ped is sitting in the vehicle and is about to close the door. If it's true, the function returns true the moment the ped starts to get onto the seat (after opening the door). Eg. if false, and the ped is getting into a submersible, the function will not return true until the ped has descended down into the submersible and gotten into the seat, while if it's true, it'll return true the moment the hatch has been opened and the ped is about to descend into the submersible. - - - - - returns true is the ped is on the ground whining like a little female dog from a gunshot wound - - - - - Gets a value indicating whether this ped's health is below its injured threshold. - The default threshold is 100. - - - - - Returns true/false if the ped is/isn't male. - - - - - Same function call as PED::GET_MOUNT, aka just returns 0 - - - - - Gets a value indicating whether the specified ped is on top of any vehicle. - Return 1 when ped is on vehicle. - Return 0 when ped is not on a vehicle. - - - - - List of component/props ID - gtaxscripting.blogspot.com/2016/04/gta-v-peds-component-and-props.html - - - - - List of component/props ID - gtaxscripting.blogspot.com/2016/04/gta-v-peds-component-and-props.html - - - - - If the ped handle passed through the parenthesis is in a ragdoll state this will return true. - - - - - Returns whether the specified ped is reloading. - - - - - Returns whether the specified ped is shooting. - - - - - Detect if ped is in any vehicle - [True/False] - - - - - Detect if ped is sitting in the specified vehicle - [True/False] - - - - - Console Hash: 0xDD5D08A7 - - - - - Console Hash: 0xDD5D08A7 - - - - - Returns true if the ped doesn't do any movement. If the ped is being pushed forwards by using APPLY_FORCE_TO_ENTITY for example, the function returns false. - - - - - What's strafing? - - - - - Definition of vaulting? - - - - - Probably checks whether the ped has finished reloading or not and if the current weapon is not being switched to another. - - - - - Returns true if the ped passed through the parenthesis is wearing a helmet. - - - - - gtaforums.com/topic/885580-ped-headshotmugshot-txd/ - - - - - gtaforums.com/topic/885580-ped-headshotmugshot-txd/ - - - - - Pickup hashes: pastebin.com/8EuSv2r1 - - - - - Return true while player is being arrested / busted. - If atArresting is set to 1, this function will return 1 when player is being arrested (while player is putting his hand up, but still have control) - If atArresting is set to 0, this function will return 1 only when the busted screen is shown. - - - - - Returns true when the player is not able to control the cam i.e. when running a benchmark test, switching the player or viewing a cutscene. - Note: I am not 100% sure if the native actually checks if the cam control is disabled but it seems promising. - - - - - Returns true when the player is not able to control the cam i.e. when running a benchmark test, switching the player or viewing a cutscene. - Note: I am not 100% sure if the native actually checks if the cam control is disabled but it seems promising. - - - - - Returns TRUE if the player ('s ped) is climbing at the moment. - - - - - Can the player control himself, used to disable controls for player for things like a cutscene. - --- - You can't disable controls with this, use SET_PLAYER_CONTROL(...) for this. - - - - - Gets a value indicating whether the specified player is currently aiming freely. - - - - - Gets a value indicating whether the specified player is currently aiming freely at the specified entity. - - - - - this function is hard-coded to always return 0. - - - - - Returns TRUE if the game is in online mode and FALSE if in offline mode. - This is an alias for NETWORK_IS_SIGNED_ONLINE. - - - - - Checks whether the specified player has a Ped, the Ped is not dead, is not injured and is not arrested. - - - - - Returns true if the player is riding a train. - - - - - Returns true if the player is currently switching, false otherwise. - (When the camera is in the sky moving from Trevor to Franklin for example) - - - - - Returns true if the player is currently switching, false otherwise. - (When the camera is in the sky moving from Trevor to Franklin for example) - - - - - Gets a value indicating whether the specified position is on a road. - The vehicle parameter is not implemented (ignored). - - - - - Determines whether there is a projectile within the specified coordinates. The coordinates form a rectangle. - ownedByPlayer = only projectiles fired by the player will be detected. - - - - - Determines whether there is a projectile of a specific type within the specified coordinates. The coordinates form a rectangle. - Note: This native hasn't been tested yet. - - - - - Dr. Underscore (1/6/18): - Checks if the projectile is in the radius around that point. - p6 is (most likely) ownedByPlayer. (see IS_PROJECTILE_IN_AREA for info) - - - - - Dr. Underscore (1/6/18): - Checks if the projectile is in the radius around that point. - p6 is (most likely) ownedByPlayer. (see IS_PROJECTILE_IN_AREA for info) - - - - - MulleDK19: This function is hard-coded to always return 0. - - - - - Checks if you're recording, returns TRUE when you start recording (F1) or turn on action replay (F2) - mov al, cs:g_bIsRecordingGameplay // byte_141DD0CD0 in b944 - retn - - - - - if(NETWORK::_IS_ROCKSTAR_BANNED() == 0) means the player is rockstar banned - - - - - Occurrences in the b617d scripts: - "ARMY_GUARD", - "ARMY_HELI", - "BLIMP", - "Cinema_Downtown", - "Cinema_Morningwood", - "Cinema_Textile", - "City_Banks", - "Countryside_Banks", - "DEALERSHIP", - "KORTZ_SECURITY", - "LSA_Planes", - "MP_POLICE", - "Observatory_Bikers", - "POLICE_POUND1", - "POLICE_POUND2", - "POLICE_POUND3", - "POLICE_POUND4", - "POLICE_POUND5", - "Rampage1", - "SANDY_PLANES", - "SCRAP_SECURITY", - "SEW_MACHINE", - "SOLOMON_GATE" - Sometimes used with DOES_SCENARIO_GROUP_EXIST: - if (AI::DOES_SCENARIO_GROUP_EXIST("Observatory_Bikers") && (!AI::IS_SCENARIO_GROUP_ENABLED("Observatory_Bikers"))) { - else if (AI::IS_SCENARIO_GROUP_ENABLED("BLIMP")) { - - - - - Occurrences in the b617d scripts: - "PROP_HUMAN_SEAT_CHAIR", - "WORLD_HUMAN_DRINKING", - "WORLD_HUMAN_HANG_OUT_STREET", - "WORLD_HUMAN_SMOKING", - "WORLD_MOUNTAIN_LION_WANDER", - "WORLD_HUMAN_DRINKING" - Sometimes used together with GAMEPLAY::IS_STRING_NULL_OR_EMPTY in the scripts. - scenarioType could be the same as scenarioName, used in for example AI::TASK_START_SCENARIO_AT_POSITION. - - - - - In drunk_controller.c4, sub_309 - if (CAM::_C912AF078AF19212()) { - CAM::_1C9D7949FA533490(0); - } - What does "IS_SCRIPT_GLOBAL_SHAKING" mean..? :/ Is this a hash collision? - - - - - In drunk_controller.c4, sub_309 - if (CAM::_C912AF078AF19212()) { - CAM::_1C9D7949FA533490(0); - } - What does "IS_SCRIPT_GLOBAL_SHAKING" mean..? :/ Is this a hash collision? - - - - - Animations list : www.los-santos-multiplayer.com/dev.airdancer?cxt=anim - - - - - Returns whether or not SEETHROUGH is active. - - - - - Some events that i found, not sure about them, but seems to have logic based on my tests: - '82 - dead body - '86 - '87 - '88 - shooting, fire extinguisher in use - '89 - '93 - ped using horn - '95 - ped receiving melee attack - '102 - living ped receiving shot - '104 - player thrown grenade, tear gas, smoke grenade, jerry can dropping gasoline - '105 - melee attack against veh - '106 - player running - '108 - vehicle theft - '112 - melee attack - '113 - veh rollover ped - '114 - dead ped receiving shot - '116 - aiming at ped - '121 - Here is full dump of shocking event types from the exe camx.me/gtav/tasks/shockingevents.txt - - - - - Determines whether there is a sniper bullet within the specified coordinates. The coordinates form a rectangle. - - - - - This function is hard-coded to always return 0. - - - - - if(_IS_SOCIALCLUB_BANNED() == 0) means the player is social club banned - - - - - Returns true when the srl from BeginSrl is loaded. - - - A boolean once BeginSrl srl is loaded. - - - - **Experimental**: This native may be altered or removed in future versions of CitizenFX without warning. - Returns whether an asynchronous streaming file registration completed. - - The file name to check, for example `asset.ydr`. - Whether or not the streaming file has been registered. - - - - Returns true if a synchronized scene is running - - - - - Return whether tennis mode is active or not. - - - - - Returns whether or not the text chat (MULTIPLAYER_CHAT Scaleform component) is active. - - - - - Returns true if the model is motorcycle or bycicle. - - - - - To check if the model is an amphibious car, see gtaforums.com/topic/717612-v-scriptnative-documentation-and-research/page-33#entry1069317363 (for build 944 and above only!) - - - - - Checks if model is a boat, then checks for FLAG_IS_JETSKI. - @whoever named this _IS_THIS_MODEL_AN_EMERGENCY_BOAT: please do some tests before naming natives, thanks. - - - - - Checks if model is a boat, then checks for FLAG_IS_JETSKI. - @whoever named this _IS_THIS_MODEL_AN_EMERGENCY_BOAT: please do some tests before naming natives, thanks. - - - - - Checks if model is a boat, then checks for FLAG_IS_JETSKI. - @whoever named this _IS_THIS_MODEL_AN_EMERGENCY_BOAT: please do some tests before naming natives, thanks. - - - - - Returns true if the two times are equal; otherwise returns false. - - - - - Returns true if the two times are equal; otherwise returns false. - - - - - Subtracts the second argument from the first, then returns whether the result is negative. - - - - - Subtracts the second argument from the first, then returns whether the result is negative. - - - - - Subtracts the first argument from the second, then returns whether the result is negative. - - - - - Subtracts the first argument from the second, then returns whether the result is negative. - - - - - returns whether or not a ped is visible within your FOV, not this check auto's to false after a certain distance. - Target needs to be tracked.. won't work otherwise. - - - - - Return if interior is valid. - - - - - p1 is false almost always. - However, in launcher_carwash/carwash1/carwash2 scripts, p1 is true and is accompanied by DOES_VEHICLE_HAVE_ROOF - - - - - Scripts verify that towTruck is the first parameter, not the second. - - - - - Public Function isVehicleAttachedToTrailer(vh As Vehicle) As Boolean - Return Native.Function.Call(Of Boolean)(Hash.IS_VEHICLE_ATTACHED_TO_TRAILER, vh) - End Function - - - - - Appears to return true if the vehicle has any damage, including cosmetically. - - - - - doorID starts at 0, not seeming to skip any numbers. Four door vehicles intuitively range from 0 to 3. - - - - - doorIndex: - 0 = Front Left Door - 1 = Front Right Door - 2 = Back Left Door - 3 = Back Right Door - 4 = Hood - 5 = Trunk - 6 = Trunk2 - - The vehicle to check. - The index of the door to check. - A bool indiciating if the specified door is fully open on the specified vehicle. - - - - p1 is always 0 in the scripts. - p1 = check if vehicle is on fire - - - - - Only ever used once in decompiled scripts: **am_pi_menu**: - Returns true if the engine is on fire, or if the vehicle engine health is &lt; 0 and it **has been** on fire. - It sometimes doesn't return true when the vehicle engine has been on fire, and has since been fixed. I'm not really sure what the exact conditions are. - This usually returns true even if there are no visible flames yet (engine health > 0). However if you monitor engine health you'll see that it starts decreasing as soon as this returns true. - ``` - if (((ENTITY::DOES_ENTITY_EXIST(Global_1281959) && !ENTITY::IS_ENTITY_DEAD(Global_1281959, 0)) && func_1545(Global_1281959)) && !func_205(PLAYER::PLAYER_ID())) - { - if (VEHICLE::GET_VEHICLE_ENGINE_HEALTH(Global_1281959) > 0f && VEHICLE::GET_IS_VEHICLE_ENGINE_RUNNING(Global_1281959)) - { - bVar0 = true; - } - else - { - bVar0 = false; - } - if (VEHICLE::_0xEC69ADF931AAE0C3(Global_1281959)) // _IS_VEHICLE_ENGINE_ON_FIRE - { - bVar0 = false; - } - } - ``` - - The vehicle to check. - Returns true when the engine of your vehicle is on fire. Returns false if it's not on fire. - - - - Only ever used once in decompiled scripts: **am_pi_menu**: - Returns true if the engine is on fire, or if the vehicle engine health is &lt; 0 and it **has been** on fire. - It sometimes doesn't return true when the vehicle engine has been on fire, and has since been fixed. I'm not really sure what the exact conditions are. - This usually returns true even if there are no visible flames yet (engine health > 0). However if you monitor engine health you'll see that it starts decreasing as soon as this returns true. - ``` - if (((ENTITY::DOES_ENTITY_EXIST(Global_1281959) && !ENTITY::IS_ENTITY_DEAD(Global_1281959, 0)) && func_1545(Global_1281959)) && !func_205(PLAYER::PLAYER_ID())) - { - if (VEHICLE::GET_VEHICLE_ENGINE_HEALTH(Global_1281959) > 0f && VEHICLE::GET_IS_VEHICLE_ENGINE_RUNNING(Global_1281959)) - { - bVar0 = true; - } - else - { - bVar0 = false; - } - if (VEHICLE::_0xEC69ADF931AAE0C3(Global_1281959)) // _IS_VEHICLE_ENGINE_ON_FIRE - { - bVar0 = false; - } - } - ``` - - The vehicle to check. - Returns true when the engine of your vehicle is on fire. Returns false if it's not on fire. - - - - Returns whether the specified vehicle is currently in a burnout. - vb.net - Public Function isVehicleInBurnout(vh As Vehicle) As Boolean - Return Native.Function.Call(Of Boolean)(Hash.IS_VEHICLE_IN_BURNOUT, vh) - End Function - - - - - garageName example "Michael - Beverly Hills" - For a full list, see here: pastebin.com/73VfwsmS - - - - - Returns whether or not the vehicle has a CVehicleStreamRequestGfx that's trying to load mods. - True if it isn't loading mods, false if it is. - - - - - Returns whether or not the vehicle has a CVehicleStreamRequestGfx that's trying to load mods. - True if it isn't loading mods, false if it is. - - - - - indices: - 0 = Left - 1 = Right - 2 = Front - 3 = Back - - - - - Returns true if the id is non zero. - - - - - Public Function isVehicleOnAllWheels(vh As Vehicle) As Boolean - Return Native.Function.Call(Of Boolean)(Hash.IS_VEHICLE_ON_ALL_WHEELS, vh) - End Function - - - - - Possibly: Returns whether the searchlight (found on police vehicles) is toggled on. - - - - - Has an additional BOOL parameter since version [???]. - Check if a vehicle seat is free. - -1 being the driver seat. - Use GET_VEHICLE_MAX_NUMBER_OF_PASSENGERS(vehicle) - 1 for last seat index. - - - - - Checks for FLAG_NO_RESPRAY - - - - - Checks for FLAG_NO_RESPRAY - - - - - MulleDK19: Returns true if the vehicle's speed is equal to, or less than 0.02 meters per second, or 0.05 meters per second, if the vehicle's handbrake is engaged. - - - - - is this for red lights only? more testing required. - - - - - p1 can be anywhere from 0 to 3 in the scripts. p2 is generally somewhere in the 1000 to 10000 range. - - - - - wheelID used for 4 wheelers seem to be (0, 1, 4, 5) - completely - is to check if tire completely gone from rim. - '0 = wheel_lf / bike, plane or jet front - '1 = wheel_rf - '2 = wheel_lm / in 6 wheels trailer, plane or jet is first one on left - '3 = wheel_rm / in 6 wheels trailer, plane or jet is first one on right - '4 = wheel_lr / bike rear / in 6 wheels trailer, plane or jet is last one on left - '5 = wheel_rr / in 6 wheels trailer, plane or jet is last one on right - '45 = 6 wheels trailer mid wheel left - '47 = 6 wheels trailer mid wheel right - - - - - must be called after TRACK_VEHICLE_VISIBILITY - it's not instant so probabilly must pass an 'update' to see correct result. - - - - - Gets whether the world point the calling script is registered to is within desired range of the player. - - - - - MulleDK19: This function is hard-coded to always return 0. - - - - - When I called this with what the script was doing, which was -190f for yaw pitch and roll, all my car did was jitter a little. I also tried 0 and 190f. I altered the p1 variable between TRUE and FALSE and didn't see a difference. - This might have something to do with the physbox of the vehicle, but I'm not sure. - - - - - hash collision - - - - - List of component/props ID - gtaxscripting.blogspot.com/2016/04/gta-v-peds-component-and-props.html - - - - - 1 - - - - - Loads all path nodes. - If keepInMemory is true, all path nodes will be loaded and be kept in memory; otherwise, all path nodes will be loaded, but unloaded as the game sees fit. - - MulleDK19. - August 29, 2017: This native has been removed in v1180. - - - - - Load interior - - - - - Load interior - - - - - Loads "common:/data/missioncreatordata" data and sets some values. - - - - - Loads "common:/data/missioncreatordata" data and sets some values. - - - - - This loads the GTA:O dlc map parts (high end garages, apartments). - Works in singleplayer. - In order to use GTA:O heist IPL's you have to call this native with the following params: _9BAE5AD2508DF078(1); - console hash: 0xC65586A9 - - - - - Reads the contents of a text file in a specified resource. - If executed on the client, this file has to be included in `files` in the resource manifest. - Example: `local data = LoadResourceFile("devtools", "data.json")` - - The resource name. - The file in the resource. - The file contents - - - - Rope presets can be found in the gamefiles. One example is "ropeFamily3", it is NOT a hash but rather a string. - - - - - Example: - AUDIO::LOAD_STREAM("CAR_STEAL_1_PASSBY", "CAR_STEAL_1_SOUNDSET"); - All found occurrences in the b678d decompiled scripts: pastebin.com/3rma6w5w - Stream names often ends with "_MASTER", "_SMALL" or "_STREAM". Also "_IN", "_OUT" and numbers. - soundSet is often set to 0 in the scripts. These are common to end the soundSets: "_SOUNDS", "_SOUNDSET" and numbers. - - - - - Example: - AUDIO::LOAD_STREAM_WITH_START_OFFSET("STASH_TOXIN_STREAM", 2400, "FBI_05_SOUNDS"); - Only called a few times in the scripts. - - - - - Loads specified video sequence into the TV Channel - TV_Channel ranges from 0-2 - VideoSequence can be any of the following: - "PL_STD_CNT" CNT Standard Channel - "PL_STD_WZL" Weazel Standard Channel - "PL_LO_CNT" - "PL_LO_WZL" - "PL_SP_WORKOUT" - "PL_SP_INV" - Jay Norris Assassination Mission Fail - "PL_SP_INV_EXP" - Jay Norris Assassination Mission Success - "PL_LO_RS" - Righteous Slaughter Ad - "PL_LO_RS_CUTSCENE" - Righteous Slaughter Cut-scene - "PL_SP_PLSH1_INTRO" - "PL_LES1_FAME_OR_SHAME" - "PL_STD_WZL_FOS_EP2" - "PL_MP_WEAZEL" - Weazel Logo on loop - "PL_MP_CCTV" - Generic CCTV loop - Restart - 0=video sequence continues as normal - 1=sequence restarts from beginning every time that channel is selected - - - - - Loads specified video sequence into the TV Channel - TV_Channel ranges from 0-2 - VideoSequence can be any of the following: - "PL_STD_CNT" CNT Standard Channel - "PL_STD_WZL" Weazel Standard Channel - "PL_LO_CNT" - "PL_LO_WZL" - "PL_SP_WORKOUT" - "PL_SP_INV" - Jay Norris Assassination Mission Fail - "PL_SP_INV_EXP" - Jay Norris Assassination Mission Success - "PL_LO_RS" - Righteous Slaughter Ad - "PL_LO_RS_CUTSCENE" - Righteous Slaughter Cut-scene - "PL_SP_PLSH1_INTRO" - "PL_LES1_FAME_OR_SHAME" - "PL_STD_WZL_FOS_EP2" - "PL_MP_WEAZEL" - Weazel Logo on loop - "PL_MP_CCTV" - Generic CCTV loop - Restart - 0=video sequence continues as normal - 1=sequence restarts from beginning every time that channel is selected - - - - - Loads a User-Generated Content (UGC) file. These files can be found in "[GTA5]\data\ugc" and "[GTA5]\common\patch\ugc". They seem to follow a naming convention, most likely of "[name]_[part].ugc". See example below for usage. - Returns whether or not the file was successfully loaded. - Example: - DATAFILE::_LOAD_UGC_FILE("RockstarPlaylists") // loads "rockstarplaylists_00.ugc" - - - - - Locks the minimap to the specified angle in integer degrees. - angle: The angle in whole degrees. If less than 0 or greater than 360, unlocks the angle. - - - - - Locks the minimap to the specified world position. - - - - - Not present in retail version of the game, actual definiton seems to be - _LOG_DEBUG_INFO(char* category, char* debugText); - - - - - Not present in retail version of the game, actual definiton seems to be - _LOG_DEBUG_INFO(char* category, char* debugText); - - - - - is this like setting is as no longer needed? - - - - - Sets the water height for a given position and radius. - - - - - For move the finger of player, the value of int goes 1 at 5. - - - - - 2 matches in 1 script - Used in multiplayer scripts? - - - - - if ((NETWORK::_597F8DBA9B206FC7() > 0) && DATAFILE::_01095C95CD46B624(0)) { - v_10 = DATAFILE::_GET_ROOT_OBJECT(); - v_11 = DATAFILE::_OBJECT_VALUE_GET_INTEGER(v_10, "pt"); - sub_20202(2, v_11); - a_0 += 1; - } else { - a_0 += 1; - } - - - - - some camera effect that is (also) used in the drunk-cheat, and turned off (by setting it to 0.0) along with the shaking effects once the drunk cheat is disabled. Possibly a cinematic or script-cam version of _0x487A82C650EB7799 - - - - - Found in the scripts: - GAMEPLAY::_02DEAAC8F8EA7FE7(""); - - - - - 2 calls in the b617d scripts. This line is called 2 times: - AUDIO::_031ACB6ABA18C729("RADIO_16_SILVERLAKE", "MIRRORPARK_LOCKED"); - Note: Another name for RADIO_16_SILVERLAKE is RADIO MIRROR PARK - - - - - Found in the b617d scripts, duplicates removed: - AUDIO::_044DBAD7A7FA2BE5("V_CARSHOWROOM_PS_WINDOW_UNBROKEN", "V_CARSHOWROOM_PS_WINDOW_BROKEN"); - AUDIO::_044DBAD7A7FA2BE5("V_CIA_PS_WINDOW_UNBROKEN", "V_CIA_PS_WINDOW_BROKEN"); - AUDIO::_044DBAD7A7FA2BE5("V_DLC_HEIST_APARTMENT_DOOR_CLOSED", "V_DLC_HEIST_APARTMENT_DOOR_OPEN"); - AUDIO::_044DBAD7A7FA2BE5("V_FINALEBANK_PS_VAULT_INTACT", "V_FINALEBANK_PS_VAULT_BLOWN"); - AUDIO::_044DBAD7A7FA2BE5("V_MICHAEL_PS_BATHROOM_WITH_WINDOW", "V_MICHAEL_PS_BATHROOM_WITHOUT_WINDOW"); - - - - - p0 was always 0xAE2602A3. - - - - - Dr. Underscore (1/6/18): - Seems to return a value 0-2. - - - - - x360 Hash: 0x4AF0ADF5 - - - - - Dr. Underscore (1/6/18): - Seems to return a value 0-2. - - - - - SET_PLAYERS_* - - - - - p0 is always false in scripts. - - - - - Not sure what this function does, but it's related to the audio of the local player's vehicle (Considering the surrounding natives, it's probably radio related). - - - - - In agency_heist3b.c4, its like this 90% of the time: - PED::_110F526AB784111F(ped, 0.099); - PED::SET_PED_ENVEFF_SCALE(ped, 1.0); - PED::_D69411AA0CEBF9E9(ped, 87, 81, 68); - PED::SET_ENABLE_PED_ENVEFF_SCALE(ped, 1); - and its like this 10% of the time: - PED::_110F526AB784111F(ped, 0.2); - PED::SET_PED_ENVEFF_SCALE(ped, 0.65); - PED::_D69411AA0CEBF9E9(ped, 74, 69, 60); - PED::SET_ENABLE_PED_ENVEFF_SCALE(ped, 1); - - - - - SET_TEXT_??? - Used in golf and golf_mp - - - - - Found in the scripts: - GAMEPLAY::_11B56FBBF7224868("CONTRAILS"); - - - - - console hash: 0x883DAB2D - - - - - p0 is usually 0. sometimes 2. Not sure what this does. - - - - - Only used in the golf and golf_mp script - - - - - Hardcoded to only work in multiplayer. - - - - - Returns some kind of banned state - - - - - Enables frontend (works in custom frontends, not sure about regular pause menu) navigation keys on keyboard if they were disabled using the native below. - To disable the keys, use [`0xEC9264727EEC0F28`](#_0xEC9264727EEC0F28). - - - - - gets some camera far clip - - - - - only documented params - dont know what this does.... To Be Continued... - - - - - 3 calls in the b617d scripts, removed duplicate. - AUDIO::_1654F24A88A8E3FE("RADIO_16_SILVERLAKE"); - AUDIO::_1654F24A88A8E3FE("RADIO_01_CLASS_ROCK"); - - - - - Dr. Underscore (1/6/18): - Seems to return a value 0-2. - - - - - only documented to be continued... - - - - - Related to displaying cash on the HUD - Always called before UI::_SET_SINGLEPLAYER_HUD_CASH in decompiled scripts - - - - - RELEASE_??? - I say RELEASE_???, as in IDA this native calls the same function as - -'RELEASE_MISSION_AUDIO_BANK()'. - -'RELEASE_AMBIENT_AUDIO_BANK()'. - -'RELEASE_SCRIPT_AUDIO_BANK()'. - However 'RELEASE_NAMED_SCRIPT_AUDIO_BANK' does not use the same function. So may be, 'RELEASE_???_AUDIO_BANK()'? Doubt it. - - - - - Seems to return the current type of view - example: // checks if you're currently in first person - if ((CAM::_EE778F8C7E1142E2(CAM::_19CAFA3C87F7C2FF()) == 4) && (!__463_$28ED382849B17AFC())) { - UI::_FDEC055AB549E328(); - UI::_SET_NOTIFICATION_TEXT_ENTRY("REC_FEED_WAR"); - l_CE[0 -- [[1]] ] = UI::_DRAW_NOTIFICATION(0, 1); - } - - - - - SET_ENTITY_* - - - - - Only appears in lamar1 script. - - - - - unk_0xCEA55F4C(uVar3, "AM_ROLLERCOASTER", -1)) - Probably has to do with seeing if they are riding the roller coaster or ferris wheel - NETWORK_IS_PLAYER_??? - - - - - Console Hash: 0x76A9FEB6 - - - - - Dr. Underscore (1/6/18): - Only one instance across all scripts. (maintransition) - May not be a bool, it could be one of these 0-2 values that are returned just about 500 god damn times. - - - - - NETWORK_CAN_R??? or NETWORK_CAN_S??? - - - - - This native is used along with these two natives: [`0xa356990e161c9e65`](https://runtime.fivem.net/doc/reference.html#_0xA356990E161C9E65) and [`0x5ce62918f8d703c7`](https://runtime.fivem.net/doc/reference.html#_0x5CE62918F8D703C7). - This native configures the location, size, rotation, normal height, and the difference ratio between min, normal and max. - All those natives combined they will output something like this: <https://i.imgur.com/TC6cku6.png> - - Grid center x coord. - Grid center y coord. - Grid center z coord. - Not sure, but seems to be the amount of lines top/bottom there are in the grid. -1.0 works best. - Grid rotation (keep between 0.0 and 1.0). - Offset top/bottom (? not sure about this one, seems weird). - Grid width (usually 15.0). - Grid height (usually 15.0). - Not sure, but seems to be the amount of lines left/right there are in the grid. -1.0 works best. - Zoom / scale (higher values = smaller (more) squares) (lower values = bigger (less) squares). - glow intensity / opacity (40.0 is fine for daylight, 15.0 is fine for night time). - The z coord for 'normal' height (white grid lines level). - This is the height difference/margin used for line color changes. 0.2 works fine (normalHeight + 0.2 = yellow, normalHeight - 0.2 = red). - - - - Related to Hao races. - - - - - Console Hash: 0xDF6D5D54 - Name was _GET_PED_TIME_OF_DEATH - ----------------------------------------------------------------- - There is no way this is the correct name. The only time this is called it's compared with the game timer and I used this to test something and noticed when I was killed by no matter what it was my 'Time Of Death' via this native was always 0, but my friends was some random big number like so, 147591. - Retreives [CPed + 15CC] (as of 944) - - - - - Console Hash: 0xDF6D5D54 - Name was _GET_PED_TIME_OF_DEATH - ----------------------------------------------------------------- - There is no way this is the correct name. The only time this is called it's compared with the game timer and I used this to test something and noticed when I was killed by no matter what it was my 'Time Of Death' via this native was always 0, but my friends was some random big number like so, 147591. - Retreives [CPed + 15CC] (as of 944) - - - - - Unsure about the use of this native but here's an example: - void sub_8709() { - GAMEPLAY::_1EAE0A6E978894A2(0, 1); - GAMEPLAY::_1EAE0A6E978894A2(1, 1); - GAMEPLAY::_1EAE0A6E978894A2(2, 1); - GAMEPLAY::_1EAE0A6E978894A2(3, 1); - GAMEPLAY::_1EAE0A6E978894A2(4, 1); - GAMEPLAY::_1EAE0A6E978894A2(5, 1); - GAMEPLAY::_1EAE0A6E978894A2(6, 1); - GAMEPLAY::_1EAE0A6E978894A2(7, 1); - GAMEPLAY::_1EAE0A6E978894A2(8, 1); - } - So it appears that p0 ranges from 0 to 8. - ENABLE_DISPATCH_SERVICE, seems to have a similar layout. - - - - - -This function appears to be deprecated/ unused. Tracing the call internally leads to a _nullsub - - first one seems to be a string of a mission name, second one seems to be a bool/toggle - p1 was always 0. - - - - - example - if (UI::IS_HELP_MESSAGE_BEING_DISPLAYED()&&(!UI::_214CD562A939246A())) { - return 0; - } - - - - - Only called once inside main_persitant with the parameters, 0 - - - - - From b617 scripts: - CAM::_21E253A7F8DA5DFB("DINGHY"); - CAM::_21E253A7F8DA5DFB("ISSI2"); - CAM::_21E253A7F8DA5DFB("SPEEDO"); - - - - - SET_TV_??? - - - - - Function.Call(Hash._0x2208438012482A1A, ped, 0, 0); - This makes the ped have faster animations - - - - - Probably the opposite of 0x80E4A6EDDB0BE8D9 / LOAD_ALL_PATH_NODES - - - - - Dr. Underscore (1/6/18): - Found only in all creator scripts. (fm_capture_creator, fm_deathmatch_creator, fm_lts_creator, fm_mission_controller, fm_race_creator) - Used in-between DRAW_* calls (DRAW_POLY specifically). - - - - - ------------------------ - | Belongs in DLC2 | - ------------------------ - Console Hash: 0x0AF83036 - Only used once in scripts, in maintransition. - maintransition.c4, line ~82432: - if (PED::_7350823473013C02(PLAYER::PLAYER_PED_ID()) && (DECORATOR::_241FCA5B1AA14F75() == 0)) { - g_2542A5 = a_1; // 'g_2542A5' used in 'building_controller.ysc' for IPL stuff? - return 1; - } - Likely used solely for the players ped. The function it's in seems to only be used for initialization/quitting. Called among natives to discard scaleforms, disable frontend, fading in/out, etc. Neighboring strings to some calls include "HUD_JOINING", "HUD_QUITTING". - - - - - p0 is int or bool - - - - - STATS::0x343B27E2(0); - STATS::0x343B27E2(1); - STATS::0x343B27E2(2); - STATS::0x343B27E2(3); - STATS::0x343B27E2(4); - STATS::0x343B27E2(5); - STATS::0x343B27E2(6); - STATS::0x343B27E2(7); - Identical in ingamehud & maintransition. - - - - - spook. - This function calls a function that gets another player stat, although implementation wasn't finished so it can only get your own stat. - Stat value it calls: 0xFC58E972 - - - - - IS_VEHICLE_BUMPER_HANGING_OFF - Not sure what the actual name is but this checks if the bumper of a vehicle is hanging off. It will return true if it is hanging, false if it falls off and false if it is not hanging off. - - - - - 2 matches across 2 scripts. Only showed in appcamera & appmedia. Both were 0. - Dr. Underscore (1/6/18): - I've found a reference in maintransition with 1, plus in appcamera and appmedia. - Takes and returns a bool. - - - - - VEHICLE::_2A8F319B392E7B3F(vehicle, 0.5); - - - - - if (ENTITY::DOES_ENTITY_EXIST(l_228)) { - CAM::_2AED6301F67007D5(l_228); - - - - - Seems to always return 0 from what I can tell. I've tried a lot of different blip related natives and it always seems to return 0. - Decompiled scripts always pass a blip handle as p0. - ``` - // freemode.c - if (HUD::DOES_BLIP_EXIST(Global_2415594[iParam0])) - { - if (HUD::_0x2C173AE2BDB9385E(Global_2415594[iParam0]) != 0) - { - return 1; - } - } - ``` - - The blip to check. - Seems to always return 0 from what I can tell. I've tried a lot of different blip related natives and it always seems to return 0. - - - - SET_ENTITY_* - - - - - Appears to return whether the player is using the pause menu store. Can't be sure though. - - - - - only documented. to be continued... - - - - - Used with radios: - void sub_cf383(auto _a0) { - if ((a_0)==1) { - if (GAMEPLAY::IS_BIT_SET((g_240005._f1), 3)) { - PLAYER::_2F7CEB6520288061(0); - AUDIO::SET_AUDIO_FLAG("AllowRadioDuringSwitch", 0); - AUDIO::SET_MOBILE_PHONE_RADIO_STATE(0); - AUDIO::SET_AUDIO_FLAG("MobileRadioInGame", 0); - } - sub_cf3f6(1); - } else { - if (GAMEPLAY::IS_BIT_SET((g_240005._f1), 3)) { - PLAYER::_2F7CEB6520288061(1); - AUDIO::SET_AUDIO_FLAG("AllowRadioDuringSwitch", 1); - AUDIO::SET_MOBILE_PHONE_RADIO_STATE(1); - AUDIO::SET_AUDIO_FLAG("MobileRadioInGame", 1); - } - sub_cf3f6(0); - } - } - SET_PLAYER_S* - - - - - NETWORK_IS_IN_??? - - - - - p8 seems to always be false. - - - - - From the decompiled scripts, called 61 times: - UI::_317EBA71D7543F52(&v_13, &v_13, &v_3, &v_3); - - - - - calculates two distances - - - - - 6,000+ calls from scripts, all with either 0 or 1 for p2, that's a boolean in my book - --- - ^ The last one is the componentId - iVar8 = dlc1::get_hash_name_for_component(iParam0, 8, ped::get_ped_drawable_variation(iParam0, 8), ped::get_ped_texture_variation(iParam0, 8)); - if (dlc1::_0x341DE7ED1D2A1BFD(iVar8, 240476421, 8)) - - - - - Returns a float value related to slipstream. - - - - - GET_TIME_SINCE_??? - - - - - when player character is used plays remove scuba gear animation - - - - - NETWORK_IS_TRANSITION_??? - - - - - I've had this return the player's ped handle sometimes, but also other random entities. - Whatever p0 is, it's at least not synced to other players. - At least not all the time, some p0 values actually output the same entity, (different handle of course, but same entity). - But another p0 value may return an entity for player x, but not for player y (it'll just return -1 even if the entity exists on both clients). - - unknown. - Returns an entity handle or -1, value changes based on p0's value. - - - - Sets profile setting 934 - - - - - Returns true if an unk value is greater than 0.0f - - - - - from extreme3.c4 - PED::_39D55A620FCB6A3A(PLAYER::PLAYER_PED_ID(), 8, PED::GET_PED_DRAWABLE_VARIATION(PLAYER::PLAYER_PED_ID(), 8), PED::GET_PED_TEXTURE_VARIATION(PLAYER::PLAYER_PED_ID(), 8)); - p1 is probably componentId - - - - - Used in carsteal3 script with p0 = "Carsteal4_spycar". - - - - - 1 match in 1 script. cellphone_controller. - p0 is -1 in scripts. - Dr. Underscore (1/6/18): - I have two uses in two scripts; and it's called with -1 in maintransition, not cellphone_controller. Are you using x360 scripts, or an older version of PC scripts? - Also returns bool. - - - - - p0 was always 2 in R* scripts. - Called before calling DISPLAY_ONSCREEN_KEYBOARD if the input needs to be saved. - - - - - Usage: INTERIOR::_0x405DC2AEF6AF95B9(INTERIOR::GET_KEY_FOR_ENTITY_IN_ROOM(PLAYER::PLAYER_PED_ID())); - - - - - Console Hash: 0x9F82917F - - - - - if (!ENTITY::DOES_ENTITY_BELONG_TO_THIS_SCRIPT(g_10A5A._f8B[a_0 -- [[1]] ], 1)) { - sub_20af7("No longer needed: Vehicle owned by other script"); - if ((((a_0 == 24) && (!sub_3a04(g_10A5A._f8B[a_0 -- [[1]] ]))) && (!sub_39c9(g_10A5A._f8B[a_0 -- [[1]] ]))) && (ENTITY::GET_ENTITY_MODEL(g_10A5A._f8B[a_0 -- [[1]] ]) != ${monster})) { - VEHICLE::_428BACCDF5E26EAD(g_10A5A._f8B[a_0 -- [[1]] ], 1); - } - g_10A5A._f8B[a_0 -- [[1]] ] = 0; - g_10A5A[a_0 -- [[1]] ] = 1; - sub_20ada(a_0); - return ; - } - - - - - LOD related - - - - - sfink: related to: NETWORK_BAIL - NETWORK_BAIL_TRANSITION - NETWORK_JOIN_GROUP_ACTIVITY - NETWORK_JOIN_TRANSITION - NETWORK_LAUNCH_TRANSITION - NETWORK_SESSION_HOST - NETWORK_SESSION_HOST_CLOSED - NETWORK_SESSION_HOST_FRIENDS_ONLY - NETWORK_SESSION_HOST_SINGLE_PLAYER - NETWORK_SESSION_VOICE_LEAVE - - - - - yoga.ysc - if (PED::IS_PED_WEARING_HELMET(iParam0) && PED::_0x451294E859ECC018(iParam0) != -1) - { - *uParam2 = PED::_0x451294E859ECC018(iParam0); - *uParam3 = PED::_0x9D728C1E12BF5518(iParam0); - } - - - - - NOTE: 'p2' might be some kind of array. - - - - - This has been found in use in the decompiled files. - - - - - Checks if the specified unknown flag is set in the ped's model. - The engine itself seems to exclusively check for flags 1 and 4 (Might be inlined code of the check that checks for other flags). - Game scripts exclusively check for flags 1 and 4. - - - - - Dr. Underscore (1/6/18): - Possibly some unknown structures. - - - - - Only found 3 times in decompiled scripts. Not a whole lot to go off of. - GAMEPLAY::_48F069265A0E4BEC(a_0, "Movie_Name_For_This_Player"); - GAMEPLAY::_48F069265A0E4BEC(&a_0._fB, "Ringtone_For_This_Player"); - GAMEPLAY::_48F069265A0E4BEC(&a_0._f1EC4._f12[v_A -- [[6]] ], &v_13); // where v_13 is "MPATMLOGSCRS0" thru "MPATMLOGSCRS15" - - - - - example: - if (!((v_7)==UI::_4A9923385BDB9DAD())) { - UI::SET_BLIP_SPRITE((v_6), (v_7)); - } - This function is hard-coded to always return 1. - - - - - Seems to call GET_PAUSED_MAP_STREAMING_REQUEST lol wtf - seg001:000000000158C324 sub_158C324: # DATA XREF: OPD:stru_1C29978o - seg001:000000000158C324 - seg001:000000000158C324 .set arg_10, 0x10 - seg001:000000000158C324 - seg001:000000000158C324 mflr r0 - seg001:000000000158C328 bl sub_1803774 - seg001:000000000158C32C stdu r1, -0x80(r1) - seg001:000000000158C330 std r0, 0x80+arg_10(r1) - seg001:000000000158C334 mr r31, r3 - seg001:000000000158C338 lwz r3, 8(r31) - seg001:000000000158C33C addic r4, r3, 4 - seg001:000000000158C340 addic r5, r3, 0x10 - seg001:000000000158C344 addic r7, r3, 0x20 - seg001:000000000158C348 lwz r6, 0(r3) - seg001:000000000158C34C lfs f1, 0x1C(r3) - seg001:000000000158C350 lwz r8, 0x2C(r3) - seg001:000000000158C354 extsw r3, r6 - seg001:000000000158C358 extsw r8, r8 - seg001:000000000158C35C bl GET_PAUSED_MAP_STREAMING_REQUEST - seg001:000000000158C360 lwz r4, 0(r31) - seg001:000000000158C364 stw r3, 0(r4) - seg001:000000000158C368 addi r1, r1, 0x80 - seg001:000000000158C36C b loc_18037D8 - sorta makes sense though since the one above this native and GET_PAUSED_MAP_STREAMING_REQUEST are used together often in scripts - - - - - Only used once in the entire game scripts, probably useless. Always returns 0. - - - - - This function is hard-coded to always return 1. - - - - - Something like flush_all_scripts - Most of time comes after NETWORK_END_TUTORIAL_SESSION() or before TERMINATE_THIS_THREAD() - - - - - Examples: - AUDIO::_4E404A9361F75BB2("RADIO_01_CLASS_ROCK", "END_CREDITS_KILL_MICHAEL", 1); - AUDIO::_4E404A9361F75BB2("RADIO_01_CLASS_ROCK", "END_CREDITS_KILL_MICHAEL", 1); - AUDIO::_4E404A9361F75BB2("RADIO_01_CLASS_ROCK", "END_CREDITS_KILL_TREVOR", 1); - AUDIO::_4E404A9361F75BB2("RADIO_01_CLASS_ROCK", "END_CREDITS_SAVE_MICHAEL_TREVOR", 1); - AUDIO::_4E404A9361F75BB2("RADIO_01_CLASS_ROCK", "OFF_ROAD_RADIO_ROCK_LIST", 1); - AUDIO::_4E404A9361F75BB2("RADIO_06_COUNTRY", "MAGDEMO2_RADIO_DINGHY", 1); - AUDIO::_4E404A9361F75BB2("RADIO_16_SILVERLAKE", "SEA_RACE_RADIO_PLAYLIST", 1); - AUDIO::_4E404A9361F75BB2("RADIO_01_CLASS_ROCK", "OFF_ROAD_RADIO_ROCK_LIST", 1); - - - - - The "disabled" variant of _0x5B84D09CEC5209C5. - 0, 1 and 2 used in the scripts. 0 is by far the most common of them. - - - - - console hash: 0x004926A3 - - - - - From the scripts: - GAMEPLAY::_54F157E0336A3822(sub_aa49(a_0), "ForcedStopDirection", v_E); - - - - - DISABLE_* - p0 seems to be Player or int - Dr. Underscore (1/6/18): - p0 is Player. - Called after/near _DISABLE_FIRST_PERSON_CAMERA_THIS_FRAME quite often, but not always. - Also called near DISABLE_CONTROL_ACTION. - - - - - Sets profile setting 935 - - - - - Order of player1 and player2 are not interchangable, it was called for both orders. - - - - - GET_PLAYER_* - Seems to do something with network (?) - PLAYER::_56105E599CAB0EFA(NETWORK::NETWORK_GET_PLAYER_INDEX_FROM_PED(ped)) - - - - - console hash = 0x30F43FE3 - - - - - Jenkins hash: 0x772DA539 - p0 looks like Player or int (found in "am_pi_menu") - Dr. Underscore (1/6/18): - It isn't Player, it is an int. - Only two references anywhere, both in am_pi_menu. - One uses globals, the other one uses a helper function that is passing in the outValue of "STATS::STAT_GET_INT"; I have no clue what is being passed in for the stat hash. - - - - - consoel hash 0xAEB29F98 - - - - - LEADERBOARDS_GET_CACHE_??? - - - - - Has a 3rd param (int) since patch [???]. - - - - - MulleDK19: This function is hard-coded to always return 0. - - - - - Same behavior as GET_LOCAL_PLAYER_AIM_STATE but only used on the PC version. - - - - - may be 0x6CDAA7D2 - sfink: related to: NETWORK_BAIL - NETWORK_BAIL_TRANSITION - NETWORK_JOIN_GROUP_ACTIVITY - NETWORK_JOIN_TRANSITION - NETWORK_LAUNCH_TRANSITION - NETWORK_SESSION_HOST - NETWORK_SESSION_HOST_CLOSED - NETWORK_SESSION_HOST_FRIENDS_ONLY - NETWORK_SESSION_HOST_SINGLE_PLAYER - NETWORK_SESSION_VOICE_LEAVE - - - - - NETWORK_IS_TRANSITION_??? - - - - - One of the first things it does is get the players ped. - Then it calls a function that is used in some tasks and ped based functions. - - - - - Disables some other rendering (internal) - - - - - Dr. Underscore (1/6/18): - Seems to return a value 0-2. - - - - - Seems to return values between -1 and 1 for controls like gas and steering. - 0, 1 and 2 used in the scripts. 0 is by far the most common of them. - - - - - Only called once in the scripts. - Related to weapon objects. - - - - - This native is used along with these two natives: [`0xa356990e161c9e65`](https://runtime.fivem.net/doc/reference.html#_0xA356990E161C9E65) and [`0x1c4fc5752bcd8e48`](https://runtime.fivem.net/doc/reference.html#_0x1C4FC5752BCD8E48). - This native sets the colors for the golf putting grid. the 'min...' values are for the lower areas that the grid covers, the 'max...' values are for the higher areas that the grid covers, all remaining values are for the 'normal' ground height. - All those natives combined they will output something like this: <https://i.imgur.com/TC6cku6.png> - Old description: - Only called in golf and golf_mp - parameters used are - GRAPHICS::\_0x5CE62918F8D703C7(255, 0, 0, 64, 255, 255, 255, 5, 255, 255, 0, 64); - - red value for the lower level - green value for the lower level - blue value for the lower level - alpha value for the lower level - red value for the normal level - green value for the normal level - blue value for the normal level - alpha value for the normal level - red value for the upper level - green value for the upper level - blue value for the upper level - alpha value for the upper level - - - - longest time being ilde? - - - - - NETWORK_IS_TRANSITION_??? - - - - - example from completionpercentage_controller.ysc.c4 - if (STATS::_5EAD2BF6484852E4()) { - GAMEPLAY::SET_BIT(g_17b95._f20df._ff10, 15); - STATS::_11FF1C80276097ED(0xe9ec4dd1, 200, 0); - } - - - - - SET_PLAYERS_* - - - - - Appears once in "re_dealgonewrong" - - - - - Console Hash: 0x37C388DB - - - - - Something with Social Club or online. - - - - - Unknown. Called after creating a checkpoint (type: 51) in the creators. - - - - - From the scripts: - OBJECT::_616093EC6B139DD9(PLAYER::PLAYER_ID(), ${pickup_portable_package}, 0); - OBJECT::_616093EC6B139DD9(PLAYER::PLAYER_ID(), ${pickup_portable_package}, 0); - OBJECT::_616093EC6B139DD9(PLAYER::PLAYER_ID(), ${pickup_portable_package}, 1); - OBJECT::_616093EC6B139DD9(PLAYER::PLAYER_ID(), ${pickup_portable_package}, 0); - OBJECT::_616093EC6B139DD9(PLAYER::PLAYER_ID(), ${pickup_armour_standard}, 0); - OBJECT::_616093EC6B139DD9(PLAYER::PLAYER_ID(), ${pickup_armour_standard}, 1); - SET_PLAYER_P* - - - - - Used only once (am_mp_property_int) - ped was PLAYER_PED_ID() - - - - - this is lightly associated with the 2 above meaning it accesses a variable that them 2 access also - - - - - possibly called: - ADD_DOOR_EXPERIMENTAL_MATRIX - - - - - Something related to clearing the ped because always used with CLEAR_PED_WETNESS, CLEAR_PED_BLOOD_DAMAGE and RESET_PED_VISIBLE_DAMAGE. - - - - - IS_PLAYER_* - - - - - Something related to vehicle lean? (References CVehicleLeanHelper) - - - - - Normally returns true. Returns false briefly whilst getting into a plane. This is probably a check to see if the ped model and all its components/drawables are properly loaded yet. - - - - - MulleDK19: This function is hard-coded to always return 0. - - - - - example: - if (GAMEPLAY::_684A41975F077262()) { - (a_0) = GAMEPLAY::_ABB2FA71C83A1B72(); - } else { - (a_0) = -1; - } - - - - - p0 seems to be Ped - Dr. Underscore (1/6/18): - Has to do something with vehicles and teams. (same teams don't jack each other out of vehicles?) - - - - - what does it do? - - - - - Called in freemode related scripts but not freemode itself. - - - - - I put the argument as 'playerName' as when it's called in freemode.c TU27 X360 scripts. It's given a var that has GET_PLAYER_NAME stored in it via StringCopy. - - - - - Possible values: - act_cinema - am_mp_carwash_launch - am_mp_carwash_control - am_mp_property_ext - chop - fairgroundHub - launcher_BasejumpHeli - launcher_BasejumpPack - launcher_CarWash - launcher_golf - launcher_Hunting_Ambient - launcher_MrsPhilips - launcher_OffroadRacing - launcher_pilotschool - launcher_Racing - launcher_rampage - launcher_rampage - launcher_range - launcher_stunts - launcher_stunts - launcher_tennis - launcher_Tonya - launcher_Triathlon - launcher_Yoga - ob_mp_bed_low - ob_mp_bed_med - - - - - Console Hash: 0x60E29B78 - - - - - Looks like a cousin of above function _6D6840CEE8845831 as it was found among them. Must be similar - Here are possible values of argument - - "ob_tv" - "launcher_Darts" - - - - - sfink: sets bit in vehicle's structure, used by maintransition, fm_mission_controller, mission_race and a couple of other scripts. see dissassembly: - CVehicle *__fastcall sub_140CDAA10(signed int a1, char a2) - { - CVehicle *result; // rax@1 - result = EntityAsCVehicle(a1); - if ( result ) - { - result->field_886 &= 0xEFu; - result->field_886 |= 16 * (a2 & 1); - } - return result; - } - - - - - Seems to have the same functionality as REGISTER_TEXT_LABEL_TO_SAVE? - GAMEPLAY::_6F7794F28C6B2535(&a_0._f1, "tlPlateText"); - GAMEPLAY::_6F7794F28C6B2535(&a_0._f1C, "tlPlateText_pending"); - GAMEPLAY::_6F7794F28C6B2535(&a_0._f10B, "tlCarAppPlateText"); - "tl" prefix sounds like "Text Label" - - - - - MulleDK19: This function is hard-coded to always return 0. - - - - - This function is hard-coded to always return 1. Крч какая-то хуйня. - - - - - - if (GAMEPLAY::_6FDDF453C0C756EC() || GAMEPLAY::IS_PC_VERSION()) { - - - - - Used in am_mp_property_ext and am_mp_property_int - - - - - If the function fails, returns "Unknown". - Could be task (sequence) name. Needs more research. - - - - - It's 100% an IS_CUTSCENE_* native. - - - - - Probably a bool, returns true if the specified network id is controlled by someone else. - If you have control over the entity corresponding to the netId then this will return false (0); - - The network id for an object or entity. - Probably a bool, returns 1 if you don't have control over the netId entity. - - - - Last named native above this one is `TRACK_VEHICLE_VISIBILITY` and first named native below is `UNCUFF_PED`. - Unknown what it does, couldn't find good examples in the decompiled scripts. - - : - : - : - - - - Appears to be a HIDE_* native. - - - - - NETWORK_CAN_R??? or NETWORK_CAN_S??? - - - - - AUDIO::_733ADF241531E5C2("inTunnel", 1.0); - AUDIO::_733ADF241531E5C2("inTunnel", 0.0); - I do not know as of yet what this does, but this was found in the scripts. - - - - - NETWORK_IS_* - - - - - MulleDK19: This function is hard-coded to always return 0. - - - - - bufferSize is 35 in the scripts. - - - - - 6 calls in the b617d scripts, removed identical lines: - AUDIO::_774BD811F656A122("RADIO_01_CLASS_ROCK", 1); - AUDIO::_774BD811F656A122(AUDIO::GET_RADIO_STATION_NAME(10), 0); - AUDIO::_774BD811F656A122(AUDIO::GET_RADIO_STATION_NAME(10), 1); - - - - - MulleDK19: This function is hard-coded to always return 1. - - - - - p1: "MP_FEMALE_ACTION" found multiple times in the b617d scripts. - Console Hash: 0x83BAE814 - - - - - Normally returns true. Returns false briefly whilst putting on a helmet after getting onto a motorbike. Not sure what that's about. - - - - - Related to cutscene entities. Unsure about the use. - - - - - Used for cash gifts - Console Hash - - - - - From the scripts: - AUDIO::_7CDC8C3B89F661B3(PLAYER::PLAYER_PED_ID(), GAMEPLAY::GET_HASH_KEY("PAIGE_PVG")); - AUDIO::_7CDC8C3B89F661B3(PLAYER::PLAYER_PED_ID(), GAMEPLAY::GET_HASH_KEY("TALINA_PVG")); - AUDIO::_7CDC8C3B89F661B3(PLAYER::PLAYER_PED_ID(), GAMEPLAY::GET_HASH_KEY("FEMALE_LOST_BLACK_PVG")); - AUDIO::_7CDC8C3B89F661B3(PLAYER::PLAYER_PED_ID(), GAMEPLAY::GET_HASH_KEY("FEMALE_LOST_WHITE_PVG")); - - - - - what does this native do? - Here's some pseudocode of the internal setter function: - __int64 __fastcall sub_140CD86B4(signed int vehicle, char a2, char a3) - { - char v3; // di@1 - char v4; // bl@1 - __int64 result; // rax@1 - __int16 v6; // cx@3 - v3 = a3; - v4 = a2; - result = GetVehicleAddress(vehicle); - if ( result ) - { - if ( v3 || (v6 = *(_WORD *)(result + 0xDA), (v6 & 0xFu) - 6 <= 1) ) - { - *(_BYTE *)(result + 0x89B) &= 0xDFu; - *(_BYTE *)(result + 0x89B) |= 32 * (v4 & 1); - } - } - return result; - } - Now it's time for you to find out :P - - - - - i found this function just like VEHICLE::TRACK_VEHICLE_VISIBILITY - example: - PED::_0x7D7A2E43E74E2EB8(ped);// TRACK_PED_VISIBILITY - if (PED::IS_TRACKED_PED_VISIBLE(ped)) - { - } - - - - - Something to do with phone cameras. - startup.c4: - void sub_2a3d() { - UNK2::_7E2BD3EF6C205F09("No_Filter", 1); - UNK2::_7E2BD3EF6C205F09("phone_cam1", 1); - UNK2::_7E2BD3EF6C205F09("phone_cam2", 1); - UNK2::_7E2BD3EF6C205F09("phone_cam3", 1); - UNK2::_7E2BD3EF6C205F09("phone_cam4", 1); - UNK2::_7E2BD3EF6C205F09("phone_cam5", 1); - UNK2::_7E2BD3EF6C205F09("phone_cam6", 1); - UNK2::_7E2BD3EF6C205F09("phone_cam7", 1); - UNK2::_7E2BD3EF6C205F09("phone_cam9", 1); - UNK2::_7E2BD3EF6C205F09("phone_cam12", 0); - } - - - - - _PLAYSTATS_ROB_ARMOURD_TRUCK - - - - - 0, 1 and 2 used in the scripts. 0 is by far the most common of them. - - - - - gets some camera fov - - - - - UI::_817B86108EB94E51(1, &g_189F36._f10CD1[0 -- [[16]] ], &g_189F36._f10CD1[1 -- [[16]] ], &g_189F36._f10CD1[2 -- [[16]] ], &g_189F36._f10CD1[3 -- [[16]] ], &g_189F36._f10CD1[4 -- [[16]] ], &g_189F36._f10CD1[5 -- [[16]] ], &g_189F36._f10CD1[6 -- [[16]] ], &g_189F36._f10CD1[7 -- [[16]] ]); - - - - - "GET_OBJ_ENTITY" seems highly unlikely. - - - - - Only found 2 times in decompiled scripts. Not a whole lot to go off of. - GAMEPLAY::_8269816F6CFD40F8(&a_0._f1F5A._f6[0 -- [[8]] ], "TEMPSTAT_LABEL"); // gets saved in a struct called "g_SaveData_STRING_ScriptSaves" - GAMEPLAY::_8269816F6CFD40F8(&a_0._f4B4[v_1A -- [[8]] ], &v_5); // where v_5 is "Name0" thru "Name9", gets saved in a struct called "OUTFIT_Name" - - - - - HUD_COLOUR_CONTROLLER_CHOP = 174; - UI::GET_HUD_COLOUR(174, &v_6, &v_7, &v_8, &v_9); - CONTROLS::_8290252FFF36ACB5(0, v_6, v_7, v_8); - - - - - Saves a JSON file? It might even be saving it to the Rockstar Cloud, but I have no way of verifying this - "shrinkletter.c4", line ~378: - DATAFILE::DATAFILE_CREATE(); - v_5 = DATAFILE::_GET_ROOT_OBJECT(); - DATAFILE::_OBJECT_VALUE_ADD_INTEGER(v_5, "in", a_2); - DATAFILE::_OBJECT_VALUE_ADD_STRING(v_5, "st", &a_2._f1); - DATAFILE::_OBJECT_VALUE_ADD_STRING(v_5, "mp", &a_2._f2); - DATAFILE::_OBJECT_VALUE_ADD_STRING(v_5, "ms", &a_2._f3); - DATAFILE::_OBJECT_VALUE_ADD_STRING(v_5, "sc", &a_2._f5); - DATAFILE::_OBJECT_VALUE_ADD_STRING(v_5, "pr", &a_2._f6); - DATAFILE::_OBJECT_VALUE_ADD_STRING(v_5, "fa", &a_2._f7); - DATAFILE::_OBJECT_VALUE_ADD_STRING(v_5, "sm", &a_2._f8); - DATAFILE::_OBJECT_VALUE_ADD_STRING(v_5, "kp", &a_2._f9); - DATAFILE::_OBJECT_VALUE_ADD_STRING(v_5, "sv", &a_2._fA); - DATAFILE::_OBJECT_VALUE_ADD_STRING(v_5, "yo", &a_2._fB); - DATAFILE::_OBJECT_VALUE_ADD_STRING(v_5, "fi", &a_2._fC); - DATAFILE::_OBJECT_VALUE_ADD_STRING(v_5, "rc", &a_2._fD); - DATAFILE::_OBJECT_VALUE_ADD_STRING(v_5, "co", &a_2._fE); - DATAFILE::_OBJECT_VALUE_ADD_INTEGER(v_5, "su", a_2._fF); - DATAFILE::_83BCCE3224735F05("gta5/psych/index.json"); // saves the file? - - - - - sfink: from scripts: - func_720(socialclub::_0x8416FE4E4629D7D7("bIgnoreCheaterOverride")); - func_719(socialclub::_0x8416FE4E4629D7D7("bIgnoreBadSportOverride")); - - - - - MulleDK19: This function is hard-coded to always return 0. - - - - - SET_PED_PATH_* - Could be the move speed on the path. Needs testing. - Default is 1.0 and maximum is 10.0 - - - - - SET_LOCAL_PLAYER_* - - - - - Something to do with time, used in context: - NETWORK::GET_TIME_DIFFERENCE(NETWORK::_89023FBBF9200E9F(), ... ) - sfink: returns the same value as NETWORK::GET_NETWORK_TIME in freemode. - - - - - One call found in the b617d scripts: - AUDIO::_8A694D7A68F8DC38(NETWORK::NET_TO_PED(l_3989._f26F[0 -- [[1]] ]), "CONV_INTERRUPT_QUIT_IT", "LESTER"); - - - - - MulleDK19: This function is hard-coded to always return 0. - - - - - console hash: 0x19EC0001 - - - - - GAMEPLAY::_8D74E26F54B4E5C3(""); - - - - - Example of usage: - v_2 = SCRIPT::_30B4FA1C82DD4B9F(); // int _GET_ID_OF_NEXT_SCRIPT_IN_ENUMERATION() - CUTSCENE::_8D9DF6ECA8768583(v_2); - - - - - Example, only occurrence in the scripts: - UI::_8EFCCF6EC66D85E4(&v_23, &v_13, &v_13, 1, v_34); - - - - - No observed effect. - - - - - Appears only in fm_mission_controller and used only 3 times. - ped was always PLAYER_PED_ID() - p1 was always true - p2 was always true - - - - - SET_GPS_??? - - - - - Dr. Underscore (1/6/18): - Seems to return a value 0-2. - - - - - return bool according to scripts - - - - - bool? - am_crate_drop.c - <...> - if (network::_network_are_ros_available()) - { - if (network::_0x91B87C55093DE351()) - <..> - - - - - Both coordinates are from objects in the decompiled scripts. - Native related to [\_0xECDC202B25E5CF48](#_0xECDC202B25E5CF48) p1 value. The only weapon hash used in the decompiled scripts is weapon_air_defence_gun. These two natives are used by the yacht script, decompiled scripts suggest it and the weapon hash used (valkyrie's rockets) are also used by yachts. - - X coordinate - Y coordinate - Z coordinate - Unknown float 150.0 is used in freemode script. - X coordinate - Y coordinate - Z coordinate - weapon_air_defence_gun and 0 are used in the decompiled scripts. - Seems to be some sort of handle, result is += 1 any time this native is called. - - - - I can 100% confirm this is some kind of START_* native. - Next character in the name is either C, D or E. - Used only once in the scripts (benchmark.ysc). - - - - - Unknown. - Seems to return either 0, 1, or -1. - - - - - MulleDK19: This function is hard-coded to always return 0. - - - - - NETWORK_IS_* - - - - - Needs more research. Possibly used to calculate the "mask" when calling "STAT_SET_MASKED_INT"? - - - - - in the decompiled scripts, seems to be always called on the vehicle right after being attached to a trailer. - - - - - SET_VEHICLE_DOORS_LOCKED_FOR_* - - - - - Example gotten from chinese2.c4 - VEHICLE::_9A75585FB2E54FAD(2004.4471435546875, 3076.806640625, 46.60689926147461, 10.0); - - - - - RELEASE_??? - I say RELEASE_???, as in IDA this native calls the same function as - -'RELEASE_MISSION_AUDIO_BANK()'. - -'RELEASE_AMBIENT_AUDIO_BANK()'. - -'RELEASE_SCRIPT_AUDIO_BANK()'. - However 'RELEASE_NAMED_SCRIPT_AUDIO_BANK' does not use the same function. So may be, 'RELEASE_???_AUDIO_BANK()'? Doubt it. - Console Hash: 0xE67446E9 - - - - - Console Hash: 0x50CDB295 - - - - - Gets some kind of data related to missions like the online player created races n stuff - - - - - Only appeared in Golf & Golf_mp. Parameters were all ptrs - - - - - Found in the b617d scripts: - PED::_9DBA107B4937F809(v_7, "trevor_heist_cover_2h"); - - - - - Only found 4 times in Rockstar scripts. - Clearly has something to do with Cutscenes. - - - - - UI::0x7AD67C95("Gallery"); - UI::0x7AD67C95("Missions"); - UI::0x7AD67C95("General"); - UI::0x7AD67C95("Playlists"); - - - - - Disconnects you from the session, and starts loading single player, however you still remain connected to the server (only if you're the host, if you're not then you also (most likely) get disconnected from the server) and other players will not be able to join until you exit the game. - If you're already in SP then it'll re-load singleplayer. - You might need to DoScreenFadeIn and ShutdownLoadingScreen otherwise you probably won't end up loading into SP at all. - Somewhat related note: opening the pause menu after loading into this 'singleplayer' mode crashes the game. - - always seems to be 1 - - - - MulleDK19: This function is hard-coded to always return 0. - - - - - MulleDK19: This function is hard-coded to always return 1. - - - - - Needs more research. If the "phone_cam12" filter is applied, this function is called with "TRUE"; otherwise, "FALSE". - Example (XBOX 360): - // check current filter selection - if (GAMEPLAY::ARE_STRINGS_EQUAL(getElem(g_2471024, &l_17, 4), "phone_cam12") != 0) - { - MOBILE::_0xC273BB4D(0); // FALSE - } - else - { - MOBILE::_0xC273BB4D(1); // TRUE - } - - - - - This native enables/disables the gold putting grid display (<https://i.imgur.com/TC6cku6.png>). - This requires these two natives to be called as well to configure the grid: [`0x1c4fc5752bcd8e48`](https://runtime.fivem.net/doc/reference.html#_0x1C4FC5752BCD8E48) and [`0x5ce62918f8d703c7`](https://runtime.fivem.net/doc/reference.html#_0x5CE62918F8D703C7). - - Enables or disables the golf putting grid display. - - - - Only called once in the scripts: - if (sub_1abd() && (!PED::_A3F3564A5B3646C0(l_8C))) { - if (sub_52e3("RESNA_CELLR", 0)) { - PED::SET_PED_CAN_PLAY_GESTURE_ANIMS(l_8C, 1); - PED::SET_PED_CAN_PLAY_AMBIENT_ANIMS(l_8C, 1); - PED::SET_PED_CAN_PLAY_VISEME_ANIMS(l_8C, 1, 0); - l_184 += 1; - } - } - - - - - NOTE: 'p1' might be some kind of array. - - - - - Dr. Underscore (1/6/18): - Only one instances in two scripts. (cellphone_controller, maintransition) - - - - - Called 4 times in the b617d scripts: - GAMEPLAY::_A74802FB8D0B7814("CONTRAILS", 0); - - - - - STATS::0xE3247582(0); - STATS::0xE3247582(1); - STATS::0xE3247582(2); - STATS::0xE3247582(3); - STATS::0xE3247582(4); - STATS::0xE3247582(5); - STATS::0xE3247582(6); - - - - - NETWORK_OVERRIDE_??? - - - - - Found in scripts: - if (AI::_A7FFBA498E4AAF67(l_9BC, "Run")) { - if (AI::_A7FFBA498E4AAF67(l_9BC, "Escape")) { - - - - - p1 always false. - - - - - console hash: 0xFD0F7EDD - - - - - This has been found in use in the decompiled files. - - - - - gets 2 floats from the CNetGamePlayer of p0 and stores them in p1 and p2. - Possibly waypoint? - - - - - Possible p0 values: - "prologue" - "Prologue_Main" - - - - - Exemple of use(carmod_shop.c4) - INTERIOR::_AF348AFCB575A441("V_CarModRoom"); - - - - - Examples: - AI::_B0A6CFD2C69C1088(PLAYER::PLAYER_PED_ID(), "isFirstPerson", 0); - AI::_B0A6CFD2C69C1088(PLAYER::PLAYER_PED_ID(), "isFirstPerson", 1); - AI::_B0A6CFD2C69C1088(PLAYER::PLAYER_PED_ID(), "isBlocked", sub_179027()); - - - - - Has something to do with player switch. - Only possible values: - - "CSM_ST_BOX3x3" - - - - - Called in decompiled scripts as alternative to _SET_PED_ENEMY_AI_BLIP in an else, when the additional parameter p3 is not -1 - - - - - 12 matches across 4 scripts. All 4 scripts were job creators. - type ranged from 0 - 2. - p4 was always 0.2f. Likely scale. - assuming p5 - p8 is RGBA, the graphic is always yellow (255, 255, 0, 255). - Tested but noticed nothing. - - - - - This native doesn't seem to do anything, might be a debug-only native. - Confirmed, it is a debug native. - - - - - No observed effect. - - - - - This line found 48 times in the scripts: - GAMEPLAY::_B335F761606DB47C(&v_4, &v_7, a_0, v_A); - - - - - This function is hard-coded to always return 1. - - - - - PLAYER::0xBF6993C7(rPtr((&l_122) + 71)); // Found in decompilation - *** - In "am_hold_up.ysc" used once: - l_8d._f47 = GAMEPLAY::GET_RANDOM_FLOAT_IN_RANGE(18.0, 28.0); - PLAYER::_B45EFF719D8427A6((l_8d._f47)); - - - - - This native is called 3 times in the decompiled scripts. Weapons hashes used are: weapon_railgun, weapon_proxmine and weapon_minigun. - - - - - Found in the b617d scripts, duplicates removed: - AUDIO::_B4BBFD9CD8B3922B("V_CARSHOWROOM_PS_WINDOW_UNBROKEN"); - AUDIO::_B4BBFD9CD8B3922B("V_CIA_PS_WINDOW_UNBROKEN"); - AUDIO::_B4BBFD9CD8B3922B("V_DLC_HEIST_APARTMENT_DOOR_CLOSED"); - AUDIO::_B4BBFD9CD8B3922B("V_FINALEBANK_PS_VAULT_INTACT"); - AUDIO::_B4BBFD9CD8B3922B("V_MICHAEL_PS_BATHROOM_WITH_WINDOW"); - - - - - Only used once in the scripts - weapon::_0xB4C8D77C80C0421E(Local_888[3 -- [[33]] ], -1082130432); - The code following this relates to manually triggering an RPG rocket (creating the object, the particle fx and sound) - - - - - "Can request assets for cutscene entity"? (found in decompiled scripts) - - - - - GRAPHICS::_0xB7ED70C49521A61D(9123); - GRAPHICS::SET_STREAMED_TEXTURE_DICT_AS_NO_LONGER_NEEDED("MPMissMarkers256"); - - - - - Old Gen: 0x47D6004E - Disables something. Used only once in R* scripts (freemode.ysc). - - - - - if (!$B8B52E498014F5B0(PLAYER::PLAYER_PED_ID())) { - - - - - Seem to return bool - Dr. Underscore (1/6/18): - It does return bool. - - - - - Every p2 - p5 occurrence was 0f. - - - - - var num3 = PLAYER::GET_PLAYER_PED(l_2171); // proof l_2171 is a player - var num17 = PLAYER::0x9DF75B2A(l_2171, 100, 0); // l_2171 - .ysc: - if (PLAYER::GET_PLAYER_WANTED_LEVEL(l_6EF) < v_4) { // l_6EF is a player - PLAYER::SET_PLAYER_WANTED_LEVEL(l_6EF, v_4, 0); // l_6EF - PLAYER::SET_PLAYER_WANTED_LEVEL_NOW(l_6EF, 0); // l_6EF - } else { - PLAYER::_4669B3ED80F24B4E(l_6EF); // l_6EF - UI::_BA8D65C1C65702E5(1); - a_0 = 1; - } - if (l_4B24[l_6F2 -- [[156]] ]._f8C != PLAYER::_BC0753C9CA14B506(l_6EF, 100, 0)) { // l_6EF - l_4B24[l_6F2 -- [[156]] ]._f8C = PLAYER::_BC0753C9CA14B506(l_6EF, 100, 0); // l_6EF - } - Both was taken from fm_mission_controller - GET_PLAYER_* - - - - - Most likely ROPE_ATTACH_* - - - - - Seems to only appear in scripts used in Singleplayer. - AI_PHONE_ARGS is a hash collision!!! - Always used like this in scripts - PLAYER::_BC9490CA15AEA8FB(PLAYER::PLAYER_ID()); - - - - - MulleDK19: This function is hard-coded to always return 1. - - - - - This function is hard-coded to always return 0. - - - - - respawn player - - - - - Something to do with timecycles. - - - - - Use _GET_VEHICLE_MOD_DATA for modData - Appears to be a GET_DLC_VEHICLE_MOD_* native. - - - - - same call as VEHICLE::_0x0F3B4D4E43177236 - - - - - Seems to return time in vector3 - - - - - CAM::_C2EAE3FB8CDBED31("SHAKE_CAM_medium", "medium", "", 0.5f); - - - - - - This is called after SET_ALL_RANDOM_PEDS_FLEE_THIS_FRAME - hash collision - 0xc3376f42b1faccc6, 0xd5d0d2853191399c, // set_areas_generator_orientation - - - - - - This is called after SET_ALL_RANDOM_PEDS_FLEE_THIS_FRAME - hash collision - 0xc3376f42b1faccc6, 0xd5d0d2853191399c, // set_areas_generator_orientation - - - - - This seems to edit the water wave, intensity around your current location. - 0.0f = Normal - 1.0f = So Calm and Smooth, a boat will stay still. - 3.0f = Really Intense. - - - - - NETWORK_IS_TRANSITION_??? - - - - - Interesting fact: A hash collision for this is RESET_JETPACK_MODEL_SETTINGS - - - - - Toggles a value (bool) for cutscenes. - - - - - Often called after _REMOVE_LOADING_PROMPT. Unsure what exactly it does, but It references busy_spinner, I can only guess its freeing the busy_spinner scaleform from memory - - - - - Found in "director_mode", "fm_bj_race_controler", "fm_deathmatch_controler", "fm_impromptu_dm_controler", "fm_race_controler", "gb_deathmatch". - - - - - rerere - - - - - Only call found in the b617d scripts: - AUDIO::_CADA5A0D0702381E("BACK", "HUD_FREEMODE_SOUNDSET"); - - - - - RESET_* - - - - - p4 seems to vary from 0 to 3. - - - - - what does this do? - - - - - Maybe gets gameplay cam near clip? - - - - - Similar to 0xDDC635D5B3262C56. Enable? - - - - - x360 Hash: 0xF637166E - - - - - SET_TV_??? - - - - - "SwitchHUDFranklinOut", - "SwitchHUDMichaelOut", - "SwitchHUDOut", - "SwitchHUDTrevorOut", - "SwitchOpenFranklinOut", - "SwitchOpenMichaelIn", - "SwitchOpenNeutral" - - - - - 1.0.335.2, 1.0.350.1/2, 1.0.372.2, 1.0.393.2, 1.0.393.4, 1.0.463.1; - - - - - Decompiled scripts have this listed as `FILES::_GET_NUM_DLC_PED_PROPS_UNK`, but that seems wrong. - Has something to do with ped (dlc) helmet props. - This native returns 1/true when the player helmet has a visor (there is another prop index for the same helmet with closed/opened visor variant) that can be toggled, 0/false if there's no alternative version with a visor for this helmet prop. - So something like `_DOES_HELMET_HASH_HAVE_A_VISOR`, anyone that knows the joaat hash? - Decompiled scripts handle this as an int. But the result is always 0 or 1 (after testing every prop hash on freemode peds). So might actually be a bool? - ``` - iVar16 = PED::GET_PED_PROP_INDEX(PLAYER::PLAYER_PED_ID(), 0); - iVar17 = PED::GET_PED_PROP_TEXTURE_INDEX(PLAYER::PLAYER_PED_ID(), 0); - iVar18 = FILES::GET_HASH_NAME_FOR_PROP(PLAYER::PLAYER_PED_ID(), 0, iVar16, iVar17); - if (FILES::_GET_NUM_DLC_PED_PROPS_UNK(iVar18) > 0) // _0xD40AAC51E8E4C663 - { - HUD::BEGIN_TEXT_COMMAND_DISPLAY_HELP("VISOR_TOGGLE"); - HUD::END_TEXT_COMMAND_DISPLAY_HELP(0, 0, true, 6000); - iVar15++; - func_12660(7668, iVar15, -1, 1); - MISC::SET_BIT(&(Global_2512581.f_1710), 24); - } - ``` - - Ped helmet prop hash - This native returns 1 when the player helmet has a visor (there is another prop index for the same helmet with closed/opened visor variant) that can be toggled. 0 if there's no alternative version with a visor for this helmet prop. - - - - Only used like this: - if (VEHICLE::_D4C4642CB7F50B5D(ENTITY::GET_VEHICLE_INDEX_FROM_ENTITY_INDEX(v_3))) { sub_157e9c(g_40001._f1868, 0); - } - - - - - p0 - PLAYER::PLAYER_PED_ID(); - p1 - "Phase", "Wobble", "x_axis","y_axis","introphase","speed". - p2 - From what i can see it goes up to 1f (maybe). - -LcGamingHD - Example: AI::_D5BB4025AE449A4E(PLAYER::PLAYER_PED_ID(), "Phase", 0.5); - - - - - Something related to the environmental effects natives. - In the "agency_heist3b" script, p1 - p3 are always under 100 - usually they are {87, 81, 68}. If SET_PED_ENVEFF_SCALE is set to 0.65 (instead of the usual 1.0), they use {74, 69, 60} - - - - - Only one match in the scripts: - GRAPHICS::_D7021272EB0A451E("int_carrier_hanger"); - - - - - Unloads GROUP_MAP (GTAO/MP) DLC data and loads GROUP_MAP_SP DLC. Neither are loaded by default, 0888C3502DBBEEF5 is a cognate to this function and loads MP DLC (and unloads SP DLC by extension). - The original (and wrong) definition is below: - This unload the GTA:O DLC map parts (like high end garages/apartments). - Works in singleplayer. - console hash: 0x8BF60FC3 - - - - - Unloads GROUP_MAP (GTAO/MP) DLC data and loads GROUP_MAP_SP DLC. Neither are loaded by default, 0888C3502DBBEEF5 is a cognate to this function and loads MP DLC (and unloads SP DLC by extension). - The original (and wrong) definition is below: - This unload the GTA:O DLC map parts (like high end garages/apartments). - Works in singleplayer. - console hash: 0x8BF60FC3 - - - - - 4 matches across 2 scripts. - appcamera: - called after UI::HIDE_HUD_AND_RADAR_THIS_FRAME() and before GRAPHICS::0x108F36CC(); - cellphone_controller: - called after GRAPHICS::0xE9F2B68F(0, 0) and before GRAPHICS::0x108F36CC(); - - - - - In scripts it's used with a var, that is used elsewhere in a check regarding if the given networkHandle is valid. - - - - - Set profile setting 866 - - - - - REQUEST_VEHICLE_* - - - - - Related to locking the vehicle or something similar. - In the decompiled scripts, its always called after - VEHICLE::_SET_EXCLUSIVE_DRIVER(a_0, 0, 0); - VEHICLE::SET_VEHICLE_DOORS_LOCKED_FOR_ALL_PLAYERS(a_0, 1); - VEHICLE::SET_VEHICLE_DOORS_LOCKED_FOR_PLAYER(a_0, PLAYER::PLAYER_ID(), 0); - - - - - probably 0x3461981 on console - - - - - Has something to do with police. - - - - - SET_ENTITY_* - x360 Hash: 0xA0466A69 - Only called within 1 script for x360. 'fm_mission_controller' and it used on an object. - Ran after these 2 natives, - set_object_targettable(uParam0, 0); - set_entity_invincible(uParam0, 1); - - - - - 2 occurrences in agency_heist3a. p1 was 0.7f then 0.4f. - - - - - Tune Backwards... ? - - - - - Similar to 0xD01005D2BA2EB778. Disable? - - - - - Dr. Underscore (1/6/18): - Most references of this native come from the creator scripts. (creator, fm_capture_creator, fm_deathmatch_creator, fm_lts_creator, fm_race_creator). - Seems to have something to do with initializing/destroying creator shit. - - - - - Scripts use 0.2, 0.5 and 1.0. - SET_DRIVER_* - - - - - Outputs 2 Vector3's. - Scripts check if out2.x - out1.x > someshit.x - Could be suspension related, as in max suspension height and min suspension height, considering the natives location. - - - - - p1 always false. - - - - - This function is hard-coded to always return 1. - - - - - Used with IS_LOOK_INVERTED() and negates its affect. - -- - Not sure how the person above got that description, but here's an actual example: - if (CONTROLS::_GET_LAST_INPUT_METHOD(2)) { - if (a_5) { - if (CONTROLS::IS_LOOK_INVERTED()) { - a_3 *= -1; - } - if (CONTROLS::_E1615EC03B3BB4FD()) { - a_3 *= -1; - } - } - } - - - - - REMOTE_VEHICLE_* - - - - - IS_* - - - - - UI::GET_CURRENT_WEBSITE_PAGE_ID(int websiteID) - returns the current website page sometimes returns false - - - - - sets something to 1 - - - - - Sets an unknown value related to timecycles. - - - - - No observed effect. - - - - - GET_VEHICLE_* - - - - - This function is hard-coded to always return 0. - - - - - Vehicle must be a boat. - - - - - MulleDK19: This function is hard-coded to always return 1. - - - - - example from scripts: - unk_0xE0C28DB5(0,Global_2398291.imm_726,1); - that global is for ps3/xbox not pc - no idea what this does does - - - - - SET_PED_* - Has most likely to do with some shooting attributes as it sets the float which is in the same range as shootRate. - - - - - _push_scaleform_movie_function(iLocal_117, "SET_TEXT"); - if (bParam0) - { - _0xEC52C631A1831C03(2); - } - else - { - _0xEC52C631A1831C03(1); - } - _pop_scaleform_movie_function_void(); - - - - - This function is hard-coded to always return 0. - - - - - Disables frontend (works in custom frontends, not sure about regular pause menu) navigation keys on keyboard. Not sure about controller. Does not disable mouse controls. No need to call this every tick. - To enable the keys again, use [`0x14621BB1DF14E2B2`](#_0x14621BB1DF14E2B2). - - - - - Hides the hud element displayed by _0x523A590C1A3CC0D3 - - - - - interprets the result of CAM::_0x19CAFA3C87F7C2FF() - example: // checks if you're currently in first person - if ((CAM::_EE778F8C7E1142E2(CAM::_19CAFA3C87F7C2FF()) == 4) && (!__463_$28ED382849B17AFC())) { - UI::_FDEC055AB549E328(); - UI::_SET_NOTIFICATION_TEXT_ENTRY("REC_FEED_WAR"); - l_CE[0 -- [[1]] ] = UI::_DRAW_NOTIFICATION(0, 1); - } - - - - - Some kind of flags. - - - - - dont know what this native does but im storing some documentation here - _NETWORK_VOICE_CONNECT_TO_PLAYER - _NETWORK_GET_GAMER_STATUS - _NETWORK_HAS_TRANSITION_INVITE_BEEN_ACKED - _NETWORK_SEND_PRESENCE_INVITE - _NETWORK_SEND_PRESENCE_TRANSITION_INVITE - _NETWORK_CHECK_DATA_MANAGER_SUCCEEDED_FOR_HANDLE - _NETWORK_CHECK_DATA_MANAGER_FOR_HANDLE - _NETWORK_CAN_COMMUNICATE_WITH_GAMER - _NETWORK_CRC_HASH_CHECK_EVENT - - - - - Adds some kind of shadow to the vehicle. - - - - - IS_OBJECT_??? - - - - - Only 1 occurrence. p1 was 2. - - - - - Sets profile setting 933 - - - - - LEADERBOARDS2_READ_BY_??? - - - - - 2 calls found in the b617d scripts: - AUDIO::_F1F8157B8C3F171C(l_A42, "Franklin_Bike_Rev", "BIG_SCORE_3A_SOUNDS"); - AUDIO::_F1F8157B8C3F171C(l_166, "Trevor_Revs_Off", "PALETO_SCORE_SETUP_SOUNDS"); - - - - - toggle was always 0 except in one instance (b678). - The one time this is set to true seems to do with when you fail the mission. - - - - - MulleDK19: This function is hard-coded to always return 0. - - - - - MulleDK19: This function is hard-coded to always return 0. - - - - - MulleDK19: This function is hard-coded to always return 1. - - - - - characters - 0: Michael - 1: Franklin - 2: Trevor - 3: MPMale - 4: MPFemale - - - - - Another function related to "HUD scaleforms" - - - - - bufferSize is 35 in the scripts. - - - - - Something to do with shake: - CAM::_F4C8CF9E353AFECA("HAND_SHAKE", 0.2); - - - - - Needs more research. Possibly used to calculate the "mask" when calling "STAT_SET_BOOL_MASKED"? - - - - - This does not move an existing checkpoint... so wtf. - - - - - 3 matches across 3 scripts. First 2 were 0, 3rd was 1. Possibly a bool. - appcamera, appmedia, and cellphone_controller. - - - - - Set profile setting 501 - - - - - Only did a quick disassembly, but this function seems to load all path nodes in the given area. Parameters appear to be start x, start y, end x, end y. - - - - - IS_S* - - - - - p1 was always 1 (true). - Kicks the ped from the current vehicle and keeps the rendering-focus on this ped (also disables its collision). If doing this for your player ped, you'll still be able to drive the vehicle. - Actual name begins with 'S' - - - - - Another unknown label type... - GAMEPLAY::_FAA457EF263E8763(a_0, "Thumb_label"); - GAMEPLAY::_FAA457EF263E8763(&a_0._f10, "Photo_label"); - GAMEPLAY::_FAA457EF263E8763(a_0, "GXTlabel"); - GAMEPLAY::_FAA457EF263E8763(&a_0._f21, "StringComp"); - GAMEPLAY::_FAA457EF263E8763(&a_0._f43, "SecondStringComp"); - GAMEPLAY::_FAA457EF263E8763(&a_0._f53, "ThirdStringComp"); - GAMEPLAY::_FAA457EF263E8763(&a_0._f32, "SenderStringComp"); - GAMEPLAY::_FAA457EF263E8763(&a_0._f726[v_1A -- [[16]] ], &v_20); // where v_20 is "LastJobTL_0_1" thru "LastJobTL_2_1", gets saved in a struct called "LAST_JobGamer_TL" - GAMEPLAY::_FAA457EF263E8763(&a_0._f4B, "PAID_PLAYER"); - GAMEPLAY::_FAA457EF263E8763(&a_0._f5B, "RADIO_STATION"); - - - - - p0 is always 0. p1 is pointing to a global. - - - - - NETWORK_IS_IN_??? - - - - - Tune Forward... ? - - - - - gets byte at offset 0x862 in the specified players data (ped data + 0xbd0) and stores the bool p1 in it. - lwz r3, 0xBD0(r3) ;r3 is player data - lbz r4, 0x862(r3) ;r4 is now the byte - insrwi r4, r31, 1,28 ;stores p1 as a bit in place 28 idk - stb r4, 0x862(r3) ; puts the newly modified one back in - SET_PLAYER_* - - - - - may be 0xBF21818E - related to: NETWORK_BAIL - NETWORK_BAIL_TRANSITION - NETWORK_JOIN_GROUP_ACTIVITY - NETWORK_JOIN_TRANSITION - NETWORK_LAUNCH_TRANSITION - NETWORK_SESSION_HOST - NETWORK_SESSION_HOST_CLOSED - NETWORK_SESSION_HOST_FRIENDS_ONLY - NETWORK_SESSION_HOST_SINGLE_PLAYER - NETWORK_SESSION_VOICE_LEAVE - - - - - gets the entity id of a network id - - - - - gets the object id of a network id - - - - - gets the ped id of a network id - - - - - Some of the tunable contexts used in the PC scripts: - - "BASE_GLOBALS" - - "MP_GLOBAL" - and some of the tunable names used in the PC scripts: - - "XP_MULTIPLIER" - - "CASH_MULTIPLIER" - - "ARMOUR_REWARD_GIFT" - - "TOGGLE_CREATORS_OFF" - - "MULTIPLAYER_DISABLED" - - - - - Some of the tunable contexts used in the PC scripts: - - "BASE_GLOBALS" - - "MP_GLOBAL" - and some of the tunable names used in the PC scripts: - - "XP_MULTIPLIER" - - "CASH_MULTIPLIER" - - "ARMOUR_REWARD_GIFT" - - "TOGGLE_CREATORS_OFF" - - "MULTIPLAYER_DISABLED" - - - - - Console Hash - 0x18867C61 = NETWORK_ACCESS_TUNABLE_BOOL_HASH - - - - - Console Hash - 0x18867C61 = NETWORK_ACCESS_TUNABLE_BOOL_HASH - - - - - Returns a default value if the tunable don't exist. - Console Hash - - - - - Returns a default value if the tunable don't exist. - Console Hash - - - - - Some of the tunable contexts used in the PC scripts: - - "BASE_GLOBALS" - - "MP_GLOBAL" - - "MP_FM_RACES" - - "MP_FM_RACES_CAR" - - "MP_FM_RACES_SEA" - - "MP_FM_RACES_CAR" - - "MP_FM_RACES_AIR" - - "MP_FM_BASEJUMP" - - "MP_FM_RACES_CYCLE" - - "MP_FM_RACES_BIKE" - - "MP_FM_MISSIONS" - - "MP_FM_CONTACT" - - "MP_FM_RANDOM" - - "MP_FM_VERSUS" - - "MP_FM_LTS" - - "MP_FM_CAPTURE" - - "MP_FM_DM" - - "MP_FM_SURVIVAL" - - "MP_FM_GANG_ATTACK" - - "MP_FM_BASEJUMP" - - "MP_CNC_TEAM_COP" - - "MP_CNC_TEAM_VAGOS" - - "MP_CNC_TEAM_LOST" - and some of the tunable names used in the PC scripts: - - "XP_MULTIPLIER" - - "CASH_MULTIPLIER" - - "ARMOUR_REWARD_GIFT" - - "TOGGLE_CREATORS_OFF" - - - - - Some of the tunable contexts used in the PC scripts: - - "BASE_GLOBALS" - - "MP_GLOBAL" - - "MP_FM_RACES" - - "MP_FM_RACES_CAR" - - "MP_FM_RACES_SEA" - - "MP_FM_RACES_CAR" - - "MP_FM_RACES_AIR" - - "MP_FM_BASEJUMP" - - "MP_FM_RACES_CYCLE" - - "MP_FM_RACES_BIKE" - - "MP_FM_MISSIONS" - - "MP_FM_CONTACT" - - "MP_FM_RANDOM" - - "MP_FM_VERSUS" - - "MP_FM_LTS" - - "MP_FM_CAPTURE" - - "MP_FM_DM" - - "MP_FM_SURVIVAL" - - "MP_FM_GANG_ATTACK" - - "MP_FM_BASEJUMP" - - "MP_CNC_TEAM_COP" - - "MP_CNC_TEAM_VAGOS" - - "MP_CNC_TEAM_LOST" - and some of the tunable names used in the PC scripts: - - "XP_MULTIPLIER" - - "CASH_MULTIPLIER" - - "ARMOUR_REWARD_GIFT" - - "TOGGLE_CREATORS_OFF" - - - - - Console Hash - 0x3972551F = NETWORK_ACCESS_TUNABLE_FLOAT_HASH - - - - - Console Hash - 0x3972551F = NETWORK_ACCESS_TUNABLE_FLOAT_HASH - - - - - Some of the tunable contexts used in the PC scripts: - - "MP_FM_RACES" - - "MP_FM_RACES_CAR" - - "MP_FM_RACES_SEA" - - "MP_FM_RACES_CAR" - - "MP_FM_RACES_AIR" - - "MP_FM_BASEJUMP" - - "MP_FM_RACES_CYCLE" - - "MP_FM_RACES_BIKE" - - "MP_FM_MISSIONS" - - "MP_FM_CONTACT" - - "MP_FM_RANDOM" - - "MP_FM_VERSUS" - - "MP_FM_LTS" - - "MP_FM_CAPTURE" - - "MP_FM_DM" - - "MP_FM_SURVIVAL" - - "MP_FM_GANG_ATTACK" - - "MP_FM_BASEJUMP" - - "BASE_GLOBALS" - - "MP_GLOBAL" - and some of the tunable names used in the PC scripts: - - "XP_MULTIPLIER" - - "CASH_MULTIPLIER" - - "ARMOUR_REWARD_GIFT" - - "TOGGLE_CREATORS_OFF" - - - - - Some of the tunable contexts used in the PC scripts: - - "MP_FM_RACES" - - "MP_FM_RACES_CAR" - - "MP_FM_RACES_SEA" - - "MP_FM_RACES_CAR" - - "MP_FM_RACES_AIR" - - "MP_FM_BASEJUMP" - - "MP_FM_RACES_CYCLE" - - "MP_FM_RACES_BIKE" - - "MP_FM_MISSIONS" - - "MP_FM_CONTACT" - - "MP_FM_RANDOM" - - "MP_FM_VERSUS" - - "MP_FM_LTS" - - "MP_FM_CAPTURE" - - "MP_FM_DM" - - "MP_FM_SURVIVAL" - - "MP_FM_GANG_ATTACK" - - "MP_FM_BASEJUMP" - - "BASE_GLOBALS" - - "MP_GLOBAL" - and some of the tunable names used in the PC scripts: - - "XP_MULTIPLIER" - - "CASH_MULTIPLIER" - - "ARMOUR_REWARD_GIFT" - - "TOGGLE_CREATORS_OFF" - - - - - Console Hash - 0xB2E83B75 = NETWORK_ACCESS_TUNABLE_INT_HASH - - - - - Console Hash - 0xB2E83B75 = NETWORK_ACCESS_TUNABLE_INT_HASH - - - - - Console hash: 0xCD69BEA1 - - - - - Console hash: 0xCD69BEA1 - - - - - .. - - - - - .. - - - - - Returns whether the Rockstar game services are available or not: - SCLB_NO_ROS = The Rockstar game services are unavailable right now. Please try again later. - ros.rockstargames.com - - - - - Returns whether the Rockstar game services are available or not: - SCLB_NO_ROS = The Rockstar game services are unavailable right now. Please try again later. - ros.rockstargames.com - - - - - This has arguments.. in PC scripts. - - - - - p1 = 0 (always) - p2 = 1 (always) - - - - - p1 is just an assumption. p2 was false and p3 was true. - - - - - The first parameter is the amount spent which is store in a global when this native is called. The global returns 10. Which is the price for both rides. - The last 3 parameters are, - 2,0,1 in the am_ferriswheel.c - 1,0,1 in the am_rollercoaster.c - - - - - The first parameter is the amount spent which is store in a global when this native is called. The global returns 10. Which is the price for both rides. - The last 3 parameters are, - 2,0,1 in the am_ferriswheel.c - 1,0,1 in the am_rollercoaster.c - - - - - p1 = 0 (always) - p2 = 1 (always) - - - - - 11 - Need to download tunables. - 12 - Need to download background script. - Returns 1 if the multiplayer is loaded, otherwhise 0. - - - - - 11 - Need to download tunables. - 12 - Need to download background script. - Returns 1 if the multiplayer is loaded, otherwhise 0. - - - - - this function is toggle when people report you and you get the auto mute message - - - - - this function is toggle when people report you and you get the auto mute message - - - - - console hash: 0x3624F054 - - - - - console hash: 0x3624F054 - - - - - Only documented... - - - - - Only documented... - - - - - BOOL DEBUG_MEMBRESHIP(int Param) - { - int membership; - networkHandleMgr handle; - NETWORK_HANDLE_FROM_PLAYER(iSelectedPlayer, &handle.netHandle, 13); - if (!_NETWORK_IS_CLAN_MEMBERSHIP_FINISHED_DOWNLOADING()) - { - if (NETWORK_CLAN_REMOTE_MEMBERSHIPS_ARE_IN_CACHE(&Param)) - { - if (NETWORK_CLAN_GET_MEMBERSHIP_COUNT(&Param) > 0) - { - if (NETWORK_CLAN_GET_MEMBERSHIP_VALID(&Param, 0)) - { - if (NETWORK_CLAN_GET_MEMBERSHIP(&Param, &membership, -1)) - { - _0xF633805A(&membership, 35, &handle.netHandle); - } - } - } - } - } - else - { - NETWORK_CLAN_DOWNLOAD_MEMBERSHIP(&handle.netHandle); - } - } - - - - - networkMembershipMgr memShip; - int maxMemship = _GET_NUM_MEMBERSHIP_DESC(); - for (int i = 0; i < maxMemship; i++) - { - NETWORK_CLAN_GET_MEMBERSHIP_DESC(&memShip.memHandle, i); - } - - - - - bufferSize is 35 in the scripts. - bufferSize is the elementCount of p0(desc), sizeof(p0) == 280 == p1*8 == 35 * 8, p2(netHandle) is obtained from NETWORK::NETWORK_HANDLE_FROM_PLAYER. And no, I can't explain why 35 * sizeof(int) == 280 and not 140, but I'll get back to you on that. - the answer is: because p0 an int64_t* / int64_t[35]. and FYI p2 is an int64_t[13] - pastebin.com/cSZniHak - - - - - netScene to scene - - - - - netScene to scene - - - - - netScene to scene - - - - - console hash: 0x99F58A07 - Sadly I thought this copied their tattoos, but it just seems to copy their 'blend data'. E.G. skin tone/color, fat/skinny face, etc. - - - - - console hash: 0x99F58A07 - Sadly I thought this copied their tattoos, but it just seems to copy their 'blend data'. E.G. skin tone/color, fat/skinny face, etc. - - - - - returns netScene - this native is missing 2 params - float p10, float p11 - - - - - Note the 2nd parameters are always 1, 0. I have a feeling it deals with your money, wallet, bank. So when you delete the character it of course wipes the wallet cash at that time. So if that was the case, it would be eg, NETWORK_DELETE_CHARACTER(characterIndex, deleteWalletCash, deleteBankCash); - - - - - hash collision??? - I did this and I didn't see anything happening - int pindex; - for (int i = 0; i < 32; i++) - { - if (NETWORK_IS_PARTICIPANT_ACTIVE(INT_TO_PARTICIPANTINDEX(i))) - { - pindex = NETWORK_GET_PLAYER_INDEX(INT_TO_PARTICIPANTINDEX(i)); - NETWORK_DISABLE_INVINCIBLE_FLASHING(pindex, 1); - } - } - - - - - hash collision??? - I did this and I didn't see anything happening - int pindex; - for (int i = 0; i < 32; i++) - { - if (NETWORK_IS_PARTICIPANT_ACTIVE(INT_TO_PARTICIPANTINDEX(i))) - { - pindex = NETWORK_GET_PLAYER_INDEX(INT_TO_PARTICIPANTINDEX(i)); - NETWORK_DISABLE_INVINCIBLE_FLASHING(pindex, 1); - } - } - - - - - p2 is true 3/4 of the occurrences I found. - 'players' is the number of players for a session. On PS3/360 it's always 18. On PC it's 32. - - - - - Some of the tunable contexts used in the PC scripts: - - "MP_FM_RACES" - - "MP_FM_RACES_CAR" - - "MP_FM_RACES_SEA" - - "MP_FM_RACES_CAR" - - "MP_FM_RACES_AIR" - - "MP_FM_BASEJUMP" - - "MP_FM_RACES_CYCLE" - - "MP_FM_RACES_BIKE" - - "MP_FM_MISSIONS" - - "MP_FM_CONTACT" - - "MP_FM_RANDOM" - - "MP_FM_VERSUS" - - "MP_FM_LTS" - - "MP_FM_CAPTURE" - - "MP_FM_DM" - - "MP_FM_SURVIVAL" - - "MP_FM_GANG_ATTACK" - - "MP_FM_BASEJUMP" - - "BASE_GLOBALS" - - "MP_GLOBAL" - and some of the tunable names used in the PC scripts: - - "XP_MULTIPLIER" - - "CASH_MULTIPLIER" - - "ARMOUR_REWARD_GIFT" - - "TOGGLE_CREATORS_OFF" - - - - - Console Hash - 0x25915CB9 = NETWORK_DOES_TUNABLE_EXIST_HASH - - - - - Console Hash - 0x25915CB9 = NETWORK_DOES_TUNABLE_EXIST_HASH - - - - - DSPORT - - - - - DSPORT - - - - - Console Hash - 0xA14CC95D = NETWORK_EARN_FROM_AMBIENT_JOB - Example for p1: "AM_DISTRACT_COPS" - - - - - Console Hash - 0xA14CC95D = NETWORK_EARN_FROM_AMBIENT_JOB - Example for p1: "AM_DISTRACT_COPS" - - - - - For the money bags that drop a max of $40,000. Often called 40k bags. - Most likely NETWORK_EARN_FROM_ROB*** - MONEY_EARN_JOBS - - - - - For the money bags that drop a max of $40,000. Often called 40k bags. - Most likely NETWORK_EARN_FROM_ROB*** - MONEY_EARN_JOBS - - - - - Console Hash - 0xAB6BD72F = NETWORK_EARN_FROM_DAILY_OBJECTIVE - - - - - Console Hash - 0xAB6BD72F = NETWORK_EARN_FROM_DAILY_OBJECTIVE - - - - - MONEY_EARN_PICKED_UP - - - - - MONEY_EARN_PICKED_UP - - - - - Console Hash - 0xBEE23713 = NETWORK_EARN_FROM_JOB_BONUS - - - - - Console Hash - 0xBEE23713 = NETWORK_EARN_FROM_JOB_BONUS - - - - - Pretty sure this is actually a hash collision. - It should be NETWORK_EARN_FROM_A*** or NETWORK_EARN_FROM_B*** - ============================================================= - Not a hash collision, test it for yourself when finishing heist. - lackos; 2017.03.12 - - - - - Pretty sure this is actually a hash collision. - It should be NETWORK_EARN_FROM_A*** or NETWORK_EARN_FROM_B*** - ============================================================= - Not a hash collision, test it for yourself when finishing heist. - lackos; 2017.03.12 - - - - - Enough007: Adds an entry in the Network Transaction Log. - Max value for amount 2000 - - - - - Enough007: Adds an entry in the Network Transaction Log. - Max value for amount 2000 - - - - - Now has 9 parameters. - - - - - Now has 9 parameters. - - - - - This merely adds an entry in the Network Transaction Log; - it does not grant cash to the player (on PC). - Max value for amount is 9999999. - - - - - Now has 8 params. - - - - - Pretty sure this is a hash collision - - - - - Pretty sure this is a hash collision - - - - - In the console script dumps, this is only referenced once. - NETWORK::NETWORK_EXPLODE_VEHICLE(vehicle, 1, 0, 0); - ^^^^^ That must be PC script dumps? In X360 Script Dumps it is reference a few times with 2 differences in the parameters. - Which as you see below is 1, 0, 0 + 1, 1, 0 + 1, 0, and a *param? - am_plane_takedown.c - network_explode_vehicle(net_to_veh(Local_40.imm_2), 1, 1, 0); - armenian2.c - network_explode_vehicle(Local_80[6 <2>], 1, 0, 0); - fm_horde_controler.c - network_explode_vehicle(net_to_veh(*uParam0), 1, 0, *uParam0); - fm_mission_controller.c, has 6 hits so not going to list them. - Side note, setting the first parameter to 0 seems to mute sound or so? - Seems it's like ADD_EXPLOSION, etc. the first 2 params. The 3rd atm no need to worry since it always seems to be 0. - - - - - state - 0 does 5 fades - state - 1 does 6 fades - native is missing third argument, also boolean, setting to 1 made vehicle fade in slower, probably "slow" as per NETWORK_FADE_OUT_ENTITY - - - - - normal - transition like when your coming out of LSC - slow - transition like when you walk into a mission - - - - - Console Hash: Probably 0xAA7EA3BD - - - - - Console Hash: Probably 0xAA7EA3BD - - - - - Returns the owner ID of the specified entity. - - The entity to get the owner for. - On the server, the server ID of the entity owner. On the client, returns the player/slot ID of the entity owner. - - - - scriptName examples: - "freemode", "AM_CR_SecurityVan", ... - Most of the time, these values are used: - p1 = -1 - p2 = 0 - - - - - Retrieves the local player's NetworkHandle* and stores it in the given buffer. - * Currently unknown struct - - - - - On PC this is hardcoded to 250. - - - - - Returns the amount of players connected in the current session. Only works when connected to a session/server. - - - - - Seems to always return 0, but it's used in quite a few loops. - for (num3 = 0; num3 < NETWORK::0xCCD8C02D(); num3++) - { - if (NETWORK::NETWORK_IS_PARTICIPANT_ACTIVE(PLAYER::0x98F3B274(num3)) != 0) - { - var num5 = NETWORK::NETWORK_GET_PLAYER_INDEX(PLAYER::0x98F3B274(num3)); - - - - - Returns the coordinates of another player. - Does not work if you enter your own player id as p0 (will return `(0.0, 0.0, 0.0)` in that case). - - The player id, MUST be another player. - A Vector3 containing the coordinates of another player. - - - - Returns the coordinates of another player. - Does not work if you enter your own player id as p0 (will return `(0.0, 0.0, 0.0)` in that case). - - The player id, MUST be another player. - A Vector3 containing the coordinates of another player. - - - - Returns the Player associated to a given Ped when in an online session. - - - - - Returns the Player associated to a given Ped when in an online session. - - - - - Same as GAMEPLAY::GET_RANDOM_INT_IN_RANGE - - - - - Same as GAMEPLAY::GET_RANDOM_INT_IN_RANGE - - - - - Based on scripts such as in freemode.c how they call their vars vVar and fVar the 2nd and 3rd param it a Vector3 and Float, but the first is based on get_random_int_in_range.. - - - - - Returns the value of the tunable 0x9A82F2B. Usually 8000 iirc. - - - - - Returns the value of the tunable 0x9A82F2B. Usually 8000 iirc. - - - - - From what I can see in ida, I believe it retrieves the players online bank balance. - - - - - From what I can see in ida, I believe it retrieves the players online bank balance. - - - - - From what I understand, it retrieves STAT_WALLET_BALANCE for the specified character (-1 means use MPPLY_LAST_MP_CHAR) - - - - - From what I understand, it retrieves STAT_WALLET_BALANCE for the specified character (-1 means use MPPLY_LAST_MP_CHAR) - - - - - Returns a NetworkHandle* from the specified member ID and stores it in a given buffer. - * Currently unknown struct - - - - - Returns a handle to networkHandle* from the specified player handle and stores it in a given buffer. - * Currently unknown struct - Example: - std::vector<UINT64> GetPlayerNetworkHandle(Player player) { - const int size = 13; - uint64_t *buffer = std::make_unique<uint64_t[]>(size).get(); - NETWORK::NETWORK_HANDLE_FROM_PLAYER(player, reinterpret_cast<int *>(buffer), 13); - for (int i = 0; i < size; i++) { - Log::Msg("networkhandle[%i]: %llx", i, buffer[i]); - } - std::vector<UINT64> result(buffer, buffer + sizeof(buffer)); - return result; - } - - - - - Returns a NetworkHandle* from the specified user ID and stores it in a given buffer. - * Currently unknown struct - - - - - console hash: 0xD14D9C07 - - - - - console hash: 0xD14D9C07 - - - - - console hash: 0x5AC9F04D = network_hash_from_gamer_handle - - - - - console hash: 0x5AC9F04D = network_hash_from_gamer_handle - - - - - console hash: 0xF8D7AF3B = NETWORK_HASH_FROM_PLAYER_HANDLE - - - - - console hash: 0xF8D7AF3B = NETWORK_HASH_FROM_PLAYER_HANDLE - - - - - From what I can tell it looks like it does the following: - Creates/hosts a new transition to another online session, using this in FiveM will result in other players being disconencted from the server/preventing them from joining. This is most likely because I entered the wrong session parameters since they're pretty much all unknown right now. - You also need to use `NetworkJoinTransition(Player player)` and `NetworkLaunchTransition()`. - - Unknown int - Unknown int - Unknown int - Unknown int - Unknown always 0 in decompiled scripts - BOOL purpose unknown, both 0 and 1 are used in decompiled scripts. - BOOL purpose unknown, both 0 and 1 are used in decompiled scripts. - Unknown int, it's an int according to decompiled scripts, however the value is always 0 or 1. - Unknown int, it's an int according to decompiled scripts, however the value is always 0 or 1. - Unknown int, sometimes 0, but also 32768 or 16384 appear in decompiled scripst, maybe a flag of some sort? - Probably a bool indicating if the transition was created. - - - - //nothing doin - int Global_1837683 = GlobalVariable::Get(1837683); - int Global_1837683_f_404 = GlobalVariable::Get(1837683 + 404); - NETWORK_INVITE_GAMERS(&Global_1837683, Global_1837683_f_404, 0, 0); - - - - - This would be nice to see if someone is in party chat, but 2 sad notes. - 1) It only becomes true if said person is speaking in that party at the time. - 2) It will never, become true unless you are in that party with said person. - - - - - In scripts R* calls 'NETWORK_GET_FRIEND_NAME' in this param. - - - - - If you are host, returns true else returns false. - anyone know how to use this to find correct host? is possible? - go to a mission and it will set a host then search the host name using a program then find the pointer to the host name - - - - - Note according to IDA TU27 X360(Console), - This native & 'NETWORK_IS_PARTY_MEMBER' both jump to the same location. - Side note: This location just stops where it's at once jumped to. - Screenshot for side note, - h t t p ://i.imgur.com/m2ci1mF.png - h t t p://i.imgur.com/Z0Wx2B6.png - - - - - Note according to IDA TU27 X360(Console), - This native & 'NETWORK_IS_PARTY_MEMBER' both jump to the same location. - Side note: This location just stops where it's at once jumped to. - Screenshot for side note, - h t t p ://i.imgur.com/m2ci1mF.png - h t t p://i.imgur.com/Z0Wx2B6.png - - - - - This function is hard-coded to always return 0. - - - - - hash collision - - - - - NETWORK_ARE_* - - - - - NETWORK_ARE_* - - - - - p1 = 6 - NETWORK_CRC_HASH_CHECK? - - - - - p1 = 6 - NETWORK_CRC_HASH_CHECK? - - - - - returns true if someone is screaming or talking in a microphone - - - - - This checks if player is playing on gta online or not. - Please add an if and block your mod if this is "true". - - - - - Returns whether the player is signed into Social Club. - - - - - Returns whether the game is not in offline mode. - seemed not to work for some ppl - - - - - Same as _IS_TEXT_CHAT_ACTIVE, except it does not check if the text chat HUD component is initialized, and therefore may crash. - - - - - int handle[76]; - NETWORK_HANDLE_FROM_FRIEND(iSelectedPlayer, &handle[0], 13); - Player uVar2 = NETWORK_GET_PLAYER_FROM_GAMER_HANDLE(&handle[0]); - NETWORK_JOIN_TRANSITION(uVar2); - nothing doin. - - - - - Could possibly bypass being muted or automatically muted - - - - - Could possibly bypass being muted or automatically muted - - - - - Works in Singleplayer too. - Actually has a 4th param (BOOL) that sets byte_14273C46C (in b944) to whatever was passed to p3. - - - - - R* uses this to hear all player when spectating. - It allows you to hear other online players when their chat is on none, crew and or friends - - - - - R* uses this to hear all player when spectating. - It allows you to hear other online players when their chat is on none, crew and or friends - - - - - Console Hash: 0x6C344AE3 - "NETWORK_OVERRIDE_SEND_RESTRICTIONS" is right, but dev-c put a _ by default. - This is used alongside the native, - 'NETWORK_OVERRIDE_RECEIVE_RESTRICTIONS'. Read it's description for more info. - - - - - Console Hash: 0x6C344AE3 - "NETWORK_OVERRIDE_SEND_RESTRICTIONS" is right, but dev-c put a _ by default. - This is used alongside the native, - 'NETWORK_OVERRIDE_RECEIVE_RESTRICTIONS'. Read it's description for more info. - - - - - Returns the name of a given player. Returns "**Invalid**" if CPlayerInfo of the given player cannot be retrieved or the player doesn't exist. - Does exactly the same as GET_PLAYER_NAME. - - - - - Sets [userID] to the user id of the given player. Returns "**Invalid**" if CPlayerInfo of the given player cannot be retrieved or the player doesn't exist. - - - - - Sets [userID] to the user id of the given player. Returns "**Invalid**" if CPlayerInfo of the given player cannot be retrieved or the player doesn't exist. - - - - - Does exactly the same thing as PLAYER_ID() - - - - - Returns whether the player has been reported too often or not. - Example : griefing. - - - - - Checks if a specific value (BYTE) in CPlayerInfo is nonzero. - Returns always false in Singleplayer. - No longer used for dev checks since first mods were released on PS3 & 360. - R* now checks with the is_dlc_present native for the dlc hash 2532323046, - if that is present it will unlock dev stuff. - - - - - fuck this function in particular. - It's similar to unk_0x9A176B6E but this ones got a different stat hash: - 0xBC707798 - - - - - fuck this function in particular. - It's similar to unk_0x9A176B6E but this ones got a different stat hash: - 0xBC707798 - - - - - NETWORK_PLAYER_??? - - - - - NETWORK_PLAYER_??? - - - - - index - ------- - See function sub_1005 in am_boat_taxi.ysc - context - ---------- - "BACKUP_VAGOS" - "BACKUP_LOST" - "BACKUP_FAMILIES" - "HIRE_MUGGER" - "HIRE_MERCENARY" - "BUY_CARDROPOFF" - "HELI_PICKUP" - "BOAT_PICKUP" - "CLEAR_WANTED" - "HEAD_2_HEAD" - "CHALLENGE" - "SHARE_LAST_JOB" - "DEFAULT" - reason - --------- - "NOTREACHTARGET" - "TARGET_ESCAPE" - "DELIVERY_FAIL" - "NOT_USED" - "TEAM_QUIT" - "SERVER_ERROR" - "RECEIVE_LJ_L" - "CHALLENGE_PLAYER_LEFT" - "DEFAULT" - unk - ----- - Unknown bool value - - - - - index - ------- - See function sub_1005 in am_boat_taxi.ysc - context - ---------- - "BACKUP_VAGOS" - "BACKUP_LOST" - "BACKUP_FAMILIES" - "HIRE_MUGGER" - "HIRE_MERCENARY" - "BUY_CARDROPOFF" - "HELI_PICKUP" - "BOAT_PICKUP" - "CLEAR_WANTED" - "HEAD_2_HEAD" - "CHALLENGE" - "SHARE_LAST_JOB" - "DEFAULT" - reason - --------- - "NOTREACHTARGET" - "TARGET_ESCAPE" - "DELIVERY_FAIL" - "NOT_USED" - "TEAM_QUIT" - "SERVER_ERROR" - "RECEIVE_LJ_L" - "CHALLENGE_PLAYER_LEFT" - "DEFAULT" - unk - ----- - Unknown bool value - - - - - sizeofVars is in bytes - - - - - NETWORK_REQUEST_CLOUD_BACKGROUND_SCRIPTS - Correct console hash is 0x98EFB921 - Start the downloading of BG_NG.RPF from R* Cloud which contains hotfix. - The console hash given is incorrect for Xbox360 that is. I searched in IDA and found 0x98EFB921 which came right after 0x155465EE. Then I searched it in TU27 X360 scripts and found it was the same results same scripts as the PC Hash for this which is obviously correct. I found the correct one as I noticed TU27 X360 script search pulled no results for 0x29532731 when it should have. - As you can see here you will see the 155465EE first then the correct hash for this native. Then the current 29532731 one which could be the native below or the native below's hash could be the has below the 29532731 - puu.sh/nhdQI/e0ca5567b4.png - 0x98EFB921 is the correct console hash for "_DOWNLOAD_BG_SCRIPT_RPF". 0x29532731 is "_HAS_BG_SCRIPT_BEEN_DOWNLOADED" - The code: - seg001:00000000003EFF4C uunk_0x29532731: # CODE XREF: sub_158C8AC+14p - seg001:00000000003EFF4C lis r3, dword_1CFB100@ha - seg001:00000000003EFF50 lwz r3, dword_1CFB100@l(r3) - seg001:00000000003EFF54 ld r3, 0x1020(r3) - seg001:00000000003EFF58 extsw r3, r3 - seg001:00000000003EFF5C blr - seg001:00000000003EFF5C # End of function uunk_0x29532731 - - - - - NETWORK_REQUEST_CLOUD_BACKGROUND_SCRIPTS - Correct console hash is 0x98EFB921 - Start the downloading of BG_NG.RPF from R* Cloud which contains hotfix. - The console hash given is incorrect for Xbox360 that is. I searched in IDA and found 0x98EFB921 which came right after 0x155465EE. Then I searched it in TU27 X360 scripts and found it was the same results same scripts as the PC Hash for this which is obviously correct. I found the correct one as I noticed TU27 X360 script search pulled no results for 0x29532731 when it should have. - As you can see here you will see the 155465EE first then the correct hash for this native. Then the current 29532731 one which could be the native below or the native below's hash could be the has below the 29532731 - puu.sh/nhdQI/e0ca5567b4.png - 0x98EFB921 is the correct console hash for "_DOWNLOAD_BG_SCRIPT_RPF". 0x29532731 is "_HAS_BG_SCRIPT_BEEN_DOWNLOADED" - The code: - seg001:00000000003EFF4C uunk_0x29532731: # CODE XREF: sub_158C8AC+14p - seg001:00000000003EFF4C lis r3, dword_1CFB100@ha - seg001:00000000003EFF50 lwz r3, dword_1CFB100@l(r3) - seg001:00000000003EFF54 ld r3, 0x1020(r3) - seg001:00000000003EFF58 extsw r3, r3 - seg001:00000000003EFF5C blr - seg001:00000000003EFF5C # End of function uunk_0x29532731 - - - - - This native start the download of tunables from R* cloud - - - - - This native start the download of tunables from R* cloud - - - - - hash collision?? - Not sure, but fits alphabetically - - - - - p4 and p5 are always 0 in scripts - - - - - p4 and p5 are always 0 in scripts - - - - - p0 = 0 or 4 - - - - - p0 = 0 or 4 - - - - - String "NETWORK_SEND_PRESENCE_TRANSITION_INVITE" is contained in the function in ida so this one is correct. - - - - - String "NETWORK_SEND_PRESENCE_TRANSITION_INVITE" is contained in the function in ida so this one is correct. - - - - - how can I increase the character limit on this native? - -------------------------------- - return - it's possible for it to have an error and return a value. One error is if it cannot find space to create the event it doesn't send the text and returns zero. It also returns 0 is the strlen is 0 or the strlen > 0x100 (I thought it was 64 so idk why it's checking 265. I may just be dumb :P ) There are other ways it could return 0 also but who the hell cares cuz it's very unlikely, but it returns a bool. - to the top guy, idk if it is possible. It is probably read a max of 64 characters on the recieving end so even if we did modify it to send more it probably wouldn't work. One of the other problems is that in part of the function it copies the string to the local stack which means we would have to change that to make it work. - - - - - the first arg seems to be the network player handle (&handle) and the second var is pretty much always "" and the third seems to be a number between 0 and ~10 and the 4th is is something like 0 to 5 and I guess the 5th is a bool cuz it is always 0 or 1 - does this send an invite to a player? - - - - - p0 is always false and p1 varies. - NETWORK_SESSION_END(0, 1) - NETWORK_SESSION_END(0, 0) - Results in: "Connection to session lost due to an unknown network error. Please return to Grand Theft Auto V and try again later." - - - - - unknown params - p0 = 0, 2, or 999 (The global is 999 by default.) - p1 = 0 (Always in every script it's found in atleast.) - p2 = 0, 3, or 4 (Based on a var that is determined by a function.) - p3 = maxPlayers (It's obvious in x360 scripts it's always 18) - p4 = 0 (Always in every script it's found in atleast.) - p5 = 0 or 1. (1 if network_can_enter_multiplayer, but set to 0 if other checks after that are passed.) - p5 is reset to 0 if, - Global_1315318 = 0 or Global_1315323 = 9 or 12 or (Global_1312629 = 0 && Global_1312631 = true/1) those are passed. - - - - - Does nothing in online but in offline it will cause the screen to fade to black. Nothing happens past then, the screen will sit at black until you restart GTA. Other stuff must be needed to actually host a session. - - - - - Does nothing in online but in offline it will cause the screen to fade to black. Nothing happens past then, the screen will sit at black until you restart GTA. Other stuff must be needed to actually host a session. - - - - - Loads up the map that is loaded when beeing in mission creator - Player gets placed in a mix between online/offline mode - p0 is always 2 in R* scripts. - Appears to be patched in gtav b757 (game gets terminated) alonside with most other network natives to prevent online modding ~ghost30812 - - - - - Only works when you are host. - - - - - BLR the shit. - - - - - BLR the shit. - - - - - if set to true other network players can't see it - if set to false other network player can see it - ========================================= - ^^ I attempted this by grabbing an object with GET_ENTITY_PLAYER_IS_FREE_AIMING_AT and setting this naive no matter the toggle he could still see it. - pc or last gen? - ^^ last-gen - - - - - if set to true other network players can't see it - if set to false other network player can see it - ========================================= - ^^ I attempted this by grabbing an object with GET_ENTITY_PLAYER_IS_FREE_AIMING_AT and setting this naive no matter the toggle he could still see it. - pc or last gen? - ^^ last-gen - - - - - if set to true other network players can't see it - if set to false other network player can see it - ========================================= - ^^ I attempted this by grabbing an object with GET_ENTITY_PLAYER_IS_FREE_AIMING_AT and setting this naive no matter the toggle he could still see it. - pc or last gen? - ^^ last-gen - - - - - //friendly fire toggle - - - - - hash collision??? - - - - - This is called shortly after setting Network ID Migration off it seems. Does anyone know the point of this? - Example scenario, - If I were to request and gain control of an online players vehicle then their vehicle's Network ID and turn migration off. I wouldn't need to ever request control again as they wouldn't gain control back. - - scenario over - - So what would be the point hereafter of setting it 'dynamic'? - - - - - This is called shortly after setting Network ID Migration off it seems. Does anyone know the point of this? - Example scenario, - If I were to request and gain control of an online players vehicle then their vehicle's Network ID and turn migration off. I wouldn't need to ever request control again as they wouldn't gain control back. - - scenario over - - So what would be the point hereafter of setting it 'dynamic'? - - - - - On PC it's a nullsub which means it does absolutely nothing. - Now that Discord supports Rich Presence, R* might finally implement this for PC. Or maybe in future games like RDR2, GTA VI... - - - - - NETWORK_SET_RICH_PRESENCE but for PlayStation? (On PC it's a nullsub) - - - - - NETWORK_SET_RICH_PRESENCE but for PlayStation? (On PC it's a nullsub) - - - - - p1 is always 0 - - - - - p0 is pointer to a script array - - - - - p0 is pointer to a script array - - - - - p0 => unk3::_network_shop_basket_apply_server_data(Global_2590199[iParam0 -- [[76]] ], &uVar6); => script array - - - - - p0 => unk3::_network_shop_basket_apply_server_data(Global_2590199[iParam0 -- [[76]] ], &uVar6); => script array - - - - - No longer works if you hook it as a stealth money method - Modes------------------ - 1: Wallet - 2: Bank - 4: Bank - 8: Wallet - Only difference I noticed. - - - - - No longer works if you hook it as a stealth money method - Modes------------------ - 1: Wallet - 2: Bank - 4: Bank - 8: Wallet - Only difference I noticed. - - - - - Belongs in UNK3, non-hashed version of 0x247F0F73A182EA0B - - - - - Belongs in UNK3, non-hashed version of 0x247F0F73A182EA0B - - - - - Belongs in UNK3, non-hashed version of 0x247F0F73A182EA0B - - - - - ex.: - v_15 = sub_10cc8(VEHICLE::GET_VEHICLE_WHEEL_TYPE(a_2)); - if (!MOBILE::_247F0F73A182EA0B(v_15)) { - return 1; - } - Belongs in UNK3, hashed version of 0xBD4D7EAF8A30F637 - - - - - ex.: - v_15 = sub_10cc8(VEHICLE::GET_VEHICLE_WHEEL_TYPE(a_2)); - if (!MOBILE::_247F0F73A182EA0B(v_15)) { - return 1; - } - Belongs in UNK3, hashed version of 0xBD4D7EAF8A30F637 - - - - - ex.: - v_15 = sub_10cc8(VEHICLE::GET_VEHICLE_WHEEL_TYPE(a_2)); - if (!MOBILE::_247F0F73A182EA0B(v_15)) { - return 1; - } - Belongs in UNK3, hashed version of 0xBD4D7EAF8A30F637 - - - - - bool is always true in game scripts - - - - - Will cancel the transaction - - - - - Will cancel the transaction - - - - - Will cancel the transaction - - - - - Example: - int playerHandle; - NETWORK_HANDLE_FROM_PLAYER(selectedPlayer, &playerHandle, 13); - NETWORK_SHOW_PROFILE_UI(&playerHandle); - - - - - Only used once in a script (am_contact_requests) - p1 = 0 - p2 = 1 - - - - - According to how I understood this in the freemode script alone, - The first parameter is determined by a function named, func_5749 within the freemode script which has a list of all the vehicles and a set price to return which some vehicles deals with globals as well. So the first parameter is basically the set in stone insurance cost it's gonna charge you for that specific vehicle model. - The second parameter whoever put it was right, they call GET_ENTITY_MODEL with the vehicle as the paremeter. - The third parameter is the network handle as they call their little struct<13> func or atleast how the script decompiled it to look which in lamens terms just returns the network handle of the previous owner based on DECOR_GET_INT(vehicle, "Previous_Owner"). - The fourth parameter is a bool that returns true/false depending on if your bank balance is greater then 0. - The fifth and last parameter is a bool that returns true/false depending on if you have the money for the car based on the cost returned by func_5749. In the freemode script eg, - bool hasTheMoney = NETWORKCASH::_GET_BANK_BALANCE() < carCost. - - - - - Console Hash 0xF4287778 = NETWORK_SPENT_REQUEST_HEIST - - - - - Console Hash 0xF4287778 = NETWORK_SPENT_REQUEST_HEIST - - - - - used in atm_trigger script. - usage: - int iVar0;STATS::STAT_GET_INT(GAMEPLAY::GET_HASH_KEY("mpply_last_mp_char"), &iVar0, -1); - UNK3::_NETWORK_TRANSFER_WALLET_TO_BANK(iVar0, amount); - used to deposit money into bank from wallet, shows up in transaction log. - - - - - used in atm_trigger script. - usage: - int iVar0;STATS::STAT_GET_INT(GAMEPLAY::GET_HASH_KEY("mpply_last_mp_char"), &iVar0, -1); - UNK3::_NETWORK_TRANSFER_WALLET_TO_BANK(iVar0, amount); - used to deposit money into bank from wallet, shows up in transaction log. - - - - - used in atm_trigger script. - usage: - int iVar0; STATS::STAT_GET_INT(GAMEPLAY::GET_HASH_KEY("mpply_last_mp_char"), &iVar0, -1); - UNK3::_NETWORK_TRANSFER_BANK_TO_WALLET(iVar0, amount); - used to withdraw money from bank into wallet, shows up in transaction log. - - - - - used in atm_trigger script. - usage: - int iVar0; STATS::STAT_GET_INT(GAMEPLAY::GET_HASH_KEY("mpply_last_mp_char"), &iVar0, -1); - UNK3::_NETWORK_TRANSFER_BANK_TO_WALLET(iVar0, amount); - used to withdraw money from bank into wallet, shows up in transaction log. - - - - - Only one occurence in the scripts: - auto sub_cb43(auto a_0, auto a_1) { - if (g_2594CB._f1) { - if (NETWORK::_855BC38818F6F684()) { - NETWORK::_ABD5E88B8A2D3DB2(&a_0._fB93); - g_2594CB._f14 -- [[{13}]] = a_0._fB93; - g_2594CB._f4 -- [["64"]] = a_1; - return 1; - } - } - return 0; - } - other: - looks like it passes a player in the paramater - Contains string "NETWORK_VOICE_CONNECT_TO_PLAYER" in ida - - - - - Only one occurence in the scripts: - auto sub_cb43(auto a_0, auto a_1) { - if (g_2594CB._f1) { - if (NETWORK::_855BC38818F6F684()) { - NETWORK::_ABD5E88B8A2D3DB2(&a_0._fB93); - g_2594CB._f14 -- [[{13}]] = a_0._fB93; - g_2594CB._f4 -- [["64"]] = a_1; - return 1; - } - } - return 0; - } - other: - looks like it passes a player in the paramater - Contains string "NETWORK_VOICE_CONNECT_TO_PLAYER" in ida - - - - - if (!sub_8f12("START LOAD SCENE SAFE")) { - if (CUTSCENE::GET_CUTSCENE_TIME() > 4178) { - STREAMING::_ACCFB4ACF53551B0(1973.845458984375, 3818.447265625, 32.43629837036133, 15.0, 2); - sub_8e9e("START LOAD SCENE SAFE", 1); - } - } - (Previously known as STREAMING::_NEW_LOAD_SCENE_START_SAFE) - - - - - if (!sub_8f12("START LOAD SCENE SAFE")) { - if (CUTSCENE::GET_CUTSCENE_TIME() > 4178) { - STREAMING::_ACCFB4ACF53551B0(1973.845458984375, 3818.447265625, 32.43629837036133, 15.0, 2); - sub_8e9e("START LOAD SCENE SAFE", 1); - } - } - (Previously known as STREAMING::_NEW_LOAD_SCENE_START_SAFE) - - - - - Sets the value of the specified variable to 0. - Always returns true. - bool _NULLIFY(void* variable, int unused) - { - *variable = NULL; - return true; - } - - - - - Lets objects spawn online simply do it like this: - int createdObject = OBJ_TO_NET(CREATE_OBJECT_NO_OFFSET(oball, pCoords.x, pCoords.y, pCoords.z, 1, 0, 0)); - - - - - Please change back to _0x444D8CF241EC25C5 (hash collision) - - - - - Types: - 1 = Boolean - 2 = Integer - 3 = Float - 4 = String - 5 = Vector3 - 6 = Object - 7 = Array - - - - - patrolRoutes found in the b617d scripts: - "miss_Ass0", - "miss_Ass1", - "miss_Ass2", - "miss_Ass3", - "miss_Ass4", - "miss_Ass5", - "miss_Ass6", - "MISS_PATROL_6", - "MISS_PATROL_7", - "MISS_PATROL_8", - "MISS_PATROL_9", - "miss_Tower_01", - "miss_Tower_02", - "miss_Tower_03", - "miss_Tower_04", - "miss_Tower_05", - "miss_Tower_06", - "miss_Tower_07", - "miss_Tower_08", - "miss_Tower_10" - - - - - Max value for p1 is 15. - - - - - Only used once in the decompiled scripts. Seems to be related to scripted vehicle generators. - Modified example from "am_imp_exp.c4", line 6406: - -- [[ popSchedules[0] = ZONE::GET_ZONE_POPSCHEDULE(ZONE::GET_ZONE_AT_COORDS(891.3, 807.9, 188.1)); - etc. - ]] - ZONE::OVERRIDE_POPSCHEDULE_VEHICLE_MODEL(popSchedules[index], vehicleHash); - STREAMING::REQUEST_MODEL(vehicleHash); - - - - - Overrides the vehicle's horn hash. - When changing this hash on a vehicle, [`_GET_VEHICLE_HORN_HASH`](#_0xACB5DCCA1EC76840) will **not** return the 'overwritten' hash. It will still always return the default horn hash (same as [`GET_VEHICLE_DEFAULT_HORN`](#_0x02165D55000219AC)). - List of possible hashes (found in decompiled scripts): - | signed | unsigned | hex | - | ------------: | -----------: | :----------: | - | `1604822495` | `1604822495` | `0x5FA7A5DF` | - | `-1262465009` | `3032502287` | `0xB4C0500F` | - | `-889553789` | `3405413507` | `0xCAFA7C83` | - | `-1557943086` | `2737024210` | `0xA323ACD2` | - | `-1318696617` | `2976270679` | `0xB1664957` | - | `-7740003` | `4287227293` | `0xFF89E59D` | - | `-1815146967` | `2479820329` | `0x93CF0E29` | - | `-339919356` | `3955047940` | `0xEBBD3E04` | - Old description: - ``` - vehicle - the vehicle whose horn should be overwritten - mute - p1 seems to be an option for muting the horn - p2 - maybe a horn id, since the function AUDIO::GET_VEHICLE_DEFAULT_HORN(veh) exists? - ``` - - The vehicle you want to change the horn on. - Must be set to true. If set to false, the default horn hash will be restored. - A horn hash. - - - - Return the local Participant ID - - - - - Return the local Participant ID. - This native is exactly the same as 'PARTICIPANT_ID' native. - - - - - [23.03.2017 19:08] by ins1de : - "_IS_PED_RELOADING" is totally a wrong name... - This native actually disables the reloading animation and script for the specified ped. Native renamed. - - - - - [23.03.2017 19:08] by ins1de : - "_IS_PED_RELOADING" is totally a wrong name... - This native actually disables the reloading animation and script for the specified ped. Native renamed. - - - - - gets the network id of a ped - - - - - Plays ambient speech. See also _0x444180DB. - ped: The ped to play the ambient speech. - speechName: Name of the speech to play, eg. "GENERIC_HI". - speechParam: Can be one of the following: - SPEECH_PARAMS_STANDARD - SPEECH_PARAMS_ALLOW_REPEAT - SPEECH_PARAMS_BEAT - SPEECH_PARAMS_FORCE - SPEECH_PARAMS_FORCE_FRONTEND - SPEECH_PARAMS_FORCE_NO_REPEAT_FRONTEND - SPEECH_PARAMS_FORCE_NORMAL - SPEECH_PARAMS_FORCE_NORMAL_CLEAR - SPEECH_PARAMS_FORCE_NORMAL_CRITICAL - SPEECH_PARAMS_FORCE_SHOUTED - SPEECH_PARAMS_FORCE_SHOUTED_CLEAR - SPEECH_PARAMS_FORCE_SHOUTED_CRITICAL - SPEECH_PARAMS_FORCE_PRELOAD_ONLY - SPEECH_PARAMS_MEGAPHONE - SPEECH_PARAMS_HELI - SPEECH_PARAMS_FORCE_MEGAPHONE - SPEECH_PARAMS_FORCE_HELI - SPEECH_PARAMS_INTERRUPT - SPEECH_PARAMS_INTERRUPT_SHOUTED - SPEECH_PARAMS_INTERRUPT_SHOUTED_CLEAR - SPEECH_PARAMS_INTERRUPT_SHOUTED_CRITICAL - SPEECH_PARAMS_INTERRUPT_NO_FORCE - SPEECH_PARAMS_INTERRUPT_FRONTEND - SPEECH_PARAMS_INTERRUPT_NO_FORCE_FRONTEND - SPEECH_PARAMS_ADD_BLIP - SPEECH_PARAMS_ADD_BLIP_ALLOW_REPEAT - SPEECH_PARAMS_ADD_BLIP_FORCE - SPEECH_PARAMS_ADD_BLIP_SHOUTED - SPEECH_PARAMS_ADD_BLIP_SHOUTED_FORCE - SPEECH_PARAMS_ADD_BLIP_INTERRUPT - SPEECH_PARAMS_ADD_BLIP_INTERRUPT_FORCE - SPEECH_PARAMS_FORCE_PRELOAD_ONLY_SHOUTED - SPEECH_PARAMS_FORCE_PRELOAD_ONLY_SHOUTED_CLEAR - SPEECH_PARAMS_FORCE_PRELOAD_ONLY_SHOUTED_CRITICAL - SPEECH_PARAMS_SHOUTED - SPEECH_PARAMS_SHOUTED_CLEAR - SPEECH_PARAMS_SHOUTED_CRITICAL - Note: A list of Name and Parameters can be found here pastebin.com/1GZS5dCL - Full list of speeches and voices names by some spanish shitbag: gist.github.com/alexguirre/0af600eb3d4c91ad4f900120a63b8992 - - - - - Plays ambient speech. See also _0x5C57B85D. - See _PLAY_AMBIENT_SPEECH1 for parameter specifications. - Full list of speeches and voices names: gist.github.com/alexguirre/0af600eb3d4c91ad4f900120a63b8992 - - - - - This is the same as _PLAY_AMBIENT_SPEECH1 and _PLAY_AMBIENT_SPEECH2 but it will allow you to play a speech file from a specific voice file. It works on players and all peds, even animals. - EX (C#): - GTA.Native.Function.Call(Hash._0x3523634255FC3318, Game.Player.Character, "GENERIC_INSULT_HIGH", "s_m_y_sheriff_01_white_full_01", "SPEECH_PARAMS_FORCE_SHOUTED", 0); - The first param is the ped you want to play it on, the second is the speech name, the third is the voice name, the fourth is the speech param, and the last param is usually always 0. - Full list of speeches and voices names: gist.github.com/alexguirre/0af600eb3d4c91ad4f900120a63b8992 - - - - - Animations list : www.los-santos-multiplayer.com/dev.airdancer?cxt=anim - - - - - Atleast one time in a script for the zRot Rockstar uses GET_ENTITY_HEADING to help fill the parameter. - p9 is unknown at this time. - p10 throughout all the X360 Scripts is always 2. - Animations list : www.los-santos-multiplayer.com/dev.airdancer?cxt=anim - - - - - delta and bitset are guessed fields. They are based on the fact that most of the calls have 0 or nil field types passed in. - The only time bitset has a value is 0x4000 and the only time delta has a value is during stealth with usually <1.0f values. - Animations list : www.los-santos-multiplayer.com/dev.airdancer?cxt=anim - - - - - Look at facials@gen_male@base and facials@gen_female@base for some common facial animations. - !!!NOTE!!! - Unlike most animation natives, the animation comes BEFORE the animation dictionary here. So you could call e.g. - PLAY_FACIAL_ANIM(ped, "dead_1", "facials@gen_male@base") - - - - - Called 38 times in the scripts. There are 5 different audioNames used. - One unknown removed below. - AUDIO::PLAY_MISSION_COMPLETE_AUDIO("DEAD"); - AUDIO::PLAY_MISSION_COMPLETE_AUDIO("FRANKLIN_BIG_01"); - AUDIO::PLAY_MISSION_COMPLETE_AUDIO("GENERIC_FAILED"); - AUDIO::PLAY_MISSION_COMPLETE_AUDIO("TREVOR_SMALL_01"); - - - - - Needs another parameter [int p2]. The signature is PED::PLAY_PAIN(Ped ped, int painID, int p1, int p2); - Last 2 parameters always seem to be 0. - EX: Function.Call(Hash.PLAY_PAIN, TestPed, 6, 0, 0); - Known Pain IDs - ________________________ - 1 - Doesn't seem to do anything. Does NOT crash the game like previously said. (Latest patch) - 6 - Scream (Short) - 7 - Scared Scream (Kinda Long) - 8 - On Fire - - - - - All found occurrences in b617d, sorted alphabetically and identical lines removed: pastebin.com/RFb4GTny - AUDIO::PLAY_PED_RINGTONE("Remote_Ring", PLAYER::PLAYER_PED_ID(), 1); - AUDIO::PLAY_PED_RINGTONE("Dial_and_Remote_Ring", PLAYER::PLAYER_PED_ID(), 1); - - - - - Please change to void. (Does not return anything!) - Plays the given police radio message. - All found occurrences in b617d, sorted alphabetically and identical lines removed: pastebin.com/GBnsQ5hr - - - - - All found occurrences in b617d, sorted alphabetically and identical lines removed: pastebin.com/A8Ny8AHZ - - - - - All found occurrences in b617d, sorted alphabetically and identical lines removed: pastebin.com/eeFc5DiW - gtaforums.com/topic/795622-audio-for-mods - - - - - All found occurrences in b617d, sorted alphabetically and identical lines removed: pastebin.com/f2A7vTj0 - No changes made in b678d. - gtaforums.com/topic/795622-audio-for-mods - - - - - list: pastebin.com/DCeRiaLJ - All found occurrences in b617d, sorted alphabetically and identical lines removed: pastebin.com/0neZdsZ5 - - - - - Used with AUDIO::LOAD_STREAM - Example from finale_heist2b.c4: - AI::TASK_SYNCHRONIZED_SCENE(l_4C8[2 -- [[14]] ], l_4C8[2 -- [[14]] ]._f7, l_30A, "push_out_vault_l", 4.0, -1.5, 5, 713, 4.0, 0); - PED::SET_SYNCHRONIZED_SCENE_PHASE(l_4C8[2 -- [[14]] ]._f7, 0.0); - PED::_2208438012482A1A(l_4C8[2 -- [[14]] ], 0, 0); - PED::SET_PED_COMBAT_ATTRIBUTES(l_4C8[2 -- [[14]] ], 38, 1); - PED::SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(l_4C8[2 -- [[14]] ], 1); - if (AUDIO::LOAD_STREAM("Gold_Cart_Push_Anim_01", "BIG_SCORE_3B_SOUNDS")) { - AUDIO::PLAY_STREAM_FROM_OBJECT(l_36F[0 -- [[1]] ]); - } - - - - - Examples: - CAM::PLAY_SYNCHRONIZED_CAM_ANIM(l_2734, NETWORK::_02C40BF885C567B6(l_2739), "PLAYER_EXIT_L_CAM", "mp_doorbell"); - CAM::PLAY_SYNCHRONIZED_CAM_ANIM(l_F0D[7 -- [[1]] ], l_F4D[15 -- [[1]] ], "ah3b_attackheli_cam2", "missheistfbi3b_helicrash"); - Animations list : www.los-santos-multiplayer.com/dev.airdancer?cxt=anim - - - - - p4 and p7 are usually 1000.0f. - Animations list : www.los-santos-multiplayer.com/dev.airdancer?cxt=anim - - - - - Animations list : www.los-santos-multiplayer.com/dev.airdancer?cxt=anim - - - - - This native only comes up once. And in that one instance, p1 is "1". - - - - - p1 appears to only be "0" or "3". I personally use "0" as p1. - - - - - Only 1 match. ob_sofa_michael. - PLAYER::PLAYER_ATTACH_VIRTUAL_BOUND(-804.5928f, 173.1801f, 71.68436f, 0f, 0f, 0.590625f, 1f, 0.7f);1.0.335.2, 1.0.350.1/2, 1.0.372.2, 1.0.393.2, 1.0.393.4, 1.0.463.1; - - - - - 1.0.335.2, 1.0.350.1/2, 1.0.372.2, 1.0.393.2, 1.0.393.4, 1.0.463.1; - - - - - This returns YOUR 'identity' as a Player type. - Always returns 0 in story mode. - - - - - Returns current player ped - - - - - p5 always seems to be 1 i.e TRUE - - - - - Parameters p0-p5 seems correct. The bool p6 is unknown, but through every X360 script it's always 1. Please correct p0-p5 if any prove to be wrong. - - - - - spawns a few distant/out-of-sight peds, vehicles, animals etc each time it is called - - - - - This native is used to attribute the SRL that BeginSrl is going to load. This is usually used for 'in-game' cinematics (not cutscenes but camera stuff) instead of SetFocusArea because it loads a specific area of the map which is pretty useful when the camera moves from distant areas. - For instance, GTA:O opening cutscene. - <https://pastebin.com/2EeKVeLA> : a list of SRL found in srllist.meta - <https://pastebin.com/zd9XYUWY> : here is the content of a SRL file opened with codewalker. - - A SRL name. - - - - Example: - bool prepareAlarm = AUDIO::PREPARE_ALARM("PORT_OF_LS_HEIST_FORT_ZANCUDO_ALARMS"); - - - - - All music event names found in the b617d scripts: pastebin.com/GnYt0R3P - - - - - This isn't a hash collision. It is used to give the player cash via the CASH_GIFT stats. - - - - - This isn't a hash collision. It is used to give the player cash via the CASH_GIFT stats. - - - - - Called to update entity attachments. - When using ATTACH_ENTITY_TO_ENTITY and using bone '0' then you set the first entity invisible. The attachments will mess up, use bone '-1' to fix that issue - - - - - Pushes a boolean for the Scaleform function onto the stack. - - - - - Pushes a boolean for the Scaleform function onto the stack. - - - - - This method is the equivalent to PUSH_SCALEFORM_MOVIE_FUNCTION_PARAMETER_STRING when using it to add a new button (like "INSTRUCTIONAL_BUTTONS"). - When switching with a controller, the icons update and become the controller's icons. - - - - - This method is the equivalent to PUSH_SCALEFORM_MOVIE_FUNCTION_PARAMETER_STRING when using it to add a new button (like "INSTRUCTIONAL_BUTTONS"). - When switching with a controller, the icons update and become the controller's icons. - - - - - Pushes a float for the Scaleform function onto the stack. - - - - - Pushes a float for the Scaleform function onto the stack. - - - - - Pushes an integer for the Scaleform function onto the stack. - - - - - Pushes an integer for the Scaleform function onto the stack. - - - - - GRAPHICS::\_0x77FE3402004CD1B0(HUD::\_GET_LABEL_TEXT("YACHT_GSY")); - GRAPHICS::\_0x77FE3402004CD1B0(PLAYER::GET_PLAYER_NAME(PLAYER::PLAYER_ID())); - Both \_0xBA7148484BD90365 / \_0x77FE3402004CD1B0 works, but \_0x77FE3402004CD1B0 is usually used for "name" (organisation, players..). - - - - - GRAPHICS::\_0x77FE3402004CD1B0(HUD::\_GET_LABEL_TEXT("YACHT_GSY")); - GRAPHICS::\_0x77FE3402004CD1B0(PLAYER::GET_PLAYER_NAME(PLAYER::PLAYER_ID())); - Both \_0xBA7148484BD90365 / \_0x77FE3402004CD1B0 works, but \_0x77FE3402004CD1B0 is usually used for "name" (organisation, players..). - - - - - **Experimental**: This native may be altered or removed in future versions of CitizenFX without warning. - Registers a set of archetypes with the game engine. These should match `CBaseArchetypeDef` class information from the game. - - A function returning a list of archetypes. - - - - Registered commands can be executed by entering them in the client console (this works for client side and server side registered commands). Or by entering them in the server console/through an RCON client (only works for server side registered commands). Or if you use a supported chat resource, like the default one provided in the cfx-server-data repository, then you can enter the command in chat by prefixing it with a `/`. - Commands registered using this function can also be executed by resources, using the [`ExecuteCommand` native](#_0x561C060B). - The restricted bool is not used on the client side. Permissions can only be checked on the server side, so if you want to limit your command with an ace permission automatically, make it a server command (by registering it in a server script). - **Example result**: - ![](https://i.imgur.com/TaCnG09.png) - - The command you want to register. - A handler function that gets called whenever the command is executed. - If this is a server command and you set this to true, then players will need the command.yourCommandName ace permission to execute this command. - - - - **Experimental**: This native may be altered or removed in future versions of CitizenFX without warning. - Registers a set of entities with the game engine. These should match `CEntityDef` class information from the game. - At this time, this function **should not be used in a live environment**. - - A function returning a list of entities. - - - - Registers a specified .gfx file as GFx font library. - The .gfx file has to be registered with the streamer already. - - The name of the .gfx file, without extension. - - - - Registers a specified font name for use with text draw commands. - - The name of the font in the GFx font library. - An index to use with [SET_TEXT_FONT](#_0x66E0276CC5F6B9DA) and similar natives. - - - - Based on TASK_COMBAT_HATED_TARGETS_AROUND_PED, the parameters are likely similar (PedHandle, and area to attack in). - - - - - Registers a script for any object with a specific model hash. - BRAIN::REGISTER_OBJECT_SCRIPT_BRAIN("ob_telescope", ${prop_telescope_01}, 100, 4.0, -1, 9); - - - - - gtaforums.com/topic/885580-ped-headshotmugshot-txd/ - - - - - **Experimental**: This native may be altered or removed in future versions of CitizenFX without warning. - Registers a dynamic streaming asset from the server with the GTA streaming module system. - - The resource to add the asset to. - A file name in the resource. - The string returned from `REGISTER_RESOURCE_ASSET` on the server. - - - - **Experimental**: This native may be altered or removed in future versions of CitizenFX without warning. - Registers a KVP value as an asset with the GTA streaming module system. This function currently won't work. - - The KVP key in the current resource to register as an asset. - - - - **Experimental**: This native may be altered or removed in future versions of CitizenFX without warning. - Registers a file from an URL as a streaming asset in the GTA streaming subsystem. This will asynchronously register the asset, and caching is done based on the URL itself - cache headers are ignored. - Use `IS_STREAMING_FILE_READY` to check if the asset has been registered successfully. - - The file name to register as, for example `asset.ydr`. - The URL to fetch the asset from. - - - - PED::REGISTER_TARGET(l_216, PLAYER::PLAYER_PED_ID()); from re_prisonbreak.txt. - l_216 = RECSBRobber1 - - - - - setting the last params to false it does that same so I would suggest its not a toggle - - - - - Pickup hashes: pastebin.com/8EuSv2r1 - - - - - p1 seems always to be 0 - - - - - Unloads the specified animation set. An animation set provides movement animations for a ped. See SET_PED_MOVEMENT_CLIPSET. - Animation set and clip set are synonymous. - - - - - In the C++ SDK, this seems not to work-- the blip isn't removed immediately. I use it for saving cars. - E.g.: - Ped pped = PLAYER::PLAYER_PED_ID(); - Vehicle v = PED::GET_VEHICLE_PED_IS_USING(pped); - Blip b = UI::ADD_BLIP_FOR_ENTITY(v); - works fine. - But later attempting to delete it with: - Blip b = UI::GET_BLIP_FROM_ENTITY(v); - if (UI::DOES_BLIP_EXIST(b)) UI::REMOVE_BLIP(&b); - doesn't work. And yes, doesn't work without the DOES_BLIP_EXIST check either. Also, if you attach multiple blips to the same thing (say, a vehicle), and that thing disappears, the blips randomly attach to other things (in my case, a vehicle). - Thus for me, UI::REMOVE_BLIP(&b) only works if there's one blip, (in my case) the vehicle is marked as no longer needed, you drive away from it and it eventually despawns, AND there is only one blip attached to it. I never intentionally attach multiple blips but if the user saves the car, this adds a blip. Then if they delete it, it is supposed to remove the blip, but it doesn't. Then they can immediately save it again, causing another blip to re-appear. - ------------- - Passing the address of the variable instead of the value works for me. - e.g. - int blip = UI::ADD_BLIP_FOR_ENTITY(ped); - UI::REMOVE_BLIP(&blip); - Remove blip will currently crash your game, just artificially remove the blip by setting the sprite to a id that is 'invisible'. - -- - It crashes my game. - - - - - Alias for REMOVE_ANIM_SET. - - - - - p0 is the handle returned from _0xFDBF4CDBC07E1706 - - - - - p0 is the handle returned from _0xFDBF4CDBC07E1706 - - - - - Removes all decals in range from a position, it includes the bullet holes, blood pools, petrol... - - - - - IPL list: pastebin.com/iNGLY32D - - - - - Removes the loading prompt at the bottom right of the screen, created by the UI::_SHOW_LOADING_PROMPT native. - - - - - Removes the loading prompt at the bottom right of the screen, created by the UI::_SHOW_LOADING_PROMPT native. - - - - - Removes multiplayer cash hud each frame - - - - - assetName = For example "core" - console hash: 0xC44762A1 - - - - - Removes a notification instantly instead of waiting for it to disappear - - - - - Ped will no longer get angry when you stay near him. - - - - - Judging purely from a quick disassembly, if the ped is in a vehicle, the ped will be deleted immediately. If not, it'll be marked as no longer needed. - very elegant.. - - - - - Retracts the hook on the cargobob. - Note: after you retract it the natives for dropping the hook no longer work - - - - - Retracts the hook on the cargobob. - Note: after you retract it the natives for dropping the hook no longer work - - - - - Experimental natives, please do not use in a live environment. - - - - - Used to remove a speedzone. - This is the speed zone native. - Example usage C#: - uint speedZone = Function.Call<uint>((Hash) 0x2CE544C68FB812A0, Game.PlayerPed.Position.X, Game.PlayerPed.Position.Y, Game.PlayerPed.Position.Z, 100.0f, 0.0f, false); - bool speedZoneClosed = Function.Call<bool>((Hash) 0x1033371FC8E842A7, speedZone); - (Thanks to alexguirre for his help!) - - - - - Used to remove a speedzone. - This is the speed zone native. - Example usage C#: - uint speedZone = Function.Call<uint>((Hash) 0x2CE544C68FB812A0, Game.PlayerPed.Position.X, Game.PlayerPed.Position.Y, Game.PlayerPed.Position.Z, 100.0f, 0.0f, false); - bool speedZoneClosed = Function.Call<bool>((Hash) 0x1033371FC8E842A7, speedZone); - (Thanks to alexguirre for his help!) - - - - - Appears to remove stealth kill action from memory. - ------------------------------------ - I agree with the above statement. - p1 is unknown, my best guess would be if false it marks the stealth kill for immediate deletion, or if true marks it for deletion later. - - - - - Appears to remove stealth kill action from memory. - ------------------------------------ - I agree with the above statement. - p1 is unknown, my best guess would be if false it marks the stealth kill for immediate deletion, or if true marks it for deletion later. - - - - - windowIndex: - 0 = Front Right Window - 1 = Front Left Window - 2 = Back Right Window - 3 = Back Left Window - - - - - For a full list, see here: pastebin.com/Tp0XpBMN - - - - - This native removes a specified weapon from your selected ped. - Weapon Hashes: pastebin.com/0wwDZgkF - Example: - C#: - Function.Call(Hash.REMOVE_WEAPON_FROM_PED, Game.Player.Character, 0x99B507EA); - C++: - WEAPON::REMOVE_WEAPON_FROM_PED(PLAYER::PLAYER_PED_ID(), 0x99B507EA); - The code above removes the knife from the player. - - - - - This native makes the gameplay camera zoom into first person/third person with a special effect. - For example, if you were first person in a mission and after the cutscene ends, the camera would then zoom into the first person camera view. - if (CAM::GET_FOLLOW_PED_CAM_VIEW_MODE() != 4) - CAM::_C819F3CBB62BF692(1, 0, 3, 0) - This makes the camera zoom in to first person. - -------------------------------------------- - 1st Param Options: 0 or 1 (Changes quit often, toggle?) - 2nd Param Options: 0, 0f, 1f, 3.8f, 10f, 20f (Mostly 0) - 3rd Param Options: 3, 2, 1 (Mostly 3); - Note for the 2nd param 10f (offroad_race.c) and 3rd param 20f (range_modern.c) are the only times those 2 high floats are called. - Note for the 3rd param 2 is only ever set in (franklin0.c), but it also sets it as 3. (0, 0, 3) ||(0, 0f, 2) || (0, 0, 3) - - - - - This native makes the gameplay camera zoom into first person/third person with a special effect. - For example, if you were first person in a mission and after the cutscene ends, the camera would then zoom into the first person camera view. - if (CAM::GET_FOLLOW_PED_CAM_VIEW_MODE() != 4) - CAM::_C819F3CBB62BF692(1, 0, 3, 0) - This makes the camera zoom in to first person. - -------------------------------------------- - 1st Param Options: 0 or 1 (Changes quit often, toggle?) - 2nd Param Options: 0, 0f, 1f, 3.8f, 10f, 20f (Mostly 0) - 3rd Param Options: 3, 2, 1 (Mostly 3); - Note for the 2nd param 10f (offroad_race.c) and 3rd param 20f (range_modern.c) are the only times those 2 high floats are called. - Note for the 3rd param 2 is only ever set in (franklin0.c), but it also sets it as 3. (0, 0, 3) ||(0, 0f, 2) || (0, 0, 3) - - - - - ease - smooth transition between the camera's positions - easeTime - Time in milliseconds for the transition to happen - If you have created a script (rendering) camera, and want to go back to the - character (gameplay) camera, call this native with render set to 0. - Setting ease to 1 will smooth the transition. - - - - - PLAYER::REPORT_CRIME(PLAYER::PLAYER_ID(), 37, PLAYER::GET_WANTED_LEVEL_THRESHOLD(1)); - From am_armybase.ysc.c4: - PLAYER::REPORT_CRIME(PLAYER::PLAYER_ID(4), 36, PLAYER::GET_WANTED_LEVEL_THRESHOLD(4)); - ----- - This was taken from the GTAV.exe v1.334. The function is called sub_140592CE8. For a full decompilation of the function, see here: pastebin.com/09qSMsN7 - ----- - crimeType: - 1: Firearms possession - 2: Person running a red light ("5-0-5") - 3: Reckless driver - 4: Speeding vehicle (a "5-10") - 5: Traffic violation (a "5-0-5") - 6: Motorcycle rider without a helmet - 7: Vehicle theft (a "5-0-3") - 8: Grand Theft Auto - 9: ??? - 10: ??? - 11: Assault on a civilian (a "2-40") - 12: Assault on an officer - 13: Assault with a deadly weapon (a "2-45") - 14: Officer shot (a "2-45") - 15: Pedestrian struck by a vehicle - 16: Officer struck by a vehicle - 17: Helicopter down (an "AC"?) - 18: Civilian on fire (a "2-40") - 19: Officer set on fire (a "10-99") - 20: Car on fire - 21: Air unit down (an "AC"?) - 22: An explosion (a "9-96") - 23: A stabbing (a "2-45") (also something else I couldn't understand) - 24: Officer stabbed (also something else I couldn't understand) - 25: Attack on a vehicle ("MDV"?) - 26: Damage to property - 27: Suspect threatening officer with a firearm - 28: Shots fired - 29: ??? - 30: ??? - 31: ??? - 32: ??? - 33: ??? - 34: A "2-45" - 35: ??? - 36: A "9-25" - 37: ??? - 38: ??? - 39: ??? - 40: ??? - 41: ??? - 42: ??? - 43: Possible disturbance - 44: Civilian in need of assistance - 45: ??? - 46: ??? - - - - - MulleDK19: Alias of REQUEST_COLLISION_AT_COORD. - - - - - Request a gxt into the passed slot. - - - - - All occurrences and usages found in b617d, sorted alphabetically and identical lines removed: pastebin.com/XZ1tmGEz - - - - - Starts loading the specified animation set. An animation set provides movement animations for a ped. See SET_PED_MOVEMENT_CLIPSET. - - - - - p1: usually 8 - Cutscene list: pastebin.com/Bbj7ANpQ - - - - - Example: - CUTSCENE::_0xC23DE0E91C30B58C("JOSH_1_INT_CONCAT", 13, 8); - Cutscene list: pastebin.com/Bbj7ANpQ - - - - - Example: - CUTSCENE::_0xC23DE0E91C30B58C("JOSH_1_INT_CONCAT", 13, 8); - Cutscene list: pastebin.com/Bbj7ANpQ - - - - - http://gtaforums.com/topic/717612-v-scriptnative-documentation-and-research/?p=1068285912 - - - - - http://gtaforums.com/topic/717612-v-scriptnative-documentation-and-research/?p=1068285912 - - - - - REQUEST_* - Something to do with interiors that have been loaded. - STREAMING::_8A7A40100EDFEC58(l_13BC, "V_FIB01_cur_elev"); - STREAMING::_8A7A40100EDFEC58(l_13BC, "limbo"); - STREAMING::_8A7A40100EDFEC58(l_13BB, "V_Office_gnd_lifts"); - STREAMING::_8A7A40100EDFEC58(l_13BB, "limbo"); - STREAMING::_8A7A40100EDFEC58(l_13BC, "v_fib01_jan_elev"); - STREAMING::_8A7A40100EDFEC58(l_13BC, "limbo"); - - - - - REQUEST_* - Something to do with interiors that have been loaded. - STREAMING::_8A7A40100EDFEC58(l_13BC, "V_FIB01_cur_elev"); - STREAMING::_8A7A40100EDFEC58(l_13BC, "limbo"); - STREAMING::_8A7A40100EDFEC58(l_13BB, "V_Office_gnd_lifts"); - STREAMING::_8A7A40100EDFEC58(l_13BB, "limbo"); - STREAMING::_8A7A40100EDFEC58(l_13BC, "v_fib01_jan_elev"); - STREAMING::_8A7A40100EDFEC58(l_13BC, "limbo"); - - - - - IPL list: pastebin.com/iNGLY32D - - - - - streaming::request_menu_ped_model(joaat("player_zero")); - iVar0 = ped::create_ped(25, joaat("player_zero"), cam::_get_gameplay_cam_coords(), 0f, 0, false); - entity::freeze_entity_position(iVar0, true); - ped::_0x4668d80430d6c299(iVar0); - ui::give_ped_to_pause_menu(iVar0, 1); - - - - - streaming::request_menu_ped_model(joaat("player_zero")); - iVar0 = ped::create_ped(25, joaat("player_zero"), cam::_get_gameplay_cam_coords(), 0f, 0, false); - entity::freeze_entity_position(iVar0, true); - ped::_0x4668d80430d6c299(iVar0); - ui::give_ped_to_pause_menu(iVar0, 1); - - - - - All occurrences and usages found in b617d: pastebin.com/NzZZ2Tmm - - - - - Request a model to be loaded into memory - Looking it the disassembly, it seems like it actually returns the model if it's already loaded. - - - - - assetName = For example "core" - From the b678d decompiled scripts: - STREAMING::REQUEST_NAMED_PTFX_ASSET("core_snow"); - STREAMING::REQUEST_NAMED_PTFX_ASSET("fm_mission_controler"); - STREAMING::REQUEST_NAMED_PTFX_ASSET("proj_xmas_firework"); - STREAMING::REQUEST_NAMED_PTFX_ASSET("scr_apartment_mp"); - STREAMING::REQUEST_NAMED_PTFX_ASSET("scr_biolab_heist"); - STREAMING::REQUEST_NAMED_PTFX_ASSET("scr_indep_fireworks"); - STREAMING::REQUEST_NAMED_PTFX_ASSET("scr_indep_parachute"); - STREAMING::REQUEST_NAMED_PTFX_ASSET("scr_indep_wheelsmoke"); - STREAMING::REQUEST_NAMED_PTFX_ASSET("scr_mp_cig_plane"); - STREAMING::REQUEST_NAMED_PTFX_ASSET("scr_mp_creator"); - STREAMING::REQUEST_NAMED_PTFX_ASSET("scr_mp_tankbattle"); - STREAMING::REQUEST_NAMED_PTFX_ASSET("scr_ornate_heist"); - STREAMING::REQUEST_NAMED_PTFX_ASSET("scr_prison_break_heist_station"); - - - - - maps script name (thread + 0xD0) by lookup via scriptfx.dat - does nothing when script name is empty - - - - - GTA V Scaleforms Decompiled - pastebin.com/mmNdjX2k - Gets a new native after almost every update. - Update 1.0.393.2 - 0x67D02A194A2FC2BD - Update 1.0.463.1 - 0xC97D787CE7726A2F - Update 1.0.505.2 - 0x36ECDA4DD9A3F08D - Update 1.0.573.1 - 0xE3C796DC28BC3254 - Update 1.0.678.1 - 0x2F14983962462691 - - - - - Also used by 0x67D02A194A2FC2BD - - - - - Similar to REQUEST_SCALEFORM_MOVIE, but seems to be some kind of "interactive" scaleform movie? - These seem to be the only scaleforms ever requested by this native: - "breaking_news" - "desktop_pc" - "ECG_MONITOR" - "Hacking_PC" - "TEETH_PULLING" - Note: Unless this hash is out-of-order, this native is next-gen only. - - - - - Similar to REQUEST_SCALEFORM_MOVIE, but seems to be some kind of "interactive" scaleform movie? - These seem to be the only scaleforms ever requested by this native: - "breaking_news" - "desktop_pc" - "ECG_MONITOR" - "Hacking_PC" - "TEETH_PULLING" - Note: Unless this hash is out-of-order, this native is next-gen only. - - - - - For a full list, see here: pastebin.com/yLNWicUi - - - - - All occurrences and usages found in b617d, sorted alphabetically and identical lines removed: pastebin.com/AkmDAVn6 - - - - - formerly _REQUEST_STREAMED_SCRIPT - - - - - formerly _REQUEST_STREAMED_SCRIPT - - - - - last param seems to be unused in disassembly - - - - - REQUEST_VEHICLE_ASSET(GET_HASH_KEY(cargobob3), 3); - vehicle found that have asset's: - cargobob3 - submersible - blazer - - - - - used for the remote vehicle explode thing with phones - - - - - used for the remote vehicle explode thing with phones - - - - - In script files, seen as REQUEST_VEHICLE_RECORDING(1, "FBIs1UBER"); - - - - - For a full list, see here: pastebin.com/Tp0XpBMN - For a full list of the points, see here: goo.gl/wIH0vn - Max number of loaded recordings is 32. - - - - - Nearly every instance of p1 I found was 31. Nearly every instance of p2 I found was 0. - REQUEST_WEAPON_ASSET(iLocal_1888, 31, 26); - - - - - Sets the waves intensity back to original (1.0 in most cases). - - - - - Sets the waves intensity back to original (1.0 in most cases). - - - - - Sets the waves intensity back to original (1.0 in most cases). - - - - - Sets (almost, not sure) all Rockstar Editor values (bIsRecording etc) to 0. - - - - - Sets (almost, not sure) all Rockstar Editor values (bIsRecording etc) to 0. - - - - - Resets the extra timecycle modifier strength normally set with [`SetExtraTimecycleModifierStrength`](#_0x2C328AF17210F009) - - - - - Resets the extra timecycle modifier strength normally set with [`SetExtraTimecycleModifierStrength`](#_0x2C328AF17210F009) - - - - - Sets the localplayer playerinfo state back to playing (State 0) - States are: - -1: "Invalid" - 0: "Playing" - 1: "Died" - 2: "Arrested" - 3: "Failed Mission" - 4: "Left Game" - 5: "Respawn" - 6: "In MP Cutscene" - - - - - console hash: 0x9E8D8B72 - Resets the effect of _SET_PARTICLE_FX_ASSET_OLD_TO_NEW - - - - - console hash: 0x9E8D8B72 - Resets the effect of _SET_PARTICLE_FX_ASSET_OLD_TO_NEW - - - - - Resets the value for the last vehicle driven by the Ped. - - - - - If p1 is 0.0, I believe you are back to normal. - If p1 is 1.0, it looks like you can only rotate the ped, not walk. - Using the following code to reset back to normal - PED::RESET_PED_MOVEMENT_CLIPSET(PLAYER::PLAYER_PED_ID(), 0.0); - - - - - There seem to be 26 flags - - - - - There seem to be 26 flags - - - - - This function resets the alignment set using `SET_SCRIPT_GFX_ALIGN` and `SET_SCRIPT_GFX_ALIGN_PARAMS` to the default - values ('I', 'I'; 0, 0, 0, 0). This should be used after having used the aforementioned functions in order to not affect - any other scripts attempting to draw. - - - - - This function resets the alignment set using `SET_SCRIPT_GFX_ALIGN` and `SET_SCRIPT_GFX_ALIGN_PARAMS` to the default - values ('I', 'I'; 0, 0, 0, 0). This should be used after having used the aforementioned functions in order to not affect - any other scripts attempting to draw. - - - - - This function resets the alignment set using `SET_SCRIPT_GFX_ALIGN` and `SET_SCRIPT_GFX_ALIGN_PARAMS` to the default - values ('I', 'I'; 0, 0, 0, 0). This should be used after having used the aforementioned functions in order to not affect - any other scripts attempting to draw. - - - - - The inner function has a switch on the second parameter. It's the stuck timer index. - Here's some pseudo code I wrote for the inner function: - void __fastcall NATIVE_RESET_VEHICLE_STUCK_TIMER_INNER(CUnknown* unknownClassInVehicle, int timerIndex) - { - switch (timerIndex) - { - case 0: - unknownClassInVehicle->FirstStuckTimer = (WORD)0u; - case 1: - unknownClassInVehicle->SecondStuckTimer = (WORD)0u; - case 2: - unknownClassInVehicle->ThirdStuckTimer = (WORD)0u; - case 3: - unknownClassInVehicle->FourthStuckTimer = (WORD)0u; - case 4: - unknownClassInVehicle->FirstStuckTimer = (WORD)0u; - unknownClassInVehicle->SecondStuckTimer = (WORD)0u; - unknownClassInVehicle->ThirdStuckTimer = (WORD)0u; - unknownClassInVehicle->FourthStuckTimer = (WORD)0u; - break; - }; - } - - - - - Please change back to _0xBD12C5EEE184C33 (hash collision) - actual native starts with SET_RADAR_ZOOM_... - - - - - Before using this native click the native above and look at the decription. - Example: - int GetHash = Function.Call<int>(Hash.GET_HASH_KEY, "fe_menu_version_corona_lobby"); - Function.Call(Hash.ACTIVATE_FRONTEND_MENU, GetHash, 0, -1); - Function.Call(Hash.RESTART_FRONTEND_MENU(GetHash, -1); - This native refreshes the frontend menu. - p1 = Hash of Menu - p2 = Unknown but always works with -1. - - - - - This function will simply bring the dead person back to life. - Try not to use it alone, since using this function alone, will make peds fall through ground in hell(well for the most of the times). - Instead, before calling this function, you may want to declare the position, where your Resurrected ped to be spawn at.(For instance, Around 2 floats of Player's current position.) - Also, disabling any assigned task immediately helped in the number of scenarios, where If you want peds to perform certain decided tasks. - - - - - It returns two lol - li r3, 2 - blr - thats all it does. - mov dword ptr [rax], 2 - Заебись функционал - - - - - It returns two lol - li r3, 2 - blr - thats all it does. - mov dword ptr [rax], 2 - Заебись функционал - - - - - It will revive/cure the injured ped. The condition is ped must not be dead. - Upon setting and converting the health int, found, if health falls below 5, the ped will lay on the ground in pain(Maximum default health is 100). - This function is well suited there. - - - - - windowIndex: - 0 = Front Right Window - 1 = Front Left Window - 2 = Back Right Window - 3 = Back Left Window - - - - - Roll down all the windows of the vehicle passed through the first parameter. - - - - - 0 = Front Right Window - 1 = Front Left Window - 2 = Back Right Window - 3 = Back Left Window - - - - - Forces a rope to a certain length. - - - - - Loads rope textures for all ropes in the current scene. - - - - - Reset a rope to a certain length. - - - - - Unloads rope textures for all ropes in the current scene. - - - - - Returns the status of a _SC_START_CHECK_STRING_TASK task. - Possible return values: - 0: not a profane string - 1: a profane string - 3: server error occurred - - - - - Returns the status of a _SC_START_CHECK_STRING_TASK task. - Possible return values: - 0: not a profane string - 1: a profane string - 3: server error occurred - - - - - Returns the nickname of the logged-in Rockstar Social Club account. - - - - - Returns whether or not a task started with _SC_START_CHECK_STRING_TASK has completed. - - - - - Returns whether or not a task started with _SC_START_CHECK_STRING_TASK has completed. - - - - - Starts a task to check an entered string for profanity on the ROS/Social Club services. - See also: 1753344C770358AE, 82E4A58BABC15AE7. - - - - - Starts a task to check an entered string for profanity on the ROS/Social Club services. - See also: 1753344C770358AE, 82E4A58BABC15AE7. - - - - - If bool Toggle = true so the mobile is hide to screen. - If bool Toggle = false so the mobile is show to screen. - - - - - Sends a message to the specific DUI root page. This is similar to SEND_NUI_MESSAGE. - - The DUI browser handle. - The message, encoded as JSON. - - - - Injects a 'mouse down' event for a DUI object. Coordinates are expected to be set using SEND_DUI_MOUSE_MOVE. - - The DUI browser handle. - Either `'left'`, `'middle'` or `'right'`. - - - - Injects a 'mouse move' event for a DUI object. Coordinates are in browser space. - - The DUI browser handle. - The mouse X position. - The mouse Y position. - - - - Injects a 'mouse up' event for a DUI object. Coordinates are expected to be set using SEND_DUI_MOUSE_MOVE. - - The DUI browser handle. - Either `'left'`, `'middle'` or `'right'`. - - - - Injects a 'mouse wheel' event for a DUI object. - - The DUI browser handle. - The wheel Y delta. - The wheel X delta. - - - - Sends a message to the `loadingScreen` NUI frame, which contains the HTML page referenced in `loadscreen` resources. - - The JSON-encoded message. - A success value. - - - - If 'value' is 50 and 'maxValue' is 100, the bar is halfway filled. - Same with 5/10, 2/4, etc. - - - - - This seems to be related to Steam achievements. - p0 and p1 are int (?) - ------ - Can't say anything about the Steam version but it is hardcoded to always return false in the retail version. - Dr. Underscore (1/6/18): - This has to do with achievement progression. If this achievement has progression, it will set the progression of it to this value. - Only tested on un-achieved achievements, Steamworks probably just rejects it if it has already been achieved. - Steamworks also seems to not like reversing achievement progression. - - - - - This seems to be related to Steam achievements. - p0 and p1 are int (?) - ------ - Can't say anything about the Steam version but it is hardcoded to always return false in the retail version. - Dr. Underscore (1/6/18): - This has to do with achievement progression. If this achievement has progression, it will set the progression of it to this value. - Only tested on un-achieved achievements, Steamworks probably just rejects it if it has already been achieved. - Steamworks also seems to not like reversing achievement progression. - - - - - Makes pedestrians sound their horn longer, faster and more agressive when they use their horn. - - - - - Previously named _0x97C65887D4B37FA9. - Sets the maximum view distance for the AI BIP - - - - - Previously named _0x97C65887D4B37FA9. - Sets the maximum view distance for the AI BIP - - - - - Set a ped's AI blip type: - 1 - Yellow blip with no name - 2 - - - - - Set a ped's AI blip type: - 1 - Yellow blip with no name - 2 - - - - - This can be between 1.0f - 14.9f - You can change the max in IDA from 15.0. I say 15.0 as the function blrs if what you input is greater than or equal to 15.0 hence why it's 14.9 max default. - On PC the multiplier can be between 0.0f and 50.0f (inclusive). - - - - - Sets the amount of bombs that this vehicle has. As far as I know, this does _not_ impact vehicle weapons or the ammo of those weapons in any way, it is just a way to keep track of the amount of bombs in a specific plane. - In decompiled scripts this is used to deduct from or add to the count whenever bombs are dropped or purchased/restocked. - Use [`_GET_AIRCRAFT_BOMB_COUNT`](#_0xEA12BD130D7569A1) to get the amount of bombs on that vehicle. - - The vehicle to set the bombCount on. - The amount of bombs to set for this vehicle. - - - - Sets the amount of bombs that this vehicle has. As far as I know, this does _not_ impact vehicle weapons or the ammo of those weapons in any way, it is just a way to keep track of the amount of bombs in a specific plane. - In decompiled scripts this is used to deduct from or add to the count whenever bombs are dropped or purchased/restocked. - Use [`_GET_AIRCRAFT_BOMB_COUNT`](#_0xEA12BD130D7569A1) to get the amount of bombs on that vehicle. - - The vehicle to set the bombCount on. - The amount of bombs to set for this vehicle. - - - - Sets the amount of bombs that this vehicle has. As far as I know, this does _not_ impact vehicle weapons or the ammo of those weapons in any way, it is just a way to keep track of the amount of bombs in a specific plane. - In decompiled scripts this is used to deduct from or add to the count whenever bombs are dropped or purchased/restocked. - Use [`_GET_AIRCRAFT_BOMB_COUNT`](#_0xEA12BD130D7569A1) to get the amount of bombs on that vehicle. - - The vehicle to set the bombCount on. - The amount of bombs to set for this vehicle. - - - - Similar to [`_SET_AIRCRAFT_BOMB_COUNT`](#_0xF4B2ED59DEB5D774), this sets the amount of countermeasures that are present on this vehicle. - Use [`_GET_AIRCRAFT_COUNTERMEASURE_COUNT`](#_0xF846AA63DF56B804) to get the current amount. - - The vehicle to set the amount of countermeasures on. - The amount of countermeasures to set on this vehicle. - - - - Similar to [`_SET_AIRCRAFT_BOMB_COUNT`](#_0xF4B2ED59DEB5D774), this sets the amount of countermeasures that are present on this vehicle. - Use [`_GET_AIRCRAFT_COUNTERMEASURE_COUNT`](#_0xF846AA63DF56B804) to get the current amount. - - The vehicle to set the amount of countermeasures on. - The amount of countermeasures to set on this vehicle. - - - - Most likely a hash collision - - - - - Audio List - gtaforums.com/topic/795622-audio-for-mods/ - All found occurrences in b617d, sorted alphabetically and identical lines removed: pastebin.com/FTeAj4yZ - Yes - - - - - All occurrences found in b617d, sorted alphabetically and identical lines removed: pastebin.com/WkXDGgQL - New Ambient Zone List (Combind with old): pastebin.com/h8BsKgUD -DasChaos - - - - - All occurrences found in b617d, sorted alphabetically and identical lines removed: pastebin.com/jYvw7N1S - New Ambient Zone List (Combind with old): pastebin.com/h8BsKgUD -DasChaos - - - - - mood can be 0 or 1 (it's not a boolean value!). Effects audio of the animal. - - - - - Does not affect weapons, particles, fire/explosions, flashlights or the sun. - When set to true, all emissive textures (including ped components that have light effects), street lights, building lights, vehicle lights, etc will all be turned off. - Used in Humane Labs Heist for EMP. - - True turns off all artificial light sources in the map: buildings, street lights, car lights, etc. False turns them back on. - - - - Does not affect weapons, particles, fire/explosions, flashlights or the sun. - When set to true, all emissive textures (including ped components that have light effects), street lights, building lights, vehicle lights, etc will all be turned off. - Used in Humane Labs Heist for EMP. - - True turns off all artificial light sources in the map: buildings, street lights, car lights, etc. False turns them back on. - - - - Possible flag names: - "ActivateSwitchWheelAudio" - "AllowAmbientSpeechInSlowMo" - "AllowCutsceneOverScreenFade" - "AllowForceRadioAfterRetune" - "AllowPainAndAmbientSpeechToPlayDuringCutscene" - "AllowPlayerAIOnMission" - "AllowPoliceScannerWhenPlayerHasNoControl" - "AllowRadioDuringSwitch" - "AllowRadioOverScreenFade" - "AllowScoreAndRadio" - "AllowScriptedSpeechInSlowMo" - "AvoidMissionCompleteDelay" - "DisableAbortConversationForDeathAndInjury" - "DisableAbortConversationForRagdoll" - "DisableBarks" - "DisableFlightMusic" - "DisableReplayScriptStreamRecording" - "EnableHeadsetBeep" - "ForceConversationInterrupt" - "ForceSeamlessRadioSwitch" - "ForceSniperAudio" - "FrontendRadioDisabled" - "HoldMissionCompleteWhenPrepared" - "IsDirectorModeActive" - "IsPlayerOnMissionForSpeech" - "ListenerReverbDisabled" - "LoadMPData" - "MobileRadioInGame" - "OnlyAllowScriptTriggerPoliceScanner" - "PlayMenuMusic" - "PoliceScannerDisabled" - "ScriptedConvListenerMaySpeak" - "SpeechDucksScore" - "SuppressPlayerScubaBreathing" - "WantedMusicDisabled" - "WantedMusicOnMission" - ------------------------------- - No added flag names between b393d and b573d, including b573d. - ####################################################################### - "IsDirectorModeActive" is an audio flag which will allow you to play speech infinitely without any pauses like in Director Mode. - ----------------------------------------------------------------------- - All flag IDs and hashes: - ID: 01 | Hash: 0x20A7858F - ID: 02 | Hash: 0xA11C2259 - ID: 03 | Hash: 0x08DE4700 - ID: 04 | Hash: 0x989F652F - ID: 05 | Hash: 0x3C9E76BA - ID: 06 | Hash: 0xA805FEB0 - ID: 07 | Hash: 0x4B94EA26 - ID: 08 | Hash: 0x803ACD34 - ID: 09 | Hash: 0x7C741226 - ID: 10 | Hash: 0x31DB9EBD - ID: 11 | Hash: 0xDF386F18 - ID: 12 | Hash: 0x669CED42 - ID: 13 | Hash: 0x51F22743 - ID: 14 | Hash: 0x2052B35C - ID: 15 | Hash: 0x071472DC - ID: 16 | Hash: 0xF9928BCC - ID: 17 | Hash: 0x7ADBDD48 - ID: 18 | Hash: 0xA959BA1A - ID: 19 | Hash: 0xBBE89B60 - ID: 20 | Hash: 0x87A08871 - ID: 21 | Hash: 0xED1057CE - ID: 22 | Hash: 0x1584AD7A - ID: 23 | Hash: 0x8582CFCB - ID: 24 | Hash: 0x7E5E2FB0 - ID: 25 | Hash: 0xAE4F72DB - ID: 26 | Hash: 0x5D16D1FA - ID: 27 | Hash: 0x06B2F4B8 - ID: 28 | Hash: 0x5D4CDC96 - ID: 29 | Hash: 0x8B5A48BA - ID: 30 | Hash: 0x98FBD539 - ID: 31 | Hash: 0xD8CB0473 - ID: 32 | Hash: 0x5CBB4874 - ID: 33 | Hash: 0x2E9F93A9 - ID: 34 | Hash: 0xD93BEA86 - ID: 35 | Hash: 0x92109B7D - ID: 36 | Hash: 0xB7EC9E4D - ID: 37 | Hash: 0xCABDBB1D - ID: 38 | Hash: 0xB3FD4A52 - ID: 39 | Hash: 0x370D94E5 - ID: 40 | Hash: 0xA0F7938F - ID: 41 | Hash: 0xCBE1CE81 - ID: 42 | Hash: 0xC27F1271 - ID: 43 | Hash: 0x9E3258EB - ID: 44 | Hash: 0x551CDA5B - ID: 45 | Hash: 0xCB6D663C - ID: 46 | Hash: 0x7DACE87F - ID: 47 | Hash: 0xF9DE416F - ID: 48 | Hash: 0x882E6E9E - ID: 49 | Hash: 0x16B447E7 - ID: 50 | Hash: 0xBD867739 - ID: 51 | Hash: 0xA3A58604 - ID: 52 | Hash: 0x7E046BBC - ID: 53 | Hash: 0xD95FDB98 - ID: 54 | Hash: 0x5842C0ED - ID: 55 | Hash: 0x285FECC6 - ID: 56 | Hash: 0x9351AC43 - ID: 57 | Hash: 0x50032E75 - ID: 58 | Hash: 0xAE6D0D59 - ID: 59 | Hash: 0xD6351785 - ID: 60 | Hash: 0xD25D71BC - ID: 61 | Hash: 0x1F7F6423 - ID: 62 | Hash: 0xE24C3AA6 - ID: 63 | Hash: 0xBFFDD2B7 - - - - - Toggles the big minimap state like in GTA:Online. - To get the current state of the minimap, use [`GetBigmapActive`](#_0xF6AE18A7). - - Enable or disable the expanded minimap. - Enable or disable the full map from being shown on the minimap, requires p0 to be true. - - - - Toggles the big minimap state like in GTA:Online. - To get the current state of the minimap, use [`GetBigmapActive`](#_0xF6AE18A7). - - Enable or disable the expanded minimap. - Enable or disable the full map from being shown on the minimap, requires p0 to be true. - - - - Only works on bikes, both X and Y work in the -1 - 1 range. - X forces the bike to turn left or right (-1, 1) - Y forces the bike to lean to the left or to the right (-1, 1) - Example with X -1/Y 1 - http://i.imgur.com/TgIuAPJ.jpg - - - - - This sets bit [offset] of [address] to on. - The offsets used are different bits to be toggled on and off, typically there is only one address used in a script. - Example: - GAMEPLAY::SET_BIT(&bitAddress, 1); - To check if this bit has been enabled: - GAMEPLAY::IS_BIT_SET(bitAddress, 1); // will return 1 afterwards - Please note, this method may assign a value to [address] when used. - - - - - Sets alpha-channel for blip color. - Example: - Blip blip = UI::ADD_BLIP_FOR_ENTITY(entity); - UI::SET_BLIP_COLOUR(blip , 3); - UI::SET_BLIP_ALPHA(blip , 64); - - - - - false for enemy - true for friendly - - - - - Sets whether or not the specified blip should only be displayed when nearby, or on the minimap. - - The blip handle. - True to only display the blip as 'short range', false to display the blip from a longer distance. - - - - int index: - 1 = No Text on blip or Distance - 2 = Text on blip - 3 = No text, just distance - 4+ No Text on blip or distance - - - - - (Hex code are approximate) - 0: White (#fefefe) - 1: Red (#e03232) - 2: Green (#71cb71) - 3: Blue (#5db6e5) - 4: White (#fefefe) - 5: Taxi Yellow (#eec64e) - 6: Light Red (#c25050) - 7: Violet (#9c6eaf) - 8: Pink (#fe7ac3) - 9: Light Orange (#f59d79) - 10: Light Brown (#b18f83) - 11: Light Green (#8dcea7) - 12: Light Blue (Teal) (#70a8ae) - 13: Very Light Purple (#d3d1e7) - 14: Dark Purple (#8f7e98) - 15: Cyan (#6ac4bf) - 16: Light Yellow (#d5c398) - 17: Orange (#ea8e50) - 18: Light Blue (#97cae9) - 19: Dark Pink (#b26287) - 20: Dark Yellow (#8f8d79) - 21: Dark Orange (#a6755e) - 22: Light Gray (#afa8a8) - 23: Light Pink (#e78d9a) - 24: Lemon Green (#bbd65b) - 25: Forest Green (#0c7b56) - 26: Electric Blue (#7ac3fe) - 27: Bright Purple (#ab3ce6) - 28: Dark Taxi Yellow (#cda80c) - 29: Dark Blue (#4561ab) - 30: Dark Cyan (#29a5b8) - 31: Light Brown (#b89b7b) - 32: Very Light Blue (#c8e0fe) - 33: Light Yellow (#f0f096) - 34: Light Pink (#ed8ca1) - 35: Light Red (#f98a8a) - 36: Light Yellow (#fbeea5) - 37: White (#fefefe) - 38: Blue (#2c6db8) - 39: Light Gray (#9a9a9a) - 40: Dark Gray (#4c4c4c) - Certainly a lot more remaining. - - - - - **displayId Behaviour** <br> - 0 = Doesn't show up, ever, anywhere. <br> - 1 = Doesn't show up, ever, anywhere. <br> - 2 = Shows on both main map and minimap. (Selectable on map) <br> - 3 = Shows on main map only. (Selectable on map) <br> - 4 = Shows on main map only. (Selectable on map) <br> - 5 = Shows on minimap only. <br> - 6 = Shows on both main map and minimap. (Selectable on map) <br> - 7 = Doesn't show up, ever, anywhere. <br> - 8 = Shows on both main map and minimap. (Not selectable on map) <br> - 9 = Shows on minimap only. <br> - 10 = Shows on both main map and minimap. (Not selectable on map) <br> - Anything higher than 10 seems to be exactly the same as 10. <br> - <br> - Rockstar seem to only use 0, 2, 3, 4, 5 and 8 in the decompiled scripts. - - - - - Adds up after viewing multiple R* scripts. I believe that the duration is in miliseconds. - - - - - Doesn't work if the label text of gxtEntry is >= 80. - - - - - See this topic for more details : gtaforums.com/topic/717612-v-scriptnative-documentation-and-research/page-35?p=1069477935 - - - - - After some testing, looks like you need to use UI:CEIL() on the rotation (vehicle/ped heading) before using it there. - - - - - Enable / disable showing route for the Blip-object. - - - - - Makes a blip go small when off the minimap. - - - - - Makes a blip go small when off the minimap. - - - - - <!-- - _loc1_.map((name, idx) => `| ${idx} | ${name} | ![${name}](https://runtime.fivem.net/blips/${name}.svg) |`).join('\n') - --> - Sets the displayed sprite for a specific blip. - There's a [list of sprites](https://docs.fivem.net/game-references/blips/) on the FiveM documentation site. - - The blip to change. - The sprite ID to set. - - - - works with AI::TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS to make a ped completely oblivious to all events going on around him - - - - - Set camera as active/inactive. - - - - - Previous declaration void SET_CAM_ACTIVE_WITH_INTERP(Cam camTo, Cam camFrom, int duration, BOOL easeLocation, BOOL easeRotation) is completely wrong. The last two params are integers not BOOLs... - - - - - Allows you to aim and shoot at the direction the camera is facing. - - - - - Sets the position of the cam. - - - - - NOTE: Debugging functions are not present in the retail version of the game. - - - - - This native has its name defined inside its codE - - - - - This native has its name defined inside its codE - - - - - This native has a name defined inside its code - - - - - This native has a name defined inside its code - - - - - This native has a name defined inside its code - - - - - This native has a name defined inside its code - - - - - This native has a name defined inside its code - - - - - This native has a name defined inside its code - - - - - if p0 is 0, effect is cancelled - if p0 is 1, effect zooms in, gradually tilts cam clockwise apx 30 degrees, wobbles slowly. Motion blur is active until cancelled. - if p0 is 2, effect immediately tilts cam clockwise apx 30 degrees, begins to wobble slowly, then gradually tilts cam back to normal. The wobbling will continue until the effect is cancelled. - - - - - Sets the field of view of the cam. - --------------------------------------------- - Min: 1.0f - Max: 130.0f - - - - - The native seems to only be called once. - The native is used as so, - CAM::SET_CAM_INHERIT_ROLL_VEHICLE(l_544, getElem(2, &l_525, 4)); - In the exile1 script. - - - - - Sets the rotation of the cam. - Last parameter unknown. - Last parameter seems to always be set to 2. - - - - - I named p1 as timeDuration as it is obvious. I'm assuming tho it is ran in ms(Milliseconds) as usual. - - - - - Setting ped to true allows the ped to shoot "friendlies". - p2 set to true when toggle is also true seams to make peds permanently unable to aim at, even if you set p2 back to false. - p1 = false & p2 = false for unable to aim at. - p1 = true & p2 = false for able to aim at. - - - - - Hardcoded to not work in multiplayer. - - - - - Something to do with "high speed bump severity"? - if (!sub_87a46("SET_CAR_HIGH_SPEED_BUMP_SEVERITY_MULTIPLIER")) { - VEHICLE::_84FD40F56075E816(0.0); - sub_8795b("SET_CAR_HIGH_SPEED_BUMP_SEVERITY_MULTIPLIER", 1); - } - - - - - Something to do with "high speed bump severity"? - if (!sub_87a46("SET_CAR_HIGH_SPEED_BUMP_SEVERITY_MULTIPLIER")) { - VEHICLE::_84FD40F56075E816(0.0); - sub_8795b("SET_CAR_HIGH_SPEED_BUMP_SEVERITY_MULTIPLIER", 1); - } - - - - - For now, I changed the last one from bool to int. - According to scripts specifically 'fm_mission_controller' this last parameter is 'false/0' when its called after the create rope native above is called for the magnet and 'true/1' after the create rope native above is called for the hook. - - - - - For now, I changed the last one from bool to int. - According to scripts specifically 'fm_mission_controller' this last parameter is 'false/0' when its called after the create rope native above is called for the magnet and 'true/1' after the create rope native above is called for the hook. - - - - - Console Hash: 0xF57066DA - Won't attract or magnetize to any helicopters or planes of course, but that's common sense. - - - - - Console Hash: 0xF57066DA - Won't attract or magnetize to any helicopters or planes of course, but that's common sense. - - - - - console hash 0xCC3CF97D - - - - - console hash 0xCC3CF97D - - - - - Sets the cylinder height of the checkpoint. - Parameters: - * nearHeight - The height of the checkpoint when inside of the radius. - * farHeight - The height of the checkpoint when outside of the radius. - * radius - The radius of the checkpoint. - - - - - Sets the checkpoint icon color. - - - - - Sets the checkpoint color. - - - - - p0 - Scale? Looks to be a normalized value (0.0 - 1.0) - offroad_races.c4, line ~67407: - a_3._f7 = GRAPHICS::CREATE_CHECKPOINT(v_D, v_A, a_4, a_7, v_E, v_F, v_10, sub_62b2(v_A, 220, 255), 0); - UI::GET_HUD_COLOUR(134, &v_E, &v_F, &v_10, &v_11); - GRAPHICS::_SET_CHECKPOINT_ICON_RGBA(a_3._f7, v_E, v_F, v_10, sub_62b2(v_A, 70, 210)); - GRAPHICS::_4B5B4DA5D79F1943(a_3._f7, 0.95); - GRAPHICS::SET_CHECKPOINT_CYLINDER_HEIGHT(a_3._f7, 4.0, 4.0, 100.0); - - - - - p0 - Scale? Looks to be a normalized value (0.0 - 1.0) - offroad_races.c4, line ~67407: - a_3._f7 = GRAPHICS::CREATE_CHECKPOINT(v_D, v_A, a_4, a_7, v_E, v_F, v_10, sub_62b2(v_A, 220, 255), 0); - UI::GET_HUD_COLOUR(134, &v_E, &v_F, &v_10, &v_11); - GRAPHICS::_SET_CHECKPOINT_ICON_RGBA(a_3._f7, v_E, v_F, v_10, sub_62b2(v_A, 70, 210)); - GRAPHICS::_4B5B4DA5D79F1943(a_3._f7, 0.95); - GRAPHICS::SET_CHECKPOINT_CYLINDER_HEIGHT(a_3._f7, 4.0, 4.0, 100.0); - - - - - p0 = 0/1 or true/false - It doesn't seems to work - - - - - SET_CLOCK_TIME(12, 34, 56); - - - - - combatType can be between 0-14. See GET_COMBAT_FLOAT below for a list of possible parameters. - - - - - This is for simulating player input. - amount is a float value from 0 - 0, 1 and 2 used in the scripts. 0 is by far the most common of them. - - - - - This is for simulating player input. - amount is a float value from 0 - 0, 1 and 2 used in the scripts. 0 is by far the most common of them. - - - - - Sets a value that determines how aggressive the ocean waves will be. Values of 2.0 or more make for very aggressive waves like you see during a thunderstorm. - Works only ~200 meters around the player. - - - - - Sets a value that determines how aggressive the ocean waves will be. Values of 2.0 or more make for very aggressive waves like you see during a thunderstorm. - Works only ~200 meters around the player. - - - - - Sets a value that determines how aggressive the ocean waves will be. Values of 2.0 or more make for very aggressive waves like you see during a thunderstorm. - Works only ~200 meters around the player. - - - - - Renamed to SET_CURSOR_LOCATION (I previously named it _SET_CURSOR_POSTION) which is the correct name as far as I can tell. - - - - - Renamed to SET_CURSOR_LOCATION (I previously named it _SET_CURSOR_POSTION) which is the correct name as far as I can tell. - - - - - Changes the mouse cursor's sprite. - public enum CursorType - { - None = 0, - Normal = 1, - TransparentNormal = 2, - PreGrab = 3, - Grab = 4, - MiddleFinger = 5, - LeftArrow = 6, - RightArrow = 7, - UpArrow = 8, - DownArrow = 9, - HorizontalExpand = 10, - Add = 11, - Remove = 12, - } - - - - - Changes the mouse cursor's sprite. - public enum CursorType - { - None = 0, - Normal = 1, - TransparentNormal = 2, - PreGrab = 3, - Grab = 4, - MiddleFinger = 5, - LeftArrow = 6, - RightArrow = 7, - UpArrow = 8, - DownArrow = 9, - HorizontalExpand = 10, - Add = 11, - Remove = 12, - } - - - - - Specifies a custom respawn position to be used in conjunction with _SET_NEXT_RESPAWN_TO_CUSTOM - - - - - Specifies a custom respawn position to be used in conjunction with _SET_NEXT_RESPAWN_TO_CUSTOM - - - - - All occurrences found in b617d, sorted alphabetically and identical lines removed: - AUDIO::SET_CUTSCENE_AUDIO_OVERRIDE("_AK"); - AUDIO::SET_CUTSCENE_AUDIO_OVERRIDE("_CUSTOM"); - AUDIO::SET_CUTSCENE_AUDIO_OVERRIDE("_TOOTHLESS"); - - - - - p3 could be heading. Needs more research. - - - - - Thanks R*! ;) - if ((l_161 == 0) || (l_161 == 2)) { - sub_2ea27("Trying to set Jimmy prop variation"); - CUTSCENE::_0546524ADE2E9723("Jimmy_Boston", 1, 0, 0, 0); - } - - - - - Thanks R*! ;) - if ((l_161 == 0) || (l_161 == 2)) { - sub_2ea27("Trying to set Jimmy prop variation"); - CUTSCENE::_0546524ADE2E9723("Jimmy_Boston", 1, 0, 0, 0); - } - - - - - Only used twice in R* scripts - - - - - NOTE: Debugging functions are not present in the retail version of the game. - - - - - Defines the state of a destructible object. - Use the "0xB48FCED898292E52" native to find an object's handle with its name / coords - State 2 == object just spawned - State 4 == Beginning of the animation - State 6 == Start animation - State 9 == End of the animation - - - - - Defines the state of a destructible object. - Use the "0xB48FCED898292E52" native to find an object's handle with its name / coords - State 2 == object just spawned - State 4 == Beginning of the animation - State 6 == Start animation - State 9 == End of the animation - - - - - MulleDK19: This starts moving the VTOL engines towards the specified angle ratio (0f-1f). - - - - - MulleDK19: This starts moving the VTOL engines towards the specified angle ratio (0f-1f). - - - - - If toggle is true, hides special ability bar / character name in the pause menu - If toggle is false, shows special ability bar / character name in the pause menu - - - - - If toggle is true, hides special ability bar / character name in the pause menu - If toggle is false, shows special ability bar / character name in the pause menu - - - - - sometimes used used with NET_TO_OBJ - hash collision last 2 words - - - - - This native sets the app id for the discord rich presence implementation. - - - - - This native sets the image asset for the discord rich presence implementation. - - The name of a valid asset registered on Discordapp's developer dashboard. note that the asset has to be registered under the same discord API application set using the SET_DISCORD_APP_ID native. - - - - This native sets the small image asset for the discord rich presence implementation. - - The name of a valid asset registered on Discordapp's developer dashboard. Note that the asset has to be registered under the same discord API application set using the SET_DISCORD_APP_ID native. - - - - This native sets the hover text of the small image asset for the discord rich presence implementation. - - Text to be displayed when hovering over small image asset. Note that you must also set a valid small image asset using the SET_DISCORD_RICH_PRESENCE_ASSET_SMALL native. - - - - This native sets the hover text of the image asset for the discord rich presence implementation. - - Text to be displayed when hovering over image asset. Note that you must also set a valid image asset using the SET_DISCORD_RICH_PRESENCE_ASSET native. - - - - This is a NOP function. It does nothing at all. - - - - - Sets the acceleration limit of a door. - How fast it can open, or the inverse hinge resistance. - A limit of 0 seems to lock doors. - p2 is always 0, p3 is always 1. - - - - - Sets the acceleration limit of a door. - How fast it can open, or the inverse hinge resistance. - A limit of 0 seems to lock doors. - p2 is always 0, p3 is always 1. - - - - - Sets the ajar angle of a door. - Ranges from -1.0 to 1.0, and 0.0 is closed / default. - p2 is always 0, p3 is always 1. - - - - - Sets the ajar angle of a door. - Ranges from -1.0 to 1.0, and 0.0 is closed / default. - p2 is always 0, p3 is always 1. - - - - - Sets the on-screen drawing origin for draw-functions (which is normally x=0,y=0 in the upper left corner of the screen) to a world coordinate. - From now on, the screen coordinate which displays the given world coordinate on the screen is seen as x=0,y=0. - Example in C#: - Vector3 boneCoord = somePed.GetBoneCoord(Bone.SKEL_Head); - Function.Call(Hash.SET_DRAW_ORIGIN, boneCoord.X, boneCoord.Y, boneCoord.Z, 0); - Function.Call(Hash.DRAW_SPRITE, "helicopterhud", "hud_corner", -0.01, -0.015, 0.013, 0.013, 0.0, 255, 0, 0, 200); - Function.Call(Hash.DRAW_SPRITE, "helicopterhud", "hud_corner", 0.01, -0.015, 0.013, 0.013, 90.0, 255, 0, 0, 200); - Function.Call(Hash.DRAW_SPRITE, "helicopterhud", "hud_corner", -0.01, 0.015, 0.013, 0.013, 270.0, 255, 0, 0, 200); - Function.Call(Hash.DRAW_SPRITE, "helicopterhud", "hud_corner", 0.01, 0.015, 0.013, 0.013, 180.0, 255, 0, 0, 200); - Function.Call(Hash.CLEAR_DRAW_ORIGIN); - Result: www11.pic-upload.de/19.06.15/bkqohvil2uao.jpg - If the pedestrian starts walking around now, the sprites are always around her head, no matter where the head is displayed on the screen. - This function also effects the drawing of texts and other UI-elements. - The effect can be reset by calling GRAPHICS::CLEAR_DRAW_ORIGIN(). - - - - - This native is used to set the driving style for specific ped. - Driving styles id seems to be: - 786468 - 262144 - 786469 - http://gtaforums.com/topic/822314-guide-driving-styles/ - - - - - For p1 & p2 (Ped, Vehicle). I could be wrong, as the only time this native is called in scripts is once and both are 0, but I assume this native will work like SET_MOUNTED_WEAPON_TARGET in which has the same exact amount of parameters and the 1st and last 3 parameters are right and the same for both natives. - - - - - The function specifically verifies the value is equal to, or less than 1.0f. If it is greater than 1.0f, the function does nothing at all. - - - - - range 0.0f - 1.0f - - - - - Navigates the specified DUI browser to a different URL. - - The DUI browser handle. - The new URL. - - - - ped can not pull out a weapon when true - - - - - Enables diving motion when underwater. - - - - - skin - everything alpha except skin - Set entity alpha level. Ranging from 0 to 255 but chnages occur after every 20 percent (after every 51). - - - - - Animations list : www.los-santos-multiplayer.com/dev.airdancer?cxt=anim - - - - - Animations list : www.los-santos-multiplayer.com/dev.airdancer?cxt=anim - - - - - Makes the specified entity (ped, vehicle or object) persistent. Persistent entities will not automatically be removed by the engine. - p1 has no effect when either its on or off - maybe a quick disassembly will tell us what it does - p2 has no effect when either its on or off - maybe a quick disassembly will tell us what it does - - - - - Marks the specified entity (ped, vehicle or object) as no longer needed. - Entities marked as no longer needed, will be deleted as the engine sees fit. - - - - - Sets whether the entity can be targeted without being in line-of-sight. - - - - - console hash: 0xBD0D4831 - internally it calls the same function as 'SET_ENTITY_COLLISION'. but uses a hard coded parameter that only activates when p1 is set to true - ============================= - Weirdly enough in the 3 scripts it's used in on PC, - - director_mode (2 hits) - - re_duel (2 hits) - - re_seaplane (1 hit) - Most of the time in the hits its actually used after the normal SET_ENTITY_COLLISION. Example from re_seaplane, - Local_49[iParam0 -- [[6]] ] = create_ped(26, iVar4, vVar0, fVar3, 1, true); - set_entity_collision(Local_49[iParam0 -- [[6]] ], iVar42, 0); - _0x9EBC85ED0FFFE51C(Local_49[iParam0 -- [[6]] ], !iVar66, 0); (_SET_ENTITY_COLLISION_2) - iVar42 being true so the normal collision native is true, 0 - iVar66 being false so !false so it's true, 0 - Gonna ignore the 'vars' for the create_ped no point in defining them. - - - - - console hash: 0xBD0D4831 - internally it calls the same function as 'SET_ENTITY_COLLISION'. but uses a hard coded parameter that only activates when p1 is set to true - ============================= - Weirdly enough in the 3 scripts it's used in on PC, - - director_mode (2 hits) - - re_duel (2 hits) - - re_seaplane (1 hit) - Most of the time in the hits its actually used after the normal SET_ENTITY_COLLISION. Example from re_seaplane, - Local_49[iParam0 -- [[6]] ] = create_ped(26, iVar4, vVar0, fVar3, 1, true); - set_entity_collision(Local_49[iParam0 -- [[6]] ], iVar42, 0); - _0x9EBC85ED0FFFE51C(Local_49[iParam0 -- [[6]] ], !iVar66, 0); (_SET_ENTITY_COLLISION_2) - iVar42 being true so the normal collision native is true, 0 - iVar66 being false so !false so it's true, 0 - Gonna ignore the 'vars' for the create_ped no point in defining them. - - - - - p7 is always 1 in the scripts. Set to 1, an area around the destination coords for the moved entity is cleared from other entities. - Often ends with 1, 0, 0, 1); in the scripts. It works. - Axis - Invert Axis Flags - - - - - Axis - Invert Axis Flags - - - - - does the same as SET_ENTITY_COORDS. - Console Hash: 0x749B282E - - - - - health >= 0 - - - - - Sets a ped or an object totally invincible. It doesn't take any kind of damage. Peds will not ragdoll on explosions and the tazer animation won't apply either. - If you use this for a ped and you want Ragdoll to stay enabled, then do: - *(DWORD *)(pedAddress + 0x188) |= (1 << 9); - Use this if you want to get the invincibility status: - bool IsPedInvincible(Ped ped) - { - auto addr = getScriptHandleBaseAddress(ped); - if (addr) - { - DWORD flag = *(DWORD *)(addr + 0x188); - return ((flag & (1 << 8)) != 0) || ((flag & (1 << 9)) != 0); - } - return false; - } - - - - - Certainly not the main usage of this native but when set to true for a Vehicle, it will prevent the vehicle to explode if it is spawned far away from the player. - - - - - I tried using this and I see nothing happening, what is this suppose to do? - - - - - I tried using this and I see nothing happening, what is this suppose to do? - - - - - LOD distance can be 0 to 0xFFFF (higher values will result in 0xFFFF) as it is actually stored as a 16-bit value (aka uint16_t). - - - - - For instance: ENTITY::SET_ENTITY_MAX_HEALTH(PLAYER::PLAYER_PED_ID(), 200); // director_mode.c4: 67849 - - - - - Calling this function, regardless of the "unknown" value, disabled collision between two entities. - Importance of entity1 and 2 order is unclear. - - - - - Enable / disable each type of damage. - -------------- - p7 is to to '1' in am_mp_property_ext/int: entity::set_entity_proofs(uParam0->f_19, true, true, true, true, true, true, 1, true); - - - - - w is the correct parameter name! - - - - - rotationOrder refers to the order yaw pitch roll is applied - value ranges from 0 to 5. What you use for rotationOrder when setting must be the same as rotationOrder when getting the rotation. - Unsure what value corresponds to what rotation order, more testing will be needed for that. - For the most part R* uses 1 or 2 as the order. - p5 is usually set as true - - - - - what does this native do? - bool IsEntitySomething(Entity entity) - { - auto addr = getScriptHandleBaseAddress(entity); - printf("addr: 0x%X \n", addr); - if (addr) - { - DWORD flag = *(DWORD *)(addr + 0x48D); - printf("flag: 0x%X \n", flag); - return ((flag & (1 << 3)) != 0) || ((flag & (1 << 30)) != 0); - } - return false; - } - wot ? - - - - - what does this native do? - bool IsEntitySomething(Entity entity) - { - auto addr = getScriptHandleBaseAddress(entity); - printf("addr: 0x%X \n", addr); - if (addr) - { - DWORD flag = *(DWORD *)(addr + 0x48D); - printf("flag: 0x%X \n", flag); - return ((flag & (1 << 3)) != 0) || ((flag & (1 << 30)) != 0); - } - return false; - } - wot ? - - - - - what does this native do? - bool IsEntitySomething(Entity entity) - { - auto addr = getScriptHandleBaseAddress(entity); - printf("addr: 0x%X \n", addr); - if (addr) - { - DWORD flag = *(DWORD *)(addr + 0x48D); - printf("flag: 0x%X \n", flag); - return ((flag & (1 << 3)) != 0) || ((flag & (1 << 30)) != 0); - } - return false; - } - wot ? - - - - - Example here: www.gtaforums.com/topic/830463-help-with-turning-lights-green-and-causing-peds-to-crash-into-each-other/#entry1068211340 - 0 = green - 1 = red - 2 = yellow - changing lights may not change the behavior of vehicles - - - - - Note that the third parameter(denoted as z) is "up and down" with positive ment. - - - - - unk was always 0. - - - - - In appcamera.c4, Line 106: - if (VEHICLE::IS_VEHICLE_DRIVEABLE(PED::SET_EXCLUSIVE_PHONE_RELATIONSHIPS(PLAYER::PLAYER_PED_ID()), 0)) - So return type could be a vehicle? - !Hash collision - gets the vehicle handle from ped which is about entering the vehicle! - sfink: agreed, 100% - Proper name is GET_VEHICLE_PED_IS_ENTERING - - - - - Groups found in the scripts used with this native: - "AMMUNATION", - "QUARRY", - "Triathlon_1", - "Triathlon_2", - "Triathlon_3" - - - - - Sets a secondary timecycle modifier. - - - - - Sets a secondary timecycle modifier. - - - - - The same as [`SetTimecycleModifierStrength`](#_0x82E7FFCD5B2326B3) but for the secondary tiemcycle modifier. - - : - - - - The same as [`SetTimecycleModifierStrength`](#_0x82E7FFCD5B2326B3) but for the secondary tiemcycle modifier. - - : - - - - Sets whether the game should fade in after the player dies or is arrested. - - - - - Sets whether the game should fade out after the player is arrested. - - - - - Sets whether the game should fade out after the player dies. - - - - - Sets a visually fake wanted level on the user interface. Used by Rockstar's scripts to "override" regular wanted levels and make custom ones while the real wanted level and multipliers are ignored. - Max is 6. Also the mini-map gets the red & blue flashing effect. - - - - - When this is set to ON, shadows only draw as you get nearer. - When OFF, they draw from a further distance. (((BUT))) f*ck up nearer shadows quality. - - - - - Sets the near clipping plane of the first person camera. - - - - - Sets the near clipping plane of the first person camera. - - - - - Similar to _CLAMP_GAMEPLAY_CAM_PITCH except this is specifically for the FP camera, and it only lets you clamp the pitch within the normal range. - - - - - Similar to _CLAMP_GAMEPLAY_CAM_PITCH except this is specifically for the FP camera, and it only lets you clamp the pitch within the normal range. - - - - - Purpose of p0 and p1 unknown. - - - - - Override the area where the camera will render the terrain. - p3, p4 and p5 are usually set to 0.0 - - - - - It seems to make the entity's coords mark the point from which LOD-distances are measured. In my testing, setting a vehicle as the focus entity and moving that vehicle more than 300 distance units away from the player will make the level of detail around the player go down drastically (shadows disappear, textures go extremely low res, etc). The player seems to be the default focus entity. - - - - - From the b617d scripts: - CAM::SET_FOLLOW_PED_CAM_CUTSCENE_CHAT("FOLLOW_PED_ATTACHED_TO_ROPE_CAMERA", 0); - CAM::SET_FOLLOW_PED_CAM_CUTSCENE_CHAT("FOLLOW_PED_ON_EXILE1_LADDER_CAMERA", 1500); - CAM::SET_FOLLOW_PED_CAM_CUTSCENE_CHAT("FOLLOW_PED_SKY_DIVING_CAMERA", 0); - CAM::SET_FOLLOW_PED_CAM_CUTSCENE_CHAT("FOLLOW_PED_SKY_DIVING_CAMERA", 3000); - CAM::SET_FOLLOW_PED_CAM_CUTSCENE_CHAT("FOLLOW_PED_SKY_DIVING_FAMILY5_CAMERA", 0); - CAM::SET_FOLLOW_PED_CAM_CUTSCENE_CHAT("FOLLOW_PED_SKY_DIVING_CAMERA", 0); - - - - - Sets the type of Player camera: - 0 - Third Person Close - 1 - Third Person Mid - 2 - Third Person Far - 4 - First Person - - - - - Sets the type of Player camera in vehicles: - 0 - Third Person Close - 1 - Third Person Mid - 2 - Third Person Far - 4 - First Person - - - - - Forces footstep tracks on all surfaces. - - - - - Forces vehicle trails on all surfaces. - - - - - Sets some values in a vehicle gadget (tow arm, digger arm, etc.). Don't know which one though. - I've tested on the towtruck 1 & 2, Dock Lift (Crate Arm), Dozer, and such have no effect. However when used on a Forklift it sets the height of the forks. 0.0 = Lowest 1.0 = Highest. This is best to be used if you wanna pick-up a car since un-realistically on GTA V forklifts can't pick up much of anything due to vehicle mass. If you put this under a car then set it above 0.0 to a 'lifted-value' it will raise the car with no issue lol - - - - - Sets some values in a vehicle gadget (tow arm, digger arm, etc.). Don't know which one though. - I've tested on the towtruck 1 & 2, Dock Lift (Crate Arm), Dozer, and such have no effect. However when used on a Forklift it sets the height of the forks. 0.0 = Lowest 1.0 = Highest. This is best to be used if you wanna pick-up a car since un-realistically on GTA V forklifts can't pick up much of anything due to vehicle mass. If you put this under a car then set it above 0.0 to a 'lifted-value' it will raise the car with no issue lol - - - - - Make sure to call this from the correct thread if you're using multiple threads because all other threads except the one which is calling SET_GAME_PAUSED will be paused which means you will lose control and the game remains in paused mode until you exit GTA5.exe - - - - - Does nothing - - - - - Sets the camera position relative to heading in float from -360 to +360. - Heading is alwyas 0 in aiming camera. - - - - - Sets the camera pitch. - Parameters: - x = pitches the camera on the x axis. - Value2 = always seems to be hex 0x3F800000 (1.000000 float). - - - - - Sets the amplitude for the gameplay (i.e. 3rd or 1st) camera to shake. Used in script "drunk_controller.ysc.c4" to simulate making the player drunk. - - - - - Example C#: - Function.Call(Hash.SET_GAMEPLAY_COORD_HINT, position.X, position.Y, position.Z, hintDuration, 1500, 1000, 0); - The camera look-at is canceled if the user is already panning the camera around. - - - - - p6 & p7 - possibly length or time - - - - - Needs to be looped! And yes, it does work and is not a hash collision. - Birds will try to reach the given height. - - - - - Only the script that originally called SET_GPS_FLAGS can set them again. Another script cannot set the flags, until the first script that called it has called CLEAR_GPS_FLAGS. - Doesn't seem like the flags are actually read by the game at all. - --------------- - Might be left-over from GTA IV. I kind of miss the *ding-dong* turn left in 2 meters lady lol. - - - - - level can be from 0 to 3 - 0: 9.8 - 1: 2.4 - 2: 0.1 - very low - 3: 0.0 - - - - - 0: Default - 1: Circle Around Leader - 2: Alternative Circle Around Leader - 3: Line, with Leader at center - - - - - Sets the range at which members will automatically leave the group. - - - - - Sets a global handling override for a specific vehicle class. The name is supposed to match the `handlingName` field from handling.meta. - Example: `SetHandlingField('AIRTUG', 'CHandlingData', 'fSteeringLock', 360.0)` - - The vehicle class to set data for. - The handling class to set. Only "CHandlingData" is supported at this time. - The field name to set. These match the keys in `handling.meta`. - The value to set. - - - - Sets a global handling override for a specific vehicle class. The name is supposed to match the `handlingName` field from handling.meta. - Example: `SetHandlingFloat('AIRTUG', 'CHandlingData', 'fSteeringLock', 360.0)` - - The vehicle class to set data for. - The handling class to set. Only "CHandlingData" is supported at this time. - The field name to set. These match the keys in `handling.meta`. - The floating-point value to set. - - - - Sets a global handling override for a specific vehicle class. The name is supposed to match the `handlingName` field from handling.meta. - - The vehicle class to set data for. - The handling class to set. Only "CHandlingData" is supported at this time. - The field name to set. These match the keys in `handling.meta`. - The integer value to set. - - - - Sets a global handling override for a specific vehicle class. The name is supposed to match the `handlingName` field from handling.meta. - Example: `SetHandlingVector('AIRTUG', 'CHandlingData', 'vecCentreOfMassOffset', vector3(0.0, 0.0, -5.0))` - - The vehicle class to set data for. - The handling class to set. Only "CHandlingData" is supported at this time. - The field name to set. These match the keys in `handling.meta`. - The Vector3 value to set. - - - - Harcoded limit for radius is 30.0f - - - - - Equivalent of SET_HELI_BLADES_SPEED(vehicleHandle, 1.0f); - this native works on planes to? - - - - - Sets the speed of the helicopter blades in percentage of the full speed. - vehicleHandle: The helicopter. - speed: The speed in percentage, 0.0f being 0% and 1.0f being 100%. - - - - - value between 0.0 and 1.0 - - - - - Makes the ped ragdoll like when falling from a great height - - - - - HUD colors and their values: pastebin.com/d9aHPbXN - - - - - HUD colors and their values: pastebin.com/d9aHPbXN - - - - - HUD colors and their values: pastebin.com/d9aHPbXN - -------------------------------------------------- - makes hudColorIndex2 color into hudColorIndex color - - - - - HUD colors and their values: pastebin.com/d9aHPbXN - -------------------------------------------------- - makes hudColorIndex2 color into hudColorIndex color - - - - - No other indices work... - IK Index --------- - 1 = head - 3 = left arm - 4 = right arm - ------------------ - EntityLookAt can be null (0 handle) - - - - - Sets whether or not `SHUTDOWN_LOADING_SCREEN` automatically shuts down the NUI frame for the loading screen. If this is enabled, - you will have to manually invoke `SHUTDOWN_LOADING_SCREEN_NUI` whenever you want to hide the NUI loading screen. - - TRUE to manually shut down the loading screen NUI. - - - - If toggle is true, the map is shown in full screen - If toggle is false, the map is shown in normal mode - - - - - If toggle is true, the map is shown in full screen - If toggle is false, the map is shown in normal mode - - - - - If this is the correct name, what microphone? I know your TV isn't going to reach out and adjust your headset so.. - - - - - Argument must be 0.0f or above 38.0f, or it will be ignored. - - - - - This native is used to toggle map components like the army base at the top of the map. - p2 appears to be always -1. - An incomplete list of components ID: - ``` - 0: Los Santos' air port yellow lift-off markers. - 1: Sandy Shore's air port yellow lift-off markers. - 2: Trevor's air port yellow lift-off markers. - 3: Unknown. - 4: Unknown. - 5: Unknown. - 6: Vespucci Beach lifeguard building. - 7: Unknown. - 8: Unknown. - 15: Army base. - ``` - - - - - Not much is known so far on what it does _exactly_. - All I know for sure is that it draws the specified hole ID on the pause menu map as well as on the mini-map/radar. This native also seems to change some other things related to the pause menu map's behaviour, for example: you can no longer set waypoints, the pause menu map starts up in a 'zoomed in' state. This native does not need to be executed every tick. - You need to center the minimap manually as well as change/lock it's zoom and angle in order for it to appear correctly on the minimap. - You'll also need to use the `GOLF` scaleform in order to get the correct minmap border to show up. - Use [`N_0x35edd5b2e3ff01c0()`](https://runtime.fivem.net/doc/reference.html#_0x35EDD5B2E3FF01C0) to reset the map when you no longer want to display any golf holes (you still need to unlock zoom, position and angle of the radar manually after calling this). - - The ID of the hole to draw on the map. ID starts with 1 for hole 1, 2 for hole 2, etc. 0 disables the golf map behaviour. - - - - Not much is known so far on what it does _exactly_. - All I know for sure is that it draws the specified hole ID on the pause menu map as well as on the mini-map/radar. This native also seems to change some other things related to the pause menu map's behaviour, for example: you can no longer set waypoints, the pause menu map starts up in a 'zoomed in' state. This native does not need to be executed every tick. - You need to center the minimap manually as well as change/lock it's zoom and angle in order for it to appear correctly on the minimap. - You'll also need to use the `GOLF` scaleform in order to get the correct minmap border to show up. - Use [`N_0x35edd5b2e3ff01c0()`](https://runtime.fivem.net/doc/reference.html#_0x35EDD5B2E3FF01C0) to reset the map when you no longer want to display any golf holes (you still need to unlock zoom, position and angle of the radar manually after calling this). - - The ID of the hole to draw on the map. ID starts with 1 for hole 1, 2 for hole 2, etc. 0 disables the golf map behaviour. - - - - Sets the display info for a minimap overlay. - - The minimap overlay ID. - The X position for the overlay. This is equivalent to a game coordinate X. - The Y position for the overlay. This is equivalent to a game coordinate Y, except that it's inverted (gfxY = -gameY). - The X scale for the overlay. This is equivalent to the Flash \_xscale property, therefore 100 = 100%. - The Y scale for the overlay. This is equivalent to the Flash \_yscale property. - The alpha value for the overlay. This is equivalent to the Flash \_alpha property, therefore 100 = 100%. - - - - If true, the entire map will be revealed. - - - - - If true, the entire map will be revealed. - - - - - If true, the player can't save the game. - If the parameter is true, sets the mission flag to true, if the parameter is false, the function does nothing at all. - ^ also, if the mission flag is already set, the function does nothing at all - - - - - Takes a text label, gets the string (must not be longer than 600 chars, should not exceed 64 chars) and sets the name to that string. - p0 must be true. - - - - - Similar to SET_MISSION_NAME but this one can take any string (must not be greater than 600 chars, should not exceed 64 chars), not just text labels. - p0 must be true. - - - - - Similar to SET_MISSION_NAME but this one can take any string (must not be greater than 600 chars, should not exceed 64 chars), not just text labels. - p0 must be true. - - - - - p1 is always 0 - - - - - Last parameter is unknown and always zero. - - - - - The minimum/default is 500.0f. If you plan to make it bigger set it's position as well. Also this seems to need to be called in a loop as when you close the phone the scale is reset. If not in a loop you'd need to call it everytime before you re-open the phone. - - - - - Enables Radio on phone. - - - - - Unloads model from memory - - - - - Note: Look in decompiled scripts and the times that p1 and p2 aren't 0. They are filled with vars. If you look through out that script what other natives those vars are used in, you can tell p1 is a ped and p2 is a vehicle. Which most likely means if you want the mounted weapon to target a ped set targetVehicle to 0 or vice-versa. - - - - - Sets flag's sprite transparency. 0-255. - - - - - Sets flag's sprite transparency. 0-255. - - - - - Set's the string displayed when flag 3 (AudioSpeaker) active. - - - - - Set's the string displayed when flag 3 (AudioSpeaker) active. - - - - - Ranges from 0 to 255. 0 is grey health bar, ~50 yellow, 200 purple. - - - - - Ranges from 0 to 255. 0 is grey health bar, ~50 yellow, 200 purple. - - - - - Ranges from 0 to 255. 0 is grey health bar, ~50 yellow, 200 purple. - Should be enabled as flag (2). Has 0 opacity by default. - - This was _SET_MP_GAMER_TAG_HEALTH_BAR_COLOR, - - - - - Ranges from 0 to 255. 0 is grey health bar, ~50 yellow, 200 purple. - Should be enabled as flag (2). Has 0 opacity by default. - - This was _SET_MP_GAMER_TAG_HEALTH_BAR_COLOR, - - - - - Ranges from 0 to 255. 0 is grey health bar, ~50 yellow, 200 purple. - Should be enabled as flag (2). Has 0 opacity by default. - - This was _SET_MP_GAMER_TAG_HEALTH_BAR_COLOR, - - - - - Displays a bunch of icons above the players name, and level, and their name twice - - - - - Displays a bunch of icons above the players name, and level, and their name twice - - - - - enum MpGamerTagComponent - { - GAMER_NAME = 0, - CREW_TAG, - healthArmour, - BIG_TEXT, - AUDIO_ICON, - MP_USING_MENU, - MP_PASSIVE_MODE, - WANTED_STARS, - MP_DRIVER, - MP_CO_DRIVER, - MP_TAGGED, - GAMER_NAME_NEARBY, - ARROW, - MP_PACKAGES, - INV_IF_PED_FOLLOWING, - RANK_TEXT, - MP_TYPING - }; - - - - - enum MpGamerTagComponent - { - GAMER_NAME = 0, - CREW_TAG, - healthArmour, - BIG_TEXT, - AUDIO_ICON, - MP_USING_MENU, - MP_PASSIVE_MODE, - WANTED_STARS, - MP_DRIVER, - MP_CO_DRIVER, - MP_TAGGED, - GAMER_NAME_NEARBY, - ARROW, - MP_PACKAGES, - INV_IF_PED_FOLLOWING, - RANK_TEXT, - MP_TYPING - }; - - - - - displays wanted star above head - - - - - displays wanted star above head - - - - - Whether or not another player is allowed to take control of the entity - - - - - not tested.... - - - - - not tested.... - - - - - Original put name, - _SET_NETWORK_VEHICLE_NON_CONTACT - However changed to 'object' as the instances where this is called in scripts both freemode and golf it's only used on objects after the objects are called OBJ_TO_NET p_parachute_s (freemode) prop_golf_ball (golf). Tho the script search was done via TU27 Xbox360 ones. - Got my hopes up whoever put this as vehicle. I was hoping it was what R* used in non-contact races. - - - - - Original put name, - _SET_NETWORK_VEHICLE_NON_CONTACT - However changed to 'object' as the instances where this is called in scripts both freemode and golf it's only used on objects after the objects are called OBJ_TO_NET p_parachute_s (freemode) prop_golf_ball (golf). Tho the script search was done via TU27 Xbox360 ones. - Got my hopes up whoever put this as vehicle. I was hoping it was what R* used in non-contact races. - - - - - Not used in the scripts. - Bullshit! It's used in spawn_activities - - - - - Sets the next spawn location to the position supplied to _SET_CUSTOM_RESPAWN_POSITION. - - - - - Sets the next spawn location to the position supplied to _SET_CUSTOM_RESPAWN_POSITION. - - - - - Enables Night Vision. - Example: - C#: Function.Call(Hash.SET_NIGHTVISION, true); - C++: GRAPHICS::SET_NIGHTVISION(true); - BOOL toggle: - true = turns night vision on for your player. - false = turns night vision off for your player. - - - - - Toggles the North Yankton map - - - - - Toggles the North Yankton map - - - - - From the decompiled scripts: - UI::_92F0DA1E27DB96DC(6); - UI::_92F0DA1E27DB96DC(184); - UI::_92F0DA1E27DB96DC(190); - sets background color for the next notification - 6 = red - 184 = green - 190 = yellow - Here is a list of some colors that can be used: gyazo.com/68bd384455fceb0a85a8729e48216e15 - this seems to set the alpha to 255 automatically, if you have a work around let me know - - - - - From the decompiled scripts: - UI::_92F0DA1E27DB96DC(6); - UI::_92F0DA1E27DB96DC(184); - UI::_92F0DA1E27DB96DC(190); - sets background color for the next notification - 6 = red - 184 = green - 190 = yellow - Here is a list of some colors that can be used: gyazo.com/68bd384455fceb0a85a8729e48216e15 - this seems to set the alpha to 255 automatically, if you have a work around let me know - - - - - sets font color for the next notification - - - - - sets font color for the next notification - - - - - sets color for notification flash - - - - - sets color for notification flash - - - - - Sets some extra options for a notification. It adds an image (or icon type) and sets a notification title (sender) and subtitle (subject). - Texture dictionary and texture name parameters are usually the same exact value. - Example result: - ![](https://i.imgur.com/LviutDl.png) - Old description with list of possible icons and texture names: - ```text - List of picNames: pastebin.com/XdpJVbHz - flash is a bool for fading in. - iconTypes: - 1 : Chat Box - 2 : Email - 3 : Add Friend Request - 4 : Nothing - 5 : Nothing - 6 : Nothing - 7 : Right Jumping Arrow - 8 : RP Icon - 9 : $ Icon - "sender" is the very top header. This can be any old string. - "subject" is the header under the sender. - ``` - - The texture dictionary for the icon. - The texture name for the icon. - Flash, doesn't seem to work no matter what. - The icon type, see the list above in the description. - The notification title. - The notification subtitle. - The notification handle. - - - - List of picNames pastebin.com/XdpJVbHz - flash is a bool for fading in. - iconTypes: - 1 : Chat Box - 2 : Email - 3 : Add Friend Request - 4 : Nothing - 5 : Nothing - 6 : Nothing - 7 : Right Jumping Arrow - 8 : RP Icon - 9 : $ Icon - "sender" is the very top header. This can be any old string. - "subject" is the header under the sender. - "duration" is a multiplier, so 1.0 is normal, 2.0 is twice as long (very slow), and 0.5 is half as long. - "clanTag" shows a crew tag in the "sender" header, after the text. You need to use 3 underscores as padding. Maximum length of this field seems to be 7. (e.g. "MK" becomes "___MK", "ACE" becomes "___ACE", etc.) - - - - - List of picNames: pastebin.com/XdpJVbHz - flash is a bool for fading in. - iconTypes: - 1 : Chat Box - 2 : Email - 3 : Add Friend Request - 4 : Nothing - 5 : Nothing - 6 : Nothing - 7 : Right Jumping Arrow - 8 : RP Icon - 9 : $ Icon - "sender" is the very top header. This can be any old string. - "subject" is the header under the sender. - "duration" is a multiplier, so 1.0 is normal, 2.0 is twice as long (very slow), and 0.5 is half as long. - "clanTag" shows a crew tag in the "sender" header, after the text. You need to use 3 underscores as padding. Maximum length of this field seems to be 7. (e.g. "MK" becomes "___MK", "ACE" becomes "___ACE", etc.) - iconType2 is a mirror of iconType. It shows in the "subject" line, right under the original iconType. - int IconNotification(char *text, char *text2, char *Subject) - { - _SET_NOTIFICATION_TEXT_ENTRY("STRING"); - ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(text); - _SET_NOTIFICATION_MESSAGE_CLAN_TAG_2("CHAR_SOCIAL_CLUB", "CHAR_SOCIAL_CLUB", 1, 7, text2, Subject, 1.0f, "__EXAMPLE", 7); - return _DRAW_NOTIFICATION(1, 1); - } - - - - - List of picNames: pastebin.com/XdpJVbHz - - - - - List of picNames: pastebin.com/XdpJVbHz - - - - - Needs more research. - Only one type of usage in the scripts: - UI::_C6F580E4C94926AC("CHAR_ACTING_UP", "CHAR_ACTING_UP", 0, 0, "DI_FEED_CHAR", a_0); - - - - - Needs more research. - Only one type of usage in the scripts: - UI::_C6F580E4C94926AC("CHAR_ACTING_UP", "CHAR_ACTING_UP", 0, 0, "DI_FEED_CHAR", a_0); - - - - - NOTE: 'duration' is a multiplier, so 1.0 is normal, 2.0 is twice as long (very slow), and 0.5 is half as long. - Example, only occurrence in the scripts: - v_8 = UI::_1E6611149DB3DB6B("CHAR_SOCIAL_CLUB", "CHAR_SOCIAL_CLUB", 0, 0, &v_9, "", a_5); - - - - - NOTE: 'duration' is a multiplier, so 1.0 is normal, 2.0 is twice as long (very slow), and 0.5 is half as long. - Example, only occurrence in the scripts: - v_8 = UI::_1E6611149DB3DB6B("CHAR_SOCIAL_CLUB", "CHAR_SOCIAL_CLUB", 0, 0, &v_9, "", a_5); - - - - - Declares the entry type of a notification, for example "STRING". - int ShowNotification(char *text) - { - _SET_NOTIFICATION_TEXT_ENTRY("STRING"); - ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(text); - return _DRAW_NOTIFICATION(1, 1); - } - - - - - This is an alias of SET_ENTITY_AS_NO_LONGER_NEEDED. - - - - - Seems to set the colour of the prop. Haven't really tested it on other props. - Only appears in am_mp_nightclub.c for the nightclub dancefloor. - Not sure what p1 does, seems to only ever be '1' in scripts. - - : - : - : - - - - Seems to set the colour of the prop. Haven't really tested it on other props. - Only appears in am_mp_nightclub.c for the nightclub dancefloor. - Not sure what p1 does, seems to only ever be '1' in scripts. - - : - : - : - - - - Adjust the physics parameters of a prop, or otherwise known as "object". This is useful for simulated gravity. - Other parameters seem to be unknown. - p2: seems to be weight and gravity related. Higher value makes the obj fall faster. Very sensitive? - p3: seems similar to p2 - p4: makes obj fall slower the higher the value - p5: similar to p4 - - - - - ` - i don't know what this does - ```<pre> - void __fastcall OBJECT___0x77F33F2CCF64B3AA_START(scrNativeCallContext *args) - { - bool p2; // bl@1 - CObject *pObject; // rax@1 - scrNativeCallContextArgStruct *pArgs; // rax@1 - pArgs = args->pArgs; - p2 = pArgs->a2.BOOL != 0; - pObject = getAddressOfObject(pArgs->a1.Object); - if ( pObject ) - { - pObject->field_425 &= 0xDFu; // 1101 1111 (clear bit 6) - pObject->field_425 |= 32 * p2; // bit 6 = p2 - } - } - // sfink - // note to AB: please set "white-space: pre" in css - ```` - ``` - ## Parameters - * **object**: - * **p1**: - - - - - ` - i don't know what this does - ```<pre> - void __fastcall OBJECT___0x77F33F2CCF64B3AA_START(scrNativeCallContext *args) - { - bool p2; // bl@1 - CObject *pObject; // rax@1 - scrNativeCallContextArgStruct *pArgs; // rax@1 - pArgs = args->pArgs; - p2 = pArgs->a2.BOOL != 0; - pObject = getAddressOfObject(pArgs->a1.Object); - if ( pObject ) - { - pObject->field_425 &= 0xDFu; // 1101 1111 (clear bit 6) - pObject->field_425 |= 32 * p2; // bit 6 = p2 - } - } - // sfink - // note to AB: please set "white-space: pre" in css - ```` - ``` - ## Parameters - * **object**: - * **p1**: - - - - - enum ObjectPaintVariants - { - Pacific = 0, - Azure = 1, - Nautical = 2, - Continental = 3, - Battleship = 4, - Intrepid = 5, - Uniform = 6, - Classico = 7, - Mediterranean = 8, - Command = 9, - Mariner = 10, - Ruby = 11, - Vintage = 12, - Pristine = 13, - Merchant = 14, - Voyager = 15 - }; - - - - - enum ObjectPaintVariants - { - Pacific = 0, - Azure = 1, - Nautical = 2, - Continental = 3, - Battleship = 4, - Intrepid = 5, - Uniform = 6, - Classico = 7, - Mediterranean = 8, - Command = 9, - Mariner = 10, - Ruby = 11, - Vintage = 12, - Pristine = 13, - Merchant = 14, - Voyager = 15 - }; - - - - - Appears to have an optional bool parameter that is unused in the scripts. - If you pass true, something will be set to zero. - - - - - p0 always seems to be 0 - duration in milliseconds - frequency should range from about 10 (slow vibration) to 255 (very fast) - appears to be a hash collision, though it does do what it says - example: - SET_PAD_SHAKE(0, 100, 200); - - - - - console hash: 0xC92719A7 - - - - - console hash: 0xC92719A7 - - - - - hash collision - - - - - only works on some fx's - p4 = 0 - - - - - Should be named SET_PARTICLE_FX_LOOPED_PROPERTY. "Evolution" doesn't make much sense... - -------- - p4 seems to be always 0. - Usage: - if (!GRAPHICS::DOES_PARTICLE_FX_LOOPED_EXIST(l_25C7)) { - l_25C7 = GRAPHICS::_DDE23F30CC5A0F03("scr_veh_plane_gen_damage", l_8B9, l_25C4, 0.0, 0.0, 0.0, ENTITY::_GET_ENTITY_BONE_INDEX(l_8B9, "exhaust"), 1.0, 0, 0, 0); - GRAPHICS::SET_PARTICLE_FX_LOOPED_EVOLUTION(l_25C7, "damage_smoke", 0.5, 0); - GRAPHICS::SET_PARTICLE_FX_LOOPED_EVOLUTION(l_25C7, "damage_fire", 0.2, 0); - } - - - - - Usage example for C#: - Function.Call(Hash.SET_PARTICLE_FX_NON_LOOPED_ALPHA, new InputArgument[] { 0.1f }); - Note: the argument alpha ranges from 0.0f-1.0f ! - - - - - only works on some fx's - - - - - accuracy = 0-100, 100 being perfectly accurate - - - - - Previously named _0xD30C50DF888D58B5, this native turns on the AI blip on the specified ped. It also disappears automatically when the ped is too far or if the ped is dead. You don't need to control it with other natives. - See gtaforums.com/topic/884370-native-research-ai-blips for further information. - Note: Everything said at the bottom is only valid for persistant peds, as AI blips seem to behave differently for non-persistant peds. - • To create an AI blip, you must use UI::0xD30C50DF888D58B5() (_SET_PED_ENEMY_AI_BLIP). It has two arguments: "ped" which is the ped you want to AI blip to be linked to, and "showViewCones" which needs to be true for AI blips to appear. - • To check if a ped has an AI blip, you can use UI::DOES_PED_HAVE_AI_BLIP(Ped ped), which returns a simple bool. - • By default, AI blips never disappear. If you want them to disappear when you're at a certain distance from a ped, you can use UI::0x97C65887D4B37FA9(Ped ped, float distance) (_SET_AI_BLIP_MAX_DISTANCE) - • By default, the blip only appears when you're in combat with the specified ped. If you want it to be always displayed, you can use UI::x0C4BBF625CA98C4E() (_IS_AI_BLIP_ALWAYS_SHOWN). It also has two arguments: "ped", and a flag. If the flag is set to true, the blip will always be displayed. If it's set to false, the AI blip will have its default behaviour. - • By default, a view cone is displayed with the blip (basically a blue surface that represents the field of view of the ped, like in vanilla stealth missions). If you don't want it, you can disable it with UI::HIDE_SPECIAL_ABILITY_LOCKON_OPERATION(Ped ped, bool flag). If the flag is set to true, the view cone is displayed. If the flag is set to false, it is not. - • Finally, there's actually 3 types of AI blips: - 0 - the default, red, "enemy" blip - 1 - a weird, semi-transparent, nameless, yellow blip - 2 - the blue "friend" blip - You can change an AI blip's type with UI::0xE52B8E7F85D39A08(Ped ped, int type) (_SET_AI_BLIP_TYPE). - - - - - Previously named _0xD30C50DF888D58B5, this native turns on the AI blip on the specified ped. It also disappears automatically when the ped is too far or if the ped is dead. You don't need to control it with other natives. - See gtaforums.com/topic/884370-native-research-ai-blips for further information. - Note: Everything said at the bottom is only valid for persistant peds, as AI blips seem to behave differently for non-persistant peds. - • To create an AI blip, you must use UI::0xD30C50DF888D58B5() (_SET_PED_ENEMY_AI_BLIP). It has two arguments: "ped" which is the ped you want to AI blip to be linked to, and "showViewCones" which needs to be true for AI blips to appear. - • To check if a ped has an AI blip, you can use UI::DOES_PED_HAVE_AI_BLIP(Ped ped), which returns a simple bool. - • By default, AI blips never disappear. If you want them to disappear when you're at a certain distance from a ped, you can use UI::0x97C65887D4B37FA9(Ped ped, float distance) (_SET_AI_BLIP_MAX_DISTANCE) - • By default, the blip only appears when you're in combat with the specified ped. If you want it to be always displayed, you can use UI::x0C4BBF625CA98C4E() (_IS_AI_BLIP_ALWAYS_SHOWN). It also has two arguments: "ped", and a flag. If the flag is set to true, the blip will always be displayed. If it's set to false, the AI blip will have its default behaviour. - • By default, a view cone is displayed with the blip (basically a blue surface that represents the field of view of the ped, like in vanilla stealth missions). If you don't want it, you can disable it with UI::HIDE_SPECIAL_ABILITY_LOCKON_OPERATION(Ped ped, bool flag). If the flag is set to true, the view cone is displayed. If the flag is set to false, it is not. - • Finally, there's actually 3 types of AI blips: - 0 - the default, red, "enemy" blip - 1 - a weird, semi-transparent, nameless, yellow blip - 2 - the blue "friend" blip - You can change an AI blip's type with UI::0xE52B8E7F85D39A08(Ped ped, int type) (_SET_AI_BLIP_TYPE). - - - - - Previously named _0xD30C50DF888D58B5, this native turns on the AI blip on the specified ped. It also disappears automatically when the ped is too far or if the ped is dead. You don't need to control it with other natives. - See gtaforums.com/topic/884370-native-research-ai-blips for further information. - Note: Everything said at the bottom is only valid for persistant peds, as AI blips seem to behave differently for non-persistant peds. - • To create an AI blip, you must use UI::0xD30C50DF888D58B5() (_SET_PED_ENEMY_AI_BLIP). It has two arguments: "ped" which is the ped you want to AI blip to be linked to, and "showViewCones" which needs to be true for AI blips to appear. - • To check if a ped has an AI blip, you can use UI::DOES_PED_HAVE_AI_BLIP(Ped ped), which returns a simple bool. - • By default, AI blips never disappear. If you want them to disappear when you're at a certain distance from a ped, you can use UI::0x97C65887D4B37FA9(Ped ped, float distance) (_SET_AI_BLIP_MAX_DISTANCE) - • By default, the blip only appears when you're in combat with the specified ped. If you want it to be always displayed, you can use UI::x0C4BBF625CA98C4E() (_IS_AI_BLIP_ALWAYS_SHOWN). It also has two arguments: "ped", and a flag. If the flag is set to true, the blip will always be displayed. If it's set to false, the AI blip will have its default behaviour. - • By default, a view cone is displayed with the blip (basically a blue surface that represents the field of view of the ped, like in vanilla stealth missions). If you don't want it, you can disable it with UI::HIDE_SPECIAL_ABILITY_LOCKON_OPERATION(Ped ped, bool flag). If the flag is set to true, the view cone is displayed. If the flag is set to false, it is not. - • Finally, there's actually 3 types of AI blips: - 0 - the default, red, "enemy" blip - 1 - a weird, semi-transparent, nameless, yellow blip - 2 - the blue "friend" blip - You can change an AI blip's type with UI::0xE52B8E7F85D39A08(Ped ped, int type) (_SET_AI_BLIP_TYPE). - - - - - value ranges from 0 to 3. - - - - - stance: - 0 = idle - 1 = walk - 2 = running - p5 = usually set to true - Animations list : www.los-santos-multiplayer.com/dev.airdancer?cxt=anim - - - - - Animations list : www.los-santos-multiplayer.com/dev.airdancer?cxt=anim - - - - - Sets the armor of the specified ped. - ped: The Ped to set the armor of. - amount: A value between 0 and 100 indicating the value to set the Ped's armor to. - - - - - Turns the desired ped into a cop. If you use this on the player ped, you will become almost invisible to cops dispatched for you. You will also report your own crimes, get a generic cop voice, get a cop-vision-cone on the radar, and you will be unable to shoot at other cops. SWAT and Army will still shoot at you. Toggling ped as "false" has no effect; you must change p0's ped model to disable the effect. - - - - - This is an alias of SET_ENTITY_AS_NO_LONGER_NEEDED. - - - - - 0 = can (bike) - 1 = can't (bike) - 2 = unk - 3 = unk - - - - - It simply makes the said ped to cower behind cover object(wall, desk, car) - Peds flee attributes must be set to not to flee, first. Else, most of the peds, will just flee from gunshot sounds or any other panic situations. - - - - - p2 usually 0 - - - - - This only will teleport the ped to the group leader if the group leader teleports (sets coords). - Only works in singleplayer - - - - - Overrides the ped's collision capsule radius for the current tick. - Must be called every tick to be effective. - Setting this to 0.001 will allow warping through some objects. - - - - - 100 would equal attack - less then 50ish would mean run away - Only the values 0, 1 and 2 occur in the decompiled scripts. Most likely refers directly to the values also described in combatbehaviour.meta: - 0: CA_Poor - 1: CA_Average - 2: CA_Professional - Tested this and got the same results as the first explanation here. Could not find any difference between 0, 1 and 2. - - - - - These combat attributes seem to be the same as the BehaviourFlags from combatbehaviour.meta. - So far, these are the equivalents found: - enum CombatAttributes - { - BF_CanUseCover = 0, - BF_CanUseVehicles = 1, - BF_CanDoDrivebys = 2, - BF_CanLeaveVehicle = 3, - BF_CanFightArmedPedsWhenNotArmed = 5, - BF_CanTauntInVehicle = 20, - BF_AlwaysFight = 46, - BF_IgnoreTrafficWhenDriving = 52, - BF_FreezeMovement = 292, - BF_PlayerCanUseFiringWeapons = 1424 - }; - 8 = ? - 9 = ? - 13 = ? - 14 ? - Research thread: gtaforums.com/topic/833391-researchguide-combat-behaviour-flags/ - - - - - 0 - Stationary (Will just stand in place) - 1 - Defensive (Will try to find cover and very likely to blind fire) - 2 - Offensive (Will attempt to charge at enemy but take cover as well) - 3 - Suicidal Offensive (Will try to flank enemy in a suicidal attack) - - - - - Only the values 0, 1 and 2 occur in the decompiled scripts. Most likely refers directly to the values also described as AttackRange in combatbehaviour.meta: - 0: CR_Near - 1: CR_Medium - 2: CR_Far - - - - - paletteId/palletColor - 0 to 3. - enum PedVariationData - { - PED_VARIATION_FACE = 0, - PED_VARIATION_HEAD = 1, - PED_VARIATION_HAIR = 2, - PED_VARIATION_TORSO = 3, - PED_VARIATION_LEGS = 4, - PED_VARIATION_HANDS = 5, - PED_VARIATION_FEET = 6, - PED_VARIATION_EYES = 7, - PED_VARIATION_ACCESSORIES = 8, - PED_VARIATION_TASKS = 9, - PED_VARIATION_TEXTURES = 10, - PED_VARIATION_TORSO2 = 11 - }; - Usage: - SET_PED_COMPONENT_VARIATION(playerPed, PED_VARIATION_FACE, GET_NUMBER_OF_PED_DRAWABLE_VARIATIONS(playerPed, PED_VARIATION_FACE), GET_NUMBER_OF_PED_TEXTURE_VARIATIONS(playerPed, PED_VARIATION_FACE, 0), 2); - List of component/props ID - gtaxscripting.blogspot.com/2016/04/gta-v-peds-component-and-props.html - - - - - Research help : pastebin.com/fPL1cSwB - New items added with underscore as first char - ----------------------------------------------------------------------- - enum PedConfigFlags - { - PED_FLAG_CAN_FLY_THRU_WINDSCREEN = 32, - PED_FLAG_DIES_BY_RAGDOLL = 33, - PED_FLAG_NO_COLLISION = 52, - _PED_FLAG_IS_SHOOTING = 58, - _PED_FLAG_IS_ON_GROUND = 60, - PED_FLAG_NO_COLLIDE = 62, - PED_FLAG_DEAD = 71, - PED_FLAG_IS_SNIPER_SCOPE_ACTIVE = 72, - PED_FLAG_SUPER_DEAD = 73, - _PED_FLAG_IS_IN_AIR = 76, - PED_FLAG_IS_AIMING = 78, - PED_FLAG_DRUNK = 100, - _PED_FLAG_IS_NOT_RAGDOLL_AND_NOT_PLAYING_ANIM = 104, - PED_FLAG_NO_PLAYER_MELEE = 122, - PED_FLAG_NM_MESSAGE_466 = 125, - PED_FLAG_INJURED_LIMP = 166, - PED_FLAG_INJURED_LIMP_2 = 170, - PED_FLAG_INJURED_DOWN = 187, - PED_FLAG_SHRINK = 223, - PED_FLAG_MELEE_COMBAT = 224, - _PED_FLAG_IS_ON_STAIRS = 253, - _PED_FLAG_HAS_ONE_LEG_ON_GROUND = 276, - PED_FLAG_NO_WRITHE = 281, - PED_FLAG_FREEZE = 292, - PED_FLAG_IS_STILL = 301, - PED_FLAG_NO_PED_MELEE = 314, - _PED_SWITCHING_WEAPON = 331, - PED_FLAG_ALPHA = 410, - }; - (*) When flagId is set to 33 and the bool value to true, peds will die by starting ragdoll, so you should set this flag to false when you resurrect a ped. - When flagId is set to 62 and the boolvalue to false this happens: Ped is taken out of vehicle and can't get back in when jacking their empty vehicle. If in a plane it falls from the sky and crashes. Sometimes peds vehicle continue to drive the route without its driver who's running after. - (*) - JUMPING CHANGES 60,61,104 TO FALSE - BEING ON WATER CHANGES 60,61 TO FALSE AND 65,66,168 TO TRUE - FALLING CHANGES 60,61,104,276 TO FALSE AND TO 76 TRUE - DYING CHANGES 60,61,104,276* TO FALSE AND (NONE) TO TRUE - DYING MAKES 60,61,104 TO FALSE - BEING IN A CAR CHANGES 60,79,104 TO FALSE AND 62 TO TRUE - (*)Maximum value for flagId is 0x1AA (426) in b944. - ID 0xF0 (240) appears to be a special flag which is handled different compared to the others IDs. - - - - - teleports ped to coords along with the vehicle ped is in - - - - - p1: Only "CODE_HUMAN_STAND_COWER" found in the b617d scripts. - - - - - Has 5 parameters since latest patches. - - - - - Applies an Item from a PedDecorationCollection to a ped. These include tattoos and shirt decals. - collection - PedDecorationCollection filename hash - overlay - Item name hash - Example: - Entry inside "mpbeach_overlays.xml" - - <Item> - <uvPos x="0.500000" y="0.500000" /> - <scale x="0.600000" y="0.500000" /> - <rotation value="0.000000" /> - <nameHash>FM_Hair_Fuzz</nameHash> - <txdHash>mp_hair_fuzz</txdHash> - <txtHash>mp_hair_fuzz</txtHash> - <zone>ZONE_HEAD</zone> - <type>TYPE_TATTOO</type> - <faction>FM</faction> - <garment>All</garment> - <gender>GENDER_DONTCARE</gender> - <award /> - <awardLevel /> - </Item> - Code: - PED::_0x5F5D1665E352A839(PLAYER::PLAYER_PED_ID(), GAMEPLAY::GET_HASH_KEY("mpbeach_overlays"), GAMEPLAY::GET_HASH_KEY("fm_hair_fuzz")) - - - - - Applies an Item from a PedDecorationCollection to a ped. These include tattoos and shirt decals. - collection - PedDecorationCollection filename hash - overlay - Item name hash - Example: - Entry inside "mpbeach_overlays.xml" - - <Item> - <uvPos x="0.500000" y="0.500000" /> - <scale x="0.600000" y="0.500000" /> - <rotation value="0.000000" /> - <nameHash>FM_Hair_Fuzz</nameHash> - <txdHash>mp_hair_fuzz</txdHash> - <txtHash>mp_hair_fuzz</txtHash> - <zone>ZONE_HEAD</zone> - <type>TYPE_TATTOO</type> - <faction>FM</faction> - <garment>All</garment> - <gender>GENDER_DONTCARE</gender> - <award /> - <awardLevel /> - </Item> - Code: - PED::_0x5F5D1665E352A839(PLAYER::PLAYER_PED_ID(), GAMEPLAY::GET_HASH_KEY("mpbeach_overlays"), GAMEPLAY::GET_HASH_KEY("fm_hair_fuzz")) - - - - - Sets Ped Default Clothes - - - - - • Usage - → Use this native inside a looped function. - → Values: - → 0.0 = no peds on streets - → 1.0 = normal peds on streets - - - - - [16/06/2017 by ins1de] : - Drops the weapon object from selected peds and turns it into a pickup. - Offset defines the next position of the weapon, ammo count is the stored ammo in the pickup (if ammoCount == 0, pickup won't be created) - Default offset values (freemode.c): - if (is_ped_walking(player_ped_id())) - { - vVar1 = {0.6f, 4.7f, -0.1f}; - } - else if (is_ped_sprinting(player_ped_id())) - { - vVar1 = {0.6f, 5.7f, -0.1f}; - } - else if (is_ped_running(player_ped_id())) - { - vVar1 = {0.6f, 4.7f, -0.1f}; - } - else - { - vVar1 = {0.4f, 4.7f, -0.1f}; - } - - - - - This is the SET_CHAR_DUCKING from GTA IV, that makes Peds duck. This function does nothing in GTA V. It cannot set the ped as ducking in vehicles, and IS_PED_DUCKING will always return false. - - - - - This is a hash collision... - _IS_VEHICLE_NEAR_ENTITY - - - - - Values look to be between 0.0 and 1.0 - From decompiled scripts: 0.0, 0.6, 0.65, 0.8, 1.0 - You are correct, just looked in IDA it breaks from the function if it's less than 0.0f or greater than 1.0f. - - - - - Used for freemode (online) characters. - For some reason, the scripts use a rounded float for the index. - - - - - Sets the various freemode face features, e.g. nose length, chin shape. Scale ranges from -1.0 to 1.0. - Index can be 0 - Edit:---->Thanks to the first user. - Enum Face_Feature - Nose_Width - Nose_Peak_Hight - Nose_Peak_Lenght - Nose_Bone_High - Nose_Peak_Lowering - Nose_Bone_Twist - EyeBrown_High - EyeBrown_Forward - Cheeks_Bone_High - Cheeks_Bone_Width - Cheeks_Width - Eyes_Openning - Lips_Thickness - Jaw_Bone_Width 'Bone size to sides - Jaw_Bone_Back_Lenght 'Bone size to back - Chimp_Bone_Lowering 'Go Down - Chimp_Bone_Lenght 'Go forward - Chimp_Bone_Width - Chimp_Hole - Neck_Thikness - End Enum - Example in VB.Net - Public Shared Sub SET_PED_FACE_FEATURE(FreemodePed As Ped, Index As Face_Feature, Scale As Single) - Native.Function.Call(Native.Hash._SET_PED_FACE_FEATURE, FreemodePed, Index, Scale) - End Sub - - - - - Console Hash: 0x8CD3E487 - - - - - Console Hash: 0x8CD3E487 - - - - - FIRING_PATTERN_BURST_FIRE = 0xD6FF6D61 ( 1073727030 ) - FIRING_PATTERN_BURST_FIRE_IN_COVER = 0x026321F1 ( 40051185 ) - FIRING_PATTERN_BURST_FIRE_DRIVEBY = 0xD31265F2 ( -753768974 ) - FIRING_PATTERN_FROM_GROUND = 0x2264E5D6 ( 577037782 ) - FIRING_PATTERN_DELAY_FIRE_BY_ONE_SEC = 0x7A845691 ( 2055493265 ) - FIRING_PATTERN_FULL_AUTO = 0xC6EE6B4C ( -957453492 ) - FIRING_PATTERN_SINGLE_SHOT = 0x5D60E4E0 ( 1566631136 ) - FIRING_PATTERN_BURST_FIRE_PISTOL = 0xA018DB8A ( -1608983670 ) - FIRING_PATTERN_BURST_FIRE_SMG = 0xD10DADEE ( 1863348768 ) - FIRING_PATTERN_BURST_FIRE_RIFLE = 0x9C74B406 ( -1670073338 ) - FIRING_PATTERN_BURST_FIRE_MG = 0xB573C5B4 ( -1250703948 ) - FIRING_PATTERN_BURST_FIRE_PUMPSHOTGUN = 0x00BAC39B ( 12239771 ) - FIRING_PATTERN_BURST_FIRE_HELI = 0x914E786F ( -1857128337 ) - FIRING_PATTERN_BURST_FIRE_MICRO = 0x42EF03FD ( 1122960381 ) - FIRING_PATTERN_SHORT_BURSTS = 0x1A92D7DF ( 445831135 ) - FIRING_PATTERN_SLOW_FIRE_TANK = 0xE2CA3A71 ( -490063247 ) - if anyone is interested firing pattern info: pastebin.com/Px036isB - - - - - Bool probably has something to do with vehicles, maybe if the ped can use vehicle to flee? - Values used as attributes are those in sequence of powers of two, 1, 2, 4, 8, 16, 32, 64.... 65536. - jedijosh920: Setting attribute "2" to true will make the ped steal a vehicle. - - - - - p1/gadgetHash was always 0xFBAB5776 ("GADGET_PARACHUTE"). - p2 is always true. - - - - - From the scripts: - PED::SET_PED_GESTURE_GROUP(PLAYER::PLAYER_PED_ID(), - "ANIM_GROUP_GESTURE_MISS_FRA0"); - PED::SET_PED_GESTURE_GROUP(PLAYER::PLAYER_PED_ID(), - "ANIM_GROUP_GESTURE_MISS_DocksSetup1"); - - - - - enable or disable the gravity of a ped - Examples: - PED::SET_PED_GRAVITY(PLAYER::PLAYER_PED_ID(), 0x00000001); - PED::SET_PED_GRAVITY(Local_289[iVar0 -- [[20]] ], 0x00000001); - - - - - Used for freemode (online) characters. - - - - - The "shape" parameters control the shape of the ped's face. The "skin" parameters control the skin tone. ShapeMix and skinMix control how much the first and second IDs contribute,(typically mother and father.) ThirdMix overrides the others in favor of the third IDs. IsParent is set for "children" of the player character's grandparents during old-gen character creation. It has unknown effect otherwise. - The IDs start at zero and go Male Non-DLC, Female Non-DLC, Male DLC, and Female DLC. - !!!Can someone add working example for this??? - try this: - headBlendData headData; - _GET_PED_HEAD_BLEND_DATA(PLAYER_PED_ID(), &headData); - SET_PED_HEAD_BLEND_DATA(PLAYER_PED_ID(), headData.shapeFirst, headData.shapeSecond, headData.shapeThird, headData.skinFirst, headData.skinSecond - , headData.skinThird, headData.shapeMix, headData.skinMix, headData.skinThird, 0); - For more info please refer to this topic. - gtaforums.com/topic/858970-all-gtao-face-ids-pedset-ped-head-blend-data-explained - - - - - OverlayID ranges from 0 to 12, index from 0 to _GET_NUM_OVERLAY_VALUES(overlayID)-1, and opacity from 0.0 to 1.0. - overlayID Part Index, to disable - 0 Blemishes 0 - 23, 255 - 1 Facial Hair 0 - 28, 255 - 2 Eyebrows 0 - 33, 255 - 3 Ageing 0 - 14, 255 - 4 Makeup 0 - 74, 255 - 5 Blush 0 - 6, 255 - 6 Complexion 0 - 11, 255 - 7 Sun Damage 0 - 10, 255 - 8 Lipstick 0 - 9, 255 - 9 Moles/Freckles 0 - 17, 255 - 10 Chest Hair 0 - 16, 255 - 11 Body Blemishes 0 - 11, 255 - 12 Add Body Blemishes 0 - 1, 255 - - - - - Used for freemode (online) characters. - ColorType is 1 for eyebrows, beards, and chest hair; 2 for blush and lipstick; and 0 otherwise, though not called in those cases. - Called after SET_PED_HEAD_OVERLAY(). - - - - - List of component/props ID - gtaxscripting.blogspot.com/2016/04/gta-v-peds-component-and-props.html - - - - - This native sets the glow intensity of illuminated clothing items. - This native does **NOT** need to be executed every tick. - This native is **NOT** synced with other connected players, you will have to set the opacity on the ped on all clients individually. - Glow intensity is a value between `0.0` and `1.0`. - In some older decompiled scripts this is known as `_SET_PED_REFLECTION_INTENSITY`. - Since there's no joaat hash for this, I find `_SET_PED_ILLUMINATED_CLOTHING_GLOW_INTENSITY` more descriptive than `_SET_PED_REFLECTION_INTENSITY`. - Use [`GetPedIlluminatedClothingGlowIntensity`](#_0x1461B28A06717D68) to get the illuminated clothing glow intensity of a specific ped. - Intensity: `1.0`: - ![](https://www.vespura.com/hi/i/2018-11-13_17-03_c2e23_229.png) - Intensity: `0.0`: - ![](https://www.vespura.com/hi/i/2018-11-13_17-03_35c33_230.png) - **Examples code result**: - ![](https://www.vespura.com/hi/i/2018-11-13_17-11_10199_232.gif) - (Direct link if embed doesn't work: [here](https://www.vespura.com/hi/i/2018-11-13_17-11_10199_232.gif)) - - The ped to set the glow intensity on. - The glow intensity, value between `0.0` and `1.0`. - - - - This native sets the glow intensity of illuminated clothing items. - This native does **NOT** need to be executed every tick. - This native is **NOT** synced with other connected players, you will have to set the opacity on the ped on all clients individually. - Glow intensity is a value between `0.0` and `1.0`. - In some older decompiled scripts this is known as `_SET_PED_REFLECTION_INTENSITY`. - Since there's no joaat hash for this, I find `_SET_PED_ILLUMINATED_CLOTHING_GLOW_INTENSITY` more descriptive than `_SET_PED_REFLECTION_INTENSITY`. - Use [`GetPedIlluminatedClothingGlowIntensity`](#_0x1461B28A06717D68) to get the illuminated clothing glow intensity of a specific ped. - Intensity: `1.0`: - ![](https://www.vespura.com/hi/i/2018-11-13_17-03_c2e23_229.png) - Intensity: `0.0`: - ![](https://www.vespura.com/hi/i/2018-11-13_17-03_35c33_230.png) - **Examples code result**: - ![](https://www.vespura.com/hi/i/2018-11-13_17-11_10199_232.gif) - (Direct link if embed doesn't work: [here](https://www.vespura.com/hi/i/2018-11-13_17-11_10199_232.gif)) - - The ped to set the glow intensity on. - The glow intensity, value between `0.0` and `1.0`. - - - - PED::SET_PED_IN_VEHICLE_CONTEXT(l_128, GAMEPLAY::GET_HASH_KEY("MINI_PROSTITUTE_LOW_PASSENGER")); - PED::SET_PED_IN_VEHICLE_CONTEXT(l_128, GAMEPLAY::GET_HASH_KEY("MINI_PROSTITUTE_LOW_RESTRICTED_PASSENGER")); - PED::SET_PED_IN_VEHICLE_CONTEXT(l_3212, GAMEPLAY::GET_HASH_KEY("MISS_FAMILY1_JIMMY_SIT")); - PED::SET_PED_IN_VEHICLE_CONTEXT(l_3212, GAMEPLAY::GET_HASH_KEY("MISS_FAMILY1_JIMMY_SIT_REAR")); - PED::SET_PED_IN_VEHICLE_CONTEXT(l_95, GAMEPLAY::GET_HASH_KEY("MISS_FAMILY2_JIMMY_BICYCLE")); - PED::SET_PED_IN_VEHICLE_CONTEXT(num3, GAMEPLAY::GET_HASH_KEY("MISSFBI2_MICHAEL_DRIVEBY")); - PED::SET_PED_IN_VEHICLE_CONTEXT(PLAYER::PLAYER_PED_ID(), GAMEPLAY::GET_HASH_KEY("MISS_ARMENIAN3_FRANKLIN_TENSE")); - PED::SET_PED_IN_VEHICLE_CONTEXT(PLAYER::PLAYER_PED_ID(), GAMEPLAY::GET_HASH_KEY("MISSFBI5_TREVOR_DRIVING")); - - - - - Ped: The ped to warp. - vehicle: The vehicle to warp the ped into. - Seat_Index: [-1 is driver seat, -2 first free passenger seat] - Moreinfo of Seat Index - DriverSeat = -1 - Passenger = 0 - Left Rear = 1 - RightRear = 2 - - - - - Sets the ped drunk sounds. Only works with PLAYER_PED_ID - ==================================================== - As mentioned above, this only sets the drunk sound to ped/player. - To give the Ped a drunk effect with drunk walking animation try using SET_PED_MOVEMENT_CLIPSET - Below is an example - if (!Function.Call<bool>(Hash.HAS_ANIM_SET_LOADED, "move_m@drunk@verydrunk")) - { - Function.Call(Hash.REQUEST_ANIM_SET, "move_m@drunk@verydrunk"); - } - Function.Call(Hash.SET_PED_MOVEMENT_CLIPSET, Ped.Handle, "move_m@drunk@verydrunk", 0x3E800000); - And to stop the effect use - RESET_PED_MOVEMENT_CLIPSET - - - - - "IK" stands for "Inverse kinematics." I assume this has something to do with how the ped uses his legs to balance. In the scripts, the second parameter is always an int with a value of 2, 0, or sometimes 1 - - - - - sets the maximum health of a ped - I think it's never been used in any script - - - - - Ped will stay on the ground after being stunned for at lest ms time. (in milliseconds) - - - - - Maximum possible amount of money on MP is 2000. ~JX - ----------------------------------------------------------------------------- - Maximum amount that a ped can theoretically have is 65535 (0xFFFF) since the amount is stored as an unsigned short (uint16_t) value. - - - - - Min: 0.00 - Max: 10.00 - Can be used in combo with fast run cheat. - When value is set to 10.00: - Sprinting without fast run cheat: 66 m/s - Sprinting with fast run cheat: 77 m/s - Does not need to be looped! - Note: According to IDA for the Xbox360 xex, when they check bgt they seem to have the min to 0.0f, but the max set to 1.15f not 10.0f. - - - - - p2 is usually 1.0f - EDIT 12/24/16: - p2 does absolutely nothing no matter what the value is. - EDIT 08/16/17: - p2 is the time for a smooth changing to the new clipset. - List of movement clipsets: - Thanks to elsewhat for list. - "ANIM_GROUP_MOVE_BALLISTIC" - "ANIM_GROUP_MOVE_LEMAR_ALLEY" - "clipset@move@trash_fast_turn" - "FEMALE_FAST_RUNNER" - "missfbi4prepp1_garbageman" - "move_characters@franklin@fire" - "move_characters@Jimmy@slow@" - "move_characters@michael@fire" - "move_f@flee@a" - "move_f@scared" - "move_f@sexy@a" - "move_heist_lester" - "move_injured_generic" - "move_lester_CaneUp" - "move_m@bag" - "MOVE_M@BAIL_BOND_NOT_TAZERED" - "MOVE_M@BAIL_BOND_TAZERED" - "move_m@brave" - "move_m@casual@d" - "move_m@drunk@moderatedrunk" - "MOVE_M@DRUNK@MODERATEDRUNK" - "MOVE_M@DRUNK@MODERATEDRUNK_HEAD_UP" - "MOVE_M@DRUNK@SLIGHTLYDRUNK" - "MOVE_M@DRUNK@VERYDRUNK" - "move_m@fire" - "move_m@gangster@var_e" - "move_m@gangster@var_f" - "move_m@gangster@var_i" - "move_m@JOG@" - "MOVE_M@PRISON_GAURD" - "MOVE_P_M_ONE" - "MOVE_P_M_ONE_BRIEFCASE" - "move_p_m_zero_janitor" - "move_p_m_zero_slow" - "move_ped_bucket" - "move_ped_crouched" - "move_ped_mop" - "MOVE_M@FEMME@" - "MOVE_F@FEMME@" - "MOVE_M@GANGSTER@NG" - "MOVE_F@GANGSTER@NG" - "MOVE_M@POSH@" - "MOVE_F@POSH@" - "MOVE_M@TOUGH_GUY@" - "MOVE_F@TOUGH_GUY@" - ~ NotCrunchyTaco - - - - - Stops speech. - - - - - Stops speech. - - - - - NOTE: Debugging functions are not present in the retail version of the game. - *untested but char *name could also be a hash for a localized string - - - - - The distance between these points, is the diagonal of a box (remember it's 3D). - - - - - Hash collision!!! Actual name: SET_PED_PATH_MAY_ENTER_WATER - - - - - p2 could be time. Only example in the decompiled scripts uses it as -1. - - - - - Points to the same function as for example GET_RANDOM_VEHICLE_MODEL_IN_MEMORY and it does absolutely nothing. - - - - - This is only called once in the scripts. - sub_1CD9(&l_49, 0, getElem(3, &l_34, 4), "MICHAEL", 0, 1); - sub_1CA8("WORLD_HUMAN_SMOKING", 2); - PED::SET_PED_PRIMARY_LOOKAT(getElem(3, &l_34, 4), PLAYER::PLAYER_PED_ID()); - - - - - ComponentId can be set to various things based on what category you're wanting to set - enum PedPropsData - { - PED_PROP_HATS = 0, - PED_PROP_GLASSES = 1, - PED_PROP_EARS = 2, - PED_PROP_WATCHES = 3, - }; - Usage: SET_PED_PROP_INDEX(playerPed, PED_PROP_HATS, GET_NUMBER_OF_PED_PROP_DRAWABLE_VARIATIONS(playerPed, PED_PROP_HATS), GET_NUMBER_OF_PED_PROP_TEXTURE_VARIATIONS(playerPed, PED_PROP_HATS, 0), TRUE); - List of component/props ID - gtaxscripting.blogspot.com/2016/04/gta-v-peds-component-and-props.html - - - - - Works for both player and peds, but some flags don't seem to work for the player (1, for example) - 1 - Blocks ragdolling when shot. - 2 - Blocks ragdolling when hit by a vehicle. The ped still might play a falling animation. - 4 - Blocks ragdolling when set on fire. - ----------------------------------------------------------------------- - There seem to be 26 flags - - - - - Works for both player and peds, but some flags don't seem to work for the player (1, for example) - 1 - Blocks ragdolling when shot. - 2 - Blocks ragdolling when hit by a vehicle. The ped still might play a falling animation. - 4 - Blocks ragdolling when set on fire. - ----------------------------------------------------------------------- - There seem to be 26 flags - - - - - Causes Ped to ragdoll on collision with any object (e.g Running into trashcan). If applied to player you will sometimes trip on the sidewalk. - - - - - p1 is always false in R* scripts. - Quick disassembly seems to indicate that p1 is unused. - List of component/props ID - gtaxscripting.blogspot.com/2016/04/gta-v-peds-component-and-props.html - - - - - List of component/props ID - gtaxscripting.blogspot.com/2016/04/gta-v-peds-component-and-props.html - - - - - PED::SET_PED_RESET_FLAG(PLAYER::PLAYER_PED_ID(), 240, 1); - - - - - Assigns some ambient voice to the ped. - - - - - Assigns some ambient voice to the ped. - - - - - shootRate 0-1000 - - - - - p1 is usually 0 in the scripts. action is either 0 or a pointer to "DEFAULT_ACTION". - - - - - ped cannot be headshot if this is set to false - - - - - Sweat is set to 100.0 or 0.0 in the decompiled scripts. - - - - - Speech related. - - - - - Speech related. - - - - - Only 1 and 2 appear in the scripts. combatbehaviour.meta seems to only have TLR_SearchForTarget for all peds, but we don't know if that's 1 or 2. - - - - - Hash collision!!! - SET_VEHICLE_I* - destroyType is 1 for opens on damage, 2 for breaks on damage. - - - - - time1- Time Ped is in ragdoll mode(ms) - time2- Unknown time, in milliseconds - ragdollType- - 0 : Normal ragdoll - 1 : Falls with stiff legs/body - 2 : Narrow leg stumble(may not fall) - 3 : Wide leg stumble(may not fall) - p4, p5, p6- No idea. In R*'s scripts they are usually either "true, true, false" or "false, false, false". - EDIT 3/11/16: unclear what 'mircoseconds' mean-- a microsecond is 1000x a ms, so time2 must be 1000x time1? more testing needed. -sob - Edit Mar 21, 2017: removed part about time2 being the microseconds version of time1. this just isn't correct. time2 is in milliseconds, and time1 and time2 don't seem to be connected in any way. - - - - - Return variable is never used in R*'s scripts. - Not sure what p2 does. It seems like it would be a time judging by it's usage in R*'s scripts, but didn't seem to affect anything in my testings. - x, y, and z are coordinates, most likely to where the ped will fall. - p7 is probably the force of the fall, but untested, so I left the variable name the same. - p8 to p13 are always 0f in R*'s scripts. - (Simplified) Example of the usage of the function from R*'s scripts: - ped::set_ped_to_ragdoll_with_fall(ped, 1500, 2000, 1, -entity::get_entity_forward_vector(ped), 1f, 0f, 0f, 0f, 0f, 0f, 0f); - - - - - p2 is usually -1 in the scripts. action is either 0 or "DEFAULT_ACTION". - - - - - This native refers to the field of vision the ped has above them, starting at 0 degrees. 90f would let the ped see enemies directly above of them. - - - - - This native refers to the field of vision the ped has below them, starting at 0 degrees. The angle value should be negative. - - - - - tintIndex can be the following: - 1 - 2 - 3 - 4 - 5 - 6 - 7 - - - - - combined with PED::SET_PED_WETNESS_HEIGHT(), this native makes the ped drenched in water up to the height specified in the other function - - - - - It adds the wetness level to the player clothing/outfit. As if player just got out from water surface. - - - - - if the bool "Toggle" is "true" so the phone is lean. - if the bool "Toggle" is "false" so the phone is not lean. - - - - - duration specifies the time until the next respawn, in ms. (known values: 600000). - Usage Example: - Pickup pickup = OBJECT::CREATE_PICKUP_ROTATE(...); - OBJECT::SET_PICKUP_REGENERATION_TIME(pickup, 600000); // 10mins - - - - - This native sets the turbulence multiplier. It only works for planes. - 0.0 = no turbulence at all. - 1.0 = heavy turbulence. - Works by just calling it once, does not need to be called every tick. - - The plane to set the multiplier for - The turbulence multiplier. Value between 0.0 and 1.0 - - - - This native sets the turbulence multiplier. It only works for planes. - 0.0 = no turbulence at all. - 1.0 = heavy turbulence. - Works by just calling it once, does not need to be called every tick. - - The plane to set the multiplier for - The turbulence multiplier. Value between 0.0 and 1.0 - - - - Hash collision! Disables speech. - - - - - Sets the position of the arrow icon representing the player on both the minimap and world map. - Too bad this wouldn't work over the network (obviously not). Could spoof where we would be. - - - - - Sets whether this player can be hassled by gangs. - - - - - Set whether this player should be able to do drive-bys. - "A drive-by is when a ped is aiming/shooting from vehicle. This includes middle finger taunts. By setting this value to false I confirm the player is unable to do all that. Tested on tick." - - - - - Sets whether this player can take cover. - - - - - Displays cash change notifications on HUD. - - - - - Displays cash change notifications on HUD. - - - - - 6 matches across 4 scripts. 5 occurrences were 240. The other was 255. - - - - - Every occurrence was either 0 or 2. - - - - - Every occurrence of p1 I found was true.1.0.335.2, 1.0.350.1/2, 1.0.372.2, 1.0.393.2, 1.0.393.4, 1.0.463.1; - - - - - Flags used in the scripts: 0,4,16,24,32,56,60,64,128,134,256,260,384,512,640,768,896,900,952,1024,1280,2048,2560 - Note to people who needs this with camera mods, etc.: - Flags(0, 4, 16, 24, 32, 56, 60, 64, 128, 134, 512, 640, 1024, 2048, 2560) - - Disables camera rotation as well. - Flags(256, 260, 384, 768, 896, 900, 952, 1280) - [ translation: cameraRotation = flags & (1 << 8) - sfink] - - - - - Hash collision - - - - - Simply sets you as invincible (Health will not deplete). - Use 0x733A643B5B0C53C1 instead if you want Ragdoll enabled, which is equal to: - *(DWORD *)(playerPedAddress + 0x188) |= (1 << 9); - - - - - Example from fm_mission_controler.ysc.c4: - PLAYER::SET_PLAYER_LOCKON(PLAYER::PLAYER_ID(), 1); - All other decompiled scripts using this seem to be using the player id as the first parameter, so I feel the need to confirm it as so. - No need to confirm it says PLAYER_ID() so it uses PLAYER_ID() lol. - - - - - Affects the range of auto aim target. - - - - - Default is 100. Use player id and not ped id. For instance: PLAYER::SET_PLAYER_MAX_ARMOUR(PLAYER::PLAYER_ID(), 100); // main_persistent.ct4 - - - - - Set the model for a specific Player. Be aware that this will destroy the current Ped for the Player and create a new one, any - reference to the old ped should be reset (by using the GetPlayerPed native). - ``` - Make sure to request the model first and wait until it has loaded. - ``` - - - - - example: - PLAYER::SET_PLAYER_PARACHUTE_MODEL_OVERRIDE(PLAYER::PLAYER_ID(), 0x73268708); - - - - - tints 0 - 1 - 2 - 3 - 4 - - - - - Tints: - None = -1, - Rainbow = 0, - Red = 1, - SeasideStripes = 2, - WidowMaker = 3, - Patriot = 4, - Blue = 5, - Black = 6, - Hornet = 7, - AirFocce = 8, - Desert = 9, - Shadow = 10, - HighAltitude = 11, - Airbone = 12, - Sunrise = 13, - - - - - p1 was always 5. - p4 was always false. - - - - - Tints: - None = -1, - Rainbow = 0, - Red = 1, - SeasideStripes = 2, - WidowMaker = 3, - Patriot = 4, - Blue = 5, - Black = 6, - Hornet = 7, - AirFocce = 8, - Desert = 9, - Shadow = 10, - HighAltitude = 11, - Airbone = 12, - Sunrise = 13, - - - - - example: - flags: 0-6 - PLAYER::SET_PLAYER_RESET_FLAG_PREFER_REAR_SEATS(PLAYER::PLAYER_ID(), 6); - wouldnt the flag be the seatIndex? - - - - - Values around 1.0f to 2.0f used in game scripts. - - - - - 77 - - - - - the status of default voip system. It affects on `NETWORK_IS_PLAYER_TALKING` and `mp_facial` animation. - This function doesn't need to be called every frame, it works like a switcher. - - The target player. - Overriding state. - - - - Sets your targeting mode. - 0 = Traditional GTA - 1 = Assisted Aiming - 2 = Free Aim - Even tho gtaforums nor Alexander B supports this, if you're online in freemode already it's nice to have this since retail or otherwise you have to go to SP to change it. - - - - - Set player team on deathmatch and last team standing.. - - - - - # Predominant call signatures - PLAYER::SET_PLAYER_WANTED_CENTRE_POSITION(PLAYER::PLAYER_ID(), ENTITY::GET_ENTITY_COORDS(PLAYER::PLAYER_PED_ID(), 1)); - # Parameter value ranges - P0: PLAYER::PLAYER_ID() - P1: ENTITY::GET_ENTITY_COORDS(PLAYER::PLAYER_PED_ID(), 1) - P2: Not set by any call - - - - - Call SET_PLAYER_WANTED_LEVEL_NOW for immediate effect - wantedLevel is an integer value representing 0 to 5 stars even though the game supports the 6th wanted level but no police will appear since no definitions are present for it in the game files - disableNoMission- Disables When Off Mission- appears to always be false - - - - - p2 is always false in R* scripts - - - - - Forces any pending wanted level to be applied to the specified player immediately. - Call SET_PLAYER_WANTED_LEVEL with the desired wanted level, followed by SET_PLAYER_WANTED_LEVEL_NOW. - Second parameter is unknown (always false). - - - - - This modifies the damage value of your weapon. Whether it is a multiplier or base damage is unknown. - Based on tests, it is unlikely to be a multiplier. - - - - - The player will be ignored by the police if toggle is set to true - - - - - If toggle is set to false: - The police won't be shown on the (mini)map - If toggle is set to true: - The police will be shown on the (mini)map - - - - - List of interior hashes: pastebin.com/1FUyXNqY - Not for every interior zoom > 0 available. - - - - - zoomLevel ranges from 0 to 200 - - - - - Disables the radio station from the radio wheel. - Note: You cannot disable LSUR, WCTR and Blaine County Radio. - List of known station names; - ``` - RADIO_01_CLASS_ROCK - RADIO_02_POP - RADIO_03_HIPHOP_NEW - RADIO_04_PUNK - RADIO_05_TALK_01 - RADIO_06_COUNTRY - RADIO_07_DANCE_01 - RADIO_08_MEXICAN - RADIO_09_HIPHOP_OLD - RADIO_12_REGGAE - RADIO_13_JAZZ - RADIO_14_DANCE_02 - RADIO_15_MOTOWN - RADIO_20_THELAB - RADIO_16_SILVERLAKE - RADIO_17_FUNK - RADIO_18_90S_ROCK - RADIO_21_DLC_XM17 - RADIO_22_DLC_BATTLE_MIX1_RADIO - RADIO_19_USER - HIDDEN_RADIO_AMBIENT_TV - HIDDEN_RADIO_AMBIENT_TV_BRIGHT - HIDDEN_RADIO_01_CLASS_ROCK - HIDDEN_RADIO_ADVERTS - HIDDEN_RADIO_02_POP - HIDDEN_RADIO_03_HIPHOP_NEW - HIDDEN_RADIO_04_PUNK - HIDDEN_RADIO_06_COUNTRY - HIDDEN_RADIO_07_DANCE_01 - HIDDEN_RADIO_09_HIPHOP_OLD - HIDDEN_RADIO_12_REGGAE - HIDDEN_RADIO_15_MOTOWN - HIDDEN_RADIO_16_SILVERLAKE - RADIO_22_DLC_BATTLE_MIX1_CLUB - HIDDEN_RADIO_STRIP_CLUB - DLC_BATTLE_MIX1_CLUB_PRIV - HIDDEN_RADIO_BIKER_CLASSIC_ROCK - DLC_BATTLE_MIX2_CLUB_PRIV - HIDDEN_RADIO_BIKER_MODERN_ROCK - RADIO_23_DLC_BATTLE_MIX2_CLUB - RADIO_25_DLC_BATTLE_MIX4_CLUB - DLC_BATTLE_MIX3_CLUB_PRIV - RADIO_26_DLC_BATTLE_CLUB_WARMUP - HIDDEN_RADIO_BIKER_PUNK - RADIO_24_DLC_BATTLE_MIX3_CLUB - DLC_BATTLE_MIX4_CLUB_PRIV - HIDDEN_RADIO_BIKER_HIP_HOP - ``` - - The name of the radio station - Toggle the station on/off - - - - Disables the radio station from the radio wheel. - Note: You cannot disable LSUR, WCTR and Blaine County Radio. - List of known station names; - ``` - RADIO_01_CLASS_ROCK - RADIO_02_POP - RADIO_03_HIPHOP_NEW - RADIO_04_PUNK - RADIO_05_TALK_01 - RADIO_06_COUNTRY - RADIO_07_DANCE_01 - RADIO_08_MEXICAN - RADIO_09_HIPHOP_OLD - RADIO_12_REGGAE - RADIO_13_JAZZ - RADIO_14_DANCE_02 - RADIO_15_MOTOWN - RADIO_20_THELAB - RADIO_16_SILVERLAKE - RADIO_17_FUNK - RADIO_18_90S_ROCK - RADIO_21_DLC_XM17 - RADIO_22_DLC_BATTLE_MIX1_RADIO - RADIO_19_USER - HIDDEN_RADIO_AMBIENT_TV - HIDDEN_RADIO_AMBIENT_TV_BRIGHT - HIDDEN_RADIO_01_CLASS_ROCK - HIDDEN_RADIO_ADVERTS - HIDDEN_RADIO_02_POP - HIDDEN_RADIO_03_HIPHOP_NEW - HIDDEN_RADIO_04_PUNK - HIDDEN_RADIO_06_COUNTRY - HIDDEN_RADIO_07_DANCE_01 - HIDDEN_RADIO_09_HIPHOP_OLD - HIDDEN_RADIO_12_REGGAE - HIDDEN_RADIO_15_MOTOWN - HIDDEN_RADIO_16_SILVERLAKE - RADIO_22_DLC_BATTLE_MIX1_CLUB - HIDDEN_RADIO_STRIP_CLUB - DLC_BATTLE_MIX1_CLUB_PRIV - HIDDEN_RADIO_BIKER_CLASSIC_ROCK - DLC_BATTLE_MIX2_CLUB_PRIV - HIDDEN_RADIO_BIKER_MODERN_ROCK - RADIO_23_DLC_BATTLE_MIX2_CLUB - RADIO_25_DLC_BATTLE_MIX4_CLUB - DLC_BATTLE_MIX3_CLUB_PRIV - RADIO_26_DLC_BATTLE_CLUB_WARMUP - HIDDEN_RADIO_BIKER_PUNK - RADIO_24_DLC_BATTLE_MIX3_CLUB - DLC_BATTLE_MIX4_CLUB_PRIV - HIDDEN_RADIO_BIKER_HIP_HOP - ``` - - The name of the radio station - Toggle the station on/off - - - - Sets radio station by index. - - - - - For a full list, see here: pastebin.com/Kj9t38KF - - - - - Only found this one in the decompiled scripts: - AUDIO::SET_RADIO_TRACK("RADIO_03_HIPHOP_NEW", "ARM1_RADIO_STARTS"); - - - - - If the parameter is true, sets the random event flag to true, if the parameter is false, the function does nothing at all. - Does nothing if the mission flag is set. - - - - - Sets the relationship between two groups. This should be called twice (once for each group). - Relationship types: - 0 = Companion - 1 = Respect - 2 = Like - 3 = Neutral - 4 = Dislike - 5 = Hate - 255 = Pedestrians - Example: - PED::SET_RELATIONSHIP_BETWEEN_GROUPS(2, l_1017, 0xA49E591C); - PED::SET_RELATIONSHIP_BETWEEN_GROUPS(2, 0xA49E591C, l_1017); - - - - - makes the train all jumbled up and derailed as it moves on the tracks (though that wont stop it from its normal operations) - - - - - Sets the player's rich presence detail state for social platform providers to a specified string. - - The rich presence string to set. - - - - missing a last parameter int p6 - - - - - bool p7 - always 1 - - - - - -- [[ Corrected conflicting parameter names ]] - - - - - -- [[ Corrected conflicting parameter names ]] - - - - - Multiplier goes up to 1.49 any value above will be completely overruled by the game and the multiplier will not take effect, this can be edited in memory however. - Just call it one time, it is not required to be called once every tick. - Note: At least the IDA method if you change the max float multiplier from 1.5 it will change it for both this and SWIM above. I say 1.5 as the function blrs if what you input is greater than or equal to 1.5 hence why it's 1.49 max default. - It is not possible to "decrease" speed. Anything below 1 will be ignored. - - - - - Sets a pixel in the specified runtime texture. This will have to be committed using `COMMIT_RUNTIME_TEXTURE` to have any effect. - - A handle to the runtime texture. - The X position of the pixel to change. - The Y position of the pixel to change. - The new R value (0-255). - The new G value (0-255). - The new B value (0-255). - The new A value (0-255). - - - - The bool is not a toggle!!! - - - - - Occurrences in the b617d scripts: pastebin.com/Tvg2PRHU - - - - - p0 and p1 are always the same - - - - - Sets a value indicating whether scenario peds should be returned by the next call to a command that returns peds. Eg. GET_CLOSEST_PED. - - - - - seems to enable/disable specific scenario-types from happening in the game world. - Here are some scenario types from the scripts: - "WORLD_MOUNTAIN_LION_REST" - "WORLD_MOUNTAIN_LION_WANDER" - "DRIVE" - "WORLD_VEHICLE_POLICE_BIKE" - "WORLD_VEHICLE_POLICE_CAR" - "WORLD_VEHICLE_POLICE_NEXT_TO_CAR" - "WORLD_VEHICLE_DRIVE_SOLO" - "WORLD_VEHICLE_BIKER" - "WORLD_VEHICLE_DRIVE_PASSENGERS" - "WORLD_VEHICLE_SALTON_DIRT_BIKE" - "WORLD_VEHICLE_BICYCLE_MOUNTAIN" - "PROP_HUMAN_SEAT_CHAIR" - "WORLD_VEHICLE_ATTRACTOR" - "WORLD_HUMAN_LEANING" - "WORLD_HUMAN_HANG_OUT_STREET" - "WORLD_HUMAN_DRINKING" - "WORLD_HUMAN_SMOKING" - "WORLD_HUMAN_GUARD_STAND" - "WORLD_HUMAN_CLIPBOARD" - "WORLD_HUMAN_HIKER" - "WORLD_VEHICLE_EMPTY" - "WORLD_VEHICLE_BIKE_OFF_ROAD_RACE" - "WORLD_HUMAN_PAPARAZZI" - "WORLD_VEHICLE_PARK_PERPENDICULAR_NOSE_IN" - "WORLD_VEHICLE_PARK_PARALLEL" - "WORLD_VEHICLE_CONSTRUCTION_SOLO" - "WORLD_VEHICLE_CONSTRUCTION_PASSENGERS" - "WORLD_VEHICLE_TRUCK_LOGS" - -alphazolam - scenarioType could be the same as scenarioName, used in for example AI::TASK_START_SCENARIO_AT_POSITION. - - - - - For a full list, see here: pastebin.com/yLNWicUi - - - - - This function anchors script draws to a side of the safe zone. This needs to be called to make the interface - independent of the player's safe zone configuration. - These values are equivalent to `alignX` and `alignY` in `common:/data/ui/frontend.xml`, which can be used as a baseline - for default alignment. - Valid values for `horizontalAlign`, from original documentation: - - **C (67)** - Center: DRAW_TEXT starts in the middle of the screen, while DRAW_RECT starts on the right; both move with - the right side of the screen. - - **L (76)** - Left: Anchors to the left side, DRAW_RECT starts on the left side of the screen, same as DRAW_TEXT when - centered. - - **R (82)** - Right: DRAW_TEXT starts on the left side (normal 0,0), while DRAW_RECT starts some short distance away - from the right side of the screen, both move with the right side of the screen. - Valid values for `verticalAlign`, from original documentation: - - **B (66)** - Bottom: DRAW_RECT starts about as far as the middle of the map from the bottom, while DRAW_TEXT is about - rather centered. - - **C (67)** - Center: It starts at a certain distance from the bottom, but the distance is fixed, the distance is - different from 66. - - **T (84)** - Top: Anchors to the top, DRAW_RECT starts on the top of the screen, DRAW_TEXT just below it. - Using any other value (including 0) will result in the safe zone not being taken into account for this draw. The - canonical value for this is 'I' (73). - For example, you can use `SET_SCRIPT_GFX_ALIGN(0, 84)` to only scale on the Y axis (to the top), but not change the X - axis. - To reset the value, use `RESET_SCRIPT_GFX_ALIGN`. - - The horizontal alignment. This can be 67 ('C'), 76 ('L'), or 82 ('R'). - The vertical alignment. This can be 67 ('C'), 66 ('B'), or 84 ('T'). - - - - This function anchors script draws to a side of the safe zone. This needs to be called to make the interface - independent of the player's safe zone configuration. - These values are equivalent to `alignX` and `alignY` in `common:/data/ui/frontend.xml`, which can be used as a baseline - for default alignment. - Valid values for `horizontalAlign`, from original documentation: - - **C (67)** - Center: DRAW_TEXT starts in the middle of the screen, while DRAW_RECT starts on the right; both move with - the right side of the screen. - - **L (76)** - Left: Anchors to the left side, DRAW_RECT starts on the left side of the screen, same as DRAW_TEXT when - centered. - - **R (82)** - Right: DRAW_TEXT starts on the left side (normal 0,0), while DRAW_RECT starts some short distance away - from the right side of the screen, both move with the right side of the screen. - Valid values for `verticalAlign`, from original documentation: - - **B (66)** - Bottom: DRAW_RECT starts about as far as the middle of the map from the bottom, while DRAW_TEXT is about - rather centered. - - **C (67)** - Center: It starts at a certain distance from the bottom, but the distance is fixed, the distance is - different from 66. - - **T (84)** - Top: Anchors to the top, DRAW_RECT starts on the top of the screen, DRAW_TEXT just below it. - Using any other value (including 0) will result in the safe zone not being taken into account for this draw. The - canonical value for this is 'I' (73). - For example, you can use `SET_SCRIPT_GFX_ALIGN(0, 84)` to only scale on the Y axis (to the top), but not change the X - axis. - To reset the value, use `RESET_SCRIPT_GFX_ALIGN`. - - The horizontal alignment. This can be 67 ('C'), 76 ('L'), or 82 ('R'). - The vertical alignment. This can be 67 ('C'), 66 ('B'), or 84 ('T'). - - - - This function anchors script draws to a side of the safe zone. This needs to be called to make the interface - independent of the player's safe zone configuration. - These values are equivalent to `alignX` and `alignY` in `common:/data/ui/frontend.xml`, which can be used as a baseline - for default alignment. - Valid values for `horizontalAlign`, from original documentation: - - **C (67)** - Center: DRAW_TEXT starts in the middle of the screen, while DRAW_RECT starts on the right; both move with - the right side of the screen. - - **L (76)** - Left: Anchors to the left side, DRAW_RECT starts on the left side of the screen, same as DRAW_TEXT when - centered. - - **R (82)** - Right: DRAW_TEXT starts on the left side (normal 0,0), while DRAW_RECT starts some short distance away - from the right side of the screen, both move with the right side of the screen. - Valid values for `verticalAlign`, from original documentation: - - **B (66)** - Bottom: DRAW_RECT starts about as far as the middle of the map from the bottom, while DRAW_TEXT is about - rather centered. - - **C (67)** - Center: It starts at a certain distance from the bottom, but the distance is fixed, the distance is - different from 66. - - **T (84)** - Top: Anchors to the top, DRAW_RECT starts on the top of the screen, DRAW_TEXT just below it. - Using any other value (including 0) will result in the safe zone not being taken into account for this draw. The - canonical value for this is 'I' (73). - For example, you can use `SET_SCRIPT_GFX_ALIGN(0, 84)` to only scale on the Y axis (to the top), but not change the X - axis. - To reset the value, use `RESET_SCRIPT_GFX_ALIGN`. - - The horizontal alignment. This can be 67 ('C'), 76 ('L'), or 82 ('R'). - The vertical alignment. This can be 67 ('C'), 66 ('B'), or 84 ('T'). - - - - Sets the draw offset/calculated size for `SET_SCRIPT_GFX_ALIGN`. If using any alignment other than left/top, the game - expects the width/height to be configured using this native in order to get a proper starting position for the draw - command. - - The X offset for the item to be drawn. - The Y offset for the item to be drawn. - The width of the item to be drawn. - The height of the item to be drawn. - - - - Sets the draw offset/calculated size for `SET_SCRIPT_GFX_ALIGN`. If using any alignment other than left/top, the game - expects the width/height to be configured using this native in order to get a proper starting position for the draw - command. - - The X offset for the item to be drawn. - The Y offset for the item to be drawn. - The width of the item to be drawn. - The height of the item to be drawn. - - - - Sets the draw offset/calculated size for `SET_SCRIPT_GFX_ALIGN`. If using any alignment other than left/top, the game - expects the width/height to be configured using this native in order to get a proper starting position for the draw - command. - - The X offset for the item to be drawn. - The Y offset for the item to be drawn. - The width of the item to be drawn. - The height of the item to be drawn. - - - - Sets a flag defining whether or not script draw commands should continue being drawn behind the pause - menu. This is usually used for TV channels and other draw commands that are used with a world render target. - - A boolean value. - - - - Sets a flag defining whether or not script draw commands should continue being drawn behind the pause - menu. This is usually used for TV channels and other draw commands that are used with a world render target. - - A boolean value. - - - - Sets the draw order for script draw commands. - Examples from decompiled scripts: - ```cpp - GRAPHICS::SET_SCRIPT_GFX_DRAW_ORDER(7); - GRAPHICS::DRAW_RECT(0.5, 0.5, 3.0, 3.0, v_4, v_5, v_6, a_0._f172, 0); - GRAPHICS::SET_SCRIPT_GFX_DRAW_ORDER(1); - GRAPHICS::DRAW_RECT(0.5, 0.5, 1.5, 1.5, 0, 0, 0, 255, 0); - ``` - - The intended draw order/layer. - - - - Sets the draw order for script draw commands. - Examples from decompiled scripts: - ```cpp - GRAPHICS::SET_SCRIPT_GFX_DRAW_ORDER(7); - GRAPHICS::DRAW_RECT(0.5, 0.5, 3.0, 3.0, v_4, v_5, v_6, a_0._f172, 0); - GRAPHICS::SET_SCRIPT_GFX_DRAW_ORDER(1); - GRAPHICS::DRAW_RECT(0.5, 0.5, 1.5, 1.5, 0, 0, 0, 255, 0); - ``` - - The intended draw order/layer. - - - - Sets the draw order for script draw commands. - Examples from decompiled scripts: - ```cpp - GRAPHICS::SET_SCRIPT_GFX_DRAW_ORDER(7); - GRAPHICS::DRAW_RECT(0.5, 0.5, 3.0, 3.0, v_4, v_5, v_6, a_0._f172, 0); - GRAPHICS::SET_SCRIPT_GFX_DRAW_ORDER(1); - GRAPHICS::DRAW_RECT(0.5, 0.5, 1.5, 1.5, 0, 0, 0, 255, 0); - ``` - - The intended draw order/layer. - - - - Sets the draw order for script draw commands. - Examples from decompiled scripts: - ```cpp - GRAPHICS::SET_SCRIPT_GFX_DRAW_ORDER(7); - GRAPHICS::DRAW_RECT(0.5, 0.5, 3.0, 3.0, v_4, v_5, v_6, a_0._f172, 0); - GRAPHICS::SET_SCRIPT_GFX_DRAW_ORDER(1); - GRAPHICS::DRAW_RECT(0.5, 0.5, 1.5, 1.5, 0, 0, 0, 255, 0); - ``` - - The intended draw order/layer. - - - - Only called once in the decompiled scripts. Presumably activates the specified generator. - - - - - Toggles Heatvision on/off. - - - - - Judging from the effect, this is some sort of vehicle density multiplier. - - - - - Judging from the effect, this is some sort of vehicle density multiplier. - - - - - SET_*_MULTIPLIER_THIS_FRAME - - - - - SET_*_MULTIPLIER_THIS_FRAME - - - - - Hardcoded to not work in multiplayer. - Used to lock/unlock doors to interior areas of the game. - (Possible) Door Types: - pastebin.com/9S2m3qA4 - Heading is either 1, 0 or -1 in the scripts. Means default closed(0) or opened either into(1) or out(-1) of the interior. - Locked means that the heading is locked. - p6 is always 0. - 225 door types, model names and coords found in stripclub.c4: - pastebin.com/gywnbzsH - get door info: pastebin.com/i14rbekD - - - - - Example: - AUDIO::SET_STATIC_EMITTER_ENABLED((Any*)"LOS_SANTOS_VANILLA_UNICORN_01_STAGE", false); AUDIO::SET_STATIC_EMITTER_ENABLED((Any*)"LOS_SANTOS_VANILLA_UNICORN_02_MAIN_ROOM", false); AUDIO::SET_STATIC_EMITTER_ENABLED((Any*)"LOS_SANTOS_VANILLA_UNICORN_03_BACK_ROOM", false); - This turns off surrounding sounds not connected directly to peds. - - - - - Access to the store for shark cards etc... - - - - - Swim speed multiplier. - Multiplier goes up to 1.49 - Just call it one time, it is not required to be called once every tick. - Note copied from below native. - Note: At least the IDA method if you change the max float multiplier from 1.5 it will change it for both this and RUN_SPRINT below. I say 1.5 as the function blrs if what you input is greater than or equal to 1.5 hence why it's 1.49 max default. - - - - - Sets the position of the audio event to the entity's position for one frame(?) - if (l_8C3 == 0) { - sub_27fd1(0, -1, 1); - if (PED::IS_SYNCHRONIZED_SCENE_RUNNING(l_87D)) { - AUDIO::STOP_SYNCHRONIZED_AUDIO_EVENT(l_87D); - } - if (sub_7dd(l_A00)) { - AUDIO::_950A154B8DAB6185("PAP2_IG1_POPPYSEX", l_A00); - } - sub_91c("TK************ SETTING SYNCH SCENE AUDIO POSITION THIS FRAME ************TK"); - l_8C3 = 1; - } - -- - Found in the b617d scripts, duplicates removed: - AUDIO::_950A154B8DAB6185("CAR_5_IG_6", l_7FE[1 -- [[1]] ]); - AUDIO::_950A154B8DAB6185("EX03_TRAIN_BIKE_LAND", PLAYER::PLAYER_PED_ID()); - AUDIO::_950A154B8DAB6185("FBI_2_MCS_1_LeadIn", l_40[2 -- [[1]] ]); - AUDIO::_950A154B8DAB6185("FIN_C2_MCS_1", l_24C[0 -- [[1]] ]); - AUDIO::_950A154B8DAB6185("MNT_DNC", l_5F); - AUDIO::_950A154B8DAB6185("PAP2_IG1_POPPYSEX", l_A00); - - - - - Sets the position of the audio event to the entity's position for one frame(?) - if (l_8C3 == 0) { - sub_27fd1(0, -1, 1); - if (PED::IS_SYNCHRONIZED_SCENE_RUNNING(l_87D)) { - AUDIO::STOP_SYNCHRONIZED_AUDIO_EVENT(l_87D); - } - if (sub_7dd(l_A00)) { - AUDIO::_950A154B8DAB6185("PAP2_IG1_POPPYSEX", l_A00); - } - sub_91c("TK************ SETTING SYNCH SCENE AUDIO POSITION THIS FRAME ************TK"); - l_8C3 = 1; - } - -- - Found in the b617d scripts, duplicates removed: - AUDIO::_950A154B8DAB6185("CAR_5_IG_6", l_7FE[1 -- [[1]] ]); - AUDIO::_950A154B8DAB6185("EX03_TRAIN_BIKE_LAND", PLAYER::PLAYER_PED_ID()); - AUDIO::_950A154B8DAB6185("FBI_2_MCS_1_LeadIn", l_40[2 -- [[1]] ]); - AUDIO::_950A154B8DAB6185("FIN_C2_MCS_1", l_24C[0 -- [[1]] ]); - AUDIO::_950A154B8DAB6185("MNT_DNC", l_5F); - AUDIO::_950A154B8DAB6185("PAP2_IG1_POPPYSEX", l_A00); - - - - - This is not tested - it's just an assumption. - Doesn't seem to work. I'll try with an int instead. --JT - Read the scripts, im dumpass. - Doesn't work at all, wether with an bool neither an int - if (!VEHICLE::IS_TAXI_LIGHT_ON(l_115)) { - VEHICLE::SET_TAXI_LIGHTS(l_115, 1); - } - - - - - Sets an unknown boolean value in the text chat. - - - - - Sets the drop shadow for the current text style. - - Shadow distance in pixels, both horizontal and vertical. - Red color. - Green color. - Blue color. - Alpha. - - - - fonts that mess up your text where made for number values/misc stuff - - - - - Types - - 0: Center-Justify - 1: Left-Justify - 2: Right-Justify - Right-Justify requires SET_TEXT_WRAP, otherwise it will draw to the far right of the screen - - - - - Types - - 0: Center-Justify - 1: Left-Justify - 2: Right-Justify - Right-Justify requires SET_TEXT_WRAP, otherwise it will draw to the far right of the screen - - - - - from script am_mp_yacht.c int? - ui::set_text_leading(2); - - - - - Size range : 0f to 1.0f - - - - - It sets the text in a specified box and wraps the text if it exceeds the boundries. Both values are for X axis. Useful when positioning text set to center or aligned to the right. - start - left boundry on screen position (0.0 - 1.0) - end - right boundry on screen position (0.0 - 1.0) - - - - - Sets the near clipping plane of the third person aim camera. - - - - - Sets the near clipping plane of the third person aim camera. - - - - - Hash collision. Please change back to _0x_ - - - - - hash collision? - - - - - hash collision? - - - - - Maximum value is 1. - At a value of 0 the game will still run at a minimum time scale. - Slow Motion 1: 0.6 - Slow Motion 2: 0.4 - Slow Motion 3: 0.2 - - - - - Loads the specified timecycle modifier. Modifiers are defined separately in another file (e.g. "timecycle_mods_1.xml") - Parameters: - modifierName - The modifier to load (e.g. "V_FIB_IT3", "scanline_cam", etc.) - For a full list, see here: pastebin.com/kVPwMemE - - - - - Sets how much the crane on the tow truck is raised, where 0.0 is fully lowered and 1.0 is fully raised. - - - - - Sets how much the crane on the tow truck is raised, where 0.0 is fully lowered and 1.0 is fully raised. - - - - - For a full list, see here: pastebin.com/kVPwMemE - - - - - Might be more appropriate in AUDIO? - Rockstar made it like this. - Probably changes tvs from being a 3d audio to being "global" audio - - - - - Sets an unknown flag used by CScene in determining which entities from CMapData scene nodes to draw, similar to 9BAE5AD2508DF078. - Documented by NTAuthority (http://fivem.net/). - - - - - Hash collision! Please change back to _0xEF4CED81CEBEDC6D - - - - - From the scripts, p0: - "ArmWrestlingIntensity", - "INOUT", - "Monkey_Stream", - "ZoomLevel" - - - - - For a full list, see here: pastebin.com/Kj9t38KF - - - - - Makes the vehicle accept no passengers. - - - - - This is an alias of SET_ENTITY_AS_NO_LONGER_NEEDED. - - - - - Disables the vehicle from being repaired when a vehicle extra is enabled. - - The vehicle to set disable auto vehicle repair. - Setting the value to true prevents the vehicle from being repaired when a extra is enabled. Setting the value to false allows the vehicle from being repaired when a extra is enabled. - - - - Please change to void. - - - - - p2 often set to 1000.0 in the decompiled scripts. - - - - - SET_VEHICLE_BOOST_ACTIVE(vehicle, 1, 0); - SET_VEHICLE_BOOST_ACTIVE(vehicle, 0, 0); - Will give a boost-soundeffect. - - - - - On accelerating, spins the driven wheels with the others braked, so you don't go anywhere. - - - - - This has not yet been tested - it's just an assumption of what the types could be. - - - - - Previously named GET_VEHICLE_DEFORMATION_GET_TREE (hash collision) - from Decrypted Scripts I found - VEHICLE::SET_VEHICLE_CEILING_HEIGHT(l_BD9[2 -- [[2]] ], 420.0); - - - - - Previously named GET_VEHICLE_DEFORMATION_GET_TREE (hash collision) - from Decrypted Scripts I found - VEHICLE::SET_VEHICLE_CEILING_HEIGHT(l_BD9[2 -- [[2]] ], 420.0); - - - - - Sets the selected vehicle's colors to their default value (specific variant specified using the colorCombination parameter). - Range of possible values for colorCombination is currently unknown, I couldn't find where these values are stored either (Disquse's guess was vehicles.meta but I haven't seen it in there.) - - The vehicle to modify. - One of the default color values of the vehicle. - - - - colorPrimary & colorSecondary are the paint index for the vehicle. - For a list of valid paint indexes, view: pastebin.com/pwHci0xK - ------------------------------------------------------------------------- - Use this to get the number of color indices: pastebin.com/RQEeqTSM - Note: minimum color index is 0, maximum color index is (numColorIndices - 1) - - - - - p1, p2, p3 are RGB values for color (255,0,0 for Red, ect) - - - - - p1, p2, p3 are RGB values for color (255,0,0 for Red, ect) - - - - - Apply damage to vehicle at a location. Location is relative to vehicle model (not world). - Radius of effect damage applied in a sphere at impact location - - - - - This fixes the deformation of a vehicle but the vehicle health doesn't improve - - - - - • Usage - → Use this native inside a looped function. - → Values: - → 0.0 = no vehicles on streets - → 1.0 = normal vehicles on streets - - - - - You can't use values greater than 15.0 - You can see why here: pastebin.com/Wbn34fGD - Also, R* does (float)(rand() % 15) to get a random dirt level when generating a vehicle. - - - - - doorIndex: - 0 = Front Right Door - 1 = Front Left Door - 2 = Back Right Door - 3 = Back Left Door - 4 = Hood - 5 = Trunk - Changed last paramater from CreateDoorObject To NoDoorOnTheFloor because when on false, the door object is created,and not created when on true...the former parameter name was counter intuitive...(by Calderon) - - - - - Keeps Vehicle Doors/Hood/Trunk from breaking off - - - - - Keeps Vehicle Doors/Hood/Trunk from breaking off - - - - - doorIndex: - 0 = Front Left Door (driver door) - 1 = Front Right Door - 2 = Back Left Door - 3 = Back Right Door - 4 = Hood - 5 = Trunk - 6 = Trunk2 - p2: - mostly use 0 and 1, very rare using 3 and 5 - p3: - It seems it is an angle - Example in VB: - Public Shared Sub Set_Vehicle_Door_Angle(Vehicle As Vehicle, Door As VehicleDoor, Angle As Single) - Native.Function.Call(Hash.SET_VEHICLE_DOOR_CONTROL, Vehicle.Handle, Door, 1, Angle) - End Sub - I'm Not MentaL - sfink: p2 is speed, 5 is fast, 1 is slow 3 is medium - - - - - When lock is false other entities can overwrite it. - - - - - doorIndex: - 0 = Front Left Door - 1 = Front Right Door - 2 = Back Left Door - 3 = Back Right Door - 4 = Hood - 5 = Trunk - 6 = Back - 7 = Back2 - - - - - doorIndex: - 0 = Front Left Door - 1 = Front Right Door - 2 = Back Left Door - 3 = Back Right Door - 4 = Hood - 5 = Trunk - 6 = Trunk2 - - - - - 1 - 2 - CARLOCK_LOCKED (locked) - 3 - 4 - CARLOCK_LOCKED_PLAYER_INSIDE (can get in, can't leave) - (maybe, these are leftovers from GTA:VC) - 5 - 6 - 7 - (source: GTA VC miss2 leak, matching constants for 0/2/4, testing) - They use 10 in am_mp_property_int, don't know what it does atm. - - - - - After some analysis, I've decided that these are what the parameters are. - We can see this being used in R* scripts such as "am_mp_property_int.ysc.c4": - l_11A1 = PED::GET_VEHICLE_PED_IS_IN(PLAYER::PLAYER_PED_ID(), 1); - ... - VEHICLE::SET_VEHICLE_DOORS_LOCKED_FOR_ALL_PLAYERS(l_11A1, 1); - - - - - Closes all doors of a vehicle: - - - - - Money pickups are created around cars when they explodes. Only works when the vehicle model is a car. A single pickup is between 1 and 18 dollars in size. All car models seems to give the same amount of money. - youtu.be/3arlUxzHl5Y - i.imgur.com/WrNpYFs.jpg - From the scripts: - VEHICLE::_068F64F2470F9656(l_36, 0); - Found a "correct" name for this :P - _dead_vehicle_pickups_dies_when_set_exploded_destroy_it_drops_on_money - SET_VEHICLE_D* or SET_VEHICLE_E* - - - - - Money pickups are created around cars when they explodes. Only works when the vehicle model is a car. A single pickup is between 1 and 18 dollars in size. All car models seems to give the same amount of money. - youtu.be/3arlUxzHl5Y - i.imgur.com/WrNpYFs.jpg - From the scripts: - VEHICLE::_068F64F2470F9656(l_36, 0); - Found a "correct" name for this :P - _dead_vehicle_pickups_dies_when_set_exploded_destroy_it_drops_on_money - SET_VEHICLE_D* or SET_VEHICLE_E* - - - - - Money pickups are created around cars when they explodes. Only works when the vehicle model is a car. A single pickup is between 1 and 18 dollars in size. All car models seems to give the same amount of money. - youtu.be/3arlUxzHl5Y - i.imgur.com/WrNpYFs.jpg - From the scripts: - VEHICLE::_068F64F2470F9656(l_36, 0); - Found a "correct" name for this :P - _dead_vehicle_pickups_dies_when_set_exploded_destroy_it_drops_on_money - SET_VEHICLE_D* or SET_VEHICLE_E* - - - - - 1000 is max health - Begins leaking gas at around 650 health - -999.90002441406 appears to be minimum health, although nothing special occurs <- false statement - ------------------------- - Minimum: -4000 - Maximum: 1000 - -4000: Engine is destroyed - 0 and below: Engine catches fire and health rapidly declines - 300: Engine is smoking and losing functionality - 1000: Engine is perfect - - - - - Starts or stops the engine on the specified vehicle. - vehicle: The vehicle to start or stop the engine on. - value: true to turn the vehicle on; false to turn it off. - instantly: if true, the vehicle will be set to the state immediately; otherwise, the current driver will physically turn on or off the engine. - -------------------------------------- - from what I've tested when I do this to a helicopter the propellers turn off after the engine has started. so is there any way to keep the heli propellers on? - -------------------------------------- - And what's with BOOL otherwise, what does it do??? - - - - - Vehicle power multiplier. - Does not have to be looped each frame. Can be set once. - Values lower than 1f don't work. - Note: If the value is set with GET_RANDOM_FLOAT_IN_RANGE, the vehicle will have an absurdly high ammount of power, and will become almost undrivable for the player or NPCs. The range doesn't seem to matter. - An high value like 10000000000f will visually remove the wheels that apply the power (front wheels for FWD, rear wheels for RWD), but the power multiplier will still apply, and the wheels still work. - ------ - value is a percentage bump which affects directly the parameter known as fInitialDriveForce in handling.meta. For example: - VEHICLE::_SET_VEHICLE_ENGINE_POWER_MULTIPLIER(myVehicle, 30.0) - will have this effect: DriveForce *= 1.3 - - - - - <1.0 - Decreased torque - =1.0 - Default torque - >1.0 - Increased torque - Negative values will cause the vehicle to go backwards instead of forwards while accelerating. - value - is between 0.2 and 1.8 in the decompiled scripts. - This needs to be called every frame to take effect. - - - - - formerly known as _SET_VEHICLE_PAINT_FADE - The parameter fade is a value from 0-1, where 0 is fresh paint. - ------------------------------------------------------------------------------------ - The actual value isn't stored as a float but as an unsigned char (BYTE). More info here: pastebin.com/r0h6EM5s - -------------- - Separate Person: I didn't want to be rude and remove it, but whom ever posted that pastebin above please remove it as the paste says it has been removed. - - - - - formerly known as _SET_VEHICLE_PAINT_FADE - The parameter fade is a value from 0-1, where 0 is fresh paint. - ------------------------------------------------------------------------------------ - The actual value isn't stored as a float but as an unsigned char (BYTE). More info here: pastebin.com/r0h6EM5s - -------------- - Separate Person: I didn't want to be rude and remove it, but whom ever posted that pastebin above please remove it as the paste says it has been removed. - - - - - Seems according to TU27 X360 Scripts, this has 3 arguments as well. - SET_VEHICLE_EXCLUSIVE_DRIVER(vehicle, 0, 0); in freemode.c - In case 5 of a switch case, is the only time it shows Arg2 being PLAYER_PED_ID(), otherwise it's 0. Arg3 always seems to be 0. - - - - - Seems according to TU27 X360 Scripts, this has 3 arguments as well. - SET_VEHICLE_EXCLUSIVE_DRIVER(vehicle, 0, 0); in freemode.c - In case 5 of a switch case, is the only time it shows Arg2 being PLAYER_PED_ID(), otherwise it's 0. Arg3 always seems to be 0. - - - - - Sets a vehicle to be strongly resistant to explosions. p0 is the vehicle; set p1 to false to toggle the effect on/off. - - - - - Note: only some vehicle have extras - extra ids are from 1 - 9 depending on the vehicle - ------------------------------------------------- - ^ not sure if outdated or simply wrong. Max extra ID for b944 is 14 - ------------------------------------------------- - p2 is not a on/off toggle. mostly 0 means on and 1 means off. - not sure if it really should be a BOOL. - ------------------------------------------------- - Confirmed p2 does not work as a bool. Changed to int. [0=on, 1=off] - - - - - They use the same color indexs as SET_VEHICLE_COLOURS. - - - - - SCALE: Setting the speed to 30 would result in a speed of roughly 60mph, according to speedometer. - Speed is in meters per second - You can convert meters/s to mph here: - http://www.calculateme.com/Speed/MetersperSecond/ToMilesperHour.htm - - - - - Seems to be related to the metal parts, not tyres (like i was expecting lol) - Must be called every tick. - - - - - It switch to highbeam when p1 is set to true. - - - - - This native makes the vehicle stop immediately, as happens when we enter a MP garage. - . distance defines how far it will travel until stopping. Garage doors use 3.0. - . If killEngine is set to 1, you cannot resume driving the vehicle once it stops. This looks like is a bitmapped integer. - - - - - This native makes the vehicle stop immediately, as happens when we enter a MP garage. - . distance defines how far it will travel until stopping. Garage doors use 3.0. - . If killEngine is set to 1, you cannot resume driving the vehicle once it stops. This looks like is a bitmapped integer. - - - - - Sets a handling override for a specific vehicle. Certain handling flags can only be set globally using `SET_HANDLING_FIELD`, this might require some experimentation. - Example: `SetVehicleHandlingField(vehicle, 'CHandlingData', 'fSteeringLock', 360.0)` - - The vehicle to set data for. - The handling class to set. Only "CHandlingData" is supported at this time. - The field name to set. These match the keys in `handling.meta`. - The value to set. - - - - Sets a handling override for a specific vehicle. Certain handling flags can only be set globally using `SET_HANDLING_FLOAT`, this might require some experimentation. - Example: `SetVehicleHandlingFloat(vehicle, 'CHandlingData', 'fSteeringLock', 360.0)` - - The vehicle to set data for. - The handling class to set. Only "CHandlingData" is supported at this time. - The field name to set. These match the keys in `handling.meta`. - The floating-point value to set. - - - - Sets a handling override for a specific vehicle. Certain handling flags can only be set globally using `SET_HANDLING_INT`, this might require some experimentation. - - The vehicle to set data for. - The handling class to set. Only "CHandlingData" is supported at this time. - The field name to set. These match the keys in `handling.meta`. - The integer value to set. - - - - Sets a handling override for a specific vehicle. Certain handling flags can only be set globally using `SET_HANDLING_VECTOR`, this might require some experimentation. - - The vehicle to set data for. - The handling class to set. Only "CHandlingData" is supported at this time. - The field name to set. These match the keys in `handling.meta`. - The Vector3 value to set. - - - - if true, axles won't bend. - - - - - color is the paint index for the vehicle. - Paint index goes from 0 to 12. - Be aware that it only works on xenon lights. - You can find the list of colors and ids here: [\_GET_VEHICLE_HEADLIGHTS_COLOUR](#_0x3DFF319A831E0CDB) - - The vehicle handle. - The paint index. - - - - color is the paint index for the vehicle. - Paint index goes from 0 to 12. - Be aware that it only works on xenon lights. - You can find the list of colors and ids here: [\_GET_VEHICLE_HEADLIGHTS_COLOUR](#_0x3DFF319A831E0CDB) - - The vehicle handle. - The paint index. - - - - console hash: 0x71CDD52F - - - - - console hash: 0x71CDD52F - - - - - Sets the turn signal enabled for a vehicle. - Set turnSignal to 1 for left light, 0 for right light. - - - - - Setting this to false, makes the specified vehicle to where if you press Y your character doesn't even attempt the animation to enter the vehicle. Hence it's not considered aka ignored. - - - - - Sets the wanted state of this vehicle. - - - - - VEHICLE::SET_VEHICLE_ENGINE_ON is not enough to start jet engines when not inside the vehicle. But with this native set to true it works: youtu.be/OK0ps2fDpxs - i.imgur.com/7XA14pX.png - Certain planes got jet engines. - void VEHICLE::_SET_VEHICLE_JET_ENGINE_ON(scrNativeCallContext *args) - { - bool bOn; // bl@1 - CVehicle *pVehicle; // rax@1 - scrNativeCallContextArgStruct *pArgs; // rax@1 - pArgs = args->pArgs; - bOn = pArgs->a2.INT32 != 0; - pVehicle = getEntityAddressIfVehicle(pArgs->a1.INT32); - if ( pVehicle ) - { - pVehicle->bitmapBulletProofTires &= 0xFBu; - pVehicle->bitmapBulletProofTires |= 4 * bOn; - } - } // sfink - - - - - VEHICLE::SET_VEHICLE_ENGINE_ON is not enough to start jet engines when not inside the vehicle. But with this native set to true it works: youtu.be/OK0ps2fDpxs - i.imgur.com/7XA14pX.png - Certain planes got jet engines. - void VEHICLE::_SET_VEHICLE_JET_ENGINE_ON(scrNativeCallContext *args) - { - bool bOn; // bl@1 - CVehicle *pVehicle; // rax@1 - scrNativeCallContextArgStruct *pArgs; // rax@1 - pArgs = args->pArgs; - bOn = pArgs->a2.INT32 != 0; - pVehicle = getEntityAddressIfVehicle(pArgs->a1.INT32); - if ( pVehicle ) - { - pVehicle->bitmapBulletProofTires &= 0xFBu; - pVehicle->bitmapBulletProofTires |= 4 * bOn; - } - } // sfink - - - - - multiplier = brightness of head lights. - this value isn't capped afaik. - multiplier = 0.0 no lights - multiplier = 1.0 default game value - - - - - set's if the vehicle has lights or not. - not an on off toggle. - p1 = 0 ;vehicle normal lights, off then lowbeams, then highbeams - p1 = 1 ;vehicle doesn't have lights, always off - p1 = 2 ;vehicle has always on lights - p1 = 3 ;or even larger like 4,5,... normal lights like =1 - note1: when using =2 on day it's lowbeam,highbeam - but at night it's lowbeam,lowbeam,highbeam - note2: when using =0 it's affected by day or night for highbeams don't exist in daytime. - - - - - p1 can be either 0, 1 or 2. - Determines how vehicle lights behave when toggled. - 0 = Default (Lights can be toggled between off, normal and high beams) - 1 = Lights Disabled (Lights are fully disabled, cannot be toggled) - 2 = Always On (Lights can be toggled between normal and high beams) - - - - - p1 can be either 0, 1 or 2. - Determines how vehicle lights behave when toggled. - 0 = Default (Lights can be toggled between off, normal and high beams) - 1 = Lights Disabled (Lights are fully disabled, cannot be toggled) - 2 = Always On (Lights can be toggled between normal and high beams) - - - - - Note: Only seems to work on Emergency Vehicles - - - - - In b944, there are 50 (0 - 49) mod types. - Sets the vehicle mod. - The vehicle must have a mod kit first. - Any out of range ModIndex is stock. - #Mod Type - Spoilers - Front Bumper - Rear Bumper - Side Skirt - Exhaust - Frame - Grille - Hood - Fender - Right Fender - Roof - Engine - Brakes - Transmission - Horns - 14 (modIndex from 0 to 51) - Suspension - Armor - Front Wheels - Back Wheels - 24 //only for motocycles - Plate holders - Trim Design - Ornaments - Dial Design - Steering Wheel - Shifter Leavers - Plaques - Hydraulics - Livery - ENUMS: pastebin.com/QzEAn02v - - - - - paintType: - 0: Normal - 1: Metallic - 2: Pearl - 3: Matte - 4: Metal - 5: Chrome - color: number of the color. - p3 seems to always be 0. - - - - - Changes the secondary paint type and color - paintType: - 0: Normal - 1: Metallic - 2: Pearl - 3: Matte - 4: Metal - 5: Chrome - color: number of the color - - - - - Set modKit to 0 if you plan to call SET_VEHICLE_MOD. That's what the game does. Most body modifications through SET_VEHICLE_MOD will not take effect until this is set to 0. - --------- - Setting the modKit to 0 also seems to load some livery related vehicle information. For example, using GET_LIVERY_NAME() will return NULL if you haven't set the modKit to 0 in advance. As soon as you set it to 0, GET_LIVERY_NAME() will work properly. - - - - - seems to make the vehicle stop spawning naturally in traffic. Here's an essential example: - VEHICLE::SET_VEHICLE_MODEL_IS_SUPPRESSED(GAMEPLAY::GET_HASH_KEY("taco"), true); - god I hate taco vans - Confirmed to work? Needs to be looped? Can not get it to work. - - - - - NOTE: Debugging functions are not present in the retail version of the game. - - - - - Sets the neon lights of the specified vehicle on/off. - Indices: - 0 = Left - 1 = Right - 2 = Front - 3 = Back - - - - - Sets the color of the neon lights on the specified vehicle. - RGB values and colour names taken from the decompiled scripts: - | Colour | R | G | B | - | ------------- | :-: | :-: | :-: | - | White | 222 | 222 | 255 | - | Blue | 2 | 21 | 255 | - | Electric Blue | 3 | 83 | 255 | - | Mint Green | 0 | 255 | 140 | - | Lime Green | 94 | 255 | 1 | - | Yellow | 255 | 255 | 0 | - | Golden Shower | 255 | 150 | 0 | - | Orange | 255 | 62 | 0 | - | Red | 255 | 1 | 1 | - | Pony Pink | 255 | 50 | 100 | - | Hot Pink | 255 | 5 | 190 | - | Purple | 35 | 1 | 255 | - | Blacklight | 15 | 3 | 255 | - - - - - Sets a vehicle's license plate text. 8 chars maximum. - Example: - Ped playerPed = PLAYER::PLAYER_PED_ID(); - Vehicle veh = PED::GET_VEHICLE_PED_IS_USING(playerPed); - char *plateText = "KING"; - VEHICLE::SET_VEHICLE_NUMBER_PLATE_TEXT(veh, plateText); - - - - - Plates: - Blue/White - Yellow/black - Yellow/Blue - Blue/White2 - Blue/White3 - Yankton - - - - - Sets a vehicle on the ground on all wheels. Returns whether or not the operation was successful. - sfink: This has an additional param(Vehicle vehicle, float p1) which is always set to 5.0f in the b944 scripts. - - - - - Tested on the player's current vehicle. Unless you kill the driver, the vehicle doesn't loose control, however, if enabled, explodeOnImpact is still active. The moment you crash, boom. - - - - - 1000 is max health - Begins leaking gas at around 650 health - - - - - can't seem to enable radio on cop cars etc - - - - - Reduces grip significantly so it's hard to go anywhere. - - - - - Used to set the tornado custom (convertible) rooftop livery. - Livery value that works for tornado custom is between 0 and 9 from what i can tell. Maybe 0-8 even. - Might work on other custom vehicles but im not sure what those might be, only confirmed it working with the tornado custom. - - The vehicle handle. - Livery index. - - - - Used to set the tornado custom (convertible) rooftop livery. - Livery value that works for tornado custom is between 0 and 9 from what i can tell. Maybe 0-8 even. - Might work on other custom vehicles but im not sure what those might be, only confirmed it working with the tornado custom. - - The vehicle handle. - Livery index. - - - - Only works during nighttime. - And only if there is a driver in heli. - - - - - Commands the driver of an armed vehicle (p0) to shoot its weapon at a target (p1). p3, p4 and p5 are the coordinates of the target. Example: - WEAPON::SET_CURRENT_PED_VEHICLE_WEAPON(pilot,GAMEPLAY::GET_HASH_KEY("VEHICLE_WEAPON_PLANE_ROCKET"));VEHICLE::SET_VEHICLE_SHOOT_AT_TARGET(pilot, target, targPos.x, targPos.y, targPos.z); - - - - - If set to TRUE, it seems to suppress door noises and doesn't allow the horn to be continuous. - - - - - If set to TRUE, it seems to suppress door noises and doesn't allow the horn to be continuous. - - - - - Activate siren on vehicle (Only works if the vehicle has a siren). - - - - - Has something to do with trains. Always precedes SET_MISSION_TRAIN_AS_NO_LONGER_NEEDED. - ============================================ - May be true that it can be used with trains not sure, but not specifically for trains. Go find Xbox360 decompiled scripts and search for 'func_1333' in freemode.c it isn't used just for trains. Thanks for the info tho. - Btw, func_1333 ends up calling this func which uses this native, - void func_1338(int iParam0)//Position - { - ENTITY::FREEZE_ENTITY_POSITION(iParam0, true); - ENTITY::SET_ENTITY_COLLISION(iParam0, false, 0); - ENTITY::SET_ENTITY_INVINCIBLE(iParam0, true); - VEHICLE::_0xDF594D8D(iParam0, true); - } - - - - - Has something to do with trains. Always precedes SET_MISSION_TRAIN_AS_NO_LONGER_NEEDED. - ============================================ - May be true that it can be used with trains not sure, but not specifically for trains. Go find Xbox360 decompiled scripts and search for 'func_1333' in freemode.c it isn't used just for trains. Thanks for the info tho. - Btw, func_1333 ends up calling this func which uses this native, - void func_1338(int iParam0)//Position - { - ENTITY::FREEZE_ENTITY_POSITION(iParam0, true); - ENTITY::SET_ENTITY_COLLISION(iParam0, false, 0); - ENTITY::SET_ENTITY_INVINCIBLE(iParam0, true); - VEHICLE::_0xDF594D8D(iParam0, true); - } - - - - - Locks the vehicle's steering to the desired angle, explained below. - Requires to be called onTick. Steering is unlocked the moment the function stops being called on the vehicle. - Steer bias: - -1.0 = full right - 0.0 = centered steering - 1.0 = full left - - - - - If set to true, vehicle will not take crash damage, but is still susceptible to damage from bullets and explosives - - - - - VEHICLE::SET_VEHICLE_TIMED_EXPLOSION(v_3, PLAYER::GET_PLAYER_PED(v_5), 1); - - - - - According to decompiled scripts this should work with the `deluxo` and `oppressor2` vehicles. - I've only seen this work for `deluxo` though, can't figure out what it's supposed to do on `oppressor2`. - For the deluxo: - - Set `state` to `0.0`: Fully transform to a 'road' vehicle (non-hover mode). - - Set `state` to `1.0`: Fully transform to a 'flying' vehicle (hover mode). - If you set it to something like 0.5, then something [weird happens](https://streamable.com/p6wmr), you end up in some 50% hover mode, 50% not hover mode. - This doesn't need to be called every tick, just once and the vehicle will transform to that state at the usual transform speed. It'll just stop transforming when it reaches the state you provided. - Once this native is used then players will just be able to hit the vehicle transform key to toggle the transformation cycle; it won't block users from using the key. - - The vehicle (a deluxo or oppressor2). - The transform state (value between 0.0 and 1.0). - - - - According to decompiled scripts this should work with the `deluxo` and `oppressor2` vehicles. - I've only seen this work for `deluxo` though, can't figure out what it's supposed to do on `oppressor2`. - For the deluxo: - - Set `state` to `0.0`: Fully transform to a 'road' vehicle (non-hover mode). - - Set `state` to `1.0`: Fully transform to a 'flying' vehicle (hover mode). - If you set it to something like 0.5, then something [weird happens](https://streamable.com/p6wmr), you end up in some 50% hover mode, 50% not hover mode. - This doesn't need to be called every tick, just once and the vehicle will transform to that state at the usual transform speed. It'll just stop transforming when it reaches the state you provided. - Once this native is used then players will just be able to hit the vehicle transform key to toggle the transformation cycle; it won't block users from using the key. - - The vehicle (a deluxo or oppressor2). - The transform state (value between 0.0 and 1.0). - - - - "To burst tyres VEHICLE::SET_VEHICLE_TYRE_BURST(vehicle, 0, true, 1000.0) - to burst all tyres type it 8 times where p1 = 0 to 7. - p3 seems to be how much damage it has taken. 0 doesn't deflate them, 1000 completely deflates them. - '0 = wheel_lf / bike, plane or jet front - '1 = wheel_rf - '2 = wheel_lm / in 6 wheels trailer, plane or jet is first one on left - '3 = wheel_rm / in 6 wheels trailer, plane or jet is first one on right - '4 = wheel_lr / bike rear / in 6 wheels trailer, plane or jet is last one on left - '5 = wheel_rr / in 6 wheels trailer, plane or jet is last one on right - '45 = 6 wheels trailer mid wheel left - '47 = 6 wheels trailer mid wheel right - - - - - tyreIndex = 0 to 4 on normal vehicles - '0 = wheel_lf / bike, plane or jet front - '1 = wheel_rf - '2 = wheel_lm / in 6 wheels trailer, plane or jet is first one on left - '3 = wheel_rm / in 6 wheels trailer, plane or jet is first one on right - '4 = wheel_lr / bike rear / in 6 wheels trailer, plane or jet is last one on left - '5 = wheel_rr / in 6 wheels trailer, plane or jet is last one on right - '45 = 6 wheels trailer mid wheel left - '47 = 6 wheels trailer mid wheel right - - - - - Sets the tire smoke's color of this vehicle. - vehicle: The vehicle that is the target of this method. - r: The red level in the RGB color code. - g: The green level in the RGB color code. - b: The blue level in the RGB color code. - Note: - setting r,g,b to 0 will give the car independance day tyre smoke - - - - - Allows you to toggle bulletproof tires. - - - - - Player won't be able to drive the car or enter it, unless you task him to get into any other seat than the driver one. - - - - - 0: Sport - 1: Muscle - 2: Lowrider - 3: SUV - 4: Offroad - 5: Tuner - 6: Bike Wheels - 7: High End - - - - - Adjusts the offset of the specified wheel relative to the wheel's axle center. - Needs to be called every frame in order to function properly, as GTA will reset the offset otherwise. - This function can be especially useful to set the track width of a vehicle, for example: - ``` - function SetVehicleFrontTrackWidth(vehicle, width) - SetVehicleWheelXOffset(vehicle, 0, -width/2) - SetVehicleWheelXOffset(vehicle, 1, width/2) - end - ``` - - - - - Example script: <https://pastebin.com/J6XGbkCW> - List of known states: - ``` - 1: Not wheeling. - 65: Vehicle is ready to do wheelie (burnouting). - 129: Vehicle is doing wheelie. - ``` - - Vehicle - Wheelie state - - - - enum WindowTints - { - WINDOWTINT_NONE, - WINDOWTINT_PURE_BLACK, - WINDOWTINT_DARKSMOKE, - WINDOWTINT_LIGHTSMOKE, - WINDOWTINT_STOCK, - WINDOWTINT_LIMO, - WINDOWTINT_GREEN - }; - - - - - MulleDK19: This immediately sets the VTOL engines at the specified angle ratio (0f-1f). - - - - - MulleDK19: This immediately sets the VTOL engines at the specified angle ratio (0f-1f). - - - - - Max value is 1.0 - - - - - **instructionalKey enum list**: - ``` - enum INSTRUCTIONAL_BUTTON_TYPES - { - NONE = 0, - SELECT = 1, - OK = 2, - YES = 4, - BACK = 8, - BACK_SELECT = 9, - BACK_OK = 10, - BACK_YES = 12, - CANCEL = 16, - CANCEL_SELECT = 17, - CANCEL_OK = 18, - CANCEL_YES = 20, - NO = 32, - NO_SELECT = 33, - NO_OK = 34, - YES_NO = 36, - RETRY = 64, - RETRY_SELECT = 65, - RETRY_OK = 66, - RETRY_YES = 68, - RETRY_BACK = 72, - RETRY_BACK_SELECT = 73, - RETRY_BACK_OK = 74, - RETRY_BACK_YES = 76, - RETRY_CANCEL = 80, - RETRY_CANCEL_SELECT = 81, - RETRY_CANCEL_OK = 82, - RETRY_CANCEL_YES = 84, - SKIP = 256, - SKIP_SELECT = 257, - SKIP_OK = 258, - SKIP_YES = 260, - SKIP_BACK = 264, - SKIP_BACK_SELECT = 265, - SKIP_BACK_OK = 266, - SKIP_BACK_YES = 268, - SKIP_CANCEL = 272, - SKIP_CANCEL_SELECT = 273, - SKIP_CANCEL_OK = 274, - SKIP_CANCEL_YES = 276, - CONTINUE = 16384, - BACK_CONTINUE = 16392, - CANCEL_CONTINUE = 16400, - LOADING_SPINNER = 134217728, - SELECT_LOADING_SPINNER = 134217729, - OK_LOADING_SPINNER = 134217730, - YES_LOADING_SPINNER = 134217732, - BACK_LOADING_SPINNER = 134217736, - BACK_SELECT_LOADING_SPINNER = 134217737, - BACK_OK_LOADING_SPINNER = 134217738, - BACK_YES_LOADING_SPINNER = 134217740, - CANCEL_LOADING_SPINNER = 134217744, - CANCEL_SELECT_LOADING_SPINNER = 134217745, - CANCEL_OK_LOADING_SPINNER = 134217746, - CANCEL_YES_LOADING_SPINNER = 134217748 - } - ``` - Note: this list is definitely NOT complete, but these are the ones I've been able to find before giving up because it's such a boring thing to look for 'good' combinations. - **Result of the example code:** - <https://i.imgur.com/imwoimm.png> - - The text label to display as the first line of the warning message. - This is an enum, check the description for a list. - The text label to display as the second line of the warning message. - Purpose unknown. - Purpose unknown. - Set to anything other than 0 or false (even any string) and it will draw a background. Setting it to 0 or false will draw no background. - Purpose unknown. - Purpose unknown. - Purpose unknown. - - - - You can only use text entries. No custom text. - C# Example : - Function.Call(Hash._SET_WARNING_MESSAGE_2, "HUD_QUIT", "HUD_CGIGNORE", 2, "HUD_CGINVITE", 0, -1, 0, 0, 1); - you can recreate this easily with scaleforms - --------------- - Fixed native name, from before nativedb restoration. - - - - - You can only use text entries. No custom text. - C# Example : - Function.Call(Hash._SET_WARNING_MESSAGE_2, "HUD_QUIT", "HUD_CGIGNORE", 2, "HUD_CGINVITE", 0, -1, 0, 0, 1); - you can recreate this easily with scaleforms - --------------- - Fixed native name, from before nativedb restoration. - - - - - You can only use text entries. No custom text. - - - - - This native removes the current waypoint from the map. - Example: - C#: - Function.Call(Hash.SET_WAYPOINT_OFF); - C++: - UI::SET_WAYPOINT_OFF(); - - - - - Changes the selected ped aiming animation style. - Note : You must use GET_HASH_KEY! - Strings to use with GET_HASH_KEY : - "Ballistic", - "Default", - "Fat", - "Female", - "FirstPerson", - "FirstPersonAiming", - "FirstPersonFranklin", - "FirstPersonFranklinAiming", - "FirstPersonFranklinRNG", - "FirstPersonFranklinScope", - "FirstPersonMPFemale", - "FirstPersonMichael", - "FirstPersonMichaelAiming", - "FirstPersonMichaelRNG", - "FirstPersonMichaelScope", - "FirstPersonRNG", - "FirstPersonScope", - "FirstPersonTrevor", - "FirstPersonTrevorAiming", - "FirstPersonTrevorRNG", - "FirstPersonTrevorScope", - "Franklin", - "Gang", - "Gang1H", - "GangFemale", - "Hillbilly", - "MP_F_Freemode", - "Michael", - "SuperFat", - "Trevor" - - - - - Hash collision, real name is: IS_FLASH_LIGHT_ON - - - - - The following weatherTypes are used in the scripts: - "CLEAR" - "EXTRASUNNY" - "CLOUDS" - "OVERCAST" - "RAIN" - "CLEARING" - "THUNDER" - "SMOG" - "FOGGY" - "XMAS" - "SNOWLIGHT" - "BLIZZARD" - - - - - The following weatherTypes are used in the scripts: - "CLEAR" - "EXTRASUNNY" - "CLOUDS" - "OVERCAST" - "RAIN" - "CLEARING" - "THUNDER" - "SMOG" - "FOGGY" - "XMAS" - "SNOWLIGHT" - "BLIZZARD" - - - - - The following weatherTypes are used in the scripts: - "CLEAR" - "EXTRASUNNY" - "CLOUDS" - "OVERCAST" - "RAIN" - "CLEARING" - "THUNDER" - "SMOG" - "FOGGY" - "XMAS" - "SNOWLIGHT" - "BLIZZARD" - - - - - Mixes two weather types. If percentWeather2 is set to 0.0f, then the weather will be entirely of weatherType1, if it is set to 1.0f it will be entirely of weatherType2. If it's set somewhere in between, there will be a mixture of weather behaviors. To test, try this in the RPH console, and change the float to different values between 0 and 1: - execute "NativeFunction.Natives.x578C752848ECFA0C(Game.GetHashKey(""RAIN""), Game.GetHashKey(""SMOG""), 0.50f); - Note that unlike most of the other weather natives, this native takes the hash of the weather name, not the plain string. These are the weather names and their hashes: - CLEAR 0x36A83D84 - EXTRASUNNY 0x97AA0A79 - CLOUDS 0x30FDAF5C - OVERCAST 0xBB898D2D - RAIN 0x54A69840 - CLEARING 0x6DB1A50D - THUNDER 0xB677829F - SMOG 0x10DCF4B5 - FOGGY 0xAE737644 - XMAS 0xAAC9C895 - SNOWLIGHT 0x23FB812B - BLIZZARD 0x27EA2814 - -- [[ OLD INVALID INFO BELOW ]] - Not tested. Based purely on disassembly. Instantly sets the weather to sourceWeather, then transitions to targetWeather over the specified transitionTime in seconds. - If an invalid hash is specified for sourceWeather, the current weather type will be used. - If an invalid hash is specified for targetWeather, the next weather type will be used. - If an invalid hash is specified for both sourceWeather and targetWeather, the function just changes the transition time of the current transition. - - - - - Sets the the raw wind speed value. - - - - - This is NOT a heading. It's a FLOAT value from 0.0-7.0. Look at this image: - i.imgur.com/FwVpGS6.png - ---------------------------- - This appears to be a heading, in radians (0-2*pi) -PNWParksFan - - - - - Using this native will clamp the wind speed value to a range of 0.0- 12.0. Using SET_WIND sets the same value but without the restriction. - - - - - Possible shake types (updated b617d): - DEATH_FAIL_IN_EFFECT_SHAKE - DRUNK_SHAKE - FAMILY5_DRUG_TRIP_SHAKE - HAND_SHAKE - JOLT_SHAKE - LARGE_EXPLOSION_SHAKE - MEDIUM_EXPLOSION_SHAKE - SMALL_EXPLOSION_SHAKE - ROAD_VIBRATION_SHAKE - SKY_DIVING_SHAKE - VIBRATE_SHAKE - - - - - p0 argument found in the b617d scripts: "DRUNK_SHAKE" - - - - - Possible shake types (updated b617d): - DEATH_FAIL_IN_EFFECT_SHAKE - DRUNK_SHAKE - FAMILY5_DRUG_TRIP_SHAKE - HAND_SHAKE - JOLT_SHAKE - LARGE_EXPLOSION_SHAKE - MEDIUM_EXPLOSION_SHAKE - SMALL_EXPLOSION_SHAKE - ROAD_VIBRATION_SHAKE - SKY_DIVING_SHAKE - VIBRATE_SHAKE - - - - - this is what p7 does in disassembly - __int8 var = 32; - if (isInvisible) - { - var = 16; - } - int v110 = var | 2 * p7; - - - - - entity - entity to ignore - - - - - entity - entity to ignore - - - - - Since latest patches has 18 parameters. - Console Hash: 0xCCDC33CC - entity - entity to ignore - - - - - Since latest patches has 18 parameters. - Console Hash: 0xCCDC33CC - entity - entity to ignore - - - - - Returns true if the game is using the metric measurement system, false if imperial is used. - This is what r\* uses for the different label types (either ones with miles in them or with km, as well as some other measurement related labels). - - Returns true if the game is using the metric measurement system, false if imperial is used. - - - - Returns true if the game is using the metric measurement system, false if imperial is used. - This is what r\* uses for the different label types (either ones with miles in them or with km, as well as some other measurement related labels). - - Returns true if the game is using the metric measurement system, false if imperial is used. - - - - Returns true if the game is using the metric measurement system, false if imperial is used. - This is what r\* uses for the different label types (either ones with miles in them or with km, as well as some other measurement related labels). - - Returns true if the game is using the metric measurement system, false if imperial is used. - - - - Enables or disables the blue half circle ![](https://i.imgur.com/iZes9Ec.png) around the specified blip on the left side of the blip. This is used to indicate that the player is in your crew in GTA:O. Color is changeable by using [`SET_BLIP_SECONDARY_COLOUR`](#_0x14892474891E09EB). - To toggle the right side of the circle use: [`SHOW_FRIEND_INDICATOR_ON_BLIP`](#_0x23C3EB807312F01A). - Example code result: - ![](https://i.imgur.com/iZ9tNWl.png) - - The blip to toggle the half blue circle around the blip on. - Enables or disables the half blue circle around the blip (on the left side). - - - - Enables or disables the blue half circle ![](https://i.imgur.com/iZes9Ec.png) around the specified blip on the left side of the blip. This is used to indicate that the player is in your crew in GTA:O. Color is changeable by using [`SET_BLIP_SECONDARY_COLOUR`](#_0x14892474891E09EB). - To toggle the right side of the circle use: [`SHOW_FRIEND_INDICATOR_ON_BLIP`](#_0x23C3EB807312F01A). - Example code result: - ![](https://i.imgur.com/iZ9tNWl.png) - - The blip to toggle the half blue circle around the blip on. - Enables or disables the half blue circle around the blip (on the left side). - - - - Enables or disables the blue half circle ![](https://i.imgur.com/iZes9Ec.png) around the specified blip on the left side of the blip. This is used to indicate that the player is in your crew in GTA:O. Color is changeable by using [`SET_BLIP_SECONDARY_COLOUR`](#_0x14892474891E09EB). - To toggle the right side of the circle use: [`SHOW_FRIEND_INDICATOR_ON_BLIP`](#_0x23C3EB807312F01A). - Example code result: - ![](https://i.imgur.com/iZ9tNWl.png) - - The blip to toggle the half blue circle around the blip on. - Enables or disables the half blue circle around the blip (on the left side). - - - - Shows the cursor on screen for the frame its called. - - - - - Highlights a blip by a half cyan circle on the right side of the blip. ![](https://i.imgur.com/FrV9M4e.png) Indicating that that player is a friend (in GTA:O). This color can not be changed. - To toggle the left side (crew member indicator) of the half circle around the blip, use: [`SHOW_CREW_INDICATOR_ON_BLIP`](#_0xDCFB5D4DB8BF367E). - - The blip to toggle the half circle on. - Enables or disables the half circle around the blip (on the right side of the blip). - - - - Highlights a blip by a half cyan circle on the right side of the blip. ![](https://i.imgur.com/FrV9M4e.png) Indicating that that player is a friend (in GTA:O). This color can not be changed. - To toggle the left side (crew member indicator) of the half circle around the blip, use: [`SHOW_CREW_INDICATOR_ON_BLIP`](#_0xDCFB5D4DB8BF367E). - - The blip to toggle the half circle on. - Enables or disables the half circle around the blip (on the right side of the blip). - - - - Highlights a blip by a half cyan circle on the right side of the blip. ![](https://i.imgur.com/FrV9M4e.png) Indicating that that player is a friend (in GTA:O). This color can not be changed. - To toggle the left side (crew member indicator) of the half circle around the blip, use: [`SHOW_CREW_INDICATOR_ON_BLIP`](#_0xDCFB5D4DB8BF367E). - - The blip to toggle the half circle on. - Enables or disables the half circle around the blip (on the right side of the blip). - - - - Adds the GTA: Online player heading indicator to a blip. - - - - - Adds the GTA: Online player heading indicator to a blip. - - - - - Toggles a cyan outline around the blip. - Color can be changed with `SET_BLIP_SECONDARY_COLOUR`. Enabling this circle will override the "crew" and "friend" half-circles (see [`SHOW_CREW_INDICATOR_ON_BLIP`](#_0xDCFB5D4DB8BF367E) and [`SHOW_FRIEND_INDICATOR_ON_BLIP`](#_0x23C3EB807312F01A)). - ~~Oddly enough, this native is called `_SET_BLIP_FRIENDLY`, but the color of the circle is only changable for the 'crew' half-circle (using `SET_BLIP_SECONDARY_COLOUR`), the 'friendly' side can NOT be changed and will always stay cyan/blue. This makes it seem more likely that this should be called `_SET_BLIP_CREW_CIRCLE` or something similar?~~ - Real name is `SHOW_OUTLINE_INDICATOR_ON_BLIP`, discovered by Blattersturm. - - The blip to toggle the outline on. - Enables or disables the outline. - - - - Toggles a cyan outline around the blip. - Color can be changed with `SET_BLIP_SECONDARY_COLOUR`. Enabling this circle will override the "crew" and "friend" half-circles (see [`SHOW_CREW_INDICATOR_ON_BLIP`](#_0xDCFB5D4DB8BF367E) and [`SHOW_FRIEND_INDICATOR_ON_BLIP`](#_0x23C3EB807312F01A)). - ~~Oddly enough, this native is called `_SET_BLIP_FRIENDLY`, but the color of the circle is only changable for the 'crew' half-circle (using `SET_BLIP_SECONDARY_COLOUR`), the 'friendly' side can NOT be changed and will always stay cyan/blue. This makes it seem more likely that this should be called `_SET_BLIP_CREW_CIRCLE` or something similar?~~ - Real name is `SHOW_OUTLINE_INDICATOR_ON_BLIP`, discovered by Blattersturm. - - The blip to toggle the outline on. - Enables or disables the outline. - - - - Toggles a cyan outline around the blip. - Color can be changed with `SET_BLIP_SECONDARY_COLOUR`. Enabling this circle will override the "crew" and "friend" half-circles (see [`SHOW_CREW_INDICATOR_ON_BLIP`](#_0xDCFB5D4DB8BF367E) and [`SHOW_FRIEND_INDICATOR_ON_BLIP`](#_0x23C3EB807312F01A)). - ~~Oddly enough, this native is called `_SET_BLIP_FRIENDLY`, but the color of the circle is only changable for the 'crew' half-circle (using `SET_BLIP_SECONDARY_COLOUR`), the 'friendly' side can NOT be changed and will always stay cyan/blue. This makes it seem more likely that this should be called `_SET_BLIP_CREW_CIRCLE` or something similar?~~ - Real name is `SHOW_OUTLINE_INDICATOR_ON_BLIP`, discovered by Blattersturm. - - The blip to toggle the outline on. - Enables or disables the outline. - - - - If toggle is true, the ped's head is shown in the pause menu - If toggle is false, the ped's head is not shown in the pause menu - - - - - If toggle is true, the ped's head is shown in the pause menu - If toggle is false, the ped's head is not shown in the pause menu - - - - - probs one frame - - - - - Adds a green checkmark on top of a blip. - - - - - Adds a green checkmark on top of a blip. - - - - - Adds a green checkmark on top of a blip. - - - - - Forces the weapon wheel to appear on screen. - - - - - Forces the weapon wheel to appear on screen. - - - - - Starts a new singleplayer game (at the prologue). - - - - - Shuts down the `loadingScreen` NUI frame, similarly to `SHUTDOWN_LOADING_SCREEN`. - - - - - This is to make the player walk without accepting input from INPUT. - gaitType is in increments of 100s. 2000, 500, 300, 200, etc. - p4 is always 1 and p5 is always 0. - C# Example : - Function.Call(Hash.SIMULATE_PLAYER_INPUT_GAIT, Game.Player, 1.0f, 100, 1.0f, 1, 0); //Player will go forward for 100ms - - - - - Returns true if the object has finished moving. - If false, moves the object towards the specified X, Y and Z coordinates with the specified X, Y and Z speed. - See also: gtag.gtagaming.com/opcode-database/opcode/034E/ - - - - - p1 appears as 5, 10, 15, 25, or 30. p2 is always true. - - - - - p1 appears to always be 1 (only comes up twice) - - - - - 2 matches. p1 was always true. - - - - - Only 1 match. Both p1 & p2 were true. - - - - - normalizedValue is from 0.0 - 1.0 - p2 is always 1 - - - - - normalizedValue is from 0.0 - 1.0 - p2 is always 1 - - - - - Every occurrence of p1 & p2 were both true. - - - - - p1 was always true. - - - - - Also known as _RECHARGE_SPECIAL_ABILITY - - - - - Hash collision!!! PLAY_STREAM_FROM_POSITION is the correct name! - - - - - Example: - This will start the alarm at Fort Zancudo. - AUDIO::START_ALARM("PORT_OF_LS_HEIST_FORT_ZANCUDO_ALARMS", 1); - First parameter (char) is the name of the alarm. - Second parameter (bool) is unknown, it does not seem to make a difference if this one is 0 or 1. - ---------- - It DOES make a difference but it has to do with the duration or something I dunno yet - ---------- - Found in the b617d scripts: - AUDIO::START_ALARM("AGENCY_HEIST_FIB_TOWER_ALARMS", 0); - AUDIO::START_ALARM("AGENCY_HEIST_FIB_TOWER_ALARMS_UPPER", 1); - AUDIO::START_ALARM("AGENCY_HEIST_FIB_TOWER_ALARMS_UPPER_B", 0); - AUDIO::START_ALARM("BIG_SCORE_HEIST_VAULT_ALARMS", a_0); - AUDIO::START_ALARM("FBI_01_MORGUE_ALARMS", 1); - AUDIO::START_ALARM("FIB_05_BIOTECH_LAB_ALARMS", 0); - AUDIO::START_ALARM("JEWEL_STORE_HEIST_ALARMS", 0); - AUDIO::START_ALARM("PALETO_BAY_SCORE_ALARM", 1); - AUDIO::START_ALARM("PALETO_BAY_SCORE_CHICKEN_FACTORY_ALARM", 0); - AUDIO::START_ALARM("PORT_OF_LS_HEIST_FORT_ZANCUDO_ALARMS", 1); - AUDIO::START_ALARM("PORT_OF_LS_HEIST_SHIP_ALARMS", 0); - AUDIO::START_ALARM("PRISON_ALARMS", 0); - AUDIO::START_ALARM("PROLOGUE_VAULT_ALARMS", 0); - - - - - Used to prepare a scene where the surrounding sound is muted or a bit changed. This does not play any sound. - List of all usable scene names found in b617d. Sorted alphabetically and identical names removed: pastebin.com/MtM9N9CC - - - - - some kind of flag. Usually 0. - - - - - p3: some kind of flag. Usually 0. - - - - - Examples: - g_384A = SYSTEM::START_NEW_SCRIPT("cellphone_flashhand", 1424); - l_10D = SYSTEM::START_NEW_SCRIPT("taxiService", 1828); - SYSTEM::START_NEW_SCRIPT("AM_MP_YACHT", 5000); - SYSTEM::START_NEW_SCRIPT("emergencycall", 512); - SYSTEM::START_NEW_SCRIPT("emergencycall", 512); - SYSTEM::START_NEW_SCRIPT("FM_maintain_cloud_header_data", 1424); - SYSTEM::START_NEW_SCRIPT("FM_Mission_Controller", 31000); - SYSTEM::START_NEW_SCRIPT("tennis_family", 3650); - SYSTEM::START_NEW_SCRIPT("Celebrations", 3650); - Decompiled examples of usage when starting a script: - SCRIPT::REQUEST_SCRIPT(a_0); - if (SCRIPT::HAS_SCRIPT_LOADED(a_0)) { - SYSTEM::START_NEW_SCRIPT(a_0, v_3); - SCRIPT::SET_SCRIPT_AS_NO_LONGER_NEEDED(a_0); - return 1; - } - or: - v_2 = "MrsPhilips2"; - SCRIPT::REQUEST_SCRIPT(v_2); - while (!SCRIPT::HAS_SCRIPT_LOADED(v_2)) { - SCRIPT::REQUEST_SCRIPT(v_2); - SYSTEM::WAIT(0); - } - sub_8792(36); - SYSTEM::START_NEW_SCRIPT(v_2, 17000); - SCRIPT::SET_SCRIPT_AS_NO_LONGER_NEEDED(v_2); - All native script names: pastebin.com/K9adDsu4 and pastebin.com/yLNWicUi - - - - - return : script thread id, 0 if failed - Pass pointer to struct of args in p1, size of struct goes into p2 - - - - - GRAPHICS::START_PARTICLE_FX_LOOPED_AT_COORD("scr_fbi_falling_debris", 93.7743f, -749.4572f, 70.86904f, 0f, 0f, 0f, 0x3F800000, 0, 0, 0, 0) - p11 seems to be always 0 - - - - - list: pastebin.com/N9unUFWY - - - - - Console Hash: 0x23BF0F9B - - - - - Console Hash: 0xF478EFCF - network fx - - - - - Console Hash: 0xF478EFCF - network fx - - - - - network fx - - - - - network fx - - - - - GRAPHICS::START_PARTICLE_FX_NON_LOOPED_AT_COORD("scr_paleto_roof_impact", -140.8576f, 6420.789f, 41.1391f, 0f, 0f, 267.3957f, 0x3F800000, 0, 0, 0); - Axis - Invert Axis Flags - list: pastebin.com/N9unUFWY - ------------------------------------------------------------------- - C# - Function.Call<int>(Hash.START_PARTICLE_FX_NON_LOOPED_AT_COORD, = you are calling this function. - char *effectname = This is an in-game effect name, for e.g. "scr_fbi4_trucks_crash" is used to give the effects when truck crashes etc - float x, y, z pos = this one is Simple, you just have to declare, where do you want this effect to take place at, so declare the ordinates - float xrot, yrot, zrot = Again simple? just mention the value in case if you want the effect to rotate. - float scale = is declare the scale of the effect, this may vary as per the effects for e.g 1.0f - bool xaxis, yaxis, zaxis = To bool the axis values. - example: - Function.Call<int>(Hash.START_PARTICLE_FX_NON_LOOPED_AT_COORD, "scr_fbi4_trucks_crash", GTA.Game.Player.Character.Position.X, GTA.Game.Player.Character.Position.Y, GTA.Game.Player.Character.Position.Z + 4f, 0, 0, 0, 5.5f, 0, 0, 0); - - - - - network fx - - - - - Starts a particle effect on an entity for example your player. - List: pastebin.com/N9unUFWY - Example: - C#: - Function.Call(Hash.REQUEST_NAMED_PTFX_ASSET, "scr_rcbarry2"); Function.Call(Hash._SET_PTFX_ASSET_NEXT_CALL, "scr_rcbarry2"); Function.Call(Hash.START_PARTICLE_FX_NON_LOOPED_ON_ENTITY, "scr_clown_appears", Game.Player.Character, 0.0, 0.0, -0.5, 0.0, 0.0, 0.0, 1.0, false, false, false); - Internally this calls the same function as GRAPHICS::START_PARTICLE_FX_NON_LOOPED_ON_PED_BONE - however it uses -1 for the specified bone index, so it should be possible to start a non looped fx on an entity bone using that native - - - - - Console hash: 0x469A2B4A - network fx - - - - - GRAPHICS::START_PARTICLE_FX_NON_LOOPED_ON_PED_BONE("scr_sh_bong_smoke", PLAYER::PLAYER_PED_ID(), -0.025f, 0.13f, 0f, 0f, 0f, 0f, 31086, 0x3F800000, 0, 0, 0); - Axis - Invert Axis Flags - list: pastebin.com/N9unUFWY - - - - - network fx - - - - - // this enum comes directly from R* so don't edit this - enum ePlayerSwitchType - { - SWITCH_TYPE_AUTO, - SWITCH_TYPE_LONG, - SWITCH_TYPE_MEDIUM, - SWITCH_TYPE_SHORT - }; - Use GET_IDEAL_PLAYER_SWITCH_TYPE for the best switch type. Or just auto, because it calls the same function in executable. - ---------------------------------------------------- - Examples from the decompiled scripts: - STREAMING::START_PLAYER_SWITCH(l_832._f3, PLAYER::PLAYER_PED_ID(), 0, 3); - STREAMING::START_PLAYER_SWITCH(l_832._f3, PLAYER::PLAYER_PED_ID(), 2050, 3); - STREAMING::START_PLAYER_SWITCH(PLAYER::PLAYER_PED_ID(), l_832._f3, 1024, 3); - STREAMING::START_PLAYER_SWITCH(g_141F27, PLAYER::PLAYER_PED_ID(), 513, v_14); - Note: DO NOT, use SWITCH_TYPE_LONG with flag 513. It leaves you stuck in the clouds. You'll have to call STOP_PLAYER_SWITCH() to return to your ped. - Flag 8 w/ SWITCH_TYPE_LONG will zoom out 3 steps, then zoom in 2/3 steps and stop on the 3rd and just hang there. - Flag 8 w/ SWITCH_TYPE_MEDIUM will zoom out 1 step, and just hang there. - - - - - Starts recording a replay. - If mode is 0, turns on action replay. - If mode is 1, starts recording. - If already recording a replay, does nothing. - - - - - Starts recording a replay. - If mode is 0, turns on action replay. - If mode is 1, starts recording. - If already recording a replay, does nothing. - - - - - Second parameter might be length. - - - - - Second parameter might be length. - - - - - playLength - is how long to play the effect for in milliseconds. If 0, it plays the default length - if loop is true, the effect wont stop until you call _STOP_SCREEN_EFFECT on it. (only loopable effects) - Example and list of screen FX: www.pastebin.com/dafBAjs0 - - - - - Starts a fire: - xyz: Location of fire - maxChildren: The max amount of times a fire can spread to other objects. Must be 25 or less, or the function will do nothing. - isGasFire: Whether or not the fire is powered by gasoline. - - - - - Raycast from point to point, where the ray has a radius. - flags: - vehicles=10 - peds =12 - Iterating through flags yields many ped / vehicle/ object combinations - p9 = 7, but no idea what it does - Entity is an entity to ignore - - - - - Raycast from point to point, where the ray has a radius. - flags: - vehicles=10 - peds =12 - Iterating through flags yields many ped / vehicle/ object combinations - p9 = 7, but no idea what it does - Entity is an entity to ignore - - - - - Performs the same type of trace as START_SHAPE_TEST_CAPSULE, but with some different hardcoded parameters. - - - - - Performs the same type of trace as START_SHAPE_TEST_CAPSULE, but with some different hardcoded parameters. - - - - - Returns a ray (?) going from x1, y1, z1 to x2, y2, z2. - entity = 0 most of the time. - p8 = 7 most of the time. - Result of this function is passed to WORLDPROBE::_GET_RAYCAST_RESULT as a first argument. - - - - - Returns a ray (?) going from x1, y1, z1 to x2, y2, z2. - entity = 0 most of the time. - p8 = 7 most of the time. - Result of this function is passed to WORLDPROBE::_GET_RAYCAST_RESULT as a first argument. - - - - - Not sure how or why this differs from 0x7EE9F5D83DD4F90E, but it does. - This function casts a ray from Point1 to Point2 and returns it's ray handle. A simple ray cast will 'shoot' a line from point A to point B, and return whether or not the ray reached it's destination or if it hit anything and if it did hit anything, will return the handle of what it hit (entity handle) and coordinates of where the ray reached. - You can use _GET_RAYCAST_RESULT to get the result of the raycast - Entity is an entity to ignore, such as the player. - Flags are intersection bit flags. They tell the ray what to care about and what not to care about when casting. Passing -1 will intersect with everything, presumably. - Flags: - 1: Intersect with map - 2: Intersect with vehicles (used to be mission entities?) (includes train) - 4: Intersect with peds? (same as 8) - 8: Intersect with peds? (same as 4) - 16: Intersect with objects - 32: Water? - 64: Unknown - 128: Unknown - 256: Intersect with vegetation (plants, coral. trees not included) - NOTE: Raycasts that intersect with mission_entites (flag = 2) has limited range and will not register for far away entites. The range seems to be about 30 metres. - - - - - Not sure how or why this differs from 0x7EE9F5D83DD4F90E, but it does. - This function casts a ray from Point1 to Point2 and returns it's ray handle. A simple ray cast will 'shoot' a line from point A to point B, and return whether or not the ray reached it's destination or if it hit anything and if it did hit anything, will return the handle of what it hit (entity handle) and coordinates of where the ray reached. - You can use _GET_RAYCAST_RESULT to get the result of the raycast - Entity is an entity to ignore, such as the player. - Flags are intersection bit flags. They tell the ray what to care about and what not to care about when casting. Passing -1 will intersect with everything, presumably. - Flags: - 1: Intersect with map - 2: Intersect with vehicles (used to be mission entities?) (includes train) - 4: Intersect with peds? (same as 8) - 8: Intersect with peds? (same as 4) - 16: Intersect with objects - 32: Water? - 64: Unknown - 128: Unknown - 256: Intersect with vegetation (plants, coral. trees not included) - NOTE: Raycasts that intersect with mission_entites (flag = 2) has limited range and will not register for far away entites. The range seems to be about 30 metres. - - - - - it returns a ShapeTest handle that can be used with GET_SHAPE_TEST_RESULT. - In its only usage in game scripts its called with flag set to 511, entity to player_ped_id and flag2 set to 7 - - - - - it returns a ShapeTest handle that can be used with GET_SHAPE_TEST_RESULT. - In its only usage in game scripts its called with flag set to 511, entity to player_ped_id and flag2 set to 7 - - - - - Sounds the horn for the specified vehicle. - vehicle: The vehicle to activate the horn for. - mode: The hash of "NORMAL" or "HELDDOWN". Can be 0. - duration: The duration to sound the horn, in milliseconds. - Note: If a player is in the vehicle, it will only sound briefly. - - - - - Please change to "void"! - --------------------------------- - Example: - for (v_2 = 0; v_2 <= 4; v_2 += 1) { - STATS::STAT_CLEAR_SLOT_FOR_RELOAD(v_2); - } - - - - - p2 - Default value? Seems to be -1 most of the time. - - - - - p2 appears to always be -1 - - - - - p1 is always -1 in the script files - - - - - Needs more research. Seems to return "STAT_UNKNOWN" if no such user id exists. - - - - - p1 always true. - - - - - 'value' is a structure to a structure, 'numFields' is how many fields there are in said structure (usually 7). - The structure looks like this: - int year - int month - int day - int hour - int minute - int second - int millisecond - The decompiled scripts use TIME::GET_POSIX_TIME to fill this structure. - - - - - The following values have been found in the decompiled scripts: - "RC_ABI1" - "RC_ABI2" - "RC_BA1" - "RC_BA2" - "RC_BA3" - "RC_BA3A" - "RC_BA3C" - "RC_BA4" - "RC_DRE1" - "RC_EPS1" - "RC_EPS2" - "RC_EPS3" - "RC_EPS4" - "RC_EPS5" - "RC_EPS6" - "RC_EPS7" - "RC_EPS8" - "RC_EXT1" - "RC_EXT2" - "RC_EXT3" - "RC_EXT4" - "RC_FAN1" - "RC_FAN2" - "RC_FAN3" - "RC_HAO1" - "RC_HUN1" - "RC_HUN2" - "RC_JOS1" - "RC_JOS2" - "RC_JOS3" - "RC_JOS4" - "RC_MAU1" - "RC_MIN1" - "RC_MIN2" - "RC_MIN3" - "RC_MRS1" - "RC_MRS2" - "RC_NI1" - "RC_NI1A" - "RC_NI1B" - "RC_NI1C" - "RC_NI1D" - "RC_NI2" - "RC_NI3" - "RC_OME1" - "RC_OME2" - "RC_PA1" - "RC_PA2" - "RC_PA3" - "RC_PA3A" - "RC_PA3B" - "RC_PA4" - "RC_RAM1" - "RC_RAM2" - "RC_RAM3" - "RC_RAM4" - "RC_RAM5" - "RC_SAS1" - "RC_TON1" - "RC_TON2" - "RC_TON3" - "RC_TON4" - "RC_TON5" - - - - - Add Cash example: - for (int i = 0; i < 3; i++) - { - char statNameFull[32]; - sprintf_s(statNameFull, "SP%d_TOTAL_CASH", i); - Hash hash = GAMEPLAY::GET_HASH_KEY(statNameFull); - int val; - STATS::STAT_GET_INT(hash, &val, -1); - val += 1000000; - STATS::STAT_SET_INT(hash, val, 1); - } - - - - - Does not take effect immediately, unfortunately. - profileSetting seems to only be 936, 937 and 938 in scripts - gtaforums.com/topic/799843-stats-profile-settings/ - - - - - Does not take effect immediately, unfortunately. - profileSetting seems to only be 936, 937 and 938 in scripts - gtaforums.com/topic/799843-stats-profile-settings/ - - - - - Hash collision!!! - SET_VEHICLE_IS_* - p1 (toggle) was always 1 (true) except in one case in the b678 scripts. - - - - - Example: - This will stop the alarm at Fort Zancudo. - AUDIO::STOP_ALARM("PORT_OF_LS_HEIST_FORT_ZANCUDO_ALARMS", 1); - First parameter (char) is the name of the alarm. - Second parameter (bool) has to be true (1) to have any effect. - - - - - From re_drunkdriver: - • AI::STOP_ANIM_PLAYBACK(l_5B[0 -- [[1]] ], 0, 0); - Looks like p1 may be a flag, still need to do some research, though. - - - - - Animations list : www.los-santos-multiplayer.com/dev.airdancer?cxt=anim - - - - - ?? - - - - - Needs to be called every frame. - - - - - Animations list : www.los-santos-multiplayer.com/dev.airdancer?cxt=anim - RAGEPluginHook list: docs.ragepluginhook.net/html/62951c37-a440-478c-b389-c471230ddfc5.htm - - - - - This doesn't stop fire nor the fire propagation in a loop... for some reasons. - - - - - p1 is always 0 in the native scripts - - - - - Disables the player's teleportation - - - - - Stops recording and discards the recorded clip. - - - - - Stops recording and discards the recorded clip. - - - - - Stops recording and saves the recorded clip. - - - - - Stops recording and saves the recorded clip. - - - - - This disable the recording feature and has to be called every frame. - - - - - This disable the recording feature and has to be called every frame. - - - - - Example and list of screen FX: www.pastebin.com/dafBAjs0 - - - - - In drunk_controller.c4, sub_309 - if (CAM::_C912AF078AF19212()) { - CAM::_1C9D7949FA533490(0); - } - - - - - In drunk_controller.c4, sub_309 - if (CAM::_C912AF078AF19212()) { - CAM::_1C9D7949FA533490(0); - } - - - - - p1 sync task id? - - - - - Returns false if it's a null or empty string or if the string is too long. outInteger will be set to -999 in that case. - If all checks have passed successfully, the return value will be set to whatever strtol(string, 0i64, 10); returns. - - - - - This was previously named as "RESERVE_ENTITY_EXPLODES_ON_HIGH_EXPLOSION_COMBO" - which is obviously incorrect. - Seems to only appear in scripts used in Singleplayer. p1 ranges from 2 - 46. - I assume this switches the crime type - - - - - This was previously named as "RESERVE_ENTITY_EXPLODES_ON_HIGH_EXPLOSION_COMBO" - which is obviously incorrect. - Seems to only appear in scripts used in Singleplayer. p1 ranges from 2 - 46. - I assume this switches the crime type - - - - - Use after using \_SWITCH_OUT_PLAYER to swoop the camera back down to the player's ped. - - - - - Use after using \_SWITCH_OUT_PLAYER to swoop the camera back down to the player's ped. - - - - - doesn't act normally when used on mount chilliad - flags: - 0: normal - 1: no transition - 255: switch IN - switchType: 0 - 3 - 0: 1 step towards ped - 1: 3 steps out from ped - 2: 1 step out from ped - 3: 1 step towards ped - - - - - doesn't act normally when used on mount chilliad - flags: - 0: normal - 1: no transition - 255: switch IN - switchType: 0 - 3 - 0: 1 step towards ped - 1: 3 steps out from ped - 2: 1 step out from ped - 3: 1 step towards ped - - - - - Returns tangent value of p0. - - - - - Makes the specified ped achieve the specified heading. - pedHandle: The handle of the ped to assign the task to. - heading: The desired heading. - timeout: The time, in milliseconds, to allow the task to complete. If the task times out, it is cancelled, and the ped will stay at the heading it managed to reach in the time. - - - - - duration: the amount of time in milliseconds to do the task. -1 will keep the task going until either another task is applied, or CLEAR_ALL_TASKS() is called with the ped - - - - - Example from "me_amanda1.ysc.c4": - AI::TASK_ARREST_PED(l_19F -- [[ This is a Ped ]] , PLAYER::PLAYER_PED_ID()); - Example from "armenian1.ysc.c4": - if (!PED::IS_PED_INJURED(l_B18[0 -- [[1]] ])) { - AI::TASK_ARREST_PED(l_B18[0 -- [[1]] ], PLAYER::PLAYER_PED_ID()); - } - I would love to have time to experiment to see if a player Ped can arrest another Ped. Might make for a good cop mod. - Looks like only the player can be arrested this way. Peds react and try to arrest you if you task them, but the player charater doesn't do anything if tasked to arrest another ped. - - - - - You need to call PED::SET_BLOCKING_OF_NON_TEMPORARY_EVENTS after TASK_BOAT_MISSION in order for the task to execute. - Working example - float vehicleMaxSpeed = VEHICLE::_GET_VEHICLE_MAX_SPEED(ENTITY::GET_ENTITY_MODEL(pedVehicle)); - AI::TASK_BOAT_MISSION(pedDriver, pedVehicle, 0, 0, waypointCoord.x, waypointCoord.y, waypointCoord.z, 4, vehicleMaxSpeed, 786469, -1.0, 7); - PED::SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedDriver, 1); - P8 appears to be driving style flag - see gtaforums.com/topic/822314-guide-driving-styles/ for documentation - - - - - p2 tend to be 16, 17 or 1 - p3 to p7 tend to be 0.0 - - - - - Not clear what it actually does, but here's how script uses it - - if (OBJECT::HAS_PICKUP_BEEN_COLLECTED(...) - { - if(ENTITY::DOES_ENTITY_EXIST(PLAYER::PLAYER_PED_ID())) - { - AI::TASK_CLEAR_LOOK_AT(PLAYER::PLAYER_PED_ID()); - } - ... - } - Another one where it doesn't "look" at current player - - AI::TASK_PLAY_ANIM(l_3ED, "missheist_agency2aig_2", "look_at_phone_a", 1000.0, -2.0, -1, 48, v_2, 0, 0, 0); - PED::_2208438012482A1A(l_3ED, 0, 0); - AI::TASK_CLEAR_LOOK_AT(l_3ED); - - - - - Climbs or vaults the nearest thing. - - - - - Despite its name, it only attacks ONE hated target. The one closest hated target. - p2 seems to be always 0 - - - - - Despite its name, it only attacks ONE hated target. The one closest to the specified position. - - - - - Makes the specified ped attack the target ped. - p2 should be 0 - p3 should be 16 - - - - - Example: - AI::TASK_DRIVE_BY(l_467[1 -- [[22]] ], PLAYER::PLAYER_PED_ID(), 0, 0.0, 0.0, 2.0, 300.0, 100, 0, ${firing_pattern_burst_fire_driveby}); - Needs working example. Doesn't seem to do anything. - I marked p2 as targetVehicle as all these shooting related tasks seem to have that in common. - I marked p6 as distanceToShoot as if you think of GTA's Logic with the native SET_VEHICLE_SHOOT natives, it won't shoot till it gets within a certain distance of the target. - I marked p7 as pedAccuracy as it seems it's mostly 100 (Completely Accurate), 75, 90, etc. Although this could be the ammo count within the gun, but I highly doubt it. I will change this comment once I find out if it's ammo count or not. - - - - - speed 1.0 = walk, 2.0 = run - p5 1 = normal, 3 = teleport to vehicle, 16 = teleport directly into vehicle - p6 is always 0 - Usage of seat - -1 = driver - 0 = passenger - 1 = left back seat - 2 = right back seat - 3 = outside left - 4 = outside right - - - - - MulleKD19: Adds a new point to the current point route. Call TASK_FLUSH_ROUTE before the first call to this. Call TASK_FOLLOW_POINT_ROUTE to make the Ped go the route. - A maximum of 8 points can be added. - - - - - MulleKD19: Clears the current point route. Call this before TASK_EXTEND_ROUTE and TASK_FOLLOW_POINT_ROUTE. - - - - - If no timeout, set timeout to -1. - - - - - MulleKD19: Makes the ped go on the created point route. - ped: The ped to give the task to. - speed: The speed to move at in m/s. - int: Unknown. Can be 0, 1, 2 or 3. - Example: - TASK_FLUSH_ROUTE(); - TASK_EXTEND_ROUTE(0f, 0f, 70f); - TASK_EXTEND_ROUTE(10f, 0f, 70f); - TASK_EXTEND_ROUTE(10f, 10f, 70f); - TASK_FOLLOW_POINT_ROUTE(GET_PLAYER_PED(), 1f, 0); - - - - - p6 always -1 - p7 always 10.0 - p8 always 1 - - - - - p2 always false - [30/03/2017] ins1de : - See dev-c.com/nativedb/func/info/f28965d04f570dca - - - - - Jenkins of this native is 0x4293601F. This is the actual name. - - - - - The ped will walk or run towards goToLocation, aiming towards goToLocation or focusLocation (depending on the aimingFlag) and shooting if shootAtEnemies = true to any enemy in his path. - If the ped is closer than noRoadsDistance, the ped will ignore pathing/navmesh and go towards goToLocation directly. This could cause the ped to get stuck behind tall walls if the goToLocation is on the other side. To avoid this, use 0.0f and the ped will always use pathing/navmesh to reach his destination. - If the speed is set to 0.0f, the ped will just stand there while aiming, if set to 1.0f he will walk while aiming, 2.0f will run while aiming. - The ped will stop aiming when he is closer than distanceToStopAt to goToLocation. - I still can't figure out what unkTrue is used for. I don't notice any difference if I set it to false but in the decompiled scripts is always true. - I think that unkFlag, like the driving styles, could be a flag that "work as a list of 32 bits converted to a decimal integer. Each bit acts as a flag, and enables or disables a function". What leads me to this conclusion is the fact that in the decompiled scripts, unkFlag takes values like: 0, 1, 5 (101 in binary) and 4097 (4096 + 1 or 1000000000001 in binary). For now, I don't know what behavior enable or disable this possible flag so I leave it at 0. - Note: After some testing, using unkFlag = 16 (0x10) enables the use of sidewalks while moving towards goToLocation. - The aimingFlag takes 2 values: 0 to aim at the focusLocation, 1 to aim at where the ped is heading (goToLocation). - Example: - enum AimFlag - { - AimAtFocusLocation, - AimAtGoToLocation - }; - Vector3 goToLocation1 = { 996.2867f, 0, -2143.044f, 0, 28.4763f, 0 }; // remember the padding. - Vector3 goToLocation2 = { 990.2867f, 0, -2140.044f, 0, 28.4763f, 0 }; // remember the padding. - Vector3 focusLocation = { 994.3478f, 0, -2136.118f, 0, 29.2463f, 0 }; // the coord z should be a little higher, around +1.0f to avoid aiming at the ground - // 1st example - AI::TASK_GO_TO_COORD_AND_AIM_AT_HATED_ENTITIES_NEAR_COORD(pedHandle, goToLocation1.x, goToLocation1.y, goToLocation1.z, focusLocation.x, focusLocation.y, focusLocation.z, 2.0f -- [[run]] , true -- [[shoot]] , 3.0f -- [[stop at]] , 0.0f -- [[noRoadsDistance]] , true -- [[always true]] , 0 -- [[possible flag]] , AimFlag::AimAtGoToLocation, -957453492 -- [[FullAuto pattern]] ); - // 2nd example - AI::TASK_GO_TO_COORD_AND_AIM_AT_HATED_ENTITIES_NEAR_COORD(pedHandle, goToLocation2.x, goToLocation2.y, goToLocation2.z, focusLocation.x, focusLocation.y, focusLocation.z, 1.0f -- [[walk]] , false -- [[don't shoot]] , 3.0f -- [[stop at]] , 0.0f -- [[noRoadsDistance]] , true -- [[always true]] , 0 -- [[possible flag]] , AimFlag::AimAtFocusLocation, -957453492 -- [[FullAuto pattern]] ); - 1st example: The ped (pedhandle) will run towards goToLocation1. While running and aiming towards goToLocation1, the ped will shoot on sight to any enemy in his path, using "FullAuto" firing pattern. The ped will stop once he is closer than distanceToStopAt to goToLocation1. - 2nd example: The ped will walk towards goToLocation2. This time, while walking towards goToLocation2 and aiming at focusLocation, the ped will point his weapon on sight to any enemy in his path without shooting. The ped will stop once he is closer than distanceToStopAt to goToLocation2. - - - - - example from fm_mission_controller - AI::TASK_GO_TO_COORD_ANY_MEANS(l_649, sub_f7e86(-1, 0), 1.0, 0, 0, 786603, 0xbf800000); - - - - - movement_speed: mostly 2f, but also 1/1.2f, etc. - p8: always false - p9: 2f - p10: 0.5f - p11: true - p12: 0 / 512 / 513, etc. - p13: 0 - firing_pattern: ${firing_pattern_full_auto}, 0xC6EE6B4C - - - - - The entity will move towards the target until time is over (duration) or get in target's range (distance). p5 and p6 are unknown, but you could leave p5 = 1073741824 or 100 or even 0 (didn't see any difference but on the decompiled scripts, they use 1073741824 mostly) and p6 = 0 - Note: I've only tested it on entity -> ped and target -> vehicle. It could work differently on other entities, didn't try it yet. - Example: AI::TASK_GO_TO_ENTITY(pedHandle, vehicleHandle, 5000, 4.0, 100, 1073741824, 0) - Ped will run towards the vehicle for 5 seconds and stop when time is over or when he gets 4 meters(?) around the vehicle (with duration = -1, the task duration will be ignored). - - - - - shootatEntity: - If true, peds will shoot at Entity till it is dead. - If false, peds will just walk till they reach the entity and will cease shooting. - - - - - eg - AI::TASK_GOTO_ENTITY_AIMING(v_2, PLAYER::PLAYER_PED_ID(), 5.0, 25.0); - ped = Ped you want to perform this task. - target = the Entity they should aim at. - distanceToStopAt = distance from the target, where the ped should stop to aim. - StartAimingDist = distance where the ped should start to aim. - - - - - From re_prisonvanbreak: - AI::TASK_GUARD_CURRENT_POSITION(l_DD, 35.0, 35.0, 1); - - - - - p0 - Guessing PedID - p1, p2, p3 - XYZ? - p4 - ??? - p5 - Maybe the size of sphere from XYZ? - p6 - ??? - p7, p8, p9 - XYZ again? - p10 - Maybe the size of sphere from second XYZ? - - - - - In the scripts, p3 was always -1. - p3 seems to be duration or timeout of turn animation. - Also facingPed can be 0 or -1 so ped will just raise hands up. - - - - - Ped pilot should be in a heli. - EntityToFollow can be a vehicle or Ped. - x,y,z appear to be how close to the EntityToFollow the heli should be. Scripts use 0.0, 0.0, 80.0. Then the heli tries to position itself 80 units above the EntityToFollow. If you reduce it to -5.0, it tries to go below (if the EntityToFollow is a heli or plane) - NOTE: If the pilot finds enemies, it will engage them, then remain there idle, not continuing to chase the Entity given. - - - - - EDITED (8/16/2017) - DESCRIPTION: - Allow a ped to fly to a specific destination. - USAGE: - -- REQUIRED -- - • pilot = The ped flying the aircraft. - • aircraft = The aircraft the pilot is flying. - -- OPTIONAL -- [atleast 1 must be assigned] - • targetVehicle = The vehicle the pilot will target. - • targetPed = The ped the pilot will target. - • destinationX, destinationY, destinationZ = The location the pilot will target. - -- LOGIC -- - • missionFlag = The type of mission. - • maxSpeed = The speed in mph that the pilot will limit his/her self to while flying. - • landingRadius = The distance from the destination that the pilot must be to land. - • targetHeading = The heading that the pilot will try to achieve while flying. - • unk1, unk2 = Set to -1 and it will be okay. - • unk3 = I'm almost sure this is a vehicle record/waypoint recording hash. A value of -1 is for none. Maybe it's a float? Idk. - • landingFlags = Bit flags used for landing. All I know is: - 0 = Hover over the destination. - 32 = Land on destination. - 1024 = Erratic, crash into nearby obstacles. - 4096 = Rushed movement + Hover over destination - Known Mission Types: - 4 = FlyToCoord - 8 = FleeFromPed - 9 = CircleAroundTarget - 10 = CopyTargetHeading - 20 = LandNearPed - 21 = Crash - Example C#: - Function.Call(Hash.TASK_HELI_MISSION, driver, heli, 0, 0, position.X, position.Y, position.Z, 4, 50.0, 10.0, (position - heli.Position).ToHeading(), -1, -1, -1, 32); - OLD USAGE: pastebin.com/ndkSjaaW - - - - - Definition is wrong. This has 4 parameters (Not sure when they were added. v350 has 2, v678 has 4). - v350: Ped ped, bool unused - v678: Ped ped, bool unused, bool flag1, bool flag2 - flag1 = super jump, flag2 = do nothing if flag1 is false and doubles super jump height if flag1 is true. - - - - - Flags from decompiled scripts: - 0 = normal exit and closes door. - 1 = normal exit and closes door. - 16 = teleports outside, door kept closed. - 64 = normal exit and closes door, maybe a bit slower animation than 0. - 256 = normal exit but does not close the door. - 4160 = ped is throwing himself out, even when the vehicle is still. - 262144 = ped moves to passenger seat first, then exits normally - Others to be tried out: 320, 512, 131072. - - - - - p5 = 0, p6 = 2 - - - - - param3: duration in ms, use -1 to look forever - param4: using 2048 is fine - param5: using 3 is fine - - - - - Example: - AI::_2D537BA194896636(PLAYER::PLAYER_PED_ID(), "arm_wrestling_sweep_paired_a_rev3", 0.0, 1, "mini@arm_wrestling", 0); - - - - - Example: - AI::_2D537BA194896636(PLAYER::PLAYER_PED_ID(), "arm_wrestling_sweep_paired_a_rev3", 0.0, 1, "mini@arm_wrestling", 0); - - - - - Example: - AI::_D5B35BEA41919ACB(PLAYER::PLAYER_PED_ID(), "minigame_tattoo_michael_parts", 324.13, 181.29, 102.6, 0.0, 0.0, 22.32, 2, 0, 0, 0, 0); - - - - - Example: - AI::_D5B35BEA41919ACB(PLAYER::PLAYER_PED_ID(), "minigame_tattoo_michael_parts", 324.13, 181.29, 102.6, 0.0, 0.0, 22.32, 2, 0, 0, 0, 0); - - - - - This function has a third parameter as well (bool). - Second parameter is unused. - seconds parameter was for jetpack in the early stages of gta and the hard coded code is now removed - - - - - makes ped parachute to coords x y z. Works well with PATHFIND::GET_SAFE_COORD_FOR_PED - - - - - After looking at some scripts the second parameter seems to be an id of some kind. Here are some I found from some R* scripts: - "miss_Tower_01" (this went from 01 - 10) - "miss_Ass0" (0, 4, 6, 3) - "MISS_PATROL_8" - I think they're patrol routes, but I'm not sure. And I believe the 3rd parameter is a BOOL, but I can't confirm other than only seeing 0 and 1 being passed. - As far as I can see the patrol routes names such as "miss_Ass0" have been defined earlier in the scripts. This leads me to believe we can defined our own new patrol routes by following the same approach. - From the scripts - AI::OPEN_PATROL_ROUTE("miss_Ass0"); - AI::ADD_PATROL_ROUTE_NODE(0, "WORLD_HUMAN_GUARD_STAND", l_738[0 -- [[3]] ], -139.4076690673828, -993.4732055664062, 26.2754, GAMEPLAY::GET_RANDOM_INT_IN_RANGE(5000, 10000)); - AI::ADD_PATROL_ROUTE_NODE(1, "WORLD_HUMAN_GUARD_STAND", l_738[1 -- [[3]] ], -116.1391830444336, -987.4984130859375, 26.38541030883789, GAMEPLAY::GET_RANDOM_INT_IN_RANGE(5000, 10000)); - AI::ADD_PATROL_ROUTE_NODE(2, "WORLD_HUMAN_GUARD_STAND", l_738[2 -- [[3]] ], -128.46847534179688, -979.0340576171875, 26.2754, GAMEPLAY::GET_RANDOM_INT_IN_RANGE(5000, 10000)); - AI::ADD_PATROL_ROUTE_LINK(0, 1); - AI::ADD_PATROL_ROUTE_LINK(1, 2); - AI::ADD_PATROL_ROUTE_LINK(2, 0); - AI::CLOSE_PATROL_ROUTE(); - AI::CREATE_PATROL_ROUTE(); - - - - - Stand still (?) - - - - - Function.Call(Hash.TASK_PLANE_LAND, pilot, selectedAirplane, runwayStartPoint.X, runwayStartPoint.Y, runwayStartPoint.Z, runwayEndPoint.X, runwayEndPoint.Y, runwayEndPoint.Z); - - - - - EDITED (7/13/2017) - NOTE: If you want air combat, AI::TASK_COMBAT_PED (while your pilot is in an aircraft) also does the same thing as this native. - DESCRIPTION: - Ever wish your buddy could shoot down one of your enemies for you? Ever wanted an auto-pilot? Well look no further! This is the native for you! (Ped intelligence may vary) - USAGE: - -- REQUIRED -- - • pilot = The ped flying the aircraft. - • aircraft = The aircraft the pilot is flying - -- OPTIONAL -- [atleast 1 must be assigned] - • targetVehicle = The vehicle the pilot will target. - • targetPed = The ped the pilot will target. - • destinationX, destinationY, destinationZ = The location the pilot will target. - -- LOGIC -- - • missionFlag = The type of mission. pastebin.com/R8x73dbv - • angularDrag = The higher the value, the slower the plane will rotate. Value ranges from 0 - Infinity. - • unk = Set to 0, and you'll be fine. - • targetHeading = The target angle (from world space north) that the pilot will try to acheive before executing an attack/landing. - • maxZ = Maximum Z coordinate height for flying. - • minZ = Minimum Z coordinate height for flying. - Z: 2,700 is the default max height a pilot will be able to fly. Anything greater and he will fly downward until reaching 2,700 again. - Mission Types (incase you don't like links..): - 0 = None - 1 = Unk - 2 = CTaskVehicleRam - 3 = CTaskVehicleBlock - 4 = CTaskVehicleGoToPlane - 5 = CTaskVehicleStop - 6 = CTaskVehicleAttack - 7 = CTaskVehicleFollow - 8 = CTaskVehicleFleeAirborne - 9 = CTaskVehicleCircle - 10 = CTaskVehicleEscort - 15 = CTaskVehicleFollowRecording - 16 = CTaskVehiclePoliceBehaviour - 17 = CTaskVehicleCrash - Example C#: - Function.Call(Hash.TASK_PLANE_MISSION, pilot, vehicle, 0, Game.Player.Character, 0, 0, 0, 6, 0f, 0f, 0f, 2500.0f, -1500f); - Example C++ - AI::TASK_PLANE_MISSION(pilot, vehicle, 0, PLAYER::GET_PLAYER_PED(PLAYER::GET_PLAYER_INDEX()), 0, 0, 0, 6, 0.0, 0.0, 0.0, 2500.0, -1500.0); - [DEPRECATED] EXAMPLE USAGE: - pastebin.com/gx7Finsk - - - - - Animations list : www.los-santos-multiplayer.com/dev.airdancer?cxt=anim - float speed > normal speed is 8.0f - ---------------------- - float speedMultiplier > multiply the playback speed - ---------------------- - int duration: time in millisecond - ---------------------- - -1 _ _ _ _ _ _ _> Default (see flag) - 0 _ _ _ _ _ _ _ > Not play at all - Small value _ _ > Slow down animation speed - Other _ _ _ _ _ > freeze player control until specific time (ms) has - _ _ _ _ _ _ _ _ _ passed. (No effect if flag is set to be - _ _ _ _ _ _ _ _ _ controllable.) - int flag: - ---------------------- - enum eAnimationFlags - { - ANIM_FLAG_NORMAL = 0, - ANIM_FLAG_REPEAT = 1, - ANIM_FLAG_STOP_LAST_FRAME = 2, - ANIM_FLAG_UPPERBODY = 16, - ANIM_FLAG_ENABLE_PLAYER_CONTROL = 32, - ANIM_FLAG_CANCELABLE = 120, - }; - Odd number : loop infinitely - Even number : Freeze at last frame - Multiple of 4: Freeze at last frame but controllable - 01 to 15 > Full body - 10 to 31 > Upper body - 32 to 47 > Full body > Controllable - 48 to 63 > Upper body > Controllable - ... - 001 to 255 > Normal - 256 to 511 > Garbled - ... - playbackRate: - values are between 0.0 and 1.0 - lockX: - 0 in most cases 1 for rcmepsilonism8 and rcmpaparazzo_3 - > 1 for mini@sprunk - lockY: - 0 in most cases - 1 for missfam5_yoga, missfra1mcs_2_crew_react - lockZ: - 0 for single player - Can be 1 but only for MP - - - - - It's similar to the one above, except the first 6 floats let you specify the initial position and rotation of the task. (Ped gets teleported to the position). animTime is a float from 0.0 -> 1.0, lets you start an animation from given point. The rest as in AI::TASK_PLAY_ANIM. - Rotation information : rotX and rotY don't seem to have any effect, only rotZ works. - Animations list : www.los-santos-multiplayer.com/dev.airdancer?cxt=anim - - - - - Example from the scripts: - AI::TASK_PLAY_PHONE_GESTURE_ANIMATION(PLAYER::PLAYER_PED_ID(), v_3, v_2, v_4, 0.25, 0.25, 0, 0); - ========================================================= - ^^ No offense, but Idk how that would really help anyone. - As for the animDict & animation, they're both store in a global in all 5 scripts. So if anyone would be so kind as to read that global and comment what strings they use. Thanks. - Known boneMaskTypes' - "BONEMASK_HEADONLY" - "BONEMASK_HEAD_NECK_AND_ARMS" - "BONEMASK_HEAD_NECK_AND_L_ARM" - "BONEMASK_HEAD_NECK_AND_R_ARM" - p4 known args - 0.0f, 0.5f, 0.25f - p5 known args - 0.0f, 0.25f - p6 known args - 1 if a global if check is passed. - p7 known args - 1 if a global if check is passed. - The values found above, I found within the 5 scripts this is ever called in. (fmmc_launcher, fm_deathmatch_controller, fm_impromptu_dm_controller, fm_mission_controller, and freemode). - ========================================================= - - - - - from armenian3.c4 - AI::TASK_PUT_PED_DIRECTLY_INTO_MELEE(PlayerPed, armenianPed, 0.0, -1.0, 0.0, 0); - - - - - Only appears twice in the scripts. - AI::TASK_RAPPEL_FROM_HELI(PLAYER::PLAYER_PED_ID(), 0x41200000); - AI::TASK_RAPPEL_FROM_HELI(a_0, 0x41200000); - Fixed, definitely not a float and since it's such a big number obviously not a bool. All though note when I thought it was a bool and set it to 1 it seemed to work that same as int 0x41200000. - 0x41200000 = 10.0 as float. - Not all helicopters support rappelling. - - - - - The 2nd param (unused) is not implemented. - ----------------------------------------------------------------------- - The only occurrence I found in a R* script ("assassin_construction.ysc.c4"): - if (((v_3 < v_4) && (AI::GET_SCRIPT_TASK_STATUS(PLAYER::PLAYER_PED_ID(), 0x6a67a5cc) != 1)) && (v_5 > v_3)) { - AI::TASK_RELOAD_WEAPON(PLAYER::PLAYER_PED_ID(), 1); - } - - - - - From fm_mission_controller.c: - reserve_network_mission_objects(get_num_reserved_mission_objects(0) + 1); - vVar28 = {0.094f, 0.02f, -0.005f}; - vVar29 = {-92.24f, 63.64f, 150.24f}; - func_253(&uVar30, joaat("prop_ld_case_01"), Global_1592429.imm_34757[iParam1 <268>], 1, 1, 0, 1); - set_entity_lod_dist(net_to_ent(uVar30), 500); - attach_entity_to_entity(net_to_ent(uVar30), iParam0, get_ped_bone_index(iParam0, 28422), vVar28, vVar29, 1, 0, 0, 0, 2, 1); - Var31.imm_4 = 1065353216; - Var31.imm_5 = 1065353216; - Var31.imm_9 = 1065353216; - Var31.imm_10 = 1065353216; - Var31.imm_14 = 1065353216; - Var31.imm_15 = 1065353216; - Var31.imm_17 = 1040187392; - Var31.imm_18 = 1040187392; - Var31.imm_19 = -1; - Var32.imm_4 = 1065353216; - Var32.imm_5 = 1065353216; - Var32.imm_9 = 1065353216; - Var32.imm_10 = 1065353216; - Var32.imm_14 = 1065353216; - Var32.imm_15 = 1065353216; - Var32.imm_17 = 1040187392; - Var32.imm_18 = 1040187392; - Var32.imm_19 = -1; - Var31 = 1; - Var31.imm_1 = "weapons@misc@jerrycan@mp_male"; - Var31.imm_2 = "idle"; - Var31.imm_20 = 1048633; - Var31.imm_4 = 0.5f; - Var31.imm_16 = get_hash_key("BONEMASK_ARMONLY_R"); - task_scripted_animation(iParam0, &Var31, &Var32, &Var32, 0f, 0.25f); - set_model_as_no_longer_needed(joaat("prop_ld_case_01")); - remove_anim_dict("anim@heists@biolab@"); - - - - - from michael2: - AI::TASK_SEEK_COVER_TO_COORDS(ped, 967.5164794921875, -2121.603515625, 30.479299545288086, 978.94677734375, -2125.84130859375, 29.4752, -1, 1); - appears to be shorter variation - from michael3: - AI::TASK_SEEK_COVER_TO_COORDS(ped, -2231.011474609375, 263.6326599121094, 173.60195922851562, -1, 0); - - - - - I cant believe I have to define this, this is one of the best natives. - It makes the ped ignore basically all shocking events around it. Occasionally the ped may comment or gesture, but other than that they just continue their daily activities. This includes shooting and wounding the ped. And - most importantly - they do not flee. - Since it is a task, every time the native is called the ped will stop for a moment. - - - - - p1 is always GET_HASH_KEY("empty") in scripts, for the rare times this is used - - - - - //this part of the code is to determine at which entity the player is aiming, for example if you want to create a mod where you give orders to peds - Entity aimedentity; - Player player = PLAYER::PLAYER_ID(); - PLAYER::_GET_AIMED_ENTITY(player, &aimedentity); - //bg is an array of peds - AI::TASK_SHOOT_AT_ENTITY(bg[i], aimedentity, 5000, GAMEPLAY::GET_HASH_KEY("FIRING_PATTERN_FULL_AUTO")); - in practical usage, getting the entity the player is aiming at and then task the peds to shoot at the entity, at a button press event would be better. - - - - - Makes the specified ped shuffle to the next vehicle seat. - The ped MUST be in a vehicle and the vehicle parameter MUST be the ped's current vehicle. - - - - - Makes the specified ped flee the specified distance from the specified position. - - - - - Makes a ped run away from another ped (fleeTarget). - distance = ped will flee this distance. - fleeTime = ped will flee for this amount of time, set to "-1" to flee forever - - - - - scenarioName example: "WORLD_HUMAN_GUARD_STAND" - - - - - Makes the specified ped stand still for (time) milliseconds. - - - - - List of scenarioNames: pastebin.com/6mrYTdQv - Also a few more listed at AI::TASK_START_SCENARIO_IN_PLACE just above. - --------------- - The first parameter in every scenario has always been a Ped of some sort. The second like TASK_START_SCENARIO_IN_PLACE is the name of the scenario. - The next 4 parameters were harder to decipher. After viewing "hairdo_shop_mp.ysc.c4", and being confused from seeing the case in other scripts, they passed the first three of the arguments as one array from a function, and it looked like it was obviously x, y, and z. - I haven't seen the sixth parameter go to or over 360, making me believe that it is rotation, but I really can't confirm anything. - I have no idea what the last 3 parameters are, but I'll try to find out. - -going on the last 3 parameters, they appear to always be "0, 0, 1" - p6 -1 also used in scrips - p7 used for sitting scenarios - p8 teleports ped to position - - - - - Plays a scenario on a Ped at their current location. - unkDelay - Usually 0 or -1, doesn't seem to have any effect. Might be a delay between sequences. - playEnterAnim - Plays the "Enter" anim if true, otherwise plays the "Exit" anim. Scenarios that don't have any "Enter" anims won't play if this is set to true. - ---- - From "am_hold_up.ysc.c4" at line 339: - AI::TASK_START_SCENARIO_IN_PLACE(NETWORK::NET_TO_PED(l_8D._f4), sub_adf(), 0, 1); - I'm unsure of what the last two parameters are, however sub_adf() randomly returns 1 of 3 scenarios, those being: - WORLD_HUMAN_SMOKING - WORLD_HUMAN_HANG_OUT_STREET - WORLD_HUMAN_STAND_MOBILE - This makes sense, as these are what I commonly see when going by a liquor store. - ------------------------- - List of scenarioNames: pastebin.com/6mrYTdQv - (^ Thank you so fucking much for this) - Also these: - WORLD_FISH_FLEE - DRIVE - WORLD_HUMAN_HIKER - WORLD_VEHICLE_ATTRACTOR - WORLD_VEHICLE_BICYCLE_MOUNTAIN - WORLD_VEHICLE_BIKE_OFF_ROAD_RACE - WORLD_VEHICLE_BIKER - WORLD_VEHICLE_CONSTRUCTION_PASSENGERS - WORLD_VEHICLE_CONSTRUCTION_SOLO - WORLD_VEHICLE_DRIVE_PASSENGERS - WORLD_VEHICLE_DRIVE_SOLO - WORLD_VEHICLE_EMPTY - WORLD_VEHICLE_PARK_PARALLEL - WORLD_VEHICLE_PARK_PERPENDICULAR_NOSE_IN - WORLD_VEHICLE_POLICE_BIKE - WORLD_VEHICLE_POLICE_CAR - WORLD_VEHICLE_POLICE_NEXT_TO_CAR - WORLD_VEHICLE_SALTON_DIRT_BIKE - WORLD_VEHICLE_TRUCK_LOGS - - - - - Makes the ped run to take cover - - - - - Stealth kill action name hashes: - stealth kills can be found here: Grand Theft Auto V\common.rpf\data\action\stealth_kills.meta - ... - { - "ACT_stealth_kill_a", - "ACT_stealth_kill_weapon", - "ACT_stealth_kill_b", - "ACT_stealth_kill_c", - "ACT_stealth_kill_d", - "ACT_stealth_kill_a_gardener" - } - Only known script using this native: fbi4_prep2 - EXAMPLE: - ai::task_stealth_kill(iParam1, Local_252, gameplay::get_hash_key("AR_stealth_kill_a"), 1f, 0);ai::task_stealth_kill(iParam1, Local_252, gameplay::get_hash_key("AR_stealth_kill_knife"), 1f, 0); - Also it may be important to note, that each time this task is called, it's followed by AI::CLEAR_PED_TASKS on the target - - - - - TODO: add hash from x360 - ^^^ - I got you, x360 Hash: 0x5A32D4B4. - Note: Whoever named this I just compared it and the hash matches, it was the correct name thanks. - Note: Alexander Blade, needs to fix this site or his code one, as when we do find the right name the server throws an error saying the name is already in use. AB is a legend coder, so I'm sure this is a simple fix for him. - - - - - This function is called on peds in vehicles. - anim: animation name - p2, p3, p4: "sweep_low", "sweep_med" or "sweep_high" - p5: no idea what it does but is usually -1 - - - - - AI::TASK_SYNCHRONIZED_SCENE(ped, scene, "creatures@rottweiler@in_vehicle@std_car", "get_in", 1000.0, -8.0, 4, 0, 0x447a0000, 0); - Animations List : www.ls-multiplayer.com/dev/index.php?section=3 - - - - - In every case of this native, I've only seen the first parameter passed as 0, although I believe it's a Ped after seeing tasks around it using 0. That's because it's used in a Sequence Task. - The last 3 parameters are definitely coordinates after seeing them passed in other scripts, and even being used straight from the player's coordinates. - --- - It seems that - in the decompiled scripts - this native was used on a ped who was in a vehicle to throw a projectile out the window at the player. This is something any ped will naturally do if they have a throwable and they are doing driveby-combat (although not very accurately). - It is possible, however, that this is how SWAT throws smoke grenades at the player when in cover. - ---------------------------------------------------- - The first comment is right it definately is the ped as if you look in script finale_heist2b.c line 59628 in Xbox Scripts atleast you will see task_throw_projectile and the first param is Local_559[2 <14>] if you look above it a little bit line 59622 give_weapon_to_ped uses the same exact param Local_559[2 <14>] and we all know the first param of that native is ped. So it guaranteed has to be ped. 0 just may mean to use your ped by default for some reason. - - - - - used in sequence task - both parameters seems to be always 0 - - - - - duration in milliseconds - - - - - duration: the amount of time in milliseconds to do the task. -1 will keep the task going until either another task is applied, or CLEAR_ALL_TASKS() is called with the ped - - - - - Actually has 3 params, not 2. - p0: Ped - p1: int (or bool?) - p2: int - - - - - Updated variables - An alternative to AI::TASK_USE_NEAREST_SCENARIO_TO_COORD_WARP. Makes the ped walk to the scenario instead. - - - - - chases targetEnt fast and aggressively - -- - Makes ped (needs to be in vehicle) chase targetEnt. - - - - - info about driving modes: HTTP://gtaforums.com/topic/822314-guide-driving-styles/ - --------------------------------------------------------------- - Passing P6 value as floating value didn't throw any errors, though unsure what is it exactly, looks like radius or something. - P10 though, it is mentioned as float, however, I used bool and set it to true, that too worked. - Here the e.g. code I used - Function.Call(Hash.TASK_VEHICLE_DRIVE_TO_COORD, Ped, Vehicle, Cor X, Cor Y, Cor Z, 30f, 1f, Vehicle.GetHashCode(), 16777216, 1f, true); - - - - - Makes a ped follow the targetVehicle with <minDistance> in between. - note: minDistance is ignored if drivingstyle is avoiding traffic, but Rushed is fine. - Mode: The mode defines the relative position to the targetVehicle. The ped will try to position its vehicle there. - -1 = behind - 0 = ahead - 1 = left - 2 = right - 3 = back left - 4 = back right - if the target is closer than noRoadsDistance, the driver will ignore pathing/roads and follow you directly. - Driving Styles guide: gtaforums.com/topic/822314-guide-driving-styles/ - - - - - Makes a ped in a vehicle follow an entity (ped, vehicle, etc.) - Driving Styles guide: gtaforums.com/topic/822314-guide-driving-styles/ - Console Hash: 0xA8B917D7 - AI::_TASK_VEHICLE_FOLLOW(l_244[3 -- [[1]] ], l_268[3 -- [[1]] ], l_278, 40.0, 262144, 10); - What is this known as in the decompiled scripts ffs. I need more examples. I've searched in all scripts for keywords suchas, - TASK_VEHICLE_FOLLOW, FC545A9F0626E3B6, 0xFC545A9F0626E3B6, all the parameters in the above example even just search the last few params '40.0, 262144, 10' and couldnt find where this native is used in scripts at all unless whoever decompiled the scripts gave it a whack a.. name. - - - - - task_vehicle_follow_waypoint_recording(Ped p0, Vehicle p1, string p2, int p3, int p4, int p5, int p6, float.x p7, float.Y p8, float.Z p9, bool p10, int p11) - p2 = Waypoint recording string (found in update\update.rpf\x64\levels\gta5\waypointrec.rpf - p3 = 786468 - p4 = 0 - p5 = 16 - p6 = -1 (angle?) - p7/8/9 = usually v3.zero - p10 = bool (repeat?) - p11 = 1073741824 - - - - - Differs from TASK_VEHICLE_DRIVE_TO_COORDS in that it will pick the shortest possible road route without taking one-way streets and other "road laws" into consideration. - WARNING: - A behaviorFlag value of 0 will result in a clunky, stupid driver! - Recommended settings: - speed = 30.0f, - behaviorFlag = 156, - stoppingRange = 5.0f; - If you simply want to have your driver move to a fixed location, call it only once, or, when necessary in the event of interruption. - If using this to continually follow a Ped who is on foot: You will need to run this in a tick loop. Call it in with the Ped's updated coordinates every 20 ticks or so and you will have one hell of a smart, fast-reacting NPC driver -- provided he doesn't get stuck. If your update frequency is too fast, the Ped may not have enough time to figure his way out of being stuck, and thus, remain stuck. One way around this would be to implement an "anti-stuck" mechanism, which allows the driver to realize he's stuck, temporarily pause the tick, unstuck, then resume the tick. - EDIT: This is being discussed in more detail at http://gtaforums.com/topic/818504-any-idea-on-how-to-make-peds-clever-and-insanely-fast-c/ - - - - - pilot, vehicle and altitude are rather self-explanatory. - p4: is unused variable in the function. - entityToFollow: you can provide a Vehicle entity or a Ped entity, the heli will protect them. - 'targetSpeed': The pilot will dip the nose AS MUCH AS POSSIBLE so as to reach this value AS FAST AS POSSIBLE. As such, you'll want to modulate it as opposed to calling it via a hard-wired, constant #. - 'radius' isn't just "stop within radius of X of target" like with ground vehicles. In this case, the pilot will fly an entire circle around 'radius' and continue to do so. - NOT CONFIRMED: p7 appears to be a FlyingStyle enum. Still investigating it as of this writing, but playing around with values here appears to result in different -behavior- as opposed to offsetting coordinates, altitude, target speed, etc. - NOTE: If the pilot finds enemies, it will engage them until it kills them, but will return to protect the ped/vehicle given shortly thereafter. - - - - - Example from fm_mission_controller.c4: - AI::TASK_VEHICLE_MISSION_COORS_TARGET(l_65E1, l_65E2, 324.84588623046875, 325.09619140625, 104.3525, 4, 15.0, 802987, 5.0, 5.0, 0); - - - - - Modes: - 8= flees - 1=drives around the ped - 4=drives and stops near - 7=follows - 10=follows to the left - 11=follows to the right - 12 = follows behind - 13=follows ahead - 14=follows, stop when near - - - - - Modes: - 0 - ignore heading - 1 - park forward - 2 - park backwards - Depending on the angle of approach, the vehicle can park at the specified heading or at its exact opposite (-180) angle. - Radius seems to define how close the vehicle has to be -after parking- to the position for this task considered completed. If the value is too small, the vehicle will try to park again until it's exactly where it should be. 20.0 Works well but lower values don't, like the radius is measured in centimeters or something. - - - - - Most probably plays a specific animation on vehicle. For example getting chop out of van etc... - Here's how its used - - AI::TASK_VEHICLE_PLAY_ANIM(l_325, "rcmnigel1b", "idle_speedo"); - AI::TASK_VEHICLE_PLAY_ANIM(l_556[0 -- [[1]] ], "missfra0_chop_drhome", "InCar_GetOutofBack_Speedo"); - FYI : Speedo is the name of van in which chop was put in the mission. - Animations list : www.los-santos-multiplayer.com/dev.airdancer?cxt=anim - - - - - '1 - '3 - brake + reverse - '4 - turn left 90 + braking - '5 - turn right 90 + braking - '6 - brake strong (handbrake?) until time ends - '7 - turn left + accelerate - '7 - turn right + accelerate - '9 - weak acceleration - '10 - turn left + restore wheel pos to center in the end - '11 - turn right + restore wheel pos to center in the end - '13 - turn left + go reverse - '14 - turn left + go reverse - '16 - crash the game after like 2 seconds :) - '17 - keep actual state, game crashed after few tries - '18 - game crash - '19 - strong brake + turn left/right - '20 - weak brake + turn left then turn right - '21 - weak brake + turn right then turn left - '22 - brake + reverse - '23 - accelerate fast - '24 - '25 - brake turning left then when almost stopping it turns left more - '26 - brake turning right then when almost stopping it turns right more - '27 - brake until car stop or until time ends - '28 - brake + strong reverse acceleration - '30 - performs a burnout (brake until stop + brake and accelerate) - '31 - accelerate + handbrake - '32 - accelerate very strong - Seems to be this: - Works on NPCs, but overrides their current task. If inside a task sequence (and not being the last task), "time" will work, otherwise the task will be performed forever until tasked with something else - - - - - Makes ped walk around the area. - set p1 to 10.0f and p2 to 10 if you want the ped to walk anywhere without a duration. - - - - - Seat Numbers - ------------------------------- - Driver = -1 - Any = -2 - Left-Rear = 1 - Right-Front = 0 - Right-Rear = 2 - Extra seats = 3-14(This may differ from vehicle type e.g. Firetruck Rear Stand, Ambulance Rear) - - - - - EX: Function.Call(Ped1, Ped2, Time, 0); - The last parameter is always 0 for some reason I do not know. The first parameter is the pedestrian who will writhe to the pedestrian in the other parameter. The third paremeter is how long until the Writhe task ends. When the task ends, the ped will die. If set to -1, he will not die automatically, and the task will continue until something causes it to end. This can be being touched by an entity, being shot, explosion, going into ragdoll, having task cleared. Anything that ends the current task will kill the ped at this point. - MulleDK19: Third parameter does not appear to be time. The last parameter is not implemented (It's not used, regardless of value). - - - - - For a full list, see here: pastebin.com/yLNWicUi - - - - - I guess p3 is shape test flags? - - - - - Counts up. Every 1000 is 1 real-time second. Use SETTIMERA(int value) to set the timer (e.g.: SETTIMERA(0)). - - - - - Gets the current frame time. - - - - - Toggles: - UNK17 - Turbo - UNK19 - Tire Smoke - UNK21 - Xenon Headlights - - - - - in script hook .net - Vehicle v = ...; - Function.Call(Hash.TRACK_VEHICLE_VISIBILITY, v.Handle); - - - - - Transforms the `stormberg` to it's "road vehicle" variant. If the vehicle is already in that state then the vehicle transformation audio will still play, but the vehicle won't change at all. - - A vehicle handle. - If true, the vehicle will be instantly transformed, when false the transform animation plays normally. - - - - Transforms the `stormberg` to it's "road vehicle" variant. If the vehicle is already in that state then the vehicle transformation audio will still play, but the vehicle won't change at all. - - A vehicle handle. - If true, the vehicle will be instantly transformed, when false the transform animation plays normally. - - - - Transforms the `stormberg` to it's "water vehicle" variant. If the vehicle is already in that state then the vehicle transformation audio will still play, but the vehicle won't change at all. - - A vehicle handle. - If true, the vehicle will be instantly transformed, when false the transform animation plays normally. - - - - Transforms the `stormberg` to it's "water vehicle" variant. If the vehicle is already in that state then the vehicle transformation audio will still play, but the vehicle won't change at all. - - A vehicle handle. - If true, the vehicle will be instantly transformed, when false the transform animation plays normally. - - - - time in ms to transition from fully blurred to normal - - - - - time in ms to transition to fully blurred screen - - - - - The backing function for TriggerEvent. - - - - - List of all usable event names found in b617d used with this native. Sorted alphabetically and identical names removed: pastebin.com/RzDFmB1W - All music event names found in the b617d scripts: pastebin.com/GnYt0R3P - - - - - yis - eventGroup: 0 = CEventGroupScriptAI, 1 = CEventGroupScriptNetwork - ^^ I'm assuming it's like the rest with this parameter. - - - - - The backing function for TriggerServerEvent. - - - - - Returns the interior ID at the given coords, but only if the unknown variable is set to 0, otherwise it will return 0. - - - - - Returns the interior ID at the given coords, but only if the unknown variable is set to 0, otherwise it will return 0. - - - - - I see this as a native that would of been used back in GTA III when you finally unlocked the bridge to the next island and such. - - - - - Does something similar to INTERIOR::DISABLE_INTERIOR. - You don't fall through the floor but everything is invisible inside and looks the same as when INTERIOR::DISABLE_INTERIOR is used. Peds behaves normally inside. - - - - - gtaforums.com/topic/885580-ped-headshotmugshot-txd/ - - - - - On last-gen this just runs blr and this func is called by several other functions other then the native's table. - - - - - Returns the current status of the onscreen keyboard, and updates the output. - Status Codes: - 0 - User still editing - 1 - User has finished editing - 2 - User has canceled editing - 3 - Keyboard isn't active - - - - - See SET_PED_HEAD_BLEND_DATA(). - - - - - Formerly known as _LOWER_MAP_PROP_DENSITY and wrongly due to idiots as _ENABLE_MP_DLC_MAPS. - Sets the maximum prop density and changes a loading screen flag from 'loading story mode' to 'loading GTA Online'. Does not touch DLC map data at all. - In fact, I doubt this changes the flag whatsoever, that's the OTHER native idiots use together with this that does so, this one only causes a loading screen to show as it reloads map data. - ------------------------ - While you're going on your rant about other "idiots" can you please supply the name of the "other native" for us "idiots" who'd like to actually learn about loading IPL's? Thank, you. - - - - - Formerly known as _LOWER_MAP_PROP_DENSITY and wrongly due to idiots as _ENABLE_MP_DLC_MAPS. - Sets the maximum prop density and changes a loading screen flag from 'loading story mode' to 'loading GTA Online'. Does not touch DLC map data at all. - In fact, I doubt this changes the flag whatsoever, that's the OTHER native idiots use together with this that does so, this one only causes a loading screen to show as it reloads map data. - ------------------------ - While you're going on your rant about other "idiots" can you please supply the name of the "other native" for us "idiots" who'd like to actually learn about loading IPL's? Thank, you. - - - - - From the b678d decompiled scripts: - GRAPHICS::_SET_PTFX_ASSET_NEXT_CALL("FM_Mission_Controler"); - GRAPHICS::_SET_PTFX_ASSET_NEXT_CALL("scr_apartment_mp"); - GRAPHICS::_SET_PTFX_ASSET_NEXT_CALL("scr_indep_fireworks"); - GRAPHICS::_SET_PTFX_ASSET_NEXT_CALL("scr_mp_cig_plane"); - GRAPHICS::_SET_PTFX_ASSET_NEXT_CALL("scr_mp_creator"); - GRAPHICS::_SET_PTFX_ASSET_NEXT_CALL("scr_ornate_heist"); - GRAPHICS::_SET_PTFX_ASSET_NEXT_CALL("scr_prison_break_heist_station"); - - - - - From the b678d decompiled scripts: - GRAPHICS::_SET_PTFX_ASSET_NEXT_CALL("FM_Mission_Controler"); - GRAPHICS::_SET_PTFX_ASSET_NEXT_CALL("scr_apartment_mp"); - GRAPHICS::_SET_PTFX_ASSET_NEXT_CALL("scr_indep_fireworks"); - GRAPHICS::_SET_PTFX_ASSET_NEXT_CALL("scr_mp_cig_plane"); - GRAPHICS::_SET_PTFX_ASSET_NEXT_CALL("scr_mp_creator"); - GRAPHICS::_SET_PTFX_ASSET_NEXT_CALL("scr_ornate_heist"); - GRAPHICS::_SET_PTFX_ASSET_NEXT_CALL("scr_prison_break_heist_station"); - - - - - hash collision? - - - - - Hash collision - If this is a hash collision, it's a very lucky one. It does seem strangely named but it is used to toggle the mission creator mode. - - - - - hash collision? - - - - - Calculates distance between vectors. - - - - - Calculates distance between vectors but does not perform Sqrt operations. (Its way faster) - - - - - calls from vehicle to net. - - - - - Vehicle has landing gear? - - - - - Vehicle has landing gear? - - - - - parachuteModel = 230075693 - - - - - colorIndex = 0 - - - - - Calculates the magnitude of a vector. - - - - - Calculates the magnitude of a vector but does not perform Sqrt operations. (Its way faster) - - - - - Pauses execution of the current script, please note this behavior is only seen when called from one of the game script files(ysc). In order to wait an asi script use - static void WAIT(DWORD time); - found in main.h - -------------------------------------------------------------------- - It does not actually seem to wait the amount of milliseconds stated like the normal WAIT() command does, but it does seem to make task sequences work more smoothly - System native hashes do not change on gameupdate - - - - - Hash collision - - - - - Returns whether or not the currently executing event was canceled. - - A boolean. - - - - Despite this function's name, it simply returns whether the specified handle is a Ped. - - - - - For a full list, see here: pastebin.com/Tp0XpBMN - For a full list of the points, see here: goo.gl/wIH0vn - - - - - For a full list, see here: pastebin.com/Tp0XpBMN - For a full list of the points, see here: goo.gl/wIH0vn - - - - - For a full list, see here: pastebin.com/Tp0XpBMN - For a full list of the points, see here: goo.gl/wIH0vn - - - - - First parameter was previously an Entity but after further research it is definitely a hash. - - - - - Allow copying memory from one IntPtr to another. Required as the implementation does not provide an appropriate override. - - - - - - - - Empty Shared Field - - - - An uninitialized Color Structure - - - - - Equality Operator - - - - Compares two Color objects. The return value is - based on the equivalence of the A,R,G,B properties - of the two Colors. - - - - - Inequality Operator - - - - Compares two Color objects. The return value is - based on the equivalence of the A,R,G,B properties - of the two colors. - - - - - IsEmpty Property - - - - Indicates transparent black. R,G,B = 0; A=0? - - - - - Equals Method - - - - Checks equivalence of this Color and another object. - - - - - GetHashCode Method - - - - Calculates a hashing value. - - - - - ToString Method - - - - Formats the Color as a string in ARGB notation. - - - - - Empty Shared Field - - - - An uninitialized Point Structure. - - - - - Ceiling Shared Method - - - - Produces a Point structure from a PointF structure by - taking the ceiling of the X and Y properties. - - - - - Round Shared Method - - - - Produces a Point structure from a PointF structure by - rounding the X and Y properties. - - - - - Truncate Shared Method - - - - Produces a Point structure from a PointF structure by - truncating the X and Y properties. - - - - - Addition Operator - - - - Translates a Point using the Width and Height - properties of the given Size. - - - - - Equality Operator - - - - Compares two Point objects. The return value is - based on the equivalence of the X and Y properties - of the two points. - - - - - Inequality Operator - - - - Compares two Point objects. The return value is - based on the equivalence of the X and Y properties - of the two points. - - - - - Subtraction Operator - - - - Translates a Point using the negation of the Width - and Height properties of the given Size. - - - - - Point to Size Conversion - - - - Returns a Size based on the Coordinates of a given - Point. Requires explicit cast. - - - - - Point to PointF Conversion - - - - Creates a PointF based on the coordinates of a given - Point. No explicit cast is required. - - - - - Point Constructor - - - - Creates a Point from an integer which holds the Y - coordinate in the high order 16 bits and the X - coordinate in the low order 16 bits. - - - - - Point Constructor - - - - Creates a Point from a Size value. - - - - - Point Constructor - - - - Creates a Point from a specified x,y coordinate pair. - - - - - IsEmpty Property - - - - Indicates if both X and Y are zero. - - - - - X Property - - - - The X coordinate of the Point. - - - - - Y Property - - - - The Y coordinate of the Point. - - - - - Equals Method - - - - Checks equivalence of this Point and another object. - - - - - GetHashCode Method - - - - Calculates a hashing value. - - - - - Offset Method - - - - Moves the Point a specified distance. - - - - - ToString Method - - - - Formats the Point as a string in coordinate notation. - - - - - Empty Shared Field - - - - An uninitialized PointF Structure. - - - - - Addition Operator - - - - Translates a PointF using the Width and Height - properties of the given Size. - - - - - Equality Operator - - - - Compares two PointF objects. The return value is - based on the equivalence of the X and Y properties - of the two points. - - - - - Inequality Operator - - - - Compares two PointF objects. The return value is - based on the equivalence of the X and Y properties - of the two points. - - - - - Subtraction Operator - - - - Translates a PointF using the negation of the Width - and Height properties of the given Size. - - - - - PointF Constructor - - - - Creates a PointF from a specified x,y coordinate pair. - - - - - IsEmpty Property - - - - Indicates if both X and Y are zero. - - - - - X Property - - - - The X coordinate of the PointF. - - - - - Y Property - - - - The Y coordinate of the PointF. - - - - - Equals Method - - - - Checks equivalence of this PointF and another object. - - - - - GetHashCode Method - - - - Calculates a hashing value. - - - - - ToString Method - - - - Formats the PointF as a string in coordinate notation. - - - - - Empty Shared Field - - - - An uninitialized Size Structure. - - - - - Ceiling Shared Method - - - - Produces a Size structure from a SizeF structure by - taking the ceiling of the Width and Height properties. - - - - - Round Shared Method - - - - Produces a Size structure from a SizeF structure by - rounding the Width and Height properties. - - - - - Truncate Shared Method - - - - Produces a Size structure from a SizeF structure by - truncating the Width and Height properties. - - - - - Addition Operator - - - - Addition of two Size structures. - - - - - Equality Operator - - - - Compares two Size objects. The return value is - based on the equivalence of the Width and Height - properties of the two Sizes. - - - - - Inequality Operator - - - - Compares two Size objects. The return value is - based on the equivalence of the Width and Height - properties of the two Sizes. - - - - - Subtraction Operator - - - - Subtracts two Size structures. - - - - - Size to Point Conversion - - - - Returns a Point based on the dimensions of a given - Size. Requires explicit cast. - - - - - Size to SizeF Conversion - - - - Creates a SizeF based on the dimensions of a given - Size. No explicit cast is required. - - - - - Size Constructor - - - - Creates a Size from a Point value. - - - - - Size Constructor - - - - Creates a Size from specified dimensions. - - - - - IsEmpty Property - - - - Indicates if both Width and Height are zero. - - - - - Width Property - - - - The Width coordinate of the Size. - - - - - Height Property - - - - The Height coordinate of the Size. - - - - - Equals Method - - - - Checks equivalence of this Size and another object. - - - - - GetHashCode Method - - - - Calculates a hashing value. - - - - - ToString Method - - - - Formats the Size as a string in coordinate notation. - - - - - Empty Shared Field - - - - An uninitialized SizeF Structure. - - - - - Addition Operator - - - - Addition of two SizeF structures. - - - - - Equality Operator - - - - Compares two SizeF objects. The return value is - based on the equivalence of the Width and Height - properties of the two Sizes. - - - - - Inequality Operator - - - - Compares two SizeF objects. The return value is - based on the equivalence of the Width and Height - properties of the two Sizes. - - - - - Subtraction Operator - - - - Subtracts two SizeF structures. - - - - - SizeF to PointF Conversion - - - - Returns a PointF based on the dimensions of a given - SizeF. Requires explicit cast. - - - - - SizeF Constructor - - - - Creates a SizeF from a PointF value. - - - - - SizeF Constructor - - - - Creates a SizeF from an existing SizeF value. - - - - - SizeF Constructor - - - - Creates a SizeF from specified dimensions. - - - - - IsEmpty Property - - - - Indicates if both Width and Height are zero. - - - - - Width Property - - - - The Width coordinate of the SizeF. - - - - - Height Property - - - - The Height coordinate of the SizeF. - - - - - Equals Method - - - - Checks equivalence of this SizeF and another object. - - - - - GetHashCode Method - - - - Calculates a hashing value. - - - - - ToString Method - - - - Formats the SizeF as a string in coordinate notation. - - - - diff --git a/dependencies/server/CitizenFX.Core.Server.dll b/dependencies/server/CitizenFX.Core.Server.dll deleted file mode 100644 index 1ab72e73bf594b26766cdccafdfbec2576e8411d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 180736 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 K{onsT4*VzIvI(^S diff --git a/dependencies/server/CitizenFX.Core.xml b/dependencies/server/CitizenFX.Core.xml deleted file mode 100644 index 3dc09873..00000000 --- a/dependencies/server/CitizenFX.Core.xml +++ /dev/null @@ -1,7584 +0,0 @@ - - - - CitizenFX.Core - - - - - An event containing callbacks to attempt to schedule on every game tick. - A callback will only be rescheduled once the associated task completes. - - - - - Returns a task that will delay scheduling of the current interval function by the passed amount of time. - - - await Delay(500); - - The amount of time by which to delay scheduling this interval function. - An awaitable task. - - - - Broadcasts an event to all connected players. - - The name of the event. - Arguments to pass to the event. - - - - Provides fast reading and writing of generic structures to a memory location using IL emitted functions. - - - - - Retrieve a pointer to the passed generic structure type. This is achieved by emitting a to retrieve a pointer to the structure. - - - - A pointer to the provided structure in memory. - - - - - Loads the generic value type from a pointer. This is achieved by emitting a that returns the value in the memory location as a . - The equivalent non-generic C# code: - - unsafe MyStruct ReadFromPointer(byte* pointer) - { - return *(MyStruct*)pointer; - } - - - Any value/structure type - Unsafe pointer to memory to load the value from - The newly loaded value - - - - Writes the generic value type to the location specified by a pointer. This is achieved by emitting a that copies the value from the referenced structure into the specified memory location. - There is no exact equivalent possible in C#, the closest possible (generates the same IL) is the following code: - - unsafe void WriteToPointer(ref SharedHeader dest, ref SharedHeader src) - { - dest = src; - } - - - - - - - - - Retrieve the cached size of a structure - - - - Caches the size by type - - - - - Reads a number of elements from a memory location into the provided buffer starting at the specified index. - - The structure type - The destination buffer. - The source memory location. - The start index within . - The number of elements to read. - - - - Writes a number of elements to a memory location from the provided buffer starting at the specified index. - - The structure type - The destination memory location. - The source buffer. - The start index within . - The number of elements to write. - - - - Emits optimized IL for the reading and writing of structures to/from memory. - For a 32-byte structure with 1 million iterations: - The method performs approx. 20x faster than - (8ms vs 160ms), and about 1.6x slower than the non-generic equivalent (8ms vs 5ms) - The method performs approx. 8x faster than - (4ms vs 34ms). - - - - - - Delegate that returns a pointer to the provided structure. Use with extreme caution. - - - - - - - Delegate for loading a structure from the specified memory address - - - - - - - Delegate for writing a structure to the specified memory address - - - - - - - The delegate for the generated IL to retrieve a pointer to the structure - - - - - The delegate for the generated IL to retrieve a structure from a specified memory address. - - - - - The delegate for the generated IL to store a structure at the specified memory address. - - - - - Cached size of T as determined by . - - - - - Performs once of type compatibility check. - - Thrown if the type T is incompatible - - - - The value for which all absolute numbers smaller than are considered equal to zero. - - - - - A value specifying the approximation of π which is 180 degrees. - - - - - A value specifying the approximation of 2π which is 360 degrees. - - - - - A value specifying the approximation of π/2 which is 90 degrees. - - - - - A value specifying the approximation of π/4 which is 45 degrees. - - - - - Checks if a and b are almost equals, taking into account the magnitude of floating point numbers (unlike method). See Remarks. - See remarks. - - The left value to compare. - The right value to compare. - true if a almost equal to b, false otherwise - - The code is using the technique described by Bruce Dawson in - Comparing Floating point numbers 2012 edition. - - - - - Determines whether the specified value is close to zero (0.0f). - - The floating value. - true if the specified value is close to zero (0.0f); otherwise, false. - - - - Determines whether the specified value is close to one (1.0f). - - The floating value. - true if the specified value is close to one (1.0f); otherwise, false. - - - - Checks if a - b are almost equals within a float epsilon. - - The left value to compare. - The right value to compare. - Epsilon value - true if a almost equal to b within a float epsilon, false otherwise - - - - Converts revolutions to degrees. - - The value to convert. - The converted value. - - - - Converts revolutions to radians. - - The value to convert. - The converted value. - - - - Converts revolutions to gradians. - - The value to convert. - The converted value. - - - - Converts degrees to revolutions. - - The value to convert. - The converted value. - - - - Converts degrees to radians. - - The value to convert. - The converted value. - - - - Converts radians to revolutions. - - The value to convert. - The converted value. - - - - Converts radians to gradians. - - The value to convert. - The converted value. - - - - Converts gradians to revolutions. - - The value to convert. - The converted value. - - - - Converts gradians to degrees. - - The value to convert. - The converted value. - - - - Converts gradians to radians. - - The value to convert. - The converted value. - - - - Converts radians to degrees. - - The value to convert. - The converted value. - - - - Clamps the specified value. - - The value. - The min. - The max. - The result of clamping a value between min and max - - - - Clamps the specified value. - - The value. - The min. - The max. - The result of clamping a value between min and max - - - - Interpolates between two values using a linear function by a given amount. - - - See http://www.encyclopediaofmath.org/index.php/Linear_interpolation and - http://fgiesen.wordpress.com/2012/08/15/linear-interpolation-past-present-and-future/ - - Value to interpolate from. - Value to interpolate to. - Interpolation amount. - The result of linear interpolation of values based on the amount. - - - - Interpolates between two values using a linear function by a given amount. - - - See http://www.encyclopediaofmath.org/index.php/Linear_interpolation and - http://fgiesen.wordpress.com/2012/08/15/linear-interpolation-past-present-and-future/ - - Value to interpolate from. - Value to interpolate to. - Interpolation amount. - The result of linear interpolation of values based on the amount. - - - - Interpolates between two values using a linear function by a given amount. - - - See http://www.encyclopediaofmath.org/index.php/Linear_interpolation and - http://fgiesen.wordpress.com/2012/08/15/linear-interpolation-past-present-and-future/ - - Value to interpolate from. - Value to interpolate to. - Interpolation amount. - The result of linear interpolation of values based on the amount. - - - - Performs smooth (cubic Hermite) interpolation between 0 and 1. - - - See https://en.wikipedia.org/wiki/Smoothstep - - Value between 0 and 1 indicating interpolation amount. - - - - Performs a smooth(er) interpolation between 0 and 1 with 1st and 2nd order derivatives of zero at endpoints. - - - See https://en.wikipedia.org/wiki/Smoothstep - - Value between 0 and 1 indicating interpolation amount. - - - - Calculates the modulo of the specified value. - - The value. - The modulo. - The result of the modulo applied to value - - - - Calculates the modulo 2*PI of the specified value. - - The value. - The result of the modulo applied to value - - - - Wraps the specified value into a range [min, max] - - The value to wrap. - The min. - The max. - Result of the wrapping. - Is thrown when is greater than . - - - - Wraps the specified value into a range [min, max[ - - The value. - The min. - The max. - Result of the wrapping. - Is thrown when is greater than . - - - - Gauss function. - - Curve amplitude. - Position X. - Position Y - Radius X. - Radius Y. - Curve sigma X. - Curve sigma Y. - The result of Gaussian function. - - - - Gauss function. - - Curve amplitude. - Position X. - Position Y - Radius X. - Radius Y. - Curve sigma X. - Curve sigma Y. - The result of Gaussian function. - - - - Represents a 4x4 mathematical matrix. - - - - - A with all of its components set to zero. - - - - - The identity . - - - - - Value at row 1 column 1 of the matrix. - - - - - Value at row 1 column 2 of the matrix. - - - - - Value at row 1 column 3 of the matrix. - - - - - Value at row 1 column 4 of the matrix. - - - - - Value at row 2 column 1 of the matrix. - - - - - Value at row 2 column 2 of the matrix. - - - - - Value at row 2 column 3 of the matrix. - - - - - Value at row 2 column 4 of the matrix. - - - - - Value at row 3 column 1 of the matrix. - - - - - Value at row 3 column 2 of the matrix. - - - - - Value at row 3 column 3 of the matrix. - - - - - Value at row 3 column 4 of the matrix. - - - - - Value at row 4 column 1 of the matrix. - - - - - Value at row 4 column 2 of the matrix. - - - - - Value at row 4 column 3 of the matrix. - - - - - Value at row 4 column 4 of the matrix. - - - - - Gets or sets the up of the matrix; that is M21, M22, and M23. - - - - - Gets or sets the down of the matrix; that is -M21, -M22, and -M23. - - - - - Gets or sets the right of the matrix; that is M11, M12, and M13. - - - - - Gets or sets the left of the matrix; that is -M11, -M12, and -M13. - - - - - Gets or sets the forward of the matrix; that is -M31, -M32, and -M33. - - - - - Gets or sets the backward of the matrix; that is M31, M32, and M33. - - - - - Initializes a new instance of the struct. - - The value that will be assigned to all components. - - - - Initializes a new instance of the struct. - - The value to assign at row 1 column 1 of the matrix. - The value to assign at row 1 column 2 of the matrix. - The value to assign at row 1 column 3 of the matrix. - The value to assign at row 1 column 4 of the matrix. - The value to assign at row 2 column 1 of the matrix. - The value to assign at row 2 column 2 of the matrix. - The value to assign at row 2 column 3 of the matrix. - The value to assign at row 2 column 4 of the matrix. - The value to assign at row 3 column 1 of the matrix. - The value to assign at row 3 column 2 of the matrix. - The value to assign at row 3 column 3 of the matrix. - The value to assign at row 3 column 4 of the matrix. - The value to assign at row 4 column 1 of the matrix. - The value to assign at row 4 column 2 of the matrix. - The value to assign at row 4 column 3 of the matrix. - The value to assign at row 4 column 4 of the matrix. - - - - Initializes a new instance of the struct. - - The values to assign to the components of the matrix. This must be an array with sixteen elements. - Thrown when is null. - Thrown when contains more or less than sixteen elements. - - - - Gets or sets the first row in the matrix; that is M11, M12, M13, and M14. - - - - - Gets or sets the second row in the matrix; that is M21, M22, M23, and M24. - - - - - Gets or sets the third row in the matrix; that is M31, M32, M33, and M34. - - - - - Gets or sets the fourth row in the matrix; that is M41, M42, M43, and M44. - - - - - Gets or sets the first column in the matrix; that is M11, M21, M31, and M41. - - - - - Gets or sets the second column in the matrix; that is M12, M22, M32, and M42. - - - - - Gets or sets the third column in the matrix; that is M13, M23, M33, and M43. - - - - - Gets or sets the fourth column in the matrix; that is M14, M24, M34, and M44. - - - - - Gets or sets the translation of the matrix; that is M41, M42, and M43. - - - - - Gets or sets the scale of the matrix; that is M11, M22, and M33. - - - - - Gets a value indicating whether this instance is an identity matrix. - - - true if this instance is an identity matrix; otherwise, false. - - - - - Gets or sets the component at the specified index. - - The value of the matrix component, depending on the index. - The zero-based index of the component to access. - The value of the component at the specified index. - Thrown when the is out of the range [0, 15]. - - - - Gets or sets the component at the specified index. - - The value of the matrix component, depending on the index. - The row of the matrix to access. - The column of the matrix to access. - The value of the component at the specified index. - Thrown when the or is out of the range [0, 3]. - - - - Calculates the determinant of the matrix. - - The determinant of the matrix. - - - - Inverts the matrix. - - - - - Transposes the matrix. - - - - - Orthogonalizes the specified matrix. - - - Orthogonalization is the process of making all rows orthogonal to each other. This - means that any given row in the matrix will be orthogonal to any other given row in the - matrix. - Because this method uses the modified Gram-Schmidt process, the resulting matrix - tends to be numerically unstable. The numeric stability decreases according to the rows - so that the first row is the most stable and the last row is the least stable. - This operation is performed on the rows of the matrix rather than the columns. - If you wish for this operation to be performed on the columns, first transpose the - input and than transpose the output. - - - - - Orthonormalizes the specified matrix. - - - Orthonormalization is the process of making all rows and columns orthogonal to each - other and making all rows and columns of unit length. This means that any given row will - be orthogonal to any other given row and any given column will be orthogonal to any other - given column. Any given row will not be orthogonal to any given column. Every row and every - column will be of unit length. - Because this method uses the modified Gram-Schmidt process, the resulting matrix - tends to be numerically unstable. The numeric stability decreases according to the rows - so that the first row is the most stable and the last row is the least stable. - This operation is performed on the rows of the matrix rather than the columns. - If you wish for this operation to be performed on the columns, first transpose the - input and than transpose the output. - - - - - Decomposes a matrix into an orthonormalized matrix Q and a right triangular matrix R. - - When the method completes, contains the orthonormalized matrix of the decomposition. - When the method completes, contains the right triangular matrix of the decomposition. - - - - Decomposes a matrix into a lower triangular matrix L and an orthonormalized matrix Q. - - When the method completes, contains the lower triangular matrix of the decomposition. - When the method completes, contains the orthonormalized matrix of the decomposition. - - - - Decomposes a matrix into a scale, rotation, and translation. - - When the method completes, contains the scaling component of the decomposed matrix. - When the method completes, contains the rotation component of the decomposed matrix. - When the method completes, contains the translation component of the decomposed matrix. - - This method is designed to decompose an SRT transformation matrix only. - - - - - Decomposes a uniform scale matrix into a scale, rotation, and translation. - A uniform scale matrix has the same scale in every axis. - - When the method completes, contains the scaling component of the decomposed matrix. - When the method completes, contains the rotation component of the decomposed matrix. - When the method completes, contains the translation component of the decomposed matrix. - - This method is designed to decompose only an SRT transformation matrix that has the same scale in every axis. - - - - - Exchanges two rows in the matrix. - - The first row to exchange. This is an index of the row starting at zero. - The second row to exchange. This is an index of the row starting at zero. - - - - Exchanges two columns in the matrix. - - The first column to exchange. This is an index of the column starting at zero. - The second column to exchange. This is an index of the column starting at zero. - - - - Creates an array containing the elements of the matrix. - - A sixteen-element array containing the components of the matrix. - - - - Determines the sum of two matrices. - - The first matrix to add. - The second matrix to add. - When the method completes, contains the sum of the two matrices. - - - - Determines the sum of two matrices. - - The first matrix to add. - The second matrix to add. - The sum of the two matrices. - - - - Determines the difference between two matrices. - - The first matrix to subtract. - The second matrix to subtract. - When the method completes, contains the difference between the two matrices. - - - - Determines the difference between two matrices. - - The first matrix to subtract. - The second matrix to subtract. - The difference between the two matrices. - - - - Scales a matrix by the given value. - - The matrix to scale. - The amount by which to scale. - When the method completes, contains the scaled matrix. - - - - Scales a matrix by the given value. - - The matrix to scale. - The amount by which to scale. - The scaled matrix. - - - - Determines the product of two matrices. - - The first matrix to multiply. - The second matrix to multiply. - The product of the two matrices. - - - - Determines the product of two matrices. - - The first matrix to multiply. - The second matrix to multiply. - The product of the two matrices. - - - - Scales a matrix by the given value. - - The matrix to scale. - The amount by which to scale. - When the method completes, contains the scaled matrix. - - - - Scales a matrix by the given value. - - The matrix to scale. - The amount by which to scale. - The scaled matrix. - - - - Determines the quotient of two matrices. - - The first matrix to divide. - The second matrix to divide. - When the method completes, contains the quotient of the two matrices. - - - - Determines the quotient of two matrices. - - The first matrix to divide. - The second matrix to divide. - The quotient of the two matrices. - - - - Performs the exponential operation on a matrix. - - The matrix to perform the operation on. - The exponent to raise the matrix to. - When the method completes, contains the exponential matrix. - Thrown when the is negative. - - - - Performs the exponential operation on a matrix. - - The matrix to perform the operation on. - The exponent to raise the matrix to. - The exponential matrix. - Thrown when the is negative. - - - - Negates a matrix. - - The matrix to be negated. - When the method completes, contains the negated matrix. - - - - Negates a matrix. - - The matrix to be negated. - The negated matrix. - - - - Performs a linear interpolation between two matrices. - - Start matrix. - End matrix. - Value between 0 and 1 indicating the weight of . - When the method completes, contains the linear interpolation of the two matrices. - - Passing a value of 0 will cause to be returned; a value of 1 will cause to be returned. - - - - - Performs a linear interpolation between two matrices. - - Start matrix. - End matrix. - Value between 0 and 1 indicating the weight of . - The linear interpolation of the two matrices. - - Passing a value of 0 will cause to be returned; a value of 1 will cause to be returned. - - - - - Performs a cubic interpolation between two matrices. - - Start matrix. - End matrix. - Value between 0 and 1 indicating the weight of . - When the method completes, contains the cubic interpolation of the two matrices. - - - - Performs a cubic interpolation between two matrices. - - Start matrix. - End matrix. - Value between 0 and 1 indicating the weight of . - The cubic interpolation of the two matrices. - - - - Calculates the transpose of the specified matrix. - - The matrix whose transpose is to be calculated. - When the method completes, contains the transpose of the specified matrix. - - - - Calculates the transpose of the specified matrix. - - The matrix whose transpose is to be calculated. - When the method completes, contains the transpose of the specified matrix. - - - - Calculates the transpose of the specified matrix. - - The matrix whose transpose is to be calculated. - The transpose of the specified matrix. - - - - Calculates the inverse of the specified matrix. - - The matrix whose inverse is to be calculated. - When the method completes, contains the inverse of the specified matrix. - - - - Calculates the inverse of the specified matrix. - - The matrix whose inverse is to be calculated. - The inverse of the specified matrix. - - - - Orthogonalizes the specified matrix. - - The matrix to orthogonalize. - When the method completes, contains the orthogonalized matrix. - - Orthogonalization is the process of making all rows orthogonal to each other. This - means that any given row in the matrix will be orthogonal to any other given row in the - matrix. - Because this method uses the modified Gram-Schmidt process, the resulting matrix - tends to be numerically unstable. The numeric stability decreases according to the rows - so that the first row is the most stable and the last row is the least stable. - This operation is performed on the rows of the matrix rather than the columns. - If you wish for this operation to be performed on the columns, first transpose the - input and than transpose the output. - - - - - Orthogonalizes the specified matrix. - - The matrix to orthogonalize. - The orthogonalized matrix. - - Orthogonalization is the process of making all rows orthogonal to each other. This - means that any given row in the matrix will be orthogonal to any other given row in the - matrix. - Because this method uses the modified Gram-Schmidt process, the resulting matrix - tends to be numerically unstable. The numeric stability decreases according to the rows - so that the first row is the most stable and the last row is the least stable. - This operation is performed on the rows of the matrix rather than the columns. - If you wish for this operation to be performed on the columns, first transpose the - input and than transpose the output. - - - - - Orthonormalizes the specified matrix. - - The matrix to orthonormalize. - When the method completes, contains the orthonormalized matrix. - - Orthonormalization is the process of making all rows and columns orthogonal to each - other and making all rows and columns of unit length. This means that any given row will - be orthogonal to any other given row and any given column will be orthogonal to any other - given column. Any given row will not be orthogonal to any given column. Every row and every - column will be of unit length. - Because this method uses the modified Gram-Schmidt process, the resulting matrix - tends to be numerically unstable. The numeric stability decreases according to the rows - so that the first row is the most stable and the last row is the least stable. - This operation is performed on the rows of the matrix rather than the columns. - If you wish for this operation to be performed on the columns, first transpose the - input and than transpose the output. - - - - - Orthonormalizes the specified matrix. - - The matrix to orthonormalize. - The orthonormalized matrix. - - Orthonormalization is the process of making all rows and columns orthogonal to each - other and making all rows and columns of unit length. This means that any given row will - be orthogonal to any other given row and any given column will be orthogonal to any other - given column. Any given row will not be orthogonal to any given column. Every row and every - column will be of unit length. - Because this method uses the modified Gram-Schmidt process, the resulting matrix - tends to be numerically unstable. The numeric stability decreases according to the rows - so that the first row is the most stable and the last row is the least stable. - This operation is performed on the rows of the matrix rather than the columns. - If you wish for this operation to be performed on the columns, first transpose the - input and than transpose the output. - - - - - Brings the matrix into upper triangular form using elementary row operations. - - The matrix to put into upper triangular form. - When the method completes, contains the upper triangular matrix. - - If the matrix is not invertible (i.e. its determinant is zero) than the result of this - method may produce Single.Nan and Single.Inf values. When the matrix represents a system - of linear equations, than this often means that either no solution exists or an infinite - number of solutions exist. - - - - - Brings the matrix into upper triangular form using elementary row operations. - - The matrix to put into upper triangular form. - The upper triangular matrix. - - If the matrix is not invertible (i.e. its determinant is zero) than the result of this - method may produce Single.Nan and Single.Inf values. When the matrix represents a system - of linear equations, than this often means that either no solution exists or an infinite - number of solutions exist. - - - - - Brings the matrix into lower triangular form using elementary row operations. - - The matrix to put into lower triangular form. - When the method completes, contains the lower triangular matrix. - - If the matrix is not invertible (i.e. its determinant is zero) than the result of this - method may produce Single.Nan and Single.Inf values. When the matrix represents a system - of linear equations, than this often means that either no solution exists or an infinite - number of solutions exist. - - - - - Brings the matrix into lower triangular form using elementary row operations. - - The matrix to put into lower triangular form. - The lower triangular matrix. - - If the matrix is not invertible (i.e. its determinant is zero) than the result of this - method may produce Single.Nan and Single.Inf values. When the matrix represents a system - of linear equations, than this often means that either no solution exists or an infinite - number of solutions exist. - - - - - Brings the matrix into row echelon form using elementary row operations; - - The matrix to put into row echelon form. - When the method completes, contains the row echelon form of the matrix. - - - - Brings the matrix into row echelon form using elementary row operations; - - The matrix to put into row echelon form. - When the method completes, contains the row echelon form of the matrix. - - - - Brings the matrix into reduced row echelon form using elementary row operations. - - The matrix to put into reduced row echelon form. - The fifth column of the matrix. - When the method completes, contains the resultant matrix after the operation. - When the method completes, contains the resultant fifth column of the matrix. - - The fifth column is often called the augmented part of the matrix. This is because the fifth - column is really just an extension of the matrix so that there is a place to put all of the - non-zero components after the operation is complete. - Often times the resultant matrix will the identity matrix or a matrix similar to the identity - matrix. Sometimes, however, that is not possible and numbers other than zero and one may appear. - This method can be used to solve systems of linear equations. Upon completion of this method, - the will contain the solution for the system. It is up to the user - to analyze both the input and the result to determine if a solution really exists. - - - - - Creates a left-handed spherical billboard that rotates around a specified object position. - - The position of the object around which the billboard will rotate. - The position of the camera. - The up vector of the camera. - The forward vector of the camera. - When the method completes, contains the created billboard matrix. - - - - Creates a left-handed spherical billboard that rotates around a specified object position. - - The position of the object around which the billboard will rotate. - The position of the camera. - The up vector of the camera. - The forward vector of the camera. - The created billboard matrix. - - - - Creates a right-handed spherical billboard that rotates around a specified object position. - - The position of the object around which the billboard will rotate. - The position of the camera. - The up vector of the camera. - The forward vector of the camera. - When the method completes, contains the created billboard matrix. - - - - Creates a right-handed spherical billboard that rotates around a specified object position. - - The position of the object around which the billboard will rotate. - The position of the camera. - The up vector of the camera. - The forward vector of the camera. - The created billboard matrix. - - - - Creates a left-handed, look-at matrix. - - The position of the viewer's eye. - The camera look-at target. - The camera's up vector. - When the method completes, contains the created look-at matrix. - - - - Creates a left-handed, look-at matrix. - - The position of the viewer's eye. - The camera look-at target. - The camera's up vector. - The created look-at matrix. - - - - Creates a right-handed, look-at matrix. - - The position of the viewer's eye. - The camera look-at target. - The camera's up vector. - When the method completes, contains the created look-at matrix. - - - - Creates a right-handed, look-at matrix. - - The position of the viewer's eye. - The camera look-at target. - The camera's up vector. - The created look-at matrix. - - - - Creates a left-handed, orthographic projection matrix. - - Width of the viewing volume. - Height of the viewing volume. - Minimum z-value of the viewing volume. - Maximum z-value of the viewing volume. - When the method completes, contains the created projection matrix. - - - - Creates a left-handed, orthographic projection matrix. - - Width of the viewing volume. - Height of the viewing volume. - Minimum z-value of the viewing volume. - Maximum z-value of the viewing volume. - The created projection matrix. - - - - Creates a right-handed, orthographic projection matrix. - - Width of the viewing volume. - Height of the viewing volume. - Minimum z-value of the viewing volume. - Maximum z-value of the viewing volume. - When the method completes, contains the created projection matrix. - - - - Creates a right-handed, orthographic projection matrix. - - Width of the viewing volume. - Height of the viewing volume. - Minimum z-value of the viewing volume. - Maximum z-value of the viewing volume. - The created projection matrix. - - - - Creates a left-handed, customized orthographic projection matrix. - - Minimum x-value of the viewing volume. - Maximum x-value of the viewing volume. - Minimum y-value of the viewing volume. - Maximum y-value of the viewing volume. - Minimum z-value of the viewing volume. - Maximum z-value of the viewing volume. - When the method completes, contains the created projection matrix. - - - - Creates a left-handed, customized orthographic projection matrix. - - Minimum x-value of the viewing volume. - Maximum x-value of the viewing volume. - Minimum y-value of the viewing volume. - Maximum y-value of the viewing volume. - Minimum z-value of the viewing volume. - Maximum z-value of the viewing volume. - The created projection matrix. - - - - Creates a right-handed, customized orthographic projection matrix. - - Minimum x-value of the viewing volume. - Maximum x-value of the viewing volume. - Minimum y-value of the viewing volume. - Maximum y-value of the viewing volume. - Minimum z-value of the viewing volume. - Maximum z-value of the viewing volume. - When the method completes, contains the created projection matrix. - - - - Creates a right-handed, customized orthographic projection matrix. - - Minimum x-value of the viewing volume. - Maximum x-value of the viewing volume. - Minimum y-value of the viewing volume. - Maximum y-value of the viewing volume. - Minimum z-value of the viewing volume. - Maximum z-value of the viewing volume. - The created projection matrix. - - - - Creates a left-handed, perspective projection matrix. - - Width of the viewing volume. - Height of the viewing volume. - Minimum z-value of the viewing volume. - Maximum z-value of the viewing volume. - When the method completes, contains the created projection matrix. - - - - Creates a left-handed, perspective projection matrix. - - Width of the viewing volume. - Height of the viewing volume. - Minimum z-value of the viewing volume. - Maximum z-value of the viewing volume. - The created projection matrix. - - - - Creates a right-handed, perspective projection matrix. - - Width of the viewing volume. - Height of the viewing volume. - Minimum z-value of the viewing volume. - Maximum z-value of the viewing volume. - When the method completes, contains the created projection matrix. - - - - Creates a right-handed, perspective projection matrix. - - Width of the viewing volume. - Height of the viewing volume. - Minimum z-value of the viewing volume. - Maximum z-value of the viewing volume. - The created projection matrix. - - - - Creates a left-handed, perspective projection matrix based on a field of view. - - Field of view in the y direction, in radians. - Aspect ratio, defined as view space width divided by height. - Minimum z-value of the viewing volume. - Maximum z-value of the viewing volume. - When the method completes, contains the created projection matrix. - - - - Creates a left-handed, perspective projection matrix based on a field of view. - - Field of view in the y direction, in radians. - Aspect ratio, defined as view space width divided by height. - Minimum z-value of the viewing volume. - Maximum z-value of the viewing volume. - The created projection matrix. - - - - Creates a right-handed, perspective projection matrix based on a field of view. - - Field of view in the y direction, in radians. - Aspect ratio, defined as view space width divided by height. - Minimum z-value of the viewing volume. - Maximum z-value of the viewing volume. - When the method completes, contains the created projection matrix. - - - - Creates a right-handed, perspective projection matrix based on a field of view. - - Field of view in the y direction, in radians. - Aspect ratio, defined as view space width divided by height. - Minimum z-value of the viewing volume. - Maximum z-value of the viewing volume. - The created projection matrix. - - - - Creates a left-handed, customized perspective projection matrix. - - Minimum x-value of the viewing volume. - Maximum x-value of the viewing volume. - Minimum y-value of the viewing volume. - Maximum y-value of the viewing volume. - Minimum z-value of the viewing volume. - Maximum z-value of the viewing volume. - When the method completes, contains the created projection matrix. - - - - Creates a left-handed, customized perspective projection matrix. - - Minimum x-value of the viewing volume. - Maximum x-value of the viewing volume. - Minimum y-value of the viewing volume. - Maximum y-value of the viewing volume. - Minimum z-value of the viewing volume. - Maximum z-value of the viewing volume. - The created projection matrix. - - - - Creates a right-handed, customized perspective projection matrix. - - Minimum x-value of the viewing volume. - Maximum x-value of the viewing volume. - Minimum y-value of the viewing volume. - Maximum y-value of the viewing volume. - Minimum z-value of the viewing volume. - Maximum z-value of the viewing volume. - When the method completes, contains the created projection matrix. - - - - Creates a right-handed, customized perspective projection matrix. - - Minimum x-value of the viewing volume. - Maximum x-value of the viewing volume. - Minimum y-value of the viewing volume. - Maximum y-value of the viewing volume. - Minimum z-value of the viewing volume. - Maximum z-value of the viewing volume. - The created projection matrix. - - - - Creates a matrix that scales along the x-axis, y-axis, and y-axis. - - Scaling factor for all three axes. - When the method completes, contains the created scaling matrix. - - - - Creates a matrix that scales along the x-axis, y-axis, and y-axis. - - Scaling factor for all three axes. - The created scaling matrix. - - - - Creates a matrix that scales along the x-axis, y-axis, and y-axis. - - Scaling factor that is applied along the x-axis. - Scaling factor that is applied along the y-axis. - Scaling factor that is applied along the z-axis. - When the method completes, contains the created scaling matrix. - - - - Creates a matrix that scales along the x-axis, y-axis, and y-axis. - - Scaling factor that is applied along the x-axis. - Scaling factor that is applied along the y-axis. - Scaling factor that is applied along the z-axis. - The created scaling matrix. - - - - Creates a matrix that uniformly scales along all three axis. - - The uniform scale that is applied along all axis. - When the method completes, contains the created scaling matrix. - - - - Creates a matrix that uniformly scales along all three axis. - - The uniform scale that is applied along all axis. - The created scaling matrix. - - - - Creates a matrix that rotates around the x-axis. - - Angle of rotation in radians. Angles are measured clockwise when looking along the rotation axis toward the origin. - When the method completes, contains the created rotation matrix. - - - - Creates a matrix that rotates around the x-axis. - - Angle of rotation in radians. Angles are measured clockwise when looking along the rotation axis toward the origin. - The created rotation matrix. - - - - Creates a matrix that rotates around the y-axis. - - Angle of rotation in radians. Angles are measured clockwise when looking along the rotation axis toward the origin. - When the method completes, contains the created rotation matrix. - - - - Creates a matrix that rotates around the y-axis. - - Angle of rotation in radians. Angles are measured clockwise when looking along the rotation axis toward the origin. - The created rotation matrix. - - - - Creates a matrix that rotates around the z-axis. - - Angle of rotation in radians. Angles are measured clockwise when looking along the rotation axis toward the origin. - When the method completes, contains the created rotation matrix. - - - - Creates a matrix that rotates around the z-axis. - - Angle of rotation in radians. Angles are measured clockwise when looking along the rotation axis toward the origin. - The created rotation matrix. - - - - Creates a matrix that rotates around an arbitrary axis. - - The axis around which to rotate. This parameter is assumed to be normalized. - Angle of rotation in radians. Angles are measured clockwise when looking along the rotation axis toward the origin. - When the method completes, contains the created rotation matrix. - - - - Creates a matrix that rotates around an arbitrary axis. - - The axis around which to rotate. This parameter is assumed to be normalized. - Angle of rotation in radians. Angles are measured clockwise when looking along the rotation axis toward the origin. - The created rotation matrix. - - - - Creates a rotation matrix from a quaternion. - - The quaternion to use to build the matrix. - The created rotation matrix. - - - - Creates a rotation matrix from a quaternion. - - The quaternion to use to build the matrix. - The created rotation matrix. - - - - Creates a rotation matrix with a specified yaw, pitch, and roll. - - Yaw around the y-axis, in radians. - Pitch around the x-axis, in radians. - Roll around the z-axis, in radians. - When the method completes, contains the created rotation matrix. - - - - Creates a rotation matrix with a specified yaw, pitch, and roll. - - Yaw around the y-axis, in radians. - Pitch around the x-axis, in radians. - Roll around the z-axis, in radians. - The created rotation matrix. - - - - Creates a translation matrix using the specified offsets. - - The offset for all three coordinate planes. - When the method completes, contains the created translation matrix. - - - - Creates a translation matrix using the specified offsets. - - The offset for all three coordinate planes. - The created translation matrix. - - - - Creates a translation matrix using the specified offsets. - - X-coordinate offset. - Y-coordinate offset. - Z-coordinate offset. - When the method completes, contains the created translation matrix. - - - - Creates a translation matrix using the specified offsets. - - X-coordinate offset. - Y-coordinate offset. - Z-coordinate offset. - The created translation matrix. - - - - Creates a skew/shear matrix by means of a translation vector, a rotation vector, and a rotation angle. - shearing is performed in the direction of translation vector, where translation vector and rotation vector define the shearing plane. - The effect is such that the skewed rotation vector has the specified angle with rotation itself. - - The rotation angle. - The rotation vector - The translation vector - Contains the created skew/shear matrix. - - - - Creates a 3D affine transformation matrix. - - Scaling factor. - The rotation of the transformation. - The translation factor of the transformation. - When the method completes, contains the created affine transformation matrix. - - - - Creates a 3D affine transformation matrix. - - Scaling factor. - The rotation of the transformation. - The translation factor of the transformation. - The created affine transformation matrix. - - - - Creates a 3D affine transformation matrix. - - Scaling factor. - The center of the rotation. - The rotation of the transformation. - The translation factor of the transformation. - When the method completes, contains the created affine transformation matrix. - - - - Creates a 3D affine transformation matrix. - - Scaling factor. - The center of the rotation. - The rotation of the transformation. - The translation factor of the transformation. - The created affine transformation matrix. - - - - Creates a 2D affine transformation matrix. - - Scaling factor. - The rotation of the transformation. - The translation factor of the transformation. - When the method completes, contains the created affine transformation matrix. - - - - Creates a 2D affine transformation matrix. - - Scaling factor. - The rotation of the transformation. - The translation factor of the transformation. - The created affine transformation matrix. - - - - Creates a 2D affine transformation matrix. - - Scaling factor. - The center of the rotation. - The rotation of the transformation. - The translation factor of the transformation. - When the method completes, contains the created affine transformation matrix. - - - - Creates a 2D affine transformation matrix. - - Scaling factor. - The center of the rotation. - The rotation of the transformation. - The translation factor of the transformation. - The created affine transformation matrix. - - - - Creates a transformation matrix. - - Center point of the scaling operation. - Scaling rotation amount. - Scaling factor. - The center of the rotation. - The rotation of the transformation. - The translation factor of the transformation. - When the method completes, contains the created transformation matrix. - - - - Creates a transformation matrix. - - Center point of the scaling operation. - Scaling rotation amount. - Scaling factor. - The center of the rotation. - The rotation of the transformation. - The translation factor of the transformation. - The created transformation matrix. - - - - Creates a 2D transformation matrix. - - Center point of the scaling operation. - Scaling rotation amount. - Scaling factor. - The center of the rotation. - The rotation of the transformation. - The translation factor of the transformation. - When the method completes, contains the created transformation matrix. - - - - Creates a 2D transformation matrix. - - Center point of the scaling operation. - Scaling rotation amount. - Scaling factor. - The center of the rotation. - The rotation of the transformation. - The translation factor of the transformation. - The created transformation matrix. - - - - Adds two matrices. - - The first matrix to add. - The second matrix to add. - The sum of the two matrices. - - - - Assert a matrix (return it unchanged). - - The matrix to assert (unchanged). - The asserted (unchanged) matrix. - - - - Subtracts two matrices. - - The first matrix to subtract. - The second matrix to subtract. - The difference between the two matrices. - - - - Negates a matrix. - - The matrix to negate. - The negated matrix. - - - - Scales a matrix by a given value. - - The matrix to scale. - The amount by which to scale. - The scaled matrix. - - - - Scales a matrix by a given value. - - The matrix to scale. - The amount by which to scale. - The scaled matrix. - - - - Multiplies two matrices. - - The first matrix to multiply. - The second matrix to multiply. - The product of the two matrices. - - - - Scales a matrix by a given value. - - The matrix to scale. - The amount by which to scale. - The scaled matrix. - - - - Divides two matrices. - - The first matrix to divide. - The second matrix to divide. - The quotient of the two matrices. - - - - Tests for equality between two objects. - - The first value to compare. - The second value to compare. - true if has the same value as ; otherwise, false. - - - - Tests for inequality between two objects. - - The first value to compare. - The second value to compare. - true if has a different value than ; otherwise, false. - - - - Returns a that represents this instance. - - - A that represents this instance. - - - - - Returns a that represents this instance. - - The format. - - A that represents this instance. - - - - - Returns a that represents this instance. - - The format provider. - - A that represents this instance. - - - - - Returns a that represents this instance. - - The format. - The format provider. - - A that represents this instance. - - - - - Returns a hash code for this instance. - - - A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. - - - - - Determines whether the specified is equal to this instance. - - The to compare with this instance. - - true if the specified is equal to this instance; otherwise, false. - - - - - Determines whether the specified is equal to this instance. - - The to compare with this instance. - - true if the specified is equal to this instance; otherwise, false. - - - - - Determines whether the specified is equal to this instance. - - The to compare with this instance. - - true if the specified is equal to this instance; otherwise, false. - - - - - Represents a 3x3 Matrix ( contains only Scale and Rotation ). - - - - - A with all of its components set to zero. - - - - - The identity . - - - - - Value at row 1 column 1 of the Matrix3x3. - - - - - Value at row 1 column 2 of the Matrix3x3. - - - - - Value at row 1 column 3 of the Matrix3x3. - - - - - Value at row 2 column 1 of the Matrix3x3. - - - - - Value at row 2 column 2 of the Matrix3x3. - - - - - Value at row 2 column 3 of the Matrix3x3. - - - - - Value at row 3 column 1 of the Matrix3x3. - - - - - Value at row 3 column 2 of the Matrix3x3. - - - - - Value at row 3 column 3 of the Matrix3x3. - - - - - Initializes a new instance of the struct. - - The value that will be assigned to all components. - - - - Initializes a new instance of the struct. - - The value to assign at row 1 column 1 of the Matrix3x3. - The value to assign at row 1 column 2 of the Matrix3x3. - The value to assign at row 1 column 3 of the Matrix3x3. - The value to assign at row 2 column 1 of the Matrix3x3. - The value to assign at row 2 column 2 of the Matrix3x3. - The value to assign at row 2 column 3 of the Matrix3x3. - The value to assign at row 3 column 1 of the Matrix3x3. - The value to assign at row 3 column 2 of the Matrix3x3. - The value to assign at row 3 column 3 of the Matrix3x3. - - - - Initializes a new instance of the struct. - - The values to assign to the components of the Matrix3x3. This must be an array with sixteen elements. - Thrown when is null. - Thrown when contains more or less than sixteen elements. - - - - Gets or sets the first row in the Matrix3x3; that is M11, M12, M13 - - - - - Gets or sets the second row in the Matrix3x3; that is M21, M22, M23 - - - - - Gets or sets the third row in the Matrix3x3; that is M31, M32, M33 - - - - - Gets or sets the first column in the Matrix3x3; that is M11, M21, M31 - - - - - Gets or sets the second column in the Matrix3x3; that is M12, M22, M32 - - - - - Gets or sets the third column in the Matrix3x3; that is M13, M23, M33 - - - - - Gets or sets the scale of the Matrix3x3; that is M11, M22, and M33. - - - - - Gets a value indicating whether this instance is an identity Matrix3x3. - - - true if this instance is an identity Matrix3x3; otherwise, false. - - - - - Gets or sets the component at the specified index. - - The value of the Matrix3x3 component, depending on the index. - The zero-based index of the component to access. - The value of the component at the specified index. - Thrown when the is out of the range [0, 15]. - - - - Gets or sets the component at the specified index. - - The value of the Matrix3x3 component, depending on the index. - The row of the Matrix3x3 to access. - The column of the Matrix3x3 to access. - The value of the component at the specified index. - Thrown when the or is out of the range [0, 3]. - - - - Calculates the determinant of the Matrix3x3. - - The determinant of the Matrix3x3. - - - - Inverts the Matrix3x3. - - - - - Transposes the Matrix3x3. - - - - - Orthogonalizes the specified Matrix3x3. - - - Orthogonalization is the process of making all rows orthogonal to each other. This - means that any given row in the Matrix3x3 will be orthogonal to any other given row in the - Matrix3x3. - Because this method uses the modified Gram-Schmidt process, the resulting Matrix3x3 - tends to be numerically unstable. The numeric stability decreases according to the rows - so that the first row is the most stable and the last row is the least stable. - This operation is performed on the rows of the Matrix3x3 rather than the columns. - If you wish for this operation to be performed on the columns, first transpose the - input and than transpose the output. - - - - - Orthonormalizes the specified Matrix3x3. - - - Orthonormalization is the process of making all rows and columns orthogonal to each - other and making all rows and columns of unit length. This means that any given row will - be orthogonal to any other given row and any given column will be orthogonal to any other - given column. Any given row will not be orthogonal to any given column. Every row and every - column will be of unit length. - Because this method uses the modified Gram-Schmidt process, the resulting Matrix3x3 - tends to be numerically unstable. The numeric stability decreases according to the rows - so that the first row is the most stable and the last row is the least stable. - This operation is performed on the rows of the Matrix3x3 rather than the columns. - If you wish for this operation to be performed on the columns, first transpose the - input and than transpose the output. - - - - - Decomposes a Matrix3x3 into an orthonormalized Matrix3x3 Q and a right triangular Matrix3x3 R. - - When the method completes, contains the orthonormalized Matrix3x3 of the decomposition. - When the method completes, contains the right triangular Matrix3x3 of the decomposition. - - - - Decomposes a Matrix3x3 into a lower triangular Matrix3x3 L and an orthonormalized Matrix3x3 Q. - - When the method completes, contains the lower triangular Matrix3x3 of the decomposition. - When the method completes, contains the orthonormalized Matrix3x3 of the decomposition. - - - - Decomposes a Matrix3x3 into a scale, rotation, and translation. - - When the method completes, contains the scaling component of the decomposed Matrix3x3. - When the method completes, contains the rotation component of the decomposed Matrix3x3. - - This method is designed to decompose an SRT transformation Matrix3x3 only. - - - - - Decomposes a uniform scale matrix into a scale, rotation, and translation. - A uniform scale matrix has the same scale in every axis. - - When the method completes, contains the scaling component of the decomposed matrix. - When the method completes, contains the rotation component of the decomposed matrix. - - This method is designed to decompose only an SRT transformation matrix that has the same scale in every axis. - - - - - Exchanges two rows in the Matrix3x3. - - The first row to exchange. This is an index of the row starting at zero. - The second row to exchange. This is an index of the row starting at zero. - - - - Exchanges two columns in the Matrix3x3. - - The first column to exchange. This is an index of the column starting at zero. - The second column to exchange. This is an index of the column starting at zero. - - - - Creates an array containing the elements of the Matrix3x3. - - A 9-element array containing the components of the Matrix3x3. - - - - Determines the sum of two matrices. - - The first Matrix3x3 to add. - The second Matrix3x3 to add. - When the method completes, contains the sum of the two matrices. - - - - Determines the sum of two matrices. - - The first Matrix3x3 to add. - The second Matrix3x3 to add. - The sum of the two matrices. - - - - Determines the difference between two matrices. - - The first Matrix3x3 to subtract. - The second Matrix3x3 to subtract. - When the method completes, contains the difference between the two matrices. - - - - Determines the difference between two matrices. - - The first Matrix3x3 to subtract. - The second Matrix3x3 to subtract. - The difference between the two matrices. - - - - Scales a Matrix3x3 by the given value. - - The Matrix3x3 to scale. - The amount by which to scale. - When the method completes, contains the scaled Matrix3x3. - - - - Scales a Matrix3x3 by the given value. - - The Matrix3x3 to scale. - The amount by which to scale. - The scaled Matrix3x3. - - - - Determines the product of two matrices. - - The first Matrix3x3 to multiply. - The second Matrix3x3 to multiply. - The product of the two matrices. - - - - Determines the product of two matrices. - - The first Matrix3x3 to multiply. - The second Matrix3x3 to multiply. - The product of the two matrices. - - - - Scales a Matrix3x3 by the given value. - - The Matrix3x3 to scale. - The amount by which to scale. - When the method completes, contains the scaled Matrix3x3. - - - - Scales a Matrix3x3 by the given value. - - The Matrix3x3 to scale. - The amount by which to scale. - The scaled Matrix3x3. - - - - Determines the quotient of two matrices. - - The first Matrix3x3 to divide. - The second Matrix3x3 to divide. - When the method completes, contains the quotient of the two matrices. - - - - Determines the quotient of two matrices. - - The first Matrix3x3 to divide. - The second Matrix3x3 to divide. - The quotient of the two matrices. - - - - Performs the exponential operation on a Matrix3x3. - - The Matrix3x3 to perform the operation on. - The exponent to raise the Matrix3x3 to. - When the method completes, contains the exponential Matrix3x3. - Thrown when the is negative. - - - - Performs the exponential operation on a Matrix3x3. - - The Matrix3x3 to perform the operation on. - The exponent to raise the Matrix3x3 to. - The exponential Matrix3x3. - Thrown when the is negative. - - - - Negates a Matrix3x3. - - The Matrix3x3 to be negated. - When the method completes, contains the negated Matrix3x3. - - - - Negates a Matrix3x3. - - The Matrix3x3 to be negated. - The negated Matrix3x3. - - - - Performs a linear interpolation between two matrices. - - Start Matrix3x3. - End Matrix3x3. - Value between 0 and 1 indicating the weight of . - When the method completes, contains the linear interpolation of the two matrices. - - Passing a value of 0 will cause to be returned; a value of 1 will cause to be returned. - - - - - Performs a linear interpolation between two matrices. - - Start Matrix3x3. - End Matrix3x3. - Value between 0 and 1 indicating the weight of . - The linear interpolation of the two matrices. - - Passing a value of 0 will cause to be returned; a value of 1 will cause to be returned. - - - - - Performs a cubic interpolation between two matrices. - - Start Matrix3x3. - End Matrix3x3. - Value between 0 and 1 indicating the weight of . - When the method completes, contains the cubic interpolation of the two matrices. - - - - Performs a cubic interpolation between two matrices. - - Start Matrix3x3. - End Matrix3x3. - Value between 0 and 1 indicating the weight of . - The cubic interpolation of the two matrices. - - - - Calculates the transpose of the specified Matrix3x3. - - The Matrix3x3 whose transpose is to be calculated. - When the method completes, contains the transpose of the specified Matrix3x3. - - - - Calculates the transpose of the specified Matrix3x3. - - The Matrix3x3 whose transpose is to be calculated. - When the method completes, contains the transpose of the specified Matrix3x3. - - - - Calculates the transpose of the specified Matrix3x3. - - The Matrix3x3 whose transpose is to be calculated. - The transpose of the specified Matrix3x3. - - - - Calculates the inverse of the specified Matrix3x3. - - The Matrix3x3 whose inverse is to be calculated. - When the method completes, contains the inverse of the specified Matrix3x3. - - - - Calculates the inverse of the specified Matrix3x3. - - The Matrix3x3 whose inverse is to be calculated. - The inverse of the specified Matrix3x3. - - - - Orthogonalizes the specified Matrix3x3. - - The Matrix3x3 to orthogonalize. - When the method completes, contains the orthogonalized Matrix3x3. - - Orthogonalization is the process of making all rows orthogonal to each other. This - means that any given row in the Matrix3x3 will be orthogonal to any other given row in the - Matrix3x3. - Because this method uses the modified Gram-Schmidt process, the resulting Matrix3x3 - tends to be numerically unstable. The numeric stability decreases according to the rows - so that the first row is the most stable and the last row is the least stable. - This operation is performed on the rows of the Matrix3x3 rather than the columns. - If you wish for this operation to be performed on the columns, first transpose the - input and than transpose the output. - - - - - Orthogonalizes the specified Matrix3x3. - - The Matrix3x3 to orthogonalize. - The orthogonalized Matrix3x3. - - Orthogonalization is the process of making all rows orthogonal to each other. This - means that any given row in the Matrix3x3 will be orthogonal to any other given row in the - Matrix3x3. - Because this method uses the modified Gram-Schmidt process, the resulting Matrix3x3 - tends to be numerically unstable. The numeric stability decreases according to the rows - so that the first row is the most stable and the last row is the least stable. - This operation is performed on the rows of the Matrix3x3 rather than the columns. - If you wish for this operation to be performed on the columns, first transpose the - input and than transpose the output. - - - - - Orthonormalizes the specified Matrix3x3. - - The Matrix3x3 to orthonormalize. - When the method completes, contains the orthonormalized Matrix3x3. - - Orthonormalization is the process of making all rows and columns orthogonal to each - other and making all rows and columns of unit length. This means that any given row will - be orthogonal to any other given row and any given column will be orthogonal to any other - given column. Any given row will not be orthogonal to any given column. Every row and every - column will be of unit length. - Because this method uses the modified Gram-Schmidt process, the resulting Matrix3x3 - tends to be numerically unstable. The numeric stability decreases according to the rows - so that the first row is the most stable and the last row is the least stable. - This operation is performed on the rows of the Matrix3x3 rather than the columns. - If you wish for this operation to be performed on the columns, first transpose the - input and than transpose the output. - - - - - Orthonormalizes the specified Matrix3x3. - - The Matrix3x3 to orthonormalize. - The orthonormalized Matrix3x3. - - Orthonormalization is the process of making all rows and columns orthogonal to each - other and making all rows and columns of unit length. This means that any given row will - be orthogonal to any other given row and any given column will be orthogonal to any other - given column. Any given row will not be orthogonal to any given column. Every row and every - column will be of unit length. - Because this method uses the modified Gram-Schmidt process, the resulting Matrix3x3 - tends to be numerically unstable. The numeric stability decreases according to the rows - so that the first row is the most stable and the last row is the least stable. - This operation is performed on the rows of the Matrix3x3 rather than the columns. - If you wish for this operation to be performed on the columns, first transpose the - input and than transpose the output. - - - - - Brings the Matrix3x3 into upper triangular form using elementary row operations. - - The Matrix3x3 to put into upper triangular form. - When the method completes, contains the upper triangular Matrix3x3. - - If the Matrix3x3 is not invertible (i.e. its determinant is zero) than the result of this - method may produce Single.Nan and Single.Inf values. When the Matrix3x3 represents a system - of linear equations, than this often means that either no solution exists or an infinite - number of solutions exist. - - - - - Brings the Matrix3x3 into upper triangular form using elementary row operations. - - The Matrix3x3 to put into upper triangular form. - The upper triangular Matrix3x3. - - If the Matrix3x3 is not invertible (i.e. its determinant is zero) than the result of this - method may produce Single.Nan and Single.Inf values. When the Matrix3x3 represents a system - of linear equations, than this often means that either no solution exists or an infinite - number of solutions exist. - - - - - Brings the Matrix3x3 into lower triangular form using elementary row operations. - - The Matrix3x3 to put into lower triangular form. - When the method completes, contains the lower triangular Matrix3x3. - - If the Matrix3x3 is not invertible (i.e. its determinant is zero) than the result of this - method may produce Single.Nan and Single.Inf values. When the Matrix3x3 represents a system - of linear equations, than this often means that either no solution exists or an infinite - number of solutions exist. - - - - - Brings the Matrix3x3 into lower triangular form using elementary row operations. - - The Matrix3x3 to put into lower triangular form. - The lower triangular Matrix3x3. - - If the Matrix3x3 is not invertible (i.e. its determinant is zero) than the result of this - method may produce Single.Nan and Single.Inf values. When the Matrix3x3 represents a system - of linear equations, than this often means that either no solution exists or an infinite - number of solutions exist. - - - - - Brings the Matrix3x3 into row echelon form using elementary row operations; - - The Matrix3x3 to put into row echelon form. - When the method completes, contains the row echelon form of the Matrix3x3. - - - - Brings the Matrix3x3 into row echelon form using elementary row operations; - - The Matrix3x3 to put into row echelon form. - When the method completes, contains the row echelon form of the Matrix3x3. - - - - Creates a left-handed spherical billboard that rotates around a specified object position. - - The position of the object around which the billboard will rotate. - The position of the camera. - The up vector of the camera. - The forward vector of the camera. - When the method completes, contains the created billboard Matrix3x3. - - - - Creates a left-handed spherical billboard that rotates around a specified object position. - - The position of the object around which the billboard will rotate. - The position of the camera. - The up vector of the camera. - The forward vector of the camera. - The created billboard Matrix3x3. - - - - Creates a right-handed spherical billboard that rotates around a specified object position. - - The position of the object around which the billboard will rotate. - The position of the camera. - The up vector of the camera. - The forward vector of the camera. - When the method completes, contains the created billboard Matrix3x3. - - - - Creates a right-handed spherical billboard that rotates around a specified object position. - - The position of the object around which the billboard will rotate. - The position of the camera. - The up vector of the camera. - The forward vector of the camera. - The created billboard Matrix3x3. - - - - Creates a left-handed, look-at Matrix3x3. - - The position of the viewer's eye. - The camera look-at target. - The camera's up vector. - When the method completes, contains the created look-at Matrix3x3. - - - - Creates a left-handed, look-at Matrix3x3. - - The position of the viewer's eye. - The camera look-at target. - The camera's up vector. - The created look-at Matrix3x3. - - - - Creates a right-handed, look-at Matrix3x3. - - The position of the viewer's eye. - The camera look-at target. - The camera's up vector. - When the method completes, contains the created look-at Matrix3x3. - - - - Creates a right-handed, look-at Matrix3x3. - - The position of the viewer's eye. - The camera look-at target. - The camera's up vector. - The created look-at Matrix3x3. - - - - Creates a Matrix3x3 that scales along the x-axis, y-axis, and y-axis. - - Scaling factor for all three axes. - When the method completes, contains the created scaling Matrix3x3. - - - - Creates a Matrix3x3 that scales along the x-axis, y-axis, and y-axis. - - Scaling factor for all three axes. - The created scaling Matrix3x3. - - - - Creates a Matrix3x3 that scales along the x-axis, y-axis, and y-axis. - - Scaling factor that is applied along the x-axis. - Scaling factor that is applied along the y-axis. - Scaling factor that is applied along the z-axis. - When the method completes, contains the created scaling Matrix3x3. - - - - Creates a Matrix3x3 that scales along the x-axis, y-axis, and y-axis. - - Scaling factor that is applied along the x-axis. - Scaling factor that is applied along the y-axis. - Scaling factor that is applied along the z-axis. - The created scaling Matrix3x3. - - - - Creates a Matrix3x3 that uniformly scales along all three axis. - - The uniform scale that is applied along all axis. - When the method completes, contains the created scaling Matrix3x3. - - - - Creates a Matrix3x3 that uniformly scales along all three axis. - - The uniform scale that is applied along all axis. - The created scaling Matrix3x3. - - - - Creates a Matrix3x3 that rotates around the x-axis. - - Angle of rotation in radians. Angles are measured clockwise when looking along the rotation axis toward the origin. - When the method completes, contains the created rotation Matrix3x3. - - - - Creates a Matrix3x3 that rotates around the x-axis. - - Angle of rotation in radians. Angles are measured clockwise when looking along the rotation axis toward the origin. - The created rotation Matrix3x3. - - - - Creates a Matrix3x3 that rotates around the y-axis. - - Angle of rotation in radians. Angles are measured clockwise when looking along the rotation axis toward the origin. - When the method completes, contains the created rotation Matrix3x3. - - - - Creates a Matrix3x3 that rotates around the y-axis. - - Angle of rotation in radians. Angles are measured clockwise when looking along the rotation axis toward the origin. - The created rotation Matrix3x3. - - - - Creates a Matrix3x3 that rotates around the z-axis. - - Angle of rotation in radians. Angles are measured clockwise when looking along the rotation axis toward the origin. - When the method completes, contains the created rotation Matrix3x3. - - - - Creates a Matrix3x3 that rotates around the z-axis. - - Angle of rotation in radians. Angles are measured clockwise when looking along the rotation axis toward the origin. - The created rotation Matrix3x3. - - - - Creates a Matrix3x3 that rotates around an arbitrary axis. - - The axis around which to rotate. This parameter is assumed to be normalized. - Angle of rotation in radians. Angles are measured clockwise when looking along the rotation axis toward the origin. - When the method completes, contains the created rotation Matrix3x3. - - - - Creates a Matrix3x3 that rotates around an arbitrary axis. - - The axis around which to rotate. This parameter is assumed to be normalized. - Angle of rotation in radians. Angles are measured clockwise when looking along the rotation axis toward the origin. - The created rotation Matrix3x3. - - - - Creates a rotation Matrix3x3 from a quaternion. - - The quaternion to use to build the Matrix3x3. - The created rotation Matrix3x3. - - - - Creates a rotation Matrix3x3 from a quaternion. - - The quaternion to use to build the Matrix3x3. - The created rotation Matrix3x3. - - - - Creates a rotation Matrix3x3 with a specified yaw, pitch, and roll. - - Yaw around the y-axis, in radians. - Pitch around the x-axis, in radians. - Roll around the z-axis, in radians. - When the method completes, contains the created rotation Matrix3x3. - - - - Creates a rotation Matrix3x3 with a specified yaw, pitch, and roll. - - Yaw around the y-axis, in radians. - Pitch around the x-axis, in radians. - Roll around the z-axis, in radians. - The created rotation Matrix3x3. - - - - Adds two matrices. - - The first Matrix3x3 to add. - The second Matrix3x3 to add. - The sum of the two matrices. - - - - Assert a Matrix3x3 (return it unchanged). - - The Matrix3x3 to assert (unchanged). - The asserted (unchanged) Matrix3x3. - - - - Subtracts two matrices. - - The first Matrix3x3 to subtract. - The second Matrix3x3 to subtract. - The difference between the two matrices. - - - - Negates a Matrix3x3. - - The Matrix3x3 to negate. - The negated Matrix3x3. - - - - Scales a Matrix3x3 by a given value. - - The Matrix3x3 to scale. - The amount by which to scale. - The scaled Matrix3x3. - - - - Scales a Matrix3x3 by a given value. - - The Matrix3x3 to scale. - The amount by which to scale. - The scaled Matrix3x3. - - - - Multiplies two matrices. - - The first Matrix3x3 to multiply. - The second Matrix3x3 to multiply. - The product of the two matrices. - - - - Scales a Matrix3x3 by a given value. - - The Matrix3x3 to scale. - The amount by which to scale. - The scaled Matrix3x3. - - - - Divides two matrices. - - The first Matrix3x3 to divide. - The second Matrix3x3 to divide. - The quotient of the two matrices. - - - - Tests for equality between two objects. - - The first value to compare. - The second value to compare. - true if has the same value as ; otherwise, false. - - - - Tests for inequality between two objects. - - The first value to compare. - The second value to compare. - true if has a different value than ; otherwise, false. - - - - Convert the 3x3 Matrix to a 4x4 Matrix. - - A 4x4 Matrix with zero translation and M44=1 - - - - Convert the 4x4 Matrix to a 3x3 Matrix. - - A 3x3 Matrix - - - - Returns a that represents this instance. - - - A that represents this instance. - - - - - Returns a that represents this instance. - - The format. - - A that represents this instance. - - - - - Returns a that represents this instance. - - The format provider. - - A that represents this instance. - - - - - Returns a that represents this instance. - - The format. - The format provider. - - A that represents this instance. - - - - - Returns a hash code for this instance. - - - A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. - - - - - Determines whether the specified is equal to this instance. - - The to compare with this instance. - - true if the specified is equal to this instance; otherwise, false. - - - - - Determines whether the specified is equal to this instance. - - The to compare with this instance. - - true if the specified is equal to this instance; otherwise, false. - - - - - Determines whether the specified are equal. - - - - - Determines whether the specified is equal to this instance. - - The to compare with this instance. - - true if the specified is equal to this instance; otherwise, false. - - - - - Represents a four dimensional mathematical quaternion. - - - - - A with all of its components set to zero. - - - - - A with all of its components set to one. - - - - - The identity (0, 0, 0, 1). - - - - - The X component of the quaternion. - - - - - The Y component of the quaternion. - - - - - The Z component of the quaternion. - - - - - The W component of the quaternion. - - - - - Initializes a new instance of the struct. - - The value that will be assigned to all components. - - - - Initializes a new instance of the struct. - - A vector containing the values with which to initialize the components. - - - - Initializes a new instance of the struct. - - A vector containing the values with which to initialize the X, Y, and Z components. - Initial value for the W component of the quaternion. - - - - Initializes a new instance of the struct. - - A vector containing the values with which to initialize the X and Y components. - Initial value for the Z component of the quaternion. - Initial value for the W component of the quaternion. - - - - Initializes a new instance of the struct. - - Initial value for the X component of the quaternion. - Initial value for the Y component of the quaternion. - Initial value for the Z component of the quaternion. - Initial value for the W component of the quaternion. - - - - Initializes a new instance of the struct. - - The values to assign to the X, Y, Z, and W components of the quaternion. This must be an array with four elements. - Thrown when is null. - Thrown when contains more or less than four elements. - - - - Gets a value indicating whether this instance is equivalent to the identity quaternion. - - - true if this instance is an identity quaternion; otherwise, false. - - - - - Gets a value indicting whether this instance is normalized. - - - - - Gets the angle of the quaternion. - - The quaternion's angle. - - - - Gets the axis components of the quaternion. - - The axis components of the quaternion. - - - - Gets or sets the component at the specified index. - - The value of the X, Y, Z, or W component, depending on the index. - The index of the component to access. Use 0 for the X component, 1 for the Y component, 2 for the Z component, and 3 for the W component. - The value of the component at the specified index. - Thrown when the is out of the range [0, 3]. - - - - Conjugates the quaternion. - - - - - Conjugates and renormalizes the quaternion. - - - - - Calculates the length of the quaternion. - - The length of the quaternion. - - may be preferred when only the relative length is needed - and speed is of the essence. - - - - - Calculates the squared length of the quaternion. - - The squared length of the quaternion. - - This method may be preferred to when only a relative length is needed - and speed is of the essence. - - - - - Converts the quaternion into a unit quaternion. - - - - - Creates an array containing the elements of the quaternion. - - A four-element array containing the components of the quaternion. - - - - Adds two quaternions. - - The first quaternion to add. - The second quaternion to add. - When the method completes, contains the sum of the two quaternions. - - - - Adds two quaternions. - - The first quaternion to add. - The second quaternion to add. - The sum of the two quaternions. - - - - Subtracts two quaternions. - - The first quaternion to subtract. - The second quaternion to subtract. - When the method completes, contains the difference of the two quaternions. - - - - Subtracts two quaternions. - - The first quaternion to subtract. - The second quaternion to subtract. - The difference of the two quaternions. - - - - Scales a quaternion by the given value. - - The quaternion to scale. - The amount by which to scale the quaternion. - When the method completes, contains the scaled quaternion. - - - - Scales a quaternion by the given value. - - The quaternion to scale. - The amount by which to scale the quaternion. - The scaled quaternion. - - - - Multiplies a quaternion by another. - - The first quaternion to multiply. - The second quaternion to multiply. - When the method completes, contains the multiplied quaternion. - - - - Multiplies a quaternion by another. - - The first quaternion to multiply. - The second quaternion to multiply. - The multiplied quaternion. - - - - Reverses the direction of a given quaternion. - - The quaternion to negate. - When the method completes, contains a quaternion facing in the opposite direction. - - - - Reverses the direction of a given quaternion. - - The quaternion to negate. - A quaternion facing in the opposite direction. - - - - Returns a containing the 4D Cartesian coordinates of a point specified in Barycentric coordinates relative to a 2D triangle. - - A containing the 4D Cartesian coordinates of vertex 1 of the triangle. - A containing the 4D Cartesian coordinates of vertex 2 of the triangle. - A containing the 4D Cartesian coordinates of vertex 3 of the triangle. - Barycentric coordinate b2, which expresses the weighting factor toward vertex 2 (specified in ). - Barycentric coordinate b3, which expresses the weighting factor toward vertex 3 (specified in ). - When the method completes, contains a new containing the 4D Cartesian coordinates of the specified point. - - - - Returns a containing the 4D Cartesian coordinates of a point specified in Barycentric coordinates relative to a 2D triangle. - - A containing the 4D Cartesian coordinates of vertex 1 of the triangle. - A containing the 4D Cartesian coordinates of vertex 2 of the triangle. - A containing the 4D Cartesian coordinates of vertex 3 of the triangle. - Barycentric coordinate b2, which expresses the weighting factor toward vertex 2 (specified in ). - Barycentric coordinate b3, which expresses the weighting factor toward vertex 3 (specified in ). - A new containing the 4D Cartesian coordinates of the specified point. - - - - Conjugates a quaternion. - - The quaternion to conjugate. - When the method completes, contains the conjugated quaternion. - - - - Conjugates a quaternion. - - The quaternion to conjugate. - The conjugated quaternion. - - - - Calculates the dot product of two quaternions. - - First source quaternion. - Second source quaternion. - When the method completes, contains the dot product of the two quaternions. - - - - Calculates the dot product of two quaternions. - - First source quaternion. - Second source quaternion. - The dot product of the two quaternions. - - - - Exponentiates a quaternion. - - The quaternion to exponentiate. - When the method completes, contains the exponentiated quaternion. - - - - Exponentiates a quaternion. - - The quaternion to exponentiate. - The exponentiated quaternion. - - - - Conjugates and renormalizes the quaternion. - - The quaternion to conjugate and renormalize. - When the method completes, contains the conjugated and renormalized quaternion. - - - - Conjugates and renormalizes the quaternion. - - The quaternion to conjugate and renormalize. - The conjugated and renormalized quaternion. - - - - Performs a linear interpolation between two quaternions. - - Start quaternion. - End quaternion. - Value between 0 and 1 indicating the weight of . - When the method completes, contains the linear interpolation of the two quaternions. - - This method performs the linear interpolation based on the following formula. - start + (end - start) * amount - Passing a value of 0 will cause to be returned; a value of 1 will cause to be returned. - - - - - Performs a linear interpolation between two quaternion. - - Start quaternion. - End quaternion. - Value between 0 and 1 indicating the weight of . - The linear interpolation of the two quaternions. - - This method performs the linear interpolation based on the following formula. - start + (end - start) * amount - Passing a value of 0 will cause to be returned; a value of 1 will cause to be returned. - - - - - Calculates the natural logarithm of the specified quaternion. - - The quaternion whose logarithm will be calculated. - When the method completes, contains the natural logarithm of the quaternion. - - - - Calculates the natural logarithm of the specified quaternion. - - The quaternion whose logarithm will be calculated. - The natural logarithm of the quaternion. - - - - Converts the quaternion into a unit quaternion. - - The quaternion to normalize. - When the method completes, contains the normalized quaternion. - - - - Converts the quaternion into a unit quaternion. - - The quaternion to normalize. - The normalized quaternion. - - - - Creates a quaternion given a rotation and an axis. - - The axis of rotation. - The angle of rotation. - When the method completes, contains the newly created quaternion. - - - - Creates a quaternion given a rotation and an axis. - - The axis of rotation. - The angle of rotation. - The newly created quaternion. - - - - Creates a quaternion given a rotation matrix. - - The rotation matrix. - When the method completes, contains the newly created quaternion. - - - - Creates a quaternion given a rotation matrix. - - The rotation matrix. - When the method completes, contains the newly created quaternion. - - - - Creates a left-handed, look-at quaternion. - - The position of the viewer's eye. - The camera look-at target. - The camera's up vector. - When the method completes, contains the created look-at quaternion. - - - - Creates a left-handed, look-at quaternion. - - The position of the viewer's eye. - The camera look-at target. - The camera's up vector. - The created look-at quaternion. - - - - Creates a left-handed, look-at quaternion. - - The camera's forward direction. - The camera's up vector. - When the method completes, contains the created look-at quaternion. - - - - Creates a left-handed, look-at quaternion. - - The camera's forward direction. - The camera's up vector. - The created look-at quaternion. - - - - Creates a right-handed, look-at quaternion. - - The position of the viewer's eye. - The camera look-at target. - The camera's up vector. - When the method completes, contains the created look-at quaternion. - - - - Creates a right-handed, look-at quaternion. - - The position of the viewer's eye. - The camera look-at target. - The camera's up vector. - The created look-at quaternion. - - - - Creates a right-handed, look-at quaternion. - - The camera's forward direction. - The camera's up vector. - When the method completes, contains the created look-at quaternion. - - - - Creates a right-handed, look-at quaternion. - - The camera's forward direction. - The camera's up vector. - The created look-at quaternion. - - - - Creates a left-handed spherical billboard that rotates around a specified object position. - - The position of the object around which the billboard will rotate. - The position of the camera. - The up vector of the camera. - The forward vector of the camera. - When the method completes, contains the created billboard quaternion. - - - - Creates a left-handed spherical billboard that rotates around a specified object position. - - The position of the object around which the billboard will rotate. - The position of the camera. - The up vector of the camera. - The forward vector of the camera. - The created billboard quaternion. - - - - Creates a right-handed spherical billboard that rotates around a specified object position. - - The position of the object around which the billboard will rotate. - The position of the camera. - The up vector of the camera. - The forward vector of the camera. - When the method completes, contains the created billboard quaternion. - - - - Creates a right-handed spherical billboard that rotates around a specified object position. - - The position of the object around which the billboard will rotate. - The position of the camera. - The up vector of the camera. - The forward vector of the camera. - The created billboard quaternion. - - - - Creates a quaternion given a rotation matrix. - - The rotation matrix. - The newly created quaternion. - - - - Creates a quaternion given a yaw, pitch, and roll value. - - The yaw of rotation. - The pitch of rotation. - The roll of rotation. - When the method completes, contains the newly created quaternion. - - - - Creates a quaternion given a yaw, pitch, and roll value. - - The yaw of rotation. - The pitch of rotation. - The roll of rotation. - The newly created quaternion. - - - - Interpolates between two quaternions, using spherical linear interpolation. - - Start quaternion. - End quaternion. - Value between 0 and 1 indicating the weight of . - When the method completes, contains the spherical linear interpolation of the two quaternions. - - - - Interpolates between two quaternions, using spherical linear interpolation. - - Start quaternion. - End quaternion. - Value between 0 and 1 indicating the weight of . - The spherical linear interpolation of the two quaternions. - - - - Interpolates between quaternions, using spherical quadrangle interpolation. - - First source quaternion. - Second source quaternion. - Third source quaternion. - Fourth source quaternion. - Value between 0 and 1 indicating the weight of interpolation. - When the method completes, contains the spherical quadrangle interpolation of the quaternions. - - - - Interpolates between quaternions, using spherical quadrangle interpolation. - - First source quaternion. - Second source quaternion. - Third source quaternion. - Fourth source quaternion. - Value between 0 and 1 indicating the weight of interpolation. - The spherical quadrangle interpolation of the quaternions. - - - - Sets up control points for spherical quadrangle interpolation. - - First source quaternion. - Second source quaternion. - Third source quaternion. - Fourth source quaternion. - An array of three quaternions that represent control points for spherical quadrangle interpolation. - - - - Adds two quaternions. - - The first quaternion to add. - The second quaternion to add. - The sum of the two quaternions. - - - - Subtracts two quaternions. - - The first quaternion to subtract. - The second quaternion to subtract. - The difference of the two quaternions. - - - - Reverses the direction of a given quaternion. - - The quaternion to negate. - A quaternion facing in the opposite direction. - - - - Scales a quaternion by the given value. - - The quaternion to scale. - The amount by which to scale the quaternion. - The scaled quaternion. - - - - Scales a quaternion by the given value. - - The quaternion to scale. - The amount by which to scale the quaternion. - The scaled quaternion. - - - - Multiplies a quaternion by another. - - The first quaternion to multiply. - The second quaternion to multiply. - The multiplied quaternion. - - - - Tests for equality between two objects. - - The first value to compare. - The second value to compare. - true if has the same value as ; otherwise, false. - - - - Tests for inequality between two objects. - - The first value to compare. - The second value to compare. - true if has a different value than ; otherwise, false. - - - - Returns a that represents this instance. - - - A that represents this instance. - - - - - Returns a that represents this instance. - - The format. - - A that represents this instance. - - - - - Returns a that represents this instance. - - The format provider. - - A that represents this instance. - - - - - Returns a that represents this instance. - - The format. - The format provider. - - A that represents this instance. - - - - - Returns a hash code for this instance. - - - A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. - - - - - Determines whether the specified is equal to this instance. - - The to compare with this instance. - - true if the specified is equal to this instance; otherwise, false. - - - - - Determines whether the specified is equal to this instance. - - The to compare with this instance. - - true if the specified is equal to this instance; otherwise, false. - - - - - Determines whether the specified is equal to this instance. - - The to compare with this instance. - - true if the specified is equal to this instance; otherwise, false. - - - - - Represents a two dimensional mathematical vector. - - - - - A with all of its components set to zero. - - - - - The X unit (1, 0). - - - - - The Y unit (0, 1). - - - - - A with all of its components set to one. - - - - - The X component of the vector. - - - - - The Y component of the vector. - - - - - Initializes a new instance of the struct. - - The value that will be assigned to all components. - - - - Initializes a new instance of the struct. - - Initial value for the X component of the vector. - Initial value for the Y component of the vector. - - - - Initializes a new instance of the struct. - - The values to assign to the X and Y components of the vector. This must be an array with two elements. - Thrown when is null. - Thrown when contains more or less than two elements. - - - - Gets a value indicting whether this instance is normalized. - - - - - Gets a value indicting whether this vector is zero - - - - - Gets or sets the component at the specified index. - - The value of the X or Y component, depending on the index. - The index of the component to access. Use 0 for the X component and 1 for the Y component. - The value of the component at the specified index. - Thrown when the is out of the range [0, 1]. - - - - Calculates the length of the vector. - - The length of the vector. - - may be preferred when only the relative length is needed - and speed is of the essence. - - - - - Calculates the squared length of the vector. - - The squared length of the vector. - - This method may be preferred to when only a relative length is needed - and speed is of the essence. - - - - - Converts the vector into a unit vector. - - - - - Creates an array containing the elements of the vector. - - A two-element array containing the components of the vector. - - - - Adds two vectors. - - The first vector to add. - The second vector to add. - When the method completes, contains the sum of the two vectors. - - - - Adds two vectors. - - The first vector to add. - The second vector to add. - The sum of the two vectors. - - - - Perform a component-wise addition - - The input vector - The scalar value to be added to elements - The vector with added scalar for each element. - - - - Perform a component-wise addition - - The input vector - The scalar value to be added to elements - The vector with added scalar for each element. - - - - Subtracts two vectors. - - The first vector to subtract. - The second vector to subtract. - When the method completes, contains the difference of the two vectors. - - - - Subtracts two vectors. - - The first vector to subtract. - The second vector to subtract. - The difference of the two vectors. - - - - Perform a component-wise subtraction - - The input vector - The scalar value to be subtraced from elements - The vector with subtracted scalar for each element. - - - - Perform a component-wise subtraction - - The input vector - The scalar value to be subtraced from elements - The vector with subtracted scalar for each element. - - - - Perform a component-wise subtraction - - The scalar value to be subtraced from elements - The input vector - The vector with subtracted scalar for each element. - - - - Perform a component-wise subtraction - - The scalar value to be subtraced from elements - The input vector - The vector with subtracted scalar for each element. - - - - Scales a vector by the given value. - - The vector to scale. - The amount by which to scale the vector. - When the method completes, contains the scaled vector. - - - - Scales a vector by the given value. - - The vector to scale. - The amount by which to scale the vector. - The scaled vector. - - - - Multiplies a vector with another by performing component-wise multiplication. - - The first vector to multiply. - The second vector to multiply. - When the method completes, contains the multiplied vector. - - - - Multiplies a vector with another by performing component-wise multiplication. - - The first vector to multiply. - The second vector to multiply. - The multiplied vector. - - - - Scales a vector by the given value. - - The vector to scale. - The amount by which to scale the vector. - When the method completes, contains the scaled vector. - - - - Scales a vector by the given value. - - The vector to scale. - The amount by which to scale the vector. - The scaled vector. - - - - Scales a vector by the given value. - - The amount by which to scale the vector. - The vector to scale. - When the method completes, contains the scaled vector. - - - - Scales a vector by the given value. - - The vector to scale. - The amount by which to scale the vector. - The scaled vector. - - - - Reverses the direction of a given vector. - - The vector to negate. - When the method completes, contains a vector facing in the opposite direction. - - - - Reverses the direction of a given vector. - - The vector to negate. - A vector facing in the opposite direction. - - - - Returns a containing the 2D Cartesian coordinates of a point specified in Barycentric coordinates relative to a 2D triangle. - - A containing the 2D Cartesian coordinates of vertex 1 of the triangle. - A containing the 2D Cartesian coordinates of vertex 2 of the triangle. - A containing the 2D Cartesian coordinates of vertex 3 of the triangle. - Barycentric coordinate b2, which expresses the weighting factor toward vertex 2 (specified in ). - Barycentric coordinate b3, which expresses the weighting factor toward vertex 3 (specified in ). - When the method completes, contains the 2D Cartesian coordinates of the specified point. - - - - Returns a containing the 2D Cartesian coordinates of a point specified in Barycentric coordinates relative to a 2D triangle. - - A containing the 2D Cartesian coordinates of vertex 1 of the triangle. - A containing the 2D Cartesian coordinates of vertex 2 of the triangle. - A containing the 2D Cartesian coordinates of vertex 3 of the triangle. - Barycentric coordinate b2, which expresses the weighting factor toward vertex 2 (specified in ). - Barycentric coordinate b3, which expresses the weighting factor toward vertex 3 (specified in ). - A new containing the 2D Cartesian coordinates of the specified point. - - - - Restricts a value to be within a specified range. - - The value to clamp. - The minimum value. - The maximum value. - When the method completes, contains the clamped value. - - - - Restricts a value to be within a specified range. - - The value to clamp. - The minimum value. - The maximum value. - The clamped value. - - - - Saturates this instance in the range [0,1] - - - - - Calculates the distance between two vectors. - - The first vector. - The second vector. - When the method completes, contains the distance between the two vectors. - - may be preferred when only the relative distance is needed - and speed is of the essence. - - - - - Calculates the distance between two vectors. - - The first vector. - The second vector. - The distance between the two vectors. - - may be preferred when only the relative distance is needed - and speed is of the essence. - - - - - Calculates the squared distance between two vectors. - - The first vector. - The second vector - When the method completes, contains the squared distance between the two vectors. - Distance squared is the value before taking the square root. - Distance squared can often be used in place of distance if relative comparisons are being made. - For example, consider three points A, B, and C. To determine whether B or C is further from A, - compare the distance between A and B to the distance between A and C. Calculating the two distances - involves two square roots, which are computationally expensive. However, using distance squared - provides the same information and avoids calculating two square roots. - - - - - Calculates the squared distance between two vectors. - - The first vector. - The second vector. - The squared distance between the two vectors. - Distance squared is the value before taking the square root. - Distance squared can often be used in place of distance if relative comparisons are being made. - For example, consider three points A, B, and C. To determine whether B or C is further from A, - compare the distance between A and B to the distance between A and C. Calculating the two distances - involves two square roots, which are computationally expensive. However, using distance squared - provides the same information and avoids calculating two square roots. - - - - - Calculates the dot product of two vectors. - - First source vector. - Second source vector. - When the method completes, contains the dot product of the two vectors. - - - - Calculates the dot product of two vectors. - - First source vector. - Second source vector. - The dot product of the two vectors. - - - - Converts the vector into a unit vector. - - The vector to normalize. - When the method completes, contains the normalized vector. - - - - Converts the vector into a unit vector. - - The vector to normalize. - The normalized vector. - - - - Performs a linear interpolation between two vectors. - - Start vector. - End vector. - Value between 0 and 1 indicating the weight of . - When the method completes, contains the linear interpolation of the two vectors. - - Passing a value of 0 will cause to be returned; a value of 1 will cause to be returned. - - - - - Performs a linear interpolation between two vectors. - - Start vector. - End vector. - Value between 0 and 1 indicating the weight of . - The linear interpolation of the two vectors. - - Passing a value of 0 will cause to be returned; a value of 1 will cause to be returned. - - - - - Performs a cubic interpolation between two vectors. - - Start vector. - End vector. - Value between 0 and 1 indicating the weight of . - When the method completes, contains the cubic interpolation of the two vectors. - - - - Performs a cubic interpolation between two vectors. - - Start vector. - End vector. - Value between 0 and 1 indicating the weight of . - The cubic interpolation of the two vectors. - - - - Performs a Hermite spline interpolation. - - First source position vector. - First source tangent vector. - Second source position vector. - Second source tangent vector. - Weighting factor. - When the method completes, contains the result of the Hermite spline interpolation. - - - - Performs a Hermite spline interpolation. - - First source position vector. - First source tangent vector. - Second source position vector. - Second source tangent vector. - Weighting factor. - The result of the Hermite spline interpolation. - - - - Performs a Catmull-Rom interpolation using the specified positions. - - The first position in the interpolation. - The second position in the interpolation. - The third position in the interpolation. - The fourth position in the interpolation. - Weighting factor. - When the method completes, contains the result of the Catmull-Rom interpolation. - - - - Performs a Catmull-Rom interpolation using the specified positions. - - The first position in the interpolation. - The second position in the interpolation. - The third position in the interpolation. - The fourth position in the interpolation. - Weighting factor. - A vector that is the result of the Catmull-Rom interpolation. - - - - Returns a vector containing the largest components of the specified vectors. - - The first source vector. - The second source vector. - When the method completes, contains an new vector composed of the largest components of the source vectors. - - - - Returns a vector containing the largest components of the specified vectors. - - The first source vector. - The second source vector. - A vector containing the largest components of the source vectors. - - - - Returns a vector containing the smallest components of the specified vectors. - - The first source vector. - The second source vector. - When the method completes, contains an new vector composed of the smallest components of the source vectors. - - - - Returns a vector containing the smallest components of the specified vectors. - - The first source vector. - The second source vector. - A vector containing the smallest components of the source vectors. - - - - Returns the reflection of a vector off a surface that has the specified normal. - - The source vector. - Normal of the surface. - When the method completes, contains the reflected vector. - Reflect only gives the direction of a reflection off a surface, it does not determine - whether the original vector was close enough to the surface to hit it. - - - - Returns the reflection of a vector off a surface that has the specified normal. - - The source vector. - Normal of the surface. - The reflected vector. - Reflect only gives the direction of a reflection off a surface, it does not determine - whether the original vector was close enough to the surface to hit it. - - - - Orthogonalizes a list of vectors. - - The list of orthogonalized vectors. - The list of vectors to orthogonalize. - - Orthogonalization is the process of making all vectors orthogonal to each other. This - means that any given vector in the list will be orthogonal to any other given vector in the - list. - Because this method uses the modified Gram-Schmidt process, the resulting vectors - tend to be numerically unstable. The numeric stability decreases according to the vectors - position in the list so that the first vector is the most stable and the last vector is the - least stable. - - Thrown when or is null. - Thrown when is shorter in length than . - - - - Orthonormalizes a list of vectors. - - The list of orthonormalized vectors. - The list of vectors to orthonormalize. - - Orthonormalization is the process of making all vectors orthogonal to each - other and making all vectors of unit length. This means that any given vector will - be orthogonal to any other given vector in the list. - Because this method uses the modified Gram-Schmidt process, the resulting vectors - tend to be numerically unstable. The numeric stability decreases according to the vectors - position in the list so that the first vector is the most stable and the last vector is the - least stable. - - Thrown when or is null. - Thrown when is shorter in length than . - - - - Transforms a 2D vector by the given rotation. - - The vector to rotate. - The rotation to apply. - When the method completes, contains the transformed . - - - - Transforms a 2D vector by the given rotation. - - The vector to rotate. - The rotation to apply. - The transformed . - - - - Transforms an array of vectors by the given rotation. - - The array of vectors to transform. - The rotation to apply. - The array for which the transformed vectors are stored. - This array may be the same array as . - Thrown when or is null. - Thrown when is shorter in length than . - - - - Transforms a 2D vector by the given . - - The source vector. - The transformation . - When the method completes, contains the transformed . - - - - Transforms a 2D vector by the given . - - The source vector. - The transformation . - The transformed . - - - - Transforms an array of 2D vectors by the given . - - The array of vectors to transform. - The transformation . - The array for which the transformed vectors are stored. - Thrown when or is null. - Thrown when is shorter in length than . - - - - Performs a coordinate transformation using the given . - - The coordinate vector to transform. - The transformation . - When the method completes, contains the transformed coordinates. - - A coordinate transform performs the transformation with the assumption that the w component - is one. The four dimensional vector obtained from the transformation operation has each - component in the vector divided by the w component. This forces the w component to be one and - therefore makes the vector homogeneous. The homogeneous vector is often preferred when working - with coordinates as the w component can safely be ignored. - - - - - Performs a coordinate transformation using the given . - - The coordinate vector to transform. - The transformation . - The transformed coordinates. - - A coordinate transform performs the transformation with the assumption that the w component - is one. The four dimensional vector obtained from the transformation operation has each - component in the vector divided by the w component. This forces the w component to be one and - therefore makes the vector homogeneous. The homogeneous vector is often preferred when working - with coordinates as the w component can safely be ignored. - - - - - Performs a coordinate transformation on an array of vectors using the given . - - The array of coordinate vectors to transform. - The transformation . - The array for which the transformed vectors are stored. - This array may be the same array as . - Thrown when or is null. - Thrown when is shorter in length than . - - A coordinate transform performs the transformation with the assumption that the w component - is one. The four dimensional vector obtained from the transformation operation has each - component in the vector divided by the w component. This forces the w component to be one and - therefore makes the vector homogeneous. The homogeneous vector is often preferred when working - with coordinates as the w component can safely be ignored. - - - - - Performs a normal transformation using the given . - - The normal vector to transform. - The transformation . - When the method completes, contains the transformed normal. - - A normal transform performs the transformation with the assumption that the w component - is zero. This causes the fourth row and fourth column of the matrix to be unused. The - end result is a vector that is not translated, but all other transformation properties - apply. This is often preferred for normal vectors as normals purely represent direction - rather than location because normal vectors should not be translated. - - - - - Performs a normal transformation using the given . - - The normal vector to transform. - The transformation . - The transformed normal. - - A normal transform performs the transformation with the assumption that the w component - is zero. This causes the fourth row and fourth column of the matrix to be unused. The - end result is a vector that is not translated, but all other transformation properties - apply. This is often preferred for normal vectors as normals purely represent direction - rather than location because normal vectors should not be translated. - - - - - Performs a normal transformation on an array of vectors using the given . - - The array of normal vectors to transform. - The transformation . - The array for which the transformed vectors are stored. - This array may be the same array as . - Thrown when or is null. - Thrown when is shorter in length than . - - A normal transform performs the transformation with the assumption that the w component - is zero. This causes the fourth row and fourth column of the matrix to be unused. The - end result is a vector that is not translated, but all other transformation properties - apply. This is often preferred for normal vectors as normals purely represent direction - rather than location because normal vectors should not be translated. - - - - - Adds two vectors. - - The first vector to add. - The second vector to add. - The sum of the two vectors. - - - - Multiplies a vector with another by performing component-wise multiplication equivalent to . - - The first vector to multiply. - The second vector to multiply. - The multiplication of the two vectors. - - - - Assert a vector (return it unchanged). - - The vector to assert (unchanged). - The asserted (unchanged) vector. - - - - Subtracts two vectors. - - The first vector to subtract. - The second vector to subtract. - The difference of the two vectors. - - - - Reverses the direction of a given vector. - - The vector to negate. - A vector facing in the opposite direction. - - - - Scales a vector by the given value. - - The vector to scale. - The amount by which to scale the vector. - The scaled vector. - - - - Scales a vector by the given value. - - The vector to scale. - The amount by which to scale the vector. - The scaled vector. - - - - Scales a vector by the given value. - - The vector to scale. - The amount by which to scale the vector. - The scaled vector. - - - - Scales a vector by the given value. - - The amount by which to scale the vector. - The vector to scale. - The scaled vector. - - - - Scales a vector by the given value. - - The vector to scale. - The amount by which to scale the vector. - The scaled vector. - - - - Perform a component-wise addition - - The input vector. - The scalar value to be added on elements - The vector with added scalar for each element. - - - - Perform a component-wise addition - - The input vector. - The scalar value to be added on elements - The vector with added scalar for each element. - - - - Perform a component-wise subtraction - - The input vector. - The scalar value to be subtraced from elements - The vector with subtraced scalar from each element. - - - - Perform a component-wise subtraction - - The input vector. - The scalar value to be subtraced from elements - The vector with subtraced scalar from each element. - - - - Tests for equality between two objects. - - The first value to compare. - The second value to compare. - true if has the same value as ; otherwise, false. - - - - Tests for inequality between two objects. - - The first value to compare. - The second value to compare. - true if has a different value than ; otherwise, false. - - - - Performs an explicit conversion from to . - - The value. - The result of the conversion. - - - - Performs an explicit conversion from to . - - The value. - The result of the conversion. - - - - Returns a that represents this instance. - - - A that represents this instance. - - - - - Returns a that represents this instance. - - The format. - - A that represents this instance. - - - - - Returns a that represents this instance. - - The format provider. - - A that represents this instance. - - - - - Returns a that represents this instance. - - The format. - The format provider. - - A that represents this instance. - - - - - Returns a hash code for this instance. - - - A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. - - - - - Determines whether the specified is equal to this instance. - - The to compare with this instance. - - true if the specified is equal to this instance; otherwise, false. - - - - - Determines whether the specified is equal to this instance. - - The to compare with this instance. - - true if the specified is equal to this instance; otherwise, false. - - - - - Determines whether the specified is equal to this instance. - - The to compare with this instance. - - true if the specified is equal to this instance; otherwise, false. - - - - - Represents a three dimensional mathematical vector. - - - - - A with all of its components set to zero. - - - - - The X unit (1, 0, 0). - - - - - The Y unit (0, 1, 0). - - - - - The Z unit (0, 0, 1). - - - - - A with all of its components set to one. - - - - - A unit designating up (0, 1, 0). - - - - - A unit designating down (0, -1, 0). - - - - - A unit designating left (-1, 0, 0). - - - - - A unit designating right (1, 0, 0). - - - - - A unit designating forward in a right-handed coordinate system (0, 0, -1). - - - - - A unit designating forward in a left-handed coordinate system (0, 0, 1). - - - - - A unit designating backward in a right-handed coordinate system (0, 0, 1). - - - - - A unit designating backward in a left-handed coordinate system (0, 0, -1). - - - - - The X component of the vector. - - - - - The Y component of the vector. - - - - - The Z component of the vector. - - - - - Initializes a new instance of the struct. - - The value that will be assigned to all components. - - - - Initializes a new instance of the struct. - - Initial value for the X component of the vector. - Initial value for the Y component of the vector. - Initial value for the Z component of the vector. - - - - Initializes a new instance of the struct. - - A vector containing the values with which to initialize the X and Y components. - Initial value for the Z component of the vector. - - - - Initializes a new instance of the struct. - - The values to assign to the X, Y, and Z components of the vector. This must be an array with three elements. - Thrown when is null. - Thrown when contains more or less than three elements. - - - - Gets a value indicting whether this instance is normalized. - - - - - Gets a value indicting whether this vector is zero - - - - - Gets or sets the component at the specified index. - - The value of the X, Y, or Z component, depending on the index. - The index of the component to access. Use 0 for the X component, 1 for the Y component, and 2 for the Z component. - The value of the component at the specified index. - Thrown when the is out of the range [0, 2]. - - - - Calculates the length of the vector. - - The length of the vector. - - may be preferred when only the relative length is needed - and speed is of the essence. - - - - - Calculates the squared length of the vector. - - The squared length of the vector. - - This method may be preferred to when only a relative length is needed - and speed is of the essence. - - - - - Converts the vector into a unit vector. - - - - - Creates an array containing the elements of the vector. - - A three-element array containing the components of the vector. - - - - Adds two vectors. - - The first vector to add. - The second vector to add. - When the method completes, contains the sum of the two vectors. - - - - Adds two vectors. - - The first vector to add. - The second vector to add. - The sum of the two vectors. - - - - Perform a component-wise addition - - The input vector - The scalar value to be added to elements - The vector with added scalar for each element. - - - - Perform a component-wise addition - - The input vector - The scalar value to be added to elements - The vector with added scalar for each element. - - - - Subtracts two vectors. - - The first vector to subtract. - The second vector to subtract. - When the method completes, contains the difference of the two vectors. - - - - Subtracts two vectors. - - The first vector to subtract. - The second vector to subtract. - The difference of the two vectors. - - - - Perform a component-wise subtraction - - The input vector - The scalar value to be subtraced from elements - The vector with subtracted scalar for each element. - - - - Perform a component-wise subtraction - - The input vector - The scalar value to be subtraced from elements - The vector with subtracted scalar for each element. - - - - Perform a component-wise subtraction - - The scalar value to be subtraced from elements - The input vector. - The vector with subtracted scalar for each element. - - - - Perform a component-wise subtraction - - The scalar value to be subtraced from elements - The input vector. - The vector with subtracted scalar for each element. - - - - Scales a vector by the given value. - - The vector to scale. - The amount by which to scale the vector. - When the method completes, contains the scaled vector. - - - - Scales a vector by the given value. - - The vector to scale. - The amount by which to scale the vector. - The scaled vector. - - - - Multiply a vector with another by performing component-wise multiplication. - - The first vector to multiply. - The second vector to multiply. - When the method completes, contains the multiplied vector. - - - - Multiply a vector with another by performing component-wise multiplication. - - The first vector to Multiply. - The second vector to multiply. - The multiplied vector. - - - - Scales a vector by the given value. - - The vector to scale. - The amount by which to scale the vector. - When the method completes, contains the scaled vector. - - - - Scales a vector by the given value. - - The vector to scale. - The amount by which to scale the vector. - The scaled vector. - - - - Scales a vector by the given value. - - The amount by which to scale the vector. - The vector to scale. - When the method completes, contains the scaled vector. - - - - Scales a vector by the given value. - - The vector to scale. - The amount by which to scale the vector. - The scaled vector. - - - - Reverses the direction of a given vector. - - The vector to negate. - When the method completes, contains a vector facing in the opposite direction. - - - - Reverses the direction of a given vector. - - The vector to negate. - A vector facing in the opposite direction. - - - - Returns a containing the 3D Cartesian coordinates of a point specified in Barycentric coordinates relative to a 3D triangle. - - A containing the 3D Cartesian coordinates of vertex 1 of the triangle. - A containing the 3D Cartesian coordinates of vertex 2 of the triangle. - A containing the 3D Cartesian coordinates of vertex 3 of the triangle. - Barycentric coordinate b2, which expresses the weighting factor toward vertex 2 (specified in ). - Barycentric coordinate b3, which expresses the weighting factor toward vertex 3 (specified in ). - When the method completes, contains the 3D Cartesian coordinates of the specified point. - - - - Returns a containing the 3D Cartesian coordinates of a point specified in Barycentric coordinates relative to a 3D triangle. - - A containing the 3D Cartesian coordinates of vertex 1 of the triangle. - A containing the 3D Cartesian coordinates of vertex 2 of the triangle. - A containing the 3D Cartesian coordinates of vertex 3 of the triangle. - Barycentric coordinate b2, which expresses the weighting factor toward vertex 2 (specified in ). - Barycentric coordinate b3, which expresses the weighting factor toward vertex 3 (specified in ). - A new containing the 3D Cartesian coordinates of the specified point. - - - - Restricts a value to be within a specified range. - - The value to clamp. - The minimum value. - The maximum value. - When the method completes, contains the clamped value. - - - - Restricts a value to be within a specified range. - - The value to clamp. - The minimum value. - The maximum value. - The clamped value. - - - - Calculates the cross product of two vectors. - - First source vector. - Second source vector. - When the method completes, contains he cross product of the two vectors. - - - - Calculates the cross product of two vectors. - - First source vector. - Second source vector. - The cross product of the two vectors. - - - - Calculates the distance between two vectors. - - The first vector. - The second vector. - When the method completes, contains the distance between the two vectors. - - may be preferred when only the relative distance is needed - and speed is of the essence. - - - - - Calculates the distance between two vectors. - - The first vector. - The second vector. - The distance between the two vectors. - - may be preferred when only the relative distance is needed - and speed is of the essence. - - - - - Calculates the squared distance between two vectors. - - The first vector. - The second vector. - When the method completes, contains the squared distance between the two vectors. - Distance squared is the value before taking the square root. - Distance squared can often be used in place of distance if relative comparisons are being made. - For example, consider three points A, B, and C. To determine whether B or C is further from A, - compare the distance between A and B to the distance between A and C. Calculating the two distances - involves two square roots, which are computationally expensive. However, using distance squared - provides the same information and avoids calculating two square roots. - - - - - Calculates the squared distance between two vectors. - - The first vector. - The second vector. - The squared distance between the two vectors. - Distance squared is the value before taking the square root. - Distance squared can often be used in place of distance if relative comparisons are being made. - For example, consider three points A, B, and C. To determine whether B or C is further from A, - compare the distance between A and B to the distance between A and C. Calculating the two distances - involves two square roots, which are computationally expensive. However, using distance squared - provides the same information and avoids calculating two square roots. - - - - - Tests whether one 3D vector is near another 3D vector. - - The left vector. - The right vector. - The epsilon. - true if left and right are near another 3D, false otherwise - - - - Tests whether one 3D vector is near another 3D vector. - - The left vector. - The right vector. - The epsilon. - true if left and right are near another 3D, false otherwise - - - - Calculates the dot product of two vectors. - - First source vector. - Second source vector. - When the method completes, contains the dot product of the two vectors. - - - - Calculates the dot product of two vectors. - - First source vector. - Second source vector. - The dot product of the two vectors. - - - - Converts the vector into a unit vector. - - The vector to normalize. - When the method completes, contains the normalized vector. - - - - Converts the vector into a unit vector. - - The vector to normalize. - The normalized vector. - - - - Performs a linear interpolation between two vectors. - - Start vector. - End vector. - Value between 0 and 1 indicating the weight of . - When the method completes, contains the linear interpolation of the two vectors. - - Passing a value of 0 will cause to be returned; a value of 1 will cause to be returned. - - - - - Performs a linear interpolation between two vectors. - - Start vector. - End vector. - Value between 0 and 1 indicating the weight of . - The linear interpolation of the two vectors. - - Passing a value of 0 will cause to be returned; a value of 1 will cause to be returned. - - - - - Performs a cubic interpolation between two vectors. - - Start vector. - End vector. - Value between 0 and 1 indicating the weight of . - When the method completes, contains the cubic interpolation of the two vectors. - - - - Performs a cubic interpolation between two vectors. - - Start vector. - End vector. - Value between 0 and 1 indicating the weight of . - The cubic interpolation of the two vectors. - - - - Performs a Hermite spline interpolation. - - First source position vector. - First source tangent vector. - Second source position vector. - Second source tangent vector. - Weighting factor. - When the method completes, contains the result of the Hermite spline interpolation. - - - - Performs a Hermite spline interpolation. - - First source position vector. - First source tangent vector. - Second source position vector. - Second source tangent vector. - Weighting factor. - The result of the Hermite spline interpolation. - - - - Performs a Catmull-Rom interpolation using the specified positions. - - The first position in the interpolation. - The second position in the interpolation. - The third position in the interpolation. - The fourth position in the interpolation. - Weighting factor. - When the method completes, contains the result of the Catmull-Rom interpolation. - - - - Performs a Catmull-Rom interpolation using the specified positions. - - The first position in the interpolation. - The second position in the interpolation. - The third position in the interpolation. - The fourth position in the interpolation. - Weighting factor. - A vector that is the result of the Catmull-Rom interpolation. - - - - Returns a vector containing the largest components of the specified vectors. - - The first source vector. - The second source vector. - When the method completes, contains an new vector composed of the largest components of the source vectors. - - - - Returns a vector containing the largest components of the specified vectors. - - The first source vector. - The second source vector. - A vector containing the largest components of the source vectors. - - - - Returns a vector containing the smallest components of the specified vectors. - - The first source vector. - The second source vector. - When the method completes, contains an new vector composed of the smallest components of the source vectors. - - - - Returns a vector containing the smallest components of the specified vectors. - - The first source vector. - The second source vector. - A vector containing the smallest components of the source vectors. - - - - Projects a 3D vector from object space into screen space. - - The vector to project. - The X position of the viewport. - The Y position of the viewport. - The width of the viewport. - The height of the viewport. - The minimum depth of the viewport. - The maximum depth of the viewport. - The combined world-view-projection matrix. - When the method completes, contains the vector in screen space. - - - - Projects a 3D vector from object space into screen space. - - The vector to project. - The X position of the viewport. - The Y position of the viewport. - The width of the viewport. - The height of the viewport. - The minimum depth of the viewport. - The maximum depth of the viewport. - The combined world-view-projection matrix. - The vector in screen space. - - - - Projects a 3D vector from screen space into object space. - - The vector to project. - The X position of the viewport. - The Y position of the viewport. - The width of the viewport. - The height of the viewport. - The minimum depth of the viewport. - The maximum depth of the viewport. - The combined world-view-projection matrix. - When the method completes, contains the vector in object space. - - - - Projects a 3D vector from screen space into object space. - - The vector to project. - The X position of the viewport. - The Y position of the viewport. - The width of the viewport. - The height of the viewport. - The minimum depth of the viewport. - The maximum depth of the viewport. - The combined world-view-projection matrix. - The vector in object space. - - - - Returns the reflection of a vector off a surface that has the specified normal. - - The source vector. - Normal of the surface. - When the method completes, contains the reflected vector. - Reflect only gives the direction of a reflection off a surface, it does not determine - whether the original vector was close enough to the surface to hit it. - - - - Returns the reflection of a vector off a surface that has the specified normal. - - The source vector. - Normal of the surface. - The reflected vector. - Reflect only gives the direction of a reflection off a surface, it does not determine - whether the original vector was close enough to the surface to hit it. - - - - Orthogonalizes a list of vectors. - - The list of orthogonalized vectors. - The list of vectors to orthogonalize. - - Orthogonalization is the process of making all vectors orthogonal to each other. This - means that any given vector in the list will be orthogonal to any other given vector in the - list. - Because this method uses the modified Gram-Schmidt process, the resulting vectors - tend to be numerically unstable. The numeric stability decreases according to the vectors - position in the list so that the first vector is the most stable and the last vector is the - least stable. - - Thrown when or is null. - Thrown when is shorter in length than . - - - - Orthonormalizes a list of vectors. - - The list of orthonormalized vectors. - The list of vectors to orthonormalize. - - Orthonormalization is the process of making all vectors orthogonal to each - other and making all vectors of unit length. This means that any given vector will - be orthogonal to any other given vector in the list. - Because this method uses the modified Gram-Schmidt process, the resulting vectors - tend to be numerically unstable. The numeric stability decreases according to the vectors - position in the list so that the first vector is the most stable and the last vector is the - least stable. - - Thrown when or is null. - Thrown when is shorter in length than . - - - - Transforms a 3D vector by the given rotation. - - The vector to rotate. - The rotation to apply. - When the method completes, contains the transformed . - - - - Transforms a 3D vector by the given rotation. - - The vector to rotate. - The rotation to apply. - The transformed . - - - - Transforms an array of vectors by the given rotation. - - The array of vectors to transform. - The rotation to apply. - The array for which the transformed vectors are stored. - This array may be the same array as . - Thrown when or is null. - Thrown when is shorter in length than . - - - - Transforms a 3D vector by the given . - - The source vector. - The transformation . - When the method completes, contains the transformed . - - - - Transforms a 3D vector by the given . - - The source vector. - The transformation . - The transformed . - - - - Transforms a 3D vector by the given . - - The source vector. - The transformation . - When the method completes, contains the transformed . - - - - Transforms a 3D vector by the given . - - The source vector. - The transformation . - When the method completes, contains the transformed . - - - - Transforms a 3D vector by the given . - - The source vector. - The transformation . - The transformed . - - - - Transforms an array of 3D vectors by the given . - - The array of vectors to transform. - The transformation . - The array for which the transformed vectors are stored. - Thrown when or is null. - Thrown when is shorter in length than . - - - - Performs a coordinate transformation using the given . - - The coordinate vector to transform. - The transformation . - When the method completes, contains the transformed coordinates. - - A coordinate transform performs the transformation with the assumption that the w component - is one. The four dimensional vector obtained from the transformation operation has each - component in the vector divided by the w component. This forces the w component to be one and - therefore makes the vector homogeneous. The homogeneous vector is often preferred when working - with coordinates as the w component can safely be ignored. - - - - - Performs a coordinate transformation using the given . - - The coordinate vector to transform. - The transformation . - The transformed coordinates. - - A coordinate transform performs the transformation with the assumption that the w component - is one. The four dimensional vector obtained from the transformation operation has each - component in the vector divided by the w component. This forces the w component to be one and - therefore makes the vector homogeneous. The homogeneous vector is often preferred when working - with coordinates as the w component can safely be ignored. - - - - - Performs a coordinate transformation on an array of vectors using the given . - - The array of coordinate vectors to transform. - The transformation . - The array for which the transformed vectors are stored. - This array may be the same array as . - Thrown when or is null. - Thrown when is shorter in length than . - - A coordinate transform performs the transformation with the assumption that the w component - is one. The four dimensional vector obtained from the transformation operation has each - component in the vector divided by the w component. This forces the w component to be one and - therefore makes the vector homogeneous. The homogeneous vector is often preferred when working - with coordinates as the w component can safely be ignored. - - - - - Performs a normal transformation using the given . - - The normal vector to transform. - The transformation . - When the method completes, contains the transformed normal. - - A normal transform performs the transformation with the assumption that the w component - is zero. This causes the fourth row and fourth column of the matrix to be unused. The - end result is a vector that is not translated, but all other transformation properties - apply. This is often preferred for normal vectors as normals purely represent direction - rather than location because normal vectors should not be translated. - - - - - Performs a normal transformation using the given . - - The normal vector to transform. - The transformation . - The transformed normal. - - A normal transform performs the transformation with the assumption that the w component - is zero. This causes the fourth row and fourth column of the matrix to be unused. The - end result is a vector that is not translated, but all other transformation properties - apply. This is often preferred for normal vectors as normals purely represent direction - rather than location because normal vectors should not be translated. - - - - - Performs a normal transformation on an array of vectors using the given . - - The array of normal vectors to transform. - The transformation . - The array for which the transformed vectors are stored. - This array may be the same array as . - Thrown when or is null. - Thrown when is shorter in length than . - - A normal transform performs the transformation with the assumption that the w component - is zero. This causes the fourth row and fourth column of the matrix to be unused. The - end result is a vector that is not translated, but all other transformation properties - apply. This is often preferred for normal vectors as normals purely represent direction - rather than location because normal vectors should not be translated. - - - - - Adds two vectors. - - The first vector to add. - The second vector to add. - The sum of the two vectors. - - - - Multiplies a vector with another by performing component-wise multiplication equivalent to . - - The first vector to multiply. - The second vector to multiply. - The multiplication of the two vectors. - - - - Assert a vector (return it unchanged). - - The vector to assert (unchanged). - The asserted (unchanged) vector. - - - - Subtracts two vectors. - - The first vector to subtract. - The second vector to subtract. - The difference of the two vectors. - - - - Reverses the direction of a given vector. - - The vector to negate. - A vector facing in the opposite direction. - - - - Scales a vector by the given value. - - The vector to scale. - The amount by which to scale the vector. - The scaled vector. - - - - Scales a vector by the given value. - - The vector to scale. - The amount by which to scale the vector. - The scaled vector. - - - - Scales a vector by the given value. - - The vector to scale. - The amount by which to scale the vector. - The scaled vector. - - - - Scales a vector by the given value. - - The amount by which to scale the vector. - The vector to scale. - The scaled vector. - - - - Scales a vector by the given value. - - The vector to scale. - The amount by which to scale the vector. - The scaled vector. - - - - Perform a component-wise addition - - The input vector. - The scalar value to be added on elements - The vector with added scalar for each element. - - - - Perform a component-wise addition - - The input vector. - The scalar value to be added on elements - The vector with added scalar for each element. - - - - Perform a component-wise subtraction - - The input vector. - The scalar value to be subtraced from elements - The vector with added scalar from each element. - - - - Perform a component-wise subtraction - - The input vector. - The scalar value to be subtraced from elements - The vector with subtraced scalar from each element. - - - - Tests for equality between two objects. - - The first value to compare. - The second value to compare. - true if has the same value as ; otherwise, false. - - - - Tests for inequality between two objects. - - The first value to compare. - The second value to compare. - true if has a different value than ; otherwise, false. - - - - Performs an explicit conversion from to . - - The value. - The result of the conversion. - - - - Performs an explicit conversion from to . - - The value. - The result of the conversion. - - - - Returns a that represents this instance. - - - A that represents this instance. - - - - - Returns a that represents this instance. - - The format. - - A that represents this instance. - - - - - Returns a that represents this instance. - - The format provider. - - A that represents this instance. - - - - - Returns a that represents this instance. - - The format. - The format provider. - - A that represents this instance. - - - - - Returns a hash code for this instance. - - - A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. - - - - - Determines whether the specified is equal to this instance. - - The to compare with this instance. - - true if the specified is equal to this instance; otherwise, false. - - - - - Determines whether the specified is equal to this instance. - - The to compare with this instance. - - true if the specified is equal to this instance; otherwise, false. - - - - - Determines whether the specified is equal to this instance. - - The to compare with this instance. - - true if the specified is equal to this instance; otherwise, false. - - - - - Represents a four dimensional mathematical vector. - - - - - A with all of its components set to zero. - - - - - The X unit (1, 0, 0, 0). - - - - - The Y unit (0, 1, 0, 0). - - - - - The Z unit (0, 0, 1, 0). - - - - - The W unit (0, 0, 0, 1). - - - - - A with all of its components set to one. - - - - - The X component of the vector. - - - - - The Y component of the vector. - - - - - The Z component of the vector. - - - - - The W component of the vector. - - - - - Initializes a new instance of the struct. - - The value that will be assigned to all components. - - - - Initializes a new instance of the struct. - - Initial value for the X component of the vector. - Initial value for the Y component of the vector. - Initial value for the Z component of the vector. - Initial value for the W component of the vector. - - - - Initializes a new instance of the struct. - - A vector containing the values with which to initialize the X, Y, and Z components. - Initial value for the W component of the vector. - - - - Initializes a new instance of the struct. - - A vector containing the values with which to initialize the X and Y components. - Initial value for the Z component of the vector. - Initial value for the W component of the vector. - - - - Initializes a new instance of the struct. - - The values to assign to the X, Y, Z, and W components of the vector. This must be an array with four elements. - Thrown when is null. - Thrown when contains more or less than four elements. - - - - Gets a value indicting whether this instance is normalized. - - - - - Gets a value indicting whether this vector is zero - - - - - Gets or sets the component at the specified index. - - The value of the X, Y, Z, or W component, depending on the index. - The index of the component to access. Use 0 for the X component, 1 for the Y component, 2 for the Z component, and 3 for the W component. - The value of the component at the specified index. - Thrown when the is out of the range [0, 3]. - - - - Calculates the length of the vector. - - The length of the vector. - - may be preferred when only the relative length is needed - and speed is of the essence. - - - - - Calculates the squared length of the vector. - - The squared length of the vector. - - This method may be preferred to when only a relative length is needed - and speed is of the essence. - - - - - Converts the vector into a unit vector. - - - - - Creates an array containing the elements of the vector. - - A four-element array containing the components of the vector. - - - - Adds two vectors. - - The first vector to add. - The second vector to add. - When the method completes, contains the sum of the two vectors. - - - - Adds two vectors. - - The first vector to add. - The second vector to add. - The sum of the two vectors. - - - - Perform a component-wise addition - - The input vector - The scalar value to be added to elements - The vector with added scalar for each element. - - - - Perform a component-wise addition - - The input vector - The scalar value to be added to elements - The vector with added scalar for each element. - - - - Subtracts two vectors. - - The first vector to subtract. - The second vector to subtract. - When the method completes, contains the difference of the two vectors. - - - - Subtracts two vectors. - - The first vector to subtract. - The second vector to subtract. - The difference of the two vectors. - - - - Perform a component-wise subtraction - - The input vector - The scalar value to be subtraced from elements - The vector with subtracted scalar for each element. - - - - Perform a component-wise subtraction - - The input vector - The scalar value to be subtraced from elements - The vector with subtracted scalar for each element. - - - - Perform a component-wise subtraction - - The scalar value to be subtraced from elements - The input vector. - The vector with subtracted scalar for each element. - - - - Perform a component-wise subtraction - - The scalar value to be subtraced from elements - The input vector. - The vector with subtracted scalar for each element. - - - - Scales a vector by the given value. - - The vector to scale. - The amount by which to scale the vector. - When the method completes, contains the scaled vector. - - - - Scales a vector by the given value. - - The vector to scale. - The amount by which to scale the vector. - The scaled vector. - - - - Multiplies a vector with another by performing component-wise multiplication. - - The first vector to multiply. - The second vector to multiply. - When the method completes, contains the multiplied vector. - - - - Multiplies a vector with another by performing component-wise multiplication. - - The first vector to multiply. - The second vector to multiply. - The multiplied vector. - - - - Scales a vector by the given value. - - The vector to scale. - The amount by which to scale the vector. - When the method completes, contains the scaled vector. - - - - Scales a vector by the given value. - - The vector to scale. - The amount by which to scale the vector. - The scaled vector. - - - - Scales a vector by the given value. - - The amount by which to scale the vector. - The vector to scale. - When the method completes, contains the scaled vector. - - - - Scales a vector by the given value. - - The vector to scale. - The amount by which to scale the vector. - The scaled vector. - - - - Reverses the direction of a given vector. - - The vector to negate. - When the method completes, contains a vector facing in the opposite direction. - - - - Reverses the direction of a given vector. - - The vector to negate. - A vector facing in the opposite direction. - - - - Returns a containing the 4D Cartesian coordinates of a point specified in Barycentric coordinates relative to a 4D triangle. - - A containing the 4D Cartesian coordinates of vertex 1 of the triangle. - A containing the 4D Cartesian coordinates of vertex 2 of the triangle. - A containing the 4D Cartesian coordinates of vertex 3 of the triangle. - Barycentric coordinate b2, which expresses the weighting factor toward vertex 2 (specified in ). - Barycentric coordinate b3, which expresses the weighting factor toward vertex 3 (specified in ). - When the method completes, contains the 4D Cartesian coordinates of the specified point. - - - - Returns a containing the 4D Cartesian coordinates of a point specified in Barycentric coordinates relative to a 4D triangle. - - A containing the 4D Cartesian coordinates of vertex 1 of the triangle. - A containing the 4D Cartesian coordinates of vertex 2 of the triangle. - A containing the 4D Cartesian coordinates of vertex 3 of the triangle. - Barycentric coordinate b2, which expresses the weighting factor toward vertex 2 (specified in ). - Barycentric coordinate b3, which expresses the weighting factor toward vertex 3 (specified in ). - A new containing the 4D Cartesian coordinates of the specified point. - - - - Restricts a value to be within a specified range. - - The value to clamp. - The minimum value. - The maximum value. - When the method completes, contains the clamped value. - - - - Restricts a value to be within a specified range. - - The value to clamp. - The minimum value. - The maximum value. - The clamped value. - - - - Calculates the distance between two vectors. - - The first vector. - The second vector. - When the method completes, contains the distance between the two vectors. - - may be preferred when only the relative distance is needed - and speed is of the essence. - - - - - Calculates the distance between two vectors. - - The first vector. - The second vector. - The distance between the two vectors. - - may be preferred when only the relative distance is needed - and speed is of the essence. - - - - - Calculates the squared distance between two vectors. - - The first vector. - The second vector. - When the method completes, contains the squared distance between the two vectors. - Distance squared is the value before taking the square root. - Distance squared can often be used in place of distance if relative comparisons are being made. - For example, consider three points A, B, and C. To determine whether B or C is further from A, - compare the distance between A and B to the distance between A and C. Calculating the two distances - involves two square roots, which are computationally expensive. However, using distance squared - provides the same information and avoids calculating two square roots. - - - - - Calculates the squared distance between two vectors. - - The first vector. - The second vector. - The squared distance between the two vectors. - Distance squared is the value before taking the square root. - Distance squared can often be used in place of distance if relative comparisons are being made. - For example, consider three points A, B, and C. To determine whether B or C is further from A, - compare the distance between A and B to the distance between A and C. Calculating the two distances - involves two square roots, which are computationally expensive. However, using distance squared - provides the same information and avoids calculating two square roots. - - - - - Calculates the dot product of two vectors. - - First source vector - Second source vector. - When the method completes, contains the dot product of the two vectors. - - - - Calculates the dot product of two vectors. - - First source vector. - Second source vector. - The dot product of the two vectors. - - - - Converts the vector into a unit vector. - - The vector to normalize. - When the method completes, contains the normalized vector. - - - - Converts the vector into a unit vector. - - The vector to normalize. - The normalized vector. - - - - Performs a linear interpolation between two vectors. - - Start vector. - End vector. - Value between 0 and 1 indicating the weight of . - When the method completes, contains the linear interpolation of the two vectors. - - Passing a value of 0 will cause to be returned; a value of 1 will cause to be returned. - - - - - Performs a linear interpolation between two vectors. - - Start vector. - End vector. - Value between 0 and 1 indicating the weight of . - The linear interpolation of the two vectors. - - Passing a value of 0 will cause to be returned; a value of 1 will cause to be returned. - - - - - Performs a cubic interpolation between two vectors. - - Start vector. - End vector. - Value between 0 and 1 indicating the weight of . - When the method completes, contains the cubic interpolation of the two vectors. - - - - Performs a cubic interpolation between two vectors. - - Start vector. - End vector. - Value between 0 and 1 indicating the weight of . - The cubic interpolation of the two vectors. - - - - Performs a Hermite spline interpolation. - - First source position vector. - First source tangent vector. - Second source position vector. - Second source tangent vector. - Weighting factor. - When the method completes, contains the result of the Hermite spline interpolation. - - - - Performs a Hermite spline interpolation. - - First source position vector. - First source tangent vector. - Second source position vector. - Second source tangent vector. - Weighting factor. - The result of the Hermite spline interpolation. - - - - Performs a Catmull-Rom interpolation using the specified positions. - - The first position in the interpolation. - The second position in the interpolation. - The third position in the interpolation. - The fourth position in the interpolation. - Weighting factor. - When the method completes, contains the result of the Catmull-Rom interpolation. - - - - Performs a Catmull-Rom interpolation using the specified positions. - - The first position in the interpolation. - The second position in the interpolation. - The third position in the interpolation. - The fourth position in the interpolation. - Weighting factor. - A vector that is the result of the Catmull-Rom interpolation. - - - - Returns a vector containing the largest components of the specified vectors. - - The first source vector. - The second source vector. - When the method completes, contains an new vector composed of the largest components of the source vectors. - - - - Returns a vector containing the largest components of the specified vectors. - - The first source vector. - The second source vector. - A vector containing the largest components of the source vectors. - - - - Returns a vector containing the smallest components of the specified vectors. - - The first source vector. - The second source vector. - When the method completes, contains an new vector composed of the smallest components of the source vectors. - - - - Returns a vector containing the smallest components of the specified vectors. - - The first source vector. - The second source vector. - A vector containing the smallest components of the source vectors. - - - - Orthogonalizes a list of vectors. - - The list of orthogonalized vectors. - The list of vectors to orthogonalize. - - Orthogonalization is the process of making all vectors orthogonal to each other. This - means that any given vector in the list will be orthogonal to any other given vector in the - list. - Because this method uses the modified Gram-Schmidt process, the resulting vectors - tend to be numerically unstable. The numeric stability decreases according to the vectors - position in the list so that the first vector is the most stable and the last vector is the - least stable. - - Thrown when or is null. - Thrown when is shorter in length than . - - - - Orthonormalizes a list of vectors. - - The list of orthonormalized vectors. - The list of vectors to orthonormalize. - - Orthonormalization is the process of making all vectors orthogonal to each - other and making all vectors of unit length. This means that any given vector will - be orthogonal to any other given vector in the list. - Because this method uses the modified Gram-Schmidt process, the resulting vectors - tend to be numerically unstable. The numeric stability decreases according to the vectors - position in the list so that the first vector is the most stable and the last vector is the - least stable. - - Thrown when or is null. - Thrown when is shorter in length than . - - - - Transforms a 4D vector by the given rotation. - - The vector to rotate. - The rotation to apply. - When the method completes, contains the transformed . - - - - Transforms a 4D vector by the given rotation. - - The vector to rotate. - The rotation to apply. - The transformed . - - - - Transforms an array of vectors by the given rotation. - - The array of vectors to transform. - The rotation to apply. - The array for which the transformed vectors are stored. - This array may be the same array as . - Thrown when or is null. - Thrown when is shorter in length than . - - - - Transforms a 4D vector by the given . - - The source vector. - The transformation . - When the method completes, contains the transformed . - - - - Transforms a 4D vector by the given . - - The source vector. - The transformation . - The transformed . - - - - Transforms an array of 4D vectors by the given . - - The array of vectors to transform. - The transformation . - The array for which the transformed vectors are stored. - This array may be the same array as . - Thrown when or is null. - Thrown when is shorter in length than . - - - - Adds two vectors. - - The first vector to add. - The second vector to add. - The sum of the two vectors. - - - - Multiplies a vector with another by performing component-wise multiplication equivalent to . - - The first vector to multiply. - The second vector to multiply. - The multiplication of the two vectors. - - - - Assert a vector (return it unchanged). - - The vector to assert (unchanged). - The asserted (unchanged) vector. - - - - Subtracts two vectors. - - The first vector to subtract. - The second vector to subtract. - The difference of the two vectors. - - - - Reverses the direction of a given vector. - - The vector to negate. - A vector facing in the opposite direction. - - - - Scales a vector by the given value. - - The vector to scale. - The amount by which to scale the vector. - The scaled vector. - - - - Scales a vector by the given value. - - The vector to scale. - The amount by which to scale the vector. - The scaled vector. - - - - Scales a vector by the given value. - - The vector to scale. - The amount by which to scale the vector. - The scaled vector. - - - - Scales a vector by the given value. - - The amount by which to scale the vector. - The vector to scale. - The scaled vector. - - - - Scales a vector by the given value. - - The vector to scale. - The amount by which to scale the vector. - The scaled vector. - - - - Perform a component-wise addition - - The input vector. - The scalar value to be added on elements - The vector with added scalar for each element. - - - - Perform a component-wise addition - - The input vector. - The scalar value to be added on elements - The vector with added scalar for each element. - - - - Perform a component-wise subtraction - - The input vector. - The scalar value to be subtraced from elements - The vector with subtraced scalar from each element. - - - - Perform a component-wise subtraction - - The input vector. - The scalar value to be subtraced from elements - The vector with subtraced scalar from each element. - - - - Tests for equality between two objects. - - The first value to compare. - The second value to compare. - true if has the same value as ; otherwise, false. - - - - Tests for inequality between two objects. - - The first value to compare. - The second value to compare. - true if has a different value than ; otherwise, false. - - - - Performs an explicit conversion from to . - - The value. - The result of the conversion. - - - - Performs an explicit conversion from to . - - The value. - The result of the conversion. - - - - Returns a that represents this instance. - - - A that represents this instance. - - - - - Returns a that represents this instance. - - The format. - - A that represents this instance. - - - - - Returns a that represents this instance. - - The format provider. - - A that represents this instance. - - - - - Returns a that represents this instance. - - The format. - The format provider. - - A that represents this instance. - - - - - Returns a hash code for this instance. - - - A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. - - - - - Determines whether the specified is equal to this instance. - - The to compare with this instance. - - true if the specified is equal to this instance; otherwise, false. - - - - - Determines whether the specified is equal to this instance. - - The to compare with this instance. - - true if the specified is equal to this instance; otherwise, false. - - - - - Determines whether the specified is equal to this instance. - - The to compare with this instance. - - true if the specified is equal to this instance; otherwise, false. - - - - - Cancels the currently executing event. - - - - - thisScriptCheck - can be destroyed if it belongs to the calling script. - - - - - No, this should be called SET_ENTITY_KINEMATIC. It does more than just "freeze" it's position. - ^Rockstar Devs named it like that, Now cry about it. - - - - - Returns the name of the currently executing resource. - - - - - Gets the current game timer in milliseconds. - - - - - This native converts the passed string to a hash. - - - - - Gets the amount of metadata values with the specified key existing in the specified resource's manifest. - See also: [Resource manifest](https://docs.fivem.net/resources/manifest/) - - - - - Returns all commands that are registered in the command system. - The data returned adheres to the following layout: - - ``` - [ - { - "name": "cmdlist" - }, - { - "name": "command1" - } - ] - ``` - - - - - Gets the metadata value at a specified key/index from a resource's manifest. - See also: [Resource manifest](https://docs.fivem.net/resources/manifest/) - - - - - Returns the physical on-disk path of the specified resource. - - - - - Returns the current state of the specified resource. - - - - - Gets whether or not this is the CitizenFX server. - - - - - Reads the contents of a text file in a specified resource. - If executed on the client, this file has to be included in `files` in the resource manifest. - Example: `local data = LoadResourceFile("devtools", "data.json")` - - - - - Returns the owner ID of the specified entity. - - - - - Registered commands can be executed by entering them in the client console (this works for client side and server side registered commands). Or by entering them in the server console/through an RCON client (only works for server side registered commands). Or if you use a supported chat resource, like the default one provided in the cfx-server-data repository, then you can enter the command in chat by prefixing it with a `/`. - - Commands registered using this function can also be executed by resources, using the [`ExecuteCommand` native](#_0x561C060B). - - The restricted bool is not used on the client side. Permissions can only be checked on the server side, so if you want to limit your command with an ace permission automatically, make it a server command (by registering it in a server script). - - **Example result**: - - ![](https://i.imgur.com/TaCnG09.png) - - - - - **Experimental**: This native may be altered or removed in future versions of CitizenFX without warning. - - Registers a cached resource asset with the resource system, similar to the automatic scanning of the `stream/` folder. - - - - - Registers a build task factory for resources. - The function should return an object (msgpack map) with the following fields: - - ``` - { - // returns whether the specific resource should be built - shouldBuild = func(resourceName: string): bool, - - // asynchronously start building the specific resource. - // call cb when completed - build = func(resourceName: string, cb: func(success: bool, status: string): void): void - } - ``` - - - - - Writes the specified data to a file in the specified resource. - Using a length of `-1` will automatically detect the length assuming the data is a C string. - - - - - p7 is always 1 in the scripts. Set to 1, an area around the destination coords for the moved entity is cleared from other entities. - Often ends with 1, 0, 0, 1); in the scripts. It works. - Axis - Invert Axis Flags - - - - - rotationOrder refers to the order yaw pitch roll is applied - value ranges from 0 to 5. What you use for rotationOrder when setting must be the same as rotationOrder when getting the rotation. - Unsure what value corresponds to what rotation order, more testing will be needed for that. - For the most part R* uses 1 or 2 as the order. - p5 is usually set as true - - - - - Note that the third parameter(denoted as z) is "up and down" with positive ment. - - - - - Ped: The ped to warp. - vehicle: The vehicle to warp the ped into. - Seat_Index: [-1 is driver seat, -2 first free passenger seat] - Moreinfo of Seat Index - DriverSeat = -1 - Passenger = 0 - Left Rear = 1 - RightRear = 2 - - - - - Call SET_PLAYER_WANTED_LEVEL_NOW for immediate effect - wantedLevel is an integer value representing 0 to 5 stars even though the game supports the 6th wanted level but no police will appear since no definitions are present for it in the game files - disableNoMission- Disables When Off Mission- appears to always be false - - - - - colorPrimary & colorSecondary are the paint index for the vehicle. - For a list of valid paint indexes, view: pastebin.com/pwHci0xK - ------------------------------------------------------------------------- - Use this to get the number of color indices: pastebin.com/RQEeqTSM - Note: minimum color index is 0, maximum color index is (numColorIndices - 1) - - - - - The backing function for TriggerClientEvent. - - - - - The backing function for TriggerEvent. - - - - - Returns whether or not the currently executing event was canceled. - - - - - Cancels the currently executing event. - - - - - thisScriptCheck - can be destroyed if it belongs to the calling script. - - - - - No, this should be called SET_ENTITY_KINEMATIC. It does more than just "freeze" it's position. - ^Rockstar Devs named it like that, Now cry about it. - - - - - Returns the name of the currently executing resource. - - The name of the resource. - - - - Gets the current game timer in milliseconds. - - The game time. - - - - This native converts the passed string to a hash. - - - - - Gets the amount of metadata values with the specified key existing in the specified resource's manifest. - See also: [Resource manifest](https://docs.fivem.net/resources/manifest/) - - The resource name. - The key to look up in the resource manifest. - - - - Returns all commands that are registered in the command system. - The data returned adheres to the following layout: - ``` - [ - { - "name": "cmdlist" - }, - { - "name": "command1" - } - ] - ``` - - An object containing registered commands. - - - - Gets the metadata value at a specified key/index from a resource's manifest. - See also: [Resource manifest](https://docs.fivem.net/resources/manifest/) - - The resource name. - The key in the resource manifest. - The value index, in a range from [0..GET_NUM_RESOURCE_METDATA-1]. - - - - Returns the physical on-disk path of the specified resource. - - The name of the resource. - The resource directory name, possibly without trailing slash. - - - - Returns the current state of the specified resource. - - The name of the resource. - The resource state. One of `"missing", "started", "starting", "stopped", "stopping", "uninitialized" or "unknown"`. - - - - Gets whether or not this is the CitizenFX server. - - A boolean value. - - - - Reads the contents of a text file in a specified resource. - If executed on the client, this file has to be included in `files` in the resource manifest. - Example: `local data = LoadResourceFile("devtools", "data.json")` - - The resource name. - The file in the resource. - The file contents - - - - Returns the owner ID of the specified entity. - - The entity to get the owner for. - On the server, the server ID of the entity owner. On the client, returns the player/slot ID of the entity owner. - - - - Registered commands can be executed by entering them in the client console (this works for client side and server side registered commands). Or by entering them in the server console/through an RCON client (only works for server side registered commands). Or if you use a supported chat resource, like the default one provided in the cfx-server-data repository, then you can enter the command in chat by prefixing it with a `/`. - Commands registered using this function can also be executed by resources, using the [`ExecuteCommand` native](#_0x561C060B). - The restricted bool is not used on the client side. Permissions can only be checked on the server side, so if you want to limit your command with an ace permission automatically, make it a server command (by registering it in a server script). - **Example result**: - ![](https://i.imgur.com/TaCnG09.png) - - The command you want to register. - A handler function that gets called whenever the command is executed. - If this is a server command and you set this to true, then players will need the command.yourCommandName ace permission to execute this command. - - - - **Experimental**: This native may be altered or removed in future versions of CitizenFX without warning. - Registers a cached resource asset with the resource system, similar to the automatic scanning of the `stream/` folder. - - The resource to add the asset to. - A file name in the resource. - A cache string to pass to `REGISTER_STREAMING_FILE_FROM_CACHE` on the client. - - - - Registers a build task factory for resources. - The function should return an object (msgpack map) with the following fields: - ``` - { - // returns whether the specific resource should be built - shouldBuild = func(resourceName: string): bool, - // asynchronously start building the specific resource. - // call cb when completed - build = func(resourceName: string, cb: func(success: bool, status: string): void): void - } - ``` - - The identifier for the build task. - The factory function. - - - - Writes the specified data to a file in the specified resource. - Using a length of `-1` will automatically detect the length assuming the data is a C string. - - The name of the resource. - The name of the file. - The data to write to the file. - The length of the written data. - A value indicating if the write succeeded. - - - - p7 is always 1 in the scripts. Set to 1, an area around the destination coords for the moved entity is cleared from other entities. - Often ends with 1, 0, 0, 1); in the scripts. It works. - Axis - Invert Axis Flags - - - - - rotationOrder refers to the order yaw pitch roll is applied - value ranges from 0 to 5. What you use for rotationOrder when setting must be the same as rotationOrder when getting the rotation. - Unsure what value corresponds to what rotation order, more testing will be needed for that. - For the most part R* uses 1 or 2 as the order. - p5 is usually set as true - - - - - Note that the third parameter(denoted as z) is "up and down" with positive ment. - - - - - Ped: The ped to warp. - vehicle: The vehicle to warp the ped into. - Seat_Index: [-1 is driver seat, -2 first free passenger seat] - Moreinfo of Seat Index - DriverSeat = -1 - Passenger = 0 - Left Rear = 1 - RightRear = 2 - - - - - Call SET_PLAYER_WANTED_LEVEL_NOW for immediate effect - wantedLevel is an integer value representing 0 to 5 stars even though the game supports the 6th wanted level but no police will appear since no definitions are present for it in the game files - disableNoMission- Disables When Off Mission- appears to always be false - - - - - colorPrimary & colorSecondary are the paint index for the vehicle. - For a list of valid paint indexes, view: pastebin.com/pwHci0xK - ------------------------------------------------------------------------- - Use this to get the number of color indices: pastebin.com/RQEeqTSM - Note: minimum color index is 0, maximum color index is (numColorIndices - 1) - - - - - The backing function for TriggerClientEvent. - - - - - The backing function for TriggerEvent. - - - - - Returns whether or not the currently executing event was canceled. - - A boolean. - - - - - - - - - - Gets the identifier value of a particular type. - - - string steamId = player.Identifiers["steam"]; - - The identifier type to return. - The identifier value (without prefix), or null if it could not be found. - - - - Empty Shared Field - - - - An uninitialized Color Structure - - - - - Equality Operator - - - - Compares two Color objects. The return value is - based on the equivalence of the A,R,G,B properties - of the two Colors. - - - - - Inequality Operator - - - - Compares two Color objects. The return value is - based on the equivalence of the A,R,G,B properties - of the two colors. - - - - - IsEmpty Property - - - - Indicates transparent black. R,G,B = 0; A=0? - - - - - Equals Method - - - - Checks equivalence of this Color and another object. - - - - - GetHashCode Method - - - - Calculates a hashing value. - - - - - ToString Method - - - - Formats the Color as a string in ARGB notation. - - - - - Empty Shared Field - - - - An uninitialized Point Structure. - - - - - Ceiling Shared Method - - - - Produces a Point structure from a PointF structure by - taking the ceiling of the X and Y properties. - - - - - Round Shared Method - - - - Produces a Point structure from a PointF structure by - rounding the X and Y properties. - - - - - Truncate Shared Method - - - - Produces a Point structure from a PointF structure by - truncating the X and Y properties. - - - - - Addition Operator - - - - Translates a Point using the Width and Height - properties of the given Size. - - - - - Equality Operator - - - - Compares two Point objects. The return value is - based on the equivalence of the X and Y properties - of the two points. - - - - - Inequality Operator - - - - Compares two Point objects. The return value is - based on the equivalence of the X and Y properties - of the two points. - - - - - Subtraction Operator - - - - Translates a Point using the negation of the Width - and Height properties of the given Size. - - - - - Point to Size Conversion - - - - Returns a Size based on the Coordinates of a given - Point. Requires explicit cast. - - - - - Point to PointF Conversion - - - - Creates a PointF based on the coordinates of a given - Point. No explicit cast is required. - - - - - Point Constructor - - - - Creates a Point from an integer which holds the Y - coordinate in the high order 16 bits and the X - coordinate in the low order 16 bits. - - - - - Point Constructor - - - - Creates a Point from a Size value. - - - - - Point Constructor - - - - Creates a Point from a specified x,y coordinate pair. - - - - - IsEmpty Property - - - - Indicates if both X and Y are zero. - - - - - X Property - - - - The X coordinate of the Point. - - - - - Y Property - - - - The Y coordinate of the Point. - - - - - Equals Method - - - - Checks equivalence of this Point and another object. - - - - - GetHashCode Method - - - - Calculates a hashing value. - - - - - Offset Method - - - - Moves the Point a specified distance. - - - - - ToString Method - - - - Formats the Point as a string in coordinate notation. - - - - - Empty Shared Field - - - - An uninitialized PointF Structure. - - - - - Addition Operator - - - - Translates a PointF using the Width and Height - properties of the given Size. - - - - - Equality Operator - - - - Compares two PointF objects. The return value is - based on the equivalence of the X and Y properties - of the two points. - - - - - Inequality Operator - - - - Compares two PointF objects. The return value is - based on the equivalence of the X and Y properties - of the two points. - - - - - Subtraction Operator - - - - Translates a PointF using the negation of the Width - and Height properties of the given Size. - - - - - PointF Constructor - - - - Creates a PointF from a specified x,y coordinate pair. - - - - - IsEmpty Property - - - - Indicates if both X and Y are zero. - - - - - X Property - - - - The X coordinate of the PointF. - - - - - Y Property - - - - The Y coordinate of the PointF. - - - - - Equals Method - - - - Checks equivalence of this PointF and another object. - - - - - GetHashCode Method - - - - Calculates a hashing value. - - - - - ToString Method - - - - Formats the PointF as a string in coordinate notation. - - - - - Empty Shared Field - - - - An uninitialized Size Structure. - - - - - Ceiling Shared Method - - - - Produces a Size structure from a SizeF structure by - taking the ceiling of the Width and Height properties. - - - - - Round Shared Method - - - - Produces a Size structure from a SizeF structure by - rounding the Width and Height properties. - - - - - Truncate Shared Method - - - - Produces a Size structure from a SizeF structure by - truncating the Width and Height properties. - - - - - Addition Operator - - - - Addition of two Size structures. - - - - - Equality Operator - - - - Compares two Size objects. The return value is - based on the equivalence of the Width and Height - properties of the two Sizes. - - - - - Inequality Operator - - - - Compares two Size objects. The return value is - based on the equivalence of the Width and Height - properties of the two Sizes. - - - - - Subtraction Operator - - - - Subtracts two Size structures. - - - - - Size to Point Conversion - - - - Returns a Point based on the dimensions of a given - Size. Requires explicit cast. - - - - - Size to SizeF Conversion - - - - Creates a SizeF based on the dimensions of a given - Size. No explicit cast is required. - - - - - Size Constructor - - - - Creates a Size from a Point value. - - - - - Size Constructor - - - - Creates a Size from specified dimensions. - - - - - IsEmpty Property - - - - Indicates if both Width and Height are zero. - - - - - Width Property - - - - The Width coordinate of the Size. - - - - - Height Property - - - - The Height coordinate of the Size. - - - - - Equals Method - - - - Checks equivalence of this Size and another object. - - - - - GetHashCode Method - - - - Calculates a hashing value. - - - - - ToString Method - - - - Formats the Size as a string in coordinate notation. - - - - - Empty Shared Field - - - - An uninitialized SizeF Structure. - - - - - Addition Operator - - - - Addition of two SizeF structures. - - - - - Equality Operator - - - - Compares two SizeF objects. The return value is - based on the equivalence of the Width and Height - properties of the two Sizes. - - - - - Inequality Operator - - - - Compares two SizeF objects. The return value is - based on the equivalence of the Width and Height - properties of the two Sizes. - - - - - Subtraction Operator - - - - Subtracts two SizeF structures. - - - - - SizeF to PointF Conversion - - - - Returns a PointF based on the dimensions of a given - SizeF. Requires explicit cast. - - - - - SizeF Constructor - - - - Creates a SizeF from a PointF value. - - - - - SizeF Constructor - - - - Creates a SizeF from an existing SizeF value. - - - - - SizeF Constructor - - - - Creates a SizeF from specified dimensions. - - - - - IsEmpty Property - - - - Indicates if both Width and Height are zero. - - - - - Width Property - - - - The Width coordinate of the SizeF. - - - - - Height Property - - - - The Height coordinate of the SizeF. - - - - - Equals Method - - - - Checks equivalence of this SizeF and another object. - - - - - GetHashCode Method - - - - Calculates a hashing value. - - - - - ToString Method - - - - Formats the SizeF as a string in coordinate notation. - - - - diff --git a/vMenu.sln b/vMenu.sln index 6514ddac..4fc2c6ff 100644 --- a/vMenu.sln +++ b/vMenu.sln @@ -1,20 +1,14 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.27130.2020 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.28711.60 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "vMenuClient", "vMenu\vMenuClient.csproj", "{58FE5D89-E729-4246-B527-6EDA2A1AF04D}" ProjectSection(ProjectDependencies) = postProject {897C1141-8CD6-4609-A692-53DAFF9BCBBE} = {897C1141-8CD6-4609-A692-53DAFF9BCBBE} - {CFE8E7CD-EAB0-48A1-A22F-566B048F110D} = {CFE8E7CD-EAB0-48A1-A22F-566B048F110D} EndProjectSection EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "vMenuServer", "vMenuServer\vMenuServer.csproj", "{897C1141-8CD6-4609-A692-53DAFF9BCBBE}" - ProjectSection(ProjectDependencies) = postProject - {CFE8E7CD-EAB0-48A1-A22F-566B048F110D} = {CFE8E7CD-EAB0-48A1-A22F-566B048F110D} - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "vMenuShared", "vMenuShared\vMenuShared.csproj", "{CFE8E7CD-EAB0-48A1-A22F-566B048F110D}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -30,10 +24,6 @@ Global {897C1141-8CD6-4609-A692-53DAFF9BCBBE}.Debug|Any CPU.Build.0 = Debug|Any CPU {897C1141-8CD6-4609-A692-53DAFF9BCBBE}.Release|Any CPU.ActiveCfg = Release|Any CPU {897C1141-8CD6-4609-A692-53DAFF9BCBBE}.Release|Any CPU.Build.0 = Release|Any CPU - {CFE8E7CD-EAB0-48A1-A22F-566B048F110D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {CFE8E7CD-EAB0-48A1-A22F-566B048F110D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {CFE8E7CD-EAB0-48A1-A22F-566B048F110D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {CFE8E7CD-EAB0-48A1-A22F-566B048F110D}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/vMenu/EventManager.cs b/vMenu/EventManager.cs index 38c541dd..55037ed0 100644 --- a/vMenu/EventManager.cs +++ b/vMenu/EventManager.cs @@ -203,8 +203,8 @@ private void SetAddons() Debug.WriteLine($"\n\n^1[vMenu] [ERROR] ^7Your addons.json file contains a problem! Error details: {ex.Message}\n\n"); } - FunctionsController.flaresAllowed = false; - FunctionsController.bombsAllowed = false; + //FunctionsController.flaresAllowed = false; + //FunctionsController.bombsAllowed = false; currentHours = GetSettingsInt(Setting.vmenu_default_time_hour); currentHours = (currentHours >= 0 && currentHours < 24) ? currentHours : 9; diff --git a/vMenu/FunctionsController.cs b/vMenu/FunctionsController.cs index 1b8fd6bf..6c807037 100644 --- a/vMenu/FunctionsController.cs +++ b/vMenu/FunctionsController.cs @@ -54,8 +54,8 @@ class FunctionsController : BaseScript /// I made these seperate bools that only get set once after initial load /// to prevent the CommonFunctions.IsAllowed() function being called over and over again multiple times every tick. - public static bool flaresAllowed = false; - public static bool bombsAllowed = false; + //public static bool flaresAllowed = false; + //public static bool bombsAllowed = false; private bool stopPropsLoop = false; private bool stopVehiclesLoop = false; @@ -75,7 +75,8 @@ public FunctionsController() playerList.Add(p.Handle, p.Name); } - // Add all tick events. + // Add all tick functions. + Tick += GcTick; Tick += GeneralTasks; Tick += PlayerOptions; Tick += DoPlayerAndVehicleChecks; @@ -97,18 +98,24 @@ public FunctionsController() Tick += PlayerOverheadNamesControl; Tick += RestorePlayerAfterBeingDead; Tick += PlayerClothingAnimationsController; - //Tick += FlaresAndBombsTick; Tick += AnimationsAndInteractions; Tick += HelpMessageController; Tick += ModelDrawDimensions; - Tick += GcTick; Tick += PersonalVehicleOptions; Tick += AnimalPedCameraChangeBlocker; - Tick += SlowMiscTick; + + + //Tick += FlaresAndBombsTick; } + /// Task related + #region gc thread int gcTimer = GetGameTimer(); + /// + /// Task for clearing unused memory periodically. + /// + /// private async Task GcTick() { if (GetGameTimer() - gcTimer > 60000) @@ -120,8 +127,8 @@ private async Task GcTick() } await Delay(1000); } + #endregion - /// Task related #region General Tasks /// /// All general tasks that run every 10 game ticks (and are not (sub)menu specific). @@ -145,6 +152,7 @@ private async Task GeneralTasks() await Delay(10); } #endregion + #region Player Options Tasks /// /// Run all tasks for the Player Options menu. @@ -216,6 +224,7 @@ bool IsMpPedCreatorOpen() } } #endregion + #region shared player options and vehicle options /// /// Slow tick that does some basic checks for shared vehicle/player options. @@ -257,6 +266,7 @@ private async Task DoPlayerAndVehicleChecks() await Delay(1000); } #endregion + #region Vehicle Options Tasks /// /// Manage all vehicle related tasks. @@ -529,6 +539,7 @@ private async Task MoreVehicleOptions() { await Delay(1); } + } private async Task VehicleOptionsEveryFrame() @@ -573,6 +584,7 @@ string GetHealthString(double health) } #endregion + #region Weather Options private async Task WeatherOptions() { @@ -642,12 +654,12 @@ private async Task WeatherOptions() } } #endregion + #region Misc Settings Menu Tasks private async void DrawMiscSettingsText() { if (MainMenu.PermissionsSetupComplete && MainMenu.MiscSettingsMenu != null) { - // draw coordinates if (MainMenu.MiscSettingsMenu.ShowCoordinates && IsAllowed(Permission.MSShowCoordinates)) { @@ -917,36 +929,32 @@ private async Task MiscSettings() } } } - /* - - TODO: UNCOMMENT WHEN PR IS MERGED INTO FIVEM PRODUCTION - */ - //if (GetProfileSetting(221) == 1) // 221 = settings > display > expanded radar - //{ - // SetBigmapActive(true, false); - //} - //else - //{ - // if (IsBigmapActive() && GetGameTimer() - radarSwitchTimer > 8000) - // { - // SetBigmapActive(false, false); - // } - // if (Game.IsControlJustReleased(0, Control.MultiplayerInfo) && MainMenu.MiscSettingsMenu.KbRadarKeys && !MenuController.IsAnyMenuOpen() && !IsPauseMenuActive()) - // { - // bool radarExpanded = IsBigmapActive(); - - // if (radarExpanded) - // { - // SetBigmapActive(false, false); - // } - // else - // { - // SetBigmapActive(true, false); - // radarSwitchTimer = GetGameTimer(); - // } - // } - //} + if (GetProfileSetting(221) == 1) // 221 = settings > display > expanded radar + { + SetBigmapActive(true, false); + } + else + { + if (IsBigmapActive() && GetGameTimer() - radarSwitchTimer > 8000) + { + SetBigmapActive(false, false); + } + if (Game.IsControlJustReleased(0, Control.MultiplayerInfo) && MainMenu.MiscSettingsMenu.KbRadarKeys && !MenuController.IsAnyMenuOpen() && !IsPauseMenuActive()) + { + bool radarExpanded = IsBigmapActive(); + + if (radarExpanded) + { + SetBigmapActive(false, false); + } + else + { + SetBigmapActive(true, false); + radarSwitchTimer = GetGameTimer(); + } + } + } } else { @@ -1135,10 +1143,7 @@ private async Task DeathNotifications() foreach (Player p in pl) { tmpiterator++; - //if (tmpiterator % 5 == 0) - //{ await Delay(0); - //} if (p.IsDead) { if (deadPlayers.Contains(p.Handle)) { return; } @@ -1221,6 +1226,7 @@ private async Task DeathNotifications() } #endregion #endregion + #region Voice Chat Tasks /// /// Run all voice chat options tasks @@ -1311,6 +1317,7 @@ private async Task VoiceChat() } } #endregion + #region Update Time Options Menu (current time display) /// /// Update the current time display in the time options menu. @@ -1334,6 +1341,7 @@ private async Task TimeOptions() await Delay(2000); } #endregion + #region Weapon Options Tasks /// /// Manage all weapon options that need to be handeled every tick. @@ -1396,6 +1404,7 @@ private async Task WeaponOptions() } } #endregion + #region Spectate Handling Tasks /// /// OnTick runs every game tick. @@ -1428,6 +1437,7 @@ private async Task SpectateHandling() } } #endregion + #region Player Appearance /// /// Manages the camera view for when the mp ped creator is open. @@ -1905,7 +1915,12 @@ void SetCameraPosition() } } #endregion + #region Restore player skin & weapons after respawning. + /// + /// Restores player appearance after dying. + /// + /// private async Task RestorePlayerAfterBeingDead() { if (MainMenu.PermissionsSetupComplete && Game.PlayerPed.IsDead) @@ -1968,13 +1983,11 @@ private async Task RestorePlayerAfterBeingDead() Log("weapons restored, deleting kvp"); DeleteResourceKvp("vmenu_temp_weapons_loadout_before_respawn"); } - - } - } } #endregion + #region Player clothing animations controller. private async Task PlayerClothingAnimationsController() { @@ -2090,6 +2103,7 @@ private async Task PlayerClothingAnimationsController() } } #endregion + #region player blips tasks private async Task PlayerBlipsControl() { @@ -2243,8 +2257,16 @@ private async Task PlayerBlipsControl() } #endregion + + #region player overhead names private Dictionary gamerTags = new Dictionary(); - float distance = 500f; + + float distance = 500f; // todo make this a convar. + + /// + /// Manages overhead player names. + /// + /// private async Task PlayerOverheadNamesControl() { await Delay(500); @@ -2299,8 +2321,13 @@ private async Task PlayerOverheadNamesControl() } } } + #endregion #region Online Player Options Tasks + /// + /// Manages online players tasks. + /// + /// private async Task OnlinePlayersTasks() { await Delay(500); @@ -2342,8 +2369,9 @@ private async Task OnlinePlayersTasks() } } #endregion - #region Flares and plane bombs controler + #region Flares and plane bombs controler (UNUSED) + /* private readonly List flareVehicles = new List() { (uint)GetHashKey("mogul"), @@ -2447,7 +2475,9 @@ private async Task FlaresAndBombsTick() await Delay(1); } } + */ #endregion + #region Tick related to animations and interactions in-game /// /// Manages (triggers) all interactions and animations that happen in the world without direct use of the menu. @@ -2469,7 +2499,7 @@ private async Task AnimationsAndInteractions() Game.PlayerPed.IsFalling || Game.PlayerPed.IsBeingStunned || Game.PlayerPed.IsWalking || Game.PlayerPed.IsRunning || Game.PlayerPed.IsSprinting || Game.PlayerPed.IsSwimming || Game.PlayerPed.IsSwimmingUnderWater || Game.PlayerPed.IsDiving && GetSelectedPedWeapon(Game.PlayerPed.Handle) == snowball_hash || GetSelectedPedWeapon(Game.PlayerPed.Handle) == GetHashKey("unarmed"))) { - await PickupSnowball(); + await PickupSnowballOnce(); } } } @@ -2488,7 +2518,7 @@ private async Task AnimationsAndInteractions() } if (GetGameTimer() - timer > 400) { - Task t = SwitchHelmet(); + Task t = SwitchHelmetOnce(); while (!t.IsCompleted && !t.IsCanceled && !t.IsFaulted) { if (inVeh) @@ -2510,7 +2540,12 @@ private async Task AnimationsAndInteractions() } } #endregion + #region help message controller + /// + /// Help message timer and stuff. + /// + /// private async Task HelpMessageController() { if (MainMenu.PermissionsSetupComplete) @@ -2559,6 +2594,7 @@ void ShowSnowballInfoMessage() } } #endregion + #region draw model dimensions /// /// Draws entity outlines if enabled (per entity type). @@ -2637,7 +2673,13 @@ private async Task ModelDrawDimensions() } } #endregion + #region animal ped camera change blocker + /// + /// Prevents players from going into first person when they're currently using an animal as their player ped. + /// This is to prevent them crashing their game or falling out of the sky as ~~birds~~ bricks. + /// + /// private async Task AnimalPedCameraChangeBlocker() { uint model = (uint)GetEntityModel(Game.PlayerPed.Handle); @@ -2693,9 +2735,9 @@ private async Task SlowMiscTick() } } - } #endregion + #region Personal Vehicle options private bool messageCooldown = false; private async void StartMessageCooldown() @@ -2705,6 +2747,11 @@ private async void StartMessageCooldown() messageCooldown = false; } int time = 0; + + /// + /// Manages personal vehicle options like locking doors while close. + /// + /// private async Task PersonalVehicleOptions() { if (MainMenu.PermissionsSetupComplete && MainMenu.PersonalVehicleMenu != null && IsAllowed(Permission.PVLockDoors) && MainMenu.PersonalVehicleMenu.CurrentPersonalVehicle != null) @@ -2756,12 +2803,14 @@ private async Task PersonalVehicleOptions() await Task.FromResult(0); } #endregion + #region animation functions /// /// This triggers a helmet visor/goggles toggle if available. + /// THIS IS NOT A TICK FUNCTION /// /// - async Task SwitchHelmet() + private async Task SwitchHelmetOnce() { if (MainMenu.PermissionsSetupComplete) { @@ -2981,9 +3030,10 @@ async Task SwitchHelmet() /// /// Pickup a snowball. + /// THIS IS NOT A TICK FUNCTION /// /// - async Task PickupSnowball() + private async Task PickupSnowballOnce() { if (MainMenu.PermissionsSetupComplete) { diff --git a/vMenu/packages.config b/vMenu/packages.config new file mode 100644 index 00000000..bd4342d3 --- /dev/null +++ b/vMenu/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/vMenu/vMenuClient.csproj b/vMenu/vMenuClient.csproj index 10108514..d4b0821c 100644 --- a/vMenu/vMenuClient.csproj +++ b/vMenu/vMenuClient.csproj @@ -18,7 +18,7 @@ embedded false ..\..\build\ - DEBUG;TRACE + TRACE;DEBUG;CLIENT prompt 4 AnyCPU @@ -27,7 +27,7 @@ embedded true ..\..\build\ - TRACE + TRACE;CLIENT prompt 4 true @@ -35,13 +35,12 @@ AnyCPU - - ..\dependencies\client\CitizenFX.Core.dll + + ..\packages\CitizenFX.Core.Client.1.0.1116\lib\net45\CitizenFX.Core.Client.dll False - - False - ..\dependencies\client\MenuAPI.net.dll + + ..\dependencies\client\MenuAPI.dll False @@ -49,17 +48,13 @@ + - - False - ..\dependencies\shared\vMenuShared.net.dll - False - @@ -91,6 +86,8 @@ + + True @@ -111,6 +108,9 @@ Resources.Designer.cs + + + diff --git a/vMenuServer/packages.config b/vMenuServer/packages.config new file mode 100644 index 00000000..f96e69a3 --- /dev/null +++ b/vMenuServer/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/vMenuServer/vMenuServer.csproj b/vMenuServer/vMenuServer.csproj index 78a03d55..bd2effb7 100644 --- a/vMenuServer/vMenuServer.csproj +++ b/vMenuServer/vMenuServer.csproj @@ -18,29 +18,29 @@ embedded false ..\..\build\ - DEBUG;TRACE + TRACE;DEBUG;SERVER prompt 4 - AnyCPU + x64 embedded true ..\..\build\ - TRACE + TRACE;SERVER prompt 4 true - AnyCPU + x64 OnBuildSuccess - - ..\dependencies\server\CitizenFX.Core.Server.dll + + ..\packages\CitizenFX.Core.Server.1.0.1116\lib\net45\CitizenFX.Core.Server.dll False @@ -56,13 +56,10 @@ - - False - ..\dependencies\shared\vMenuShared.net.dll - True - + + @@ -80,6 +77,7 @@ PreserveNewest config + diff --git a/vMenuShared/Properties/AssemblyInfo.cs b/vMenuShared/Properties/AssemblyInfo.cs deleted file mode 100644 index df3d2d23..00000000 --- a/vMenuShared/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("vMenuShared")] -[assembly: AssemblyDescription("www.vespura.com")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("vMenuShared")] -[assembly: AssemblyCopyright("Copyright © 2017-2019")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("cfe8e7cd-eab0-48a1-a22f-566b048f110d")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("2.2.3.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/vMenuShared/vMenuShared.csproj b/vMenuShared/vMenuShared.csproj deleted file mode 100644 index cbe795ec..00000000 --- a/vMenuShared/vMenuShared.csproj +++ /dev/null @@ -1,75 +0,0 @@ - - - - - Debug - AnyCPU - {CFE8E7CD-EAB0-48A1-A22F-566B048F110D} - Library - Properties - vMenuShared - vMenuShared.net - v4.5.2 - 512 - true - - - - true - embedded - false - ..\..\build\ - DEBUG;TRACE - prompt - 4 - AnyCPU - - - embedded - true - ..\..\build\ - TRACE - prompt - 4 - true - - - AnyCPU - - - OnBuildSuccess - - - - ..\dependencies\client\CitizenFX.Core.dll - False - - - ..\dependencies\server\CitizenFX.Core.Server.dll - False - - - False - ..\dependencies\shared\Newtonsoft.Json.dll - False - - - - - - - - - - - - - - - - - - cp "$(TargetPath)" "$(SolutionDir)/dependencies/shared" - copy /Y "$(TargetPath)" "$(SolutionDir)\dependencies\shared" - - \ No newline at end of file

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 KKgahW1^xyO7Iy#u diff --git a/dependencies/client/CitizenFX.Core.xml b/dependencies/client/CitizenFX.Core.xml deleted file mode 100644 index b23239bb..00000000 --- a/dependencies/client/CitizenFX.Core.xml +++ /dev/null @@ -1,66753 +0,0 @@ - - - - CitizenFX.Core - - - -