RedM documentation

Murphy Menu

Getting Started

Installation and API

Installation and API for Murphy Menu.


Install the complete resource

Download Murphy Menu from its Workshop page. Keep the folder name murphy_menu, with fxmanifest.lua at its root. Include the complete client/ and html/ directories, including the fonts, images, CSS and JavaScript.

server.cfg
ensure murphy_menu
# Start resources that use Menu after it.

If you only need Menu as a dependency, this is the installation step. The dependent script supplies its own entries and actions.

The examples below follow the official Menu source. Its manifest is unversioned. An inherited README may refer to redemrp_menu_base; Murphy integrations use the resource and event names shown here.

Open a small example menu

For your own integration, place this in a client Lua file of a separate resource that starts after Menu:

lua
RegisterCommand("docs_menu", function()
local api
TriggerEvent("murphy_menu:getData", function(value) api = value end)
if not api then return print("Start murphy_menu first") end
api.Close("default", GetCurrentResourceName(), "docs_example")
api.Open("default", GetCurrentResourceName(), "docs_example", {
title = "Example menu",
subtext = "Choose an action",
align = "top-left",
elements = {
{ label = "Print a message", value = "print", desc = "Test the selected action." },
{ label = "Quantity", value = 1, type = "slider", min = 1, max = 10, hop = 1 },
},
}, function(data, menu)
print("Selected value:", data.current.value)
menu.close()
end, function(_, menu)
menu.close()
end, nil, nil, true)
end, false)

Run /docs_menu to open this example. It only prints a value; it does not buy, grant or remove anything.

Arguments and focus

The complete signature is:

lua
MenuData.Open(type, namespace, name, data, submit, cancel, change, close, setnui)

submit handles selection, cancel handles closing/back input, and change handles changes such as sliders. The final setnui is the ninth argument. Set it to true when the integration needs cursor/typing focus. Keep the two nil arguments in the example when you do not provide change and close callbacks.

Use a distinct namespace/name for each menu. Close your own menu with menu.close() or MenuData.Close(type, namespace, name). CloseAll() also closes menus opened by other resources using this library.

Adjust entries

Field Use
label Visible row text
value Value returned to your callback
desc Description for the selected row
type = "slider" Numeric selector
min, max, hop Slider bounds and step
type = "text" Text-entry row
image Image shown with the row
descriptionimages Additional images, text and counts below the selected entry

The menu object has update(query, newData), setElement(index, key, value), setElements(elements) and setTitle(title) methods. Call menu.refresh() after modifying its data. Element indices in Lua start at 1.

Images must use paths to files available to the game's UI. Do not copy an old nui://redemrp_menu_base/ image path if that resource is not installed.

Menu callbacks handle presentation and input. Your server code still decides whether a player may purchase an item, access storage or perform a restricted action.


Last updated: September 15, 2026