What this example does
The identifiers table is an editable notebook. Each entry becomes an action, so the script requires no external dataset or download.
util.joaat lowercases the identifier and returns a 32-bit hash. Values at or above 0x80000000 are converted to signed decimal by subtracting 2^32.
The message includes hexadecimal, unsigned decimal and signed decimal. Use the representation required by the API or file you are working with.
Install and run
- Use Nenyoo GTA V Premium with the native Lua API. Download the file and keep its
.luaextension. - Put
nenyoo-hash-notebook.luain the native user-script folder:%LOCALAPPDATA%\Nenyoo\Plus\Scripts\User\ - Refresh the script list, load the script, and open its script page. Keep the
-- @nenyoo-menumarker at the top. - Use the script’s Unload action when finished. Reload after editing its source.
Try it
- Choose adder and compare the output with the web JOAAT generator: 0xB779A091, u32 3078201489, i32 -1216765807.
- Add another ASCII model identifier to the table and reload the script.
- Open F10 to inspect the printed result if the notification disappears before you copy it.
Complete Lua source
nenyoo-hash-notebook.lua · original Nenyoo documentation example
-- @nenyoo-menu
-- Nenyoo documentation example: JOAAT hash notebook.
-- Requires GTA V Premium's native Engine + Foundation Lua APIs.
-- Source review only; no in-game compatibility claim.
local root = menu.my_root()
-- Add your own ASCII GTA identifiers to this list, then reload the script.
local identifiers = { "adder", "sultan", "weapon_pistol" }
for _, name in ipairs(identifiers) do
local identifier = name
menu.action(root, identifier, {}, "Print this identifier's JOAAT hash", function()
local hash = util.joaat(identifier)
local signed = hash
if hash >= 0x80000000 then
signed = hash - 0x100000000
end
local message = string.format("%s: 0x%08X | u32 %d | i32 %d",
identifier, hash, hash, signed)
print(message)
util.toast(message)
end)
end
Requirements and limits
- A matching hash does not prove the model exists in your game version. This script does not load, spawn or modify a model.
- Different strings can share a hash. This example hashes known text; it does not reverse an arbitrary number.
API and source review: 2026-11-13. These examples were reviewed against the bundled Nenyoo reference and source. They have not been tested in a running game, and no particular game-build compatibility is claimed.
APIs used: menu.my_root, menu.action, util.joaat, util.toast
