管理员菜单(可以帮助更好的学习开发脚本)
开发这个插件的目的只是为了自己开发插件的时候调试方便,所有功能并没有太多,只实现了一部分核心功能
但是我为这个插件添加了非常详细的注释,为了更多开发插件的新手能够更好的融入到fivem服务器开发中
这是部分注释展示
---------------------------------------
--------------------------------------------------------------------------------
-- 我们这里使用的是 es_extended 1.10.1 版本,通过 exports["es_extended"]:getSharedObject()
-- 来获取 ESX 主对象,而非旧版常见的 TriggerEvent('esx:getSharedObject', ...) 方式。
--------------------------------------------------------------------------------
ESX = exports["es_extended"]:getSharedObject()
--------------------------------------------------------------------------------
-- 全局变量,用于标记管理菜单(GUI)是否打开,以及 NUI 是否已准备就绪。
-- 这里的 menuOpen 在打开面板时设置为 true,关闭时设置为 false。
-- nuiReady 则由前端发回的回调 'nuiready' 来表示 NUI 加载完成。
--------------------------------------------------------------------------------
local menuOpen = false
local nuiReady = false
--------------------------------------------------------------------------------
-- 下面的 debugPrint 用于在控制台输出调试信息。
-- 由于只有开发者能看到控制台,这有助于快速定位问题,但不会打扰正常玩家。
--------------------------------------------------------------------------------
local function debugPrint(message)
print(" " .. message)
end
--------------------------------------------------------------------------------
-- OpenAdminMenuTest() 函数是我们打开管理员面板的入口。
-- 流程:
-- 1. 如果菜单已经打开,则关闭菜单,并通知 NUI 客户端"closeAdmin"。
-- 2. 如果菜单未打开,则先向服务器验证是否具有管理员权限 (admin 或 superadmin)。
-- - 若通过验证,则发送"openAdmin"消息与管理员的相关数据给 NUI。
-- - 之后启动一个线程,反复等待 NUI 告知自己已准备就绪 (nuiReady = true)。
-- - NUI 就绪后才真正 SetNuiFocus(true, true) 以捕获鼠标与键盘焦点。
--------------------------------------------------------------------------------
local function OpenAdminMenuTest()
debugPrint("调用OpenAdminMenuTest函数, menuOpen状态: " .. tostring(menuOpen))
if menuOpen then
-- 当前菜单已打开,则执行关闭操作
SetNuiFocus(false, false)
SendNUIMessage({
type = 'closeAdmin'
})
menuOpen = false
debugPrint("菜单已关闭")
return
end---------------------------------------
/**
* app.js 在整个项目中扮演管理面板前端逻辑的核心角色:
* 1. 通过 window.addEventListener('message') 接收来自客户端脚本(main.lua)的 NUI 通知,
* 从而打开/关闭管理员面板,或执行相应的界面更新操作。
* 2. 为页面上的按钮(如“传送”、“复活”、“无敌”等)注册点击事件,调用游戏内指令并与服务器端通信。
* 3. 负责展示物品列表、搜索功能、坐标输入框等界面交互,并将玩家输入的数据通过 fetch POST 发送回游戏端。
*/
let currentAdminData = null;
let allItems = [];
let nuiInitialized = false;
// 监听来自游戏的消息
window.addEventListener('message', function(event) {
const data = event.data;
switch(data.type) {
case 'openAdmin':
// 显示管理面板,并更新管理员相关信息
document.getElementById('app').style.display = 'flex';
updateAdminInfo(data.adminData);
// 若 NUI 尚未初始化,则发送一次 nuiready,以便客户端(main.lua)知道前端准备完成
setTimeout(() => {
if (!nuiInitialized) {
nuiInitialized = true;
fetch(`https://${GetParentResourceName()}/nuiready`, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({})
});
}
}, 100);
break;
{:4_95:}
页:
[1]