mirror of
https://github.com/UltimateMenu/UltimateMenu.git
synced 2026-10-10 20:03:10 +08:00
Compare commits
129 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| cf2e354173 | |||
| 2c7b12720b | |||
| 034c9e4bef | |||
| e6d5d3a245 | |||
| b3ebc25a43 | |||
| b77c81bc48 | |||
| e8adcde6e2 | |||
| b54f4c48c5 | |||
| d868876d70 | |||
| e4a41668ee | |||
| 9ca89413c9 | |||
| c45c7f03fc | |||
| 624c607185 | |||
| a7120f68e7 | |||
| 4dd2ec689c | |||
| b7625dfbe1 | |||
| 5ff45873e2 | |||
| 720816f826 | |||
| c06a2ff411 | |||
| 96e20e98e1 | |||
| 2e74762235 | |||
| 307d6e07ca | |||
| 9583689be9 | |||
| c679209178 | |||
| c6ea3a97c0 | |||
| 306c771a78 | |||
| 11b079a49e | |||
| 335cf29d97 | |||
| a28c577c2a | |||
| 362e626393 | |||
| b6e598c4f7 | |||
| 150f423ed7 | |||
| 63f0ea1488 | |||
| ff7def525b | |||
| 29965eeb59 | |||
| c9fe45884c | |||
| b4f01c9771 | |||
| f3778a4b21 | |||
| ba45b292db | |||
| 859a682f92 | |||
| d14b42b08e | |||
| e030c7f3f4 | |||
| 5d5b8a6de0 | |||
| 2a2d655c96 | |||
| 8e72de2936 | |||
| cc1bbd0040 | |||
| bce5cca6cf | |||
| dc127f8e19 | |||
| 3ae957323f | |||
| 7f8468d4a3 | |||
| 4548f33290 | |||
| c9381be953 | |||
| ed8de348fa | |||
| ef159a8efc | |||
| db2b8ae936 | |||
| 5c5d95f84e | |||
| bb9ab6b081 | |||
| bb3b76951b | |||
| de2144259e | |||
| a83beadfc0 | |||
| fd1064ba80 | |||
| 4ccd511e2d | |||
| dbd70e2f0e | |||
| 9abe0ad3ab | |||
| a68053e489 | |||
| 6e287087f4 | |||
| bf71acc16c | |||
| 37e5774a4c | |||
| d635ed9866 | |||
| 129a4caa90 | |||
| 86a905d7dd | |||
| 9663c47911 | |||
| d566697e8d | |||
| 875dca2969 | |||
| 54832454ca | |||
| 2a9b4d51be | |||
| 6a6e0e2d50 | |||
| c107f0bf10 | |||
| f839fd2ee5 | |||
| ed828baf8b | |||
| ee142f4564 | |||
| 473c84ac69 | |||
| 8515113297 | |||
| 5cbdbb204d | |||
| 9972459de4 | |||
| cd1edbfa64 | |||
| 1730fb5bde | |||
| ff6052e2f4 | |||
| c5dbaea207 | |||
| 24bb44eb45 | |||
| d656cf578d | |||
| 6b592202ff | |||
| 503c1f2ba3 | |||
| 97c8e8df7c | |||
| 03844850ca | |||
| 57cff43f87 | |||
| ac6176f6c4 | |||
| a3606c6577 | |||
| 561837d5ef | |||
| e0aa8504c2 | |||
| b573a8f1b2 | |||
| a0dde9ffe8 | |||
| 80fad0a562 | |||
| 07ffefacdd | |||
| b66a28e547 | |||
| 8d899318b9 | |||
| 75652c055e | |||
| 92269eb9a2 | |||
| 540701e9e1 | |||
| af62aba2f3 | |||
| f6069a007f | |||
| 1830770813 | |||
| da306f00a8 | |||
| d3ae866674 | |||
| 146608dd9f | |||
| 4eec8e59e8 | |||
| 32335e27d8 | |||
| 5bd236b78e | |||
| cc0c040d71 | |||
| 73e1362d55 | |||
| 8053782438 | |||
| 0cb8d211b0 | |||
| 9e354e9bc8 | |||
| 9b6c9d8da3 | |||
| d74542e7db | |||
| 9aca683529 | |||
| 0dc7832b5f | |||
| 885a1c020b | |||
| 0937eb8d19 |
@@ -0,0 +1,113 @@
|
|||||||
|
name: Bug report
|
||||||
|
description: Create a report to help us improve
|
||||||
|
title: "[Bug]: "
|
||||||
|
labels: bug
|
||||||
|
type: bug
|
||||||
|
body:
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Describe the bug
|
||||||
|
description: A clear and concise description of what the bug is.
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Steps To Reproduce
|
||||||
|
description: Steps to reproduce the behavior.
|
||||||
|
placeholder: |
|
||||||
|
1. Go to '...'
|
||||||
|
2. Click on '...'
|
||||||
|
3. Scroll down to '...'
|
||||||
|
4. See error
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Expected Behavior
|
||||||
|
description: A clear and concise description of what you expected to happen.
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Logs
|
||||||
|
description: |
|
||||||
|
For a bug report to be valid, you need to include the logs for YimMenu.
|
||||||
|
They can be found under `%appdata%/YimMenu/cout.log`, even if you think the log file is useless we'd still like for you to include it here.
|
||||||
|
|
||||||
|
Tip: To easily upload your log file rename the cout.log file to cout.txt, alternatively zip the cout.log file. You can then drag and drop the file here.
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Screenshots / Video
|
||||||
|
description: |
|
||||||
|
If you think the issue can be better explained with screenshots or a video then consider adding these here.
|
||||||
|
|
||||||
|
Tip: You can attach images by clicking this area to highlight it and then dragging files in.
|
||||||
|
value: |
|
||||||
|
<!-- drag and drop your images or video(s) here -->
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
- type: dropdown
|
||||||
|
attributes:
|
||||||
|
label: Store
|
||||||
|
description: Which launcher/store do you use to launch your game?
|
||||||
|
multiple: false
|
||||||
|
options:
|
||||||
|
- Steam
|
||||||
|
- Epic Games
|
||||||
|
- Rockstar
|
||||||
|
- Other (please mention in "Additional context")
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: dropdown
|
||||||
|
attributes:
|
||||||
|
label: Language
|
||||||
|
description: Which language do you have GTA 5 set to?
|
||||||
|
multiple: false
|
||||||
|
options:
|
||||||
|
- English
|
||||||
|
- French
|
||||||
|
- Italian
|
||||||
|
- German
|
||||||
|
- Spanish
|
||||||
|
- Japanese
|
||||||
|
- Russian
|
||||||
|
- Polish
|
||||||
|
- Brazilian Portuguese
|
||||||
|
- Traditional Chinese
|
||||||
|
- Simplified Chinese
|
||||||
|
- Latin American Spanish
|
||||||
|
- Korean
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: dropdown
|
||||||
|
attributes:
|
||||||
|
label: YimMenu Language
|
||||||
|
description: Which language do you use with YimMenu?
|
||||||
|
multiple: false
|
||||||
|
options:
|
||||||
|
- English (US)
|
||||||
|
- Español (España)
|
||||||
|
- Français (FR)
|
||||||
|
- Italiano (IT)
|
||||||
|
- Portuguese (BR)
|
||||||
|
- Русский (RU)
|
||||||
|
- Chinese (CN)
|
||||||
|
- Chinese (TW)
|
||||||
|
- Korean (KR)
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Additional context
|
||||||
|
description: Add any other context about the problem here.
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
- type: checkboxes
|
||||||
|
attributes:
|
||||||
|
label: Release
|
||||||
|
description: We want to confirm that this issue exists on the latest **release** version of UltimateMenu, not a fork or your own version of UltimateMenu.
|
||||||
|
options:
|
||||||
|
- label: I've confirmed the issue exists on the latest **release** version of UltimateMenu
|
||||||
|
required: true
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
blank_issues_enabled: false
|
||||||
|
contact_links:
|
||||||
|
- name: Website
|
||||||
|
url: https://ultimatemenu.github.io
|
||||||
|
about: Main website of UltimateMenu.
|
||||||
|
- name: Docs | wiki
|
||||||
|
url: https://github.com/UltimateMenu/UltimateMenu/wiki
|
||||||
|
about: Maybe take a look a the docs in the main wiki of UltimateMenu?
|
||||||
|
- name: Discord Server
|
||||||
|
url: https://l7neg.uk.to/discord
|
||||||
|
about: Main Discord Server of UltimateMenu.
|
||||||
|
- name: UltimateMenu profile
|
||||||
|
url: https://github.com/UltimateMenu
|
||||||
|
about: Main github Orgnization profile of UltimateMenu for other sources.
|
||||||
|
- name: UltimateMenu Org discussions
|
||||||
|
url: https://github.com/orgs/UltimateMenu/discussions
|
||||||
|
about: Main github Orgnization discussions of UltimateMenu.
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
name: Enhancement request
|
||||||
|
description: Enhance an existing feature in UltimateMenu.
|
||||||
|
title: "[Enhancement]: "
|
||||||
|
labels: enhancement
|
||||||
|
type: enhancement
|
||||||
|
body:
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Which feature
|
||||||
|
description: "Explain which feature you want to see enhanced/improved and what you'd like to be changed about it."
|
||||||
|
placeholder: "ex: I'd like to enhance/improve .... because .... ."
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Reason
|
||||||
|
description: Provide Reasoning
|
||||||
|
placeholder: "Tell us why you'd want for us to improve this feature in UltimateMenu."
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Additional context
|
||||||
|
description: |
|
||||||
|
Add any other context about the request here.
|
||||||
|
|
||||||
|
Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in.
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
name: Feature request
|
||||||
|
description: Suggest an idea for this project
|
||||||
|
title: "[Request]: "
|
||||||
|
labels: feature request
|
||||||
|
type: feature request
|
||||||
|
body:
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Problem
|
||||||
|
description: "Is your feature request related to a problem? Please describe."
|
||||||
|
placeholder: "A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]"
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Solution
|
||||||
|
description: "Describe the solution you'd like"
|
||||||
|
placeholder: "A clear and concise description of what you want to happen."
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Reason
|
||||||
|
description: Provide Reasoning
|
||||||
|
placeholder: "Tell us why you'd want for us to add this to UltimateMenu."
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Additional context
|
||||||
|
description: |
|
||||||
|
Add any other context about the request here.
|
||||||
|
|
||||||
|
Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in.
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
name: Autolocker
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request_target:
|
||||||
|
types: [closed]
|
||||||
|
issues:
|
||||||
|
types: [closed]
|
||||||
|
|
||||||
|
permissions: write-all
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
autolock-prs:
|
||||||
|
if: ${{ github.event_name == 'pull_request_target' && github.event.pull_request.merged }}
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
name: Autolock merged PRs
|
||||||
|
steps:
|
||||||
|
- name: Autolock merged PRs
|
||||||
|
uses: actions/github-script@v6
|
||||||
|
with:
|
||||||
|
script: |
|
||||||
|
github.rest.issues.lock({
|
||||||
|
issue_number: context.issue.number,
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
lock_reason: "resolved"
|
||||||
|
});
|
||||||
|
|
||||||
|
autolock-issues:
|
||||||
|
if: ${{ github.event_name == 'issues' }}
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
name: Autolock closed Issues
|
||||||
|
steps:
|
||||||
|
- name: Autolock closed Issues
|
||||||
|
uses: actions/github-script@v6
|
||||||
|
with:
|
||||||
|
script: |
|
||||||
|
github.rest.issues.lock({
|
||||||
|
issue_number: context.issue.number,
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
lock_reason: "resolved"
|
||||||
|
});
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,21 @@
|
|||||||
|
# Ultimate Menu for Nenyoo
|
||||||
|
|
||||||
|
Ultimate Menu runs in Nenyoo on GTA V Legacy and Enhanced with the same menu structure and controls as the YimMenu edition.
|
||||||
|
|
||||||
|
## Install
|
||||||
|
|
||||||
|
1. Copy this folder to `%LOCALAPPDATA%\Nenyoo\Plus\Scripts\User\UltimateMenu\`.
|
||||||
|
2. Keep `Ultimate_Menu.lua` and the `lib` folder together.
|
||||||
|
3. In Nenyoo, open **Scripts** and select `Ultimate_Menu.lua`.
|
||||||
|
|
||||||
|
Online features become available after joining GTA Online.
|
||||||
|
|
||||||
|
## Supported builds
|
||||||
|
|
||||||
|
- GTA V Legacy 3889
|
||||||
|
- GTA V Enhanced 1158.13
|
||||||
|
|
||||||
|
The correct offset catalog is selected automatically. Build-specific globals and locals are stored in:
|
||||||
|
|
||||||
|
- `lib/game_offsets_legacy.offsets`
|
||||||
|
- `lib/game_offsets_enhanced.offsets`
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
-- @nenyoo-menu
|
||||||
|
-- Ultimate Menu for Nenyoo (GTA V Legacy and Enhanced).
|
||||||
|
-- Install this package under %LOCALAPPDATA%\Nenyoo\Plus\Scripts\User\UltimateMenu.
|
||||||
|
|
||||||
|
local source = debug.getinfo(1, "S").source
|
||||||
|
assert(source:sub(1, 1) == "@", "Ultimate Menu must be loaded from a file")
|
||||||
|
local directory = source:sub(2):match("^(.*[\\/])")
|
||||||
|
assert(directory, "Could not locate the Ultimate Menu package")
|
||||||
|
|
||||||
|
-- The YimResupplier config belongs to this package, not the GTA working directory.
|
||||||
|
local script_io = setmetatable({
|
||||||
|
open = function(name, mode)
|
||||||
|
if name == "YimResupplier.json" then name = directory .. name end
|
||||||
|
return io.open(name, mode)
|
||||||
|
end,
|
||||||
|
}, {__index = io})
|
||||||
|
|
||||||
|
-- Keep compatibility overrides inside this package; other Nenyoo scripts use
|
||||||
|
-- the original native, memory, network, and script tables.
|
||||||
|
local environment = setmetatable({
|
||||||
|
io = script_io,
|
||||||
|
memory = setmetatable({}, {__index = memory}),
|
||||||
|
network = setmetatable({}, {__index = network or {}}),
|
||||||
|
script = setmetatable({}, {__index = script or {}}),
|
||||||
|
NETSHOPPING = setmetatable({}, {__index = NETSHOPPING}),
|
||||||
|
PAD = setmetatable({}, {__index = PAD}),
|
||||||
|
HUD = setmetatable({}, {__index = HUD}),
|
||||||
|
ENTITY = setmetatable({}, {__index = ENTITY}),
|
||||||
|
CUTSCENE = setmetatable({}, {__index = CUTSCENE}),
|
||||||
|
}, {__index = _ENV})
|
||||||
|
local function run(path)
|
||||||
|
local chunk, message = loadfile(path, "t", environment)
|
||||||
|
assert(chunk, message)
|
||||||
|
return chunk()
|
||||||
|
end
|
||||||
|
|
||||||
|
local offsets = run(directory .. "lib\\game_offsets.offsets")
|
||||||
|
for _, group in ipairs({offsets.globals, offsets.locals, offsets.scripts}) do
|
||||||
|
for name, value in pairs(group) do environment[name] = value end
|
||||||
|
end
|
||||||
|
environment.ULTIMATE_MENU_OFFSETS = offsets
|
||||||
|
environment.ULTIMATE_MENU_EDITION = offsets.edition
|
||||||
|
environment.ULTIMATE_MENU_BUILD = offsets.build
|
||||||
|
|
||||||
|
local compatibility = run(directory .. "lib\\yim_compat.lua")
|
||||||
|
run(directory .. "lib\\Ultimate_Menu_Legacy.lua")
|
||||||
|
run(directory .. "lib\\info_panel.lua")(compatibility)
|
||||||
|
compatibility.materialize_imgui()
|
||||||
|
return compatibility
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,13 @@
|
|||||||
|
-- Select the build-specific GTA address catalog at runtime.
|
||||||
|
local source = debug.getinfo(1, "S").source
|
||||||
|
assert(source:sub(1, 1) == "@", "Offset catalog must be loaded from a file")
|
||||||
|
local directory = assert(source:sub(2):match("^(.*[\\/])"), "Could not locate offset catalogs")
|
||||||
|
|
||||||
|
local edition = "Legacy"
|
||||||
|
if ctx and type(ctx.edition) == "function" then
|
||||||
|
local reported = tostring(ctx.edition())
|
||||||
|
if reported:lower() == "enhanced" then edition = "Enhanced" end
|
||||||
|
end
|
||||||
|
|
||||||
|
local filename = edition == "Enhanced" and "game_offsets_enhanced.offsets" or "game_offsets_legacy.offsets"
|
||||||
|
return assert(loadfile(directory .. filename, "t", _ENV))()
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,138 @@
|
|||||||
|
-- Companion information panel for the Nenyoo edition of Ultimate Menu.
|
||||||
|
-- The menu adapter publishes text on the script thread. Draw only the
|
||||||
|
-- published strings here; overlay.on_draw runs on Nenyoo's render thread.
|
||||||
|
return function(compat)
|
||||||
|
local scroll_by_page = {}
|
||||||
|
local last_page
|
||||||
|
|
||||||
|
local function clamp(value, low, high)
|
||||||
|
return math.max(low, math.min(high, value))
|
||||||
|
end
|
||||||
|
|
||||||
|
local function wrap_paragraph(value, max_width, output, heading, color)
|
||||||
|
local line = ""
|
||||||
|
for word in value:gmatch("%S+") do
|
||||||
|
local candidate = line == "" and word or line .. " " .. word
|
||||||
|
if line ~= "" and text.width(font.small, candidate) > max_width then
|
||||||
|
output[#output + 1] = {text = line, heading = heading, color = color}
|
||||||
|
line = word
|
||||||
|
else
|
||||||
|
line = candidate
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if line ~= "" then output[#output + 1] = {text = line, heading = heading, color = color} end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function make_lines(rows, max_width)
|
||||||
|
local lines = {}
|
||||||
|
for _, row in ipairs(rows) do
|
||||||
|
local value = tostring(row.text or ""):gsub("\r", "")
|
||||||
|
if value == "" then
|
||||||
|
lines[#lines + 1] = {gap = 8}
|
||||||
|
else
|
||||||
|
local compact = value:gsub("%s+", " "):match("^%s*(.-)%s*$")
|
||||||
|
local heading = #compact <= 38 and (compact:sub(-1) == ":" or compact == "Preps")
|
||||||
|
for paragraph in (value .. "\n"):gmatch("(.-)\n") do
|
||||||
|
if paragraph:match("%S") then wrap_paragraph(paragraph, max_width, lines, heading, row.color)
|
||||||
|
else lines[#lines + 1] = {gap = 8} end
|
||||||
|
end
|
||||||
|
lines[#lines + 1] = {gap = heading and 7 or 11}
|
||||||
|
end
|
||||||
|
if row.tooltip then
|
||||||
|
wrap_paragraph(row.tooltip:gsub("%s+", " "), max_width, lines, false, nil)
|
||||||
|
lines[#lines + 1] = {gap = 11}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
while #lines > 0 and lines[#lines].gap do lines[#lines] = nil end
|
||||||
|
return lines
|
||||||
|
end
|
||||||
|
|
||||||
|
overlay.on_draw("ultimate_menu_information", function()
|
||||||
|
if not menu.is_visible() then return end
|
||||||
|
local id = menu.page_id()
|
||||||
|
local info = compat.info_for_page(id)
|
||||||
|
if not info or #info.rows == 0 then return end
|
||||||
|
local sw, sh = ctx.screen_w(), ctx.screen_h()
|
||||||
|
local bx, by, bw = menu.bounds()
|
||||||
|
if not bw or bw <= 0 then return end
|
||||||
|
|
||||||
|
local gap, pad, header_h = 14, 14, 36
|
||||||
|
local width = math.min(420, math.max(280, sw * 0.30))
|
||||||
|
local side = bx + bw + gap + width <= sw - 8 or bx - gap - width >= 8
|
||||||
|
if not side then width = math.min(600, sw - 16) end
|
||||||
|
local x
|
||||||
|
if side and bx + bw + gap + width <= sw - 8 then x = bx + bw + gap
|
||||||
|
elseif side then x = bx - gap - width
|
||||||
|
else x = clamp(bx + (bw - width) * 0.5, 8, sw - width - 8) end
|
||||||
|
|
||||||
|
local lines = make_lines(info.rows, width - pad * 2)
|
||||||
|
if #lines == 0 then return end
|
||||||
|
local line_h = text.height(font.small) + 4
|
||||||
|
local content_h = 0
|
||||||
|
for _, line in ipairs(lines) do content_h = content_h + (line.gap or line_h) end
|
||||||
|
local desired_h = header_h + pad * 2 + content_h
|
||||||
|
local height = math.min(desired_h, sh - 16, 650)
|
||||||
|
local y = clamp(by, 8, sh - height - 8)
|
||||||
|
if not side then
|
||||||
|
local _, content_y, _, content_height = menu.content_rect()
|
||||||
|
local below = content_y + content_height + 56
|
||||||
|
local space_below = sh - below - 8
|
||||||
|
if content_height > 0 and space_below >= 170 then
|
||||||
|
y = below
|
||||||
|
height = math.min(height, space_below)
|
||||||
|
elseif by >= 180 then
|
||||||
|
height = math.min(height, by - 16)
|
||||||
|
y = by - height - 8
|
||||||
|
end
|
||||||
|
end
|
||||||
|
local viewport_h = height - header_h - pad * 2
|
||||||
|
if viewport_h <= line_h then return end
|
||||||
|
|
||||||
|
if last_page ~= id then scroll_by_page[id] = 0; last_page = id end
|
||||||
|
local max_scroll = math.max(0, content_h - viewport_h)
|
||||||
|
local scroll = clamp(scroll_by_page[id] or 0, 0, max_scroll)
|
||||||
|
local mx, my = input.mouse_x(), input.mouse_y()
|
||||||
|
if mx >= x and mx <= x + width and my >= y and my <= y + height then
|
||||||
|
scroll = clamp(scroll - input.mouse_wheel() * line_h * 3, 0, max_scroll)
|
||||||
|
end
|
||||||
|
scroll_by_page[id] = scroll
|
||||||
|
|
||||||
|
local ar, ag, ab = theme.accent()
|
||||||
|
draw.rect(x, y, x + width, y + height, 12, 15, 22, 232, 7)
|
||||||
|
draw.rect(x, y, x + width, y + header_h, 24, 32, 44, 245, 7)
|
||||||
|
draw.rect(x, y + header_h - 2, x + width, y + header_h, ar, ag, ab, 255)
|
||||||
|
draw.rect_outline(x, y, x + width, y + height, ar, ag, ab, 125, 7)
|
||||||
|
text.draw_ellipsis(font.item, x + pad, y + (header_h - text.height(font.item)) * 0.5,
|
||||||
|
240, 245, 250, 255, info.title, width - pad * 2)
|
||||||
|
|
||||||
|
local top = y + header_h + pad
|
||||||
|
draw.push_clip(x + pad, top, x + width - pad, top + viewport_h)
|
||||||
|
local cursor = top - scroll
|
||||||
|
for _, line in ipairs(lines) do
|
||||||
|
if line.gap then cursor = cursor + line.gap
|
||||||
|
else
|
||||||
|
if cursor + line_h >= top and cursor <= top + viewport_h then
|
||||||
|
local r, g, b = 220, 228, 238
|
||||||
|
if line.heading then r, g, b = ar, ag, ab end
|
||||||
|
if line.color then
|
||||||
|
local function channel(value)
|
||||||
|
value = value or 1
|
||||||
|
return clamp(math.floor((value <= 1 and value * 255 or value) + 0.5), 0, 255)
|
||||||
|
end
|
||||||
|
r, g, b = channel(line.color[1]), channel(line.color[2]), channel(line.color[3])
|
||||||
|
end
|
||||||
|
text.draw(font.small, x + pad, cursor, r, g, b, 245, line.text)
|
||||||
|
end
|
||||||
|
cursor = cursor + line_h
|
||||||
|
end
|
||||||
|
end
|
||||||
|
draw.pop_clip()
|
||||||
|
if max_scroll > 0 then
|
||||||
|
local track_top, track_height = top, viewport_h
|
||||||
|
local thumb_h = math.max(22, track_height * viewport_h / content_h)
|
||||||
|
local thumb_y = track_top + (track_height - thumb_h) * scroll / max_scroll
|
||||||
|
draw.rect(x + width - 5, thumb_y, x + width - 2, thumb_y + thumb_h,
|
||||||
|
ar, ag, ab, 190, 2)
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
end
|
||||||
File diff suppressed because it is too large
Load Diff
Binary file not shown.
|
After Width: | Height: | Size: 541 KiB |
@@ -1,113 +1,85 @@
|
|||||||
<div align="center">
|
<p align="center">
|
||||||
<a href="https://ghrmt.vercel.app"><img src="https://readme-typing-svg.vercel.app/?lines=Ultimate+Menu+Script;Most+Useful+Script;Written+By+L7NEG&font=Fira%20Code&size=31¢er=true&width=380&height=50&duration=4000&pause=1000" alt="Readme Typing Svg Vercel Version By L7NEG"></a>
|
<img src="https://readme-typing-svg.vercel.app/?lines=Ultimate+Menu+Script;Most+Useful+Script&font=Fira%20Code&size=31¢er=true&width=380&height=50&duration=4000&pause=1000" alt="Typing Banner">
|
||||||
</div>
|
</p>
|
||||||
|
|
||||||
<div align="center">
|
<h1 align="center">Ultimate Menu</h1>
|
||||||
<h1><a href="https://www.unknowncheats.me/forum/grand-theft-auto-v/565688-ultimate-menu-script.html">Ultimate Menu</a></h1>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div align="center">
|
<p align="center"><em>A powerful menu script featuring advanced recovery options, money tools, a Heist Editor, and much more.</em></p>
|
||||||
<h1><a href="https://www.unknowncheats.me/forum/grand-theft-auto-v/597103-ultimate-menu-yimmenu.html">Ultimate Menu For YimMenu</a></h1>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<a href="https://www.unknowncheats.me/forum/grand-theft-auto-v/565688-ultimate-menu-script.html">[ModestMenu UKC Thread]</a> •
|
||||||
|
<a href="https://www.unknowncheats.me/forum/grand-theft-auto-v/597103-ultimate-menu-yimmenu.html">[YimMenu UKC Thread]</a> •
|
||||||
|
<a href="https://github.com/UltimateMenu/UltimateMenu?tab=readme-ov-file#-faq">[FAQ]</a>
|
||||||
|
</p>
|
||||||
|
|
||||||
# How To Use Ultimate Menu Script
|
> [!NOTE]
|
||||||
For every Version of the ultimate menu (Kiddion/YimMenu) there is a different use and ways to fully Run It.
|
> [How To Use YimMenu After BattlEye Anticheat Update (Legacy & Enhanced)](https://github.com/UltimateMenu/UltimateMenu/wiki/How-To-Use-UM-Script-With-YimMenu-After-Battleye-Anticheat-(Legacy-&-Enhanced))
|
||||||
|
|
||||||
For Kiddions script is just puting the script into scripts directory, inside the Kiddions files.
|
---
|
||||||
|
|
||||||
For YimMenu it is actually the same way, but first before initiating the script you will need to go to Settings > Lua > Open Folder Option
|
<h2 align="center">📸 YimMenu Preview (Legacy)</h2>
|
||||||
|
|
||||||
From There Go To Scripts Folder Then Paste The Ultimate Menu In There
|
<p align="center">
|
||||||
|
<img src="https://ultimatemenu.github.io/ScreenShots/YimMenu/15.png" alt="Ultimate Menu Preview">
|
||||||
|
</p>
|
||||||
|
|
||||||
--------------------------------------------------------------------------------------------------
|
---
|
||||||
<div align="center">
|
|
||||||
<h1> New ScreenShots V2.1</h1>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
[](https://ibb.co/Rhzr2WC)
|
<h2 align="center">📸 Nenyoo Preview (Legacy)</h2>
|
||||||
[](https://ibb.co/NY3SMjM)
|
|
||||||
--------------------------------------------------------------------------------------------------
|
|
||||||
<div align="center"> <h1> <details>
|
|
||||||
<summary>Old Versions ScreenShots</summary>
|
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<img src="Nenyoo/preview.jpg" alt="Ultimate Menu running in Nenyoo on GTA V Legacy">
|
||||||
|
</p>
|
||||||
|
|
||||||
[](https://i.imgur.com/M54nsX6.png)
|
---
|
||||||
[](https://i.imgur.com/qszJJNK.png)
|
|
||||||
[](https://i.imgur.com/A5951n9.png)
|
|
||||||
[](https://i.imgur.com/Q04ceX5.png)
|
|
||||||
[](https://i.imgur.com/J3vquqW.png)
|
|
||||||
[](https://i.imgur.com/OKD4ruV.png)
|
|
||||||
[](https://i.imgur.com/MmRIRzW.png)
|
|
||||||
[](https://i.imgur.com/tuVD0wg.png)
|
|
||||||
[](https://i.imgur.com/b2erLqZ.png)
|
|
||||||
[](https://i.imgur.com/C1nhfs6.png)
|
|
||||||
[](https://i.imgur.com/2kNARYV.png)
|
|
||||||
[](https://i.imgur.com/vfsnLz4.png)
|
|
||||||
[](https://i.imgur.com/5ovnXIS.png)
|
|
||||||
[](https://i.imgur.com/HtOYaT2.png)
|
|
||||||
[](https://i.imgur.com/wSw48p7.png)
|
|
||||||
[](https://i.imgur.com/jz13ysV.png)
|
|
||||||
[](https://i.imgur.com/NlATJNG.png)
|
|
||||||
[](https://i.imgur.com/SSf5TwH.png)
|
|
||||||
[](https://i.imgur.com/0QDgNad.png)
|
|
||||||
[](https://i.imgur.com/oBnOqdG.png)
|
|
||||||
[](https://i.imgur.com/gspkbJq.png)
|
|
||||||
[](https://i.imgur.com/fQnOyPM.png)
|
|
||||||
[](https://i.imgur.com/Zfiv9po.png)
|
|
||||||
[](https://i.imgur.com/I7QHqM8.png)
|
|
||||||
[](https://i.imgur.com/b0JmgBF.png)
|
|
||||||
[](https://i.imgur.com/qZpu6Uo.png)
|
|
||||||
[](https://i.imgur.com/EFF9efF.png)
|
|
||||||
[](https://i.imgur.com/9QRULhG.png)
|
|
||||||
[](https://i.imgur.com/bas1EOp.png)
|
|
||||||
[](https://i.imgur.com/JMkmB7X.png)
|
|
||||||
[](https://i.imgur.com/Im3W9vf.png)
|
|
||||||
[](https://i.imgur.com/qw4ir1P.png)
|
|
||||||
[](https://i.imgur.com/IZmhyCp.png)
|
|
||||||
[](https://i.imgur.com/EN7gLdh.png)
|
|
||||||
[](https://i.imgur.com/rSPdw5D.png)
|
|
||||||
[](https://i.imgur.com/KOF7T0I.png)
|
|
||||||
[](https://i.imgur.com/c6XapmD.png)
|
|
||||||
[](https://i.imgur.com/YNsHiEz.png)
|
|
||||||
[](https://i.imgur.com/D1JDwWy.png)
|
|
||||||
[](https://i.imgur.com/uRU7pEJ.png)
|
|
||||||
[](https://i.imgur.com/QqqTWhV.png)
|
|
||||||
[](https://i.imgur.com/FfeC0g0.png)
|
|
||||||
[](https://i.imgur.com/ewUvo9k.png)
|
|
||||||
[](https://i.imgur.com/aIR70Sq.png)
|
|
||||||
[](https://i.imgur.com/M33uCnH.png)
|
|
||||||
[](https://i.imgur.com/wuS93Jy.png)
|
|
||||||
[](https://i.imgur.com/IGrWFv4.png)
|
|
||||||
[](https://i.imgur.com/Wwcu6uJ.png)
|
|
||||||
[](https://i.imgur.com/Cw3lR0K.png)
|
|
||||||
[](https://i.imgur.com/sK8v823.png)
|
|
||||||
[](https://i.imgur.com/TU2a1dL.png)
|
|
||||||
[](https://i.imgur.com/I4BKPNx.png)
|
|
||||||
[](https://i.imgur.com/TfUzBnL.png)
|
|
||||||
[](https://i.imgur.com/he7jVbf.png)
|
|
||||||
[](https://i.imgur.com/2gFkwgd.png)
|
|
||||||
[](https://i.imgur.com/0JTNdeR.png)
|
|
||||||
[](https://i.imgur.com/ZOhngs0.png)
|
|
||||||
[](https://i.imgur.com/JdGNN5u.png)
|
|
||||||
[](https://i.imgur.com/g1E5tET.png)
|
|
||||||
[](https://i.imgur.com/us8pTnv.png)
|
|
||||||
[](https://i.imgur.com/UxNxSD2.png)
|
|
||||||
[](https://i.imgur.com/dsaBz9M.png)
|
|
||||||
[](https://i.imgur.com/ahzoYzX.png)
|
|
||||||
[](https://i.imgur.com/AR0fcUS.png)
|
|
||||||
[](https://i.imgur.com/4BWvVJx.png)
|
|
||||||
[](https://i.imgur.com/M5RIvvm.png)
|
|
||||||
[](https://i.imgur.com/weSH8H1.png)
|
|
||||||
|
|
||||||
</details> </h1> </div>
|
## ❓ FAQ
|
||||||
|
|
||||||
--------------------------------------------------------------------------------------------------
|
<details>
|
||||||
## When Your New Updates Will Be Out?
|
<summary><strong>How To Use?</strong></summary>
|
||||||
No ETA for big updates also because i don't know actually if im going to be able to continue this script (boths) because i have a life and i need to study. This is a helpfull and fun project for everyone who wants to use it, is free and you can use my script as a template.
|
|
||||||
--------------------------------------------------------------------------------------------------
|
|
||||||
## About
|
|
||||||
- By the way to anyone who ask's about the Ultimate-Menu script, is not entire mine, there is actually in credits every single person who i taked code from and who helped me with this.
|
|
||||||
## Latest Ultimate Menu Kiddions update was on: 20/04/2024
|
|
||||||
## Latest Ultimate Menu YimMenu update was on: 31/12/2023
|
|
||||||
|
|
||||||
|
- For **YimMenu Legacy**:
|
||||||
|
Open YimMenu → `Settings` → `Lua` → `Open Folder` → `scripts`
|
||||||
|
→ Paste the `.lua` file there. That’s it!
|
||||||
|
|
||||||
|
- For **YimMenuV2 Enhanced**:
|
||||||
|
Coming Soon (WIP)
|
||||||
|
- For **Nenyoo GTA V Legacy or Enhanced**:
|
||||||
|
Copy the contents of [`Nenyoo`](Nenyoo) to `%LOCALAPPDATA%\Nenyoo\Plus\Scripts\User\UltimateMenu\`. In Nenyoo, open `Scripts` and select `Ultimate_Menu.lua` to load its menu page. The `lib` folder must stay beside the entry script. Join GTA Online before using online actions.
|
||||||
|
Supported builds: Legacy 3889 and Enhanced 1158.13. The matching offsets are selected automatically.
|
||||||
|
</details>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📅 Update Info
|
||||||
|
|
||||||
|
- **Ultimate Menu for ModestMenu**: Last updated on **Dec 12, 2024** *(Final Update)*
|
||||||
|
- **Ultimate Menu for YimMenu Legacy**: Last updated on **Jul 24, 2026**
|
||||||
|
- **Ultimate Menu for YimMenu Enhanced**: **Might Not Coming Soon (WIP Waiting for completion of YimMenuV2 Lua API)**
|
||||||
|
- **Ultimate Menu for Nenyoo**: Legacy and Enhanced support
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🛠️ About
|
||||||
|
|
||||||
|
This is a fun and helpful free project for the community.
|
||||||
|
There is **no ETA** for future big updates, as I’m currently focused on studying and personal life.
|
||||||
|
|
||||||
|
You're welcome to fork, use, and build on this script for your own needs.
|
||||||
|
Treat it as a base or template if you wish.
|
||||||
|
|
||||||
|
Credits For Everything I Used Is Included In The Script.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<h2 align="left">💬 Discord Server</h2>
|
||||||
|
|
||||||
|
<p align="left">
|
||||||
|
<a href="https://dsc.gg/l7neg">
|
||||||
|
<img src="https://discord.com/api/guilds/1025804814183047218/widget.png?style=banner2" alt="L7NEG Community Discord Server">
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Thanks for using Ultimate Menu Made With ❤️ By L7NEG & Contributors/Helpers**
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user