# Custom menu

If you want to use a custom menu of your own to handle hostaging options, it's totally possible! Currently we offer two kinds of menu style "built-in" and "ox". If you're looking to implement something of your own it's still possible however you're going to require of some basic coding skills.

# 1. Updating config value

Head to of_hostage/shared.lua and select between the possible options.

-- ...
  shared.menu_style = "built-in" -- built-in, ox, custom

# 2. Edit your menu preferences

Head to of_hostage\client\modules\nui\custom\ox.lua as an example. If the resource was found then this file will be added as a preferred nui handler, if something messes up then we'll default to the built-in menu. You'll find something like this:

Nui.customHandler["ox"] = Client.DependStatus.lib == "ox_lib" and shared.menu_style == "ox" and
(function()
  local ctx = {
    id = Nui.context,
    title = "Hostage menu",
    canClose = true,
    onExit = Nui.closeMenu,
    onBack = Nui.closeMenu,
    options = {}
  }

  local function buildOptionsWithFlags(flags, options)
    local aux = {}

    for i = 1, #options do
      local iFlag = options[i]
      local isHidden = lib.table.contains(flags, iFlag)
      if isHidden then goto continue end

      table.insert(aux, {
        title = Client.T(iFlag),
        onSelect = function()
          TriggerEvent("of-hostage:handleOption", { action = { id = iFlag } })
          Nui.closeMenu()
        end,
      })

      :: continue ::
    end

    return #aux ~= 0 and aux or {
      title = "No options found"
    }
  end


  return {
    openMenu = function(flags)
      local newCtx = lib.table.deepclone(ctx)
      newCtx.options = buildOptionsWithFlags(flags, Nui.flagList)

      lib.registerContext(newCtx)
      lib.showContext(Nui.context)
    end,
  }
end)()

# 3. Implementing your custom menu

If you decided to implement your custom menu you'll need to take a few details into account. Obviously, set shared.menu_style to custom in the script config (shared.lua).

# 3.1 Option flags

In order to control which options are displayed and which actions we'll be dispatching we send flags to the NUI

Nui.flagList = { 
  "cuff", "uncuff", "grab", "grab_stop", 
  "follow", "follow_stop", "car_in", "car_out",
  "knees", "knees_stop", "carry", "carry_stop",
  "dead_rob", "free", "no_hostage"
}

The implementation is up to you, just make sure to send the correct flag when an item is selected.

# 3.2 Dispatching an action

In this case, we'll be sending an event to the client with the selected flag. Since we're not using the built-in menu, you should manually close the menu so during-menu threads are killed.

It should look something like this:

(function()
  TriggerEvent("of-hostage:handleOption", { action = { id = "my_flag_to_handle" } })
  Nui.closeMenu() -- Really important, otherwise you'll get into issues
end)()

# 3.3 What to return as a handler

Essentially, what we're doing is indexing a "custom" handler inside Nui.customHandler so we must return a table that looks like this in order to make it work properly:

Nui.customHandler["custom"] = (function()
  -- single-time-executed-code?
  return {
    openMenu = function(flags)
      -- your code
    end
  }
end)()