好的,可以通过按键打开一个NUI面板来生成CDK。接下来,我将更新之前的代码,以便玩家可以使用按键打开生成CDK的界面。
### 1. 更新 NUI 界面
我们会添加一个新的按钮,用于输入CDK长度并生成随机CDK。
**nui/index.html**<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>CDK兑换与生成</title>
<style>
body {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
background-color: rgba(0, 0, 0, 0.8);
color: white;
font-family: Arial, sans-serif;
}
#container {
text-align: center;
}
input {
padding: 10px;
margin-top: 10px;
border-radius: 5px;
border: none;
}
button {
padding: 10px 20px;
border-radius: 5px;
border: none;
background-color: green;
color: white;
cursor: pointer;
}
</style>
</head>
<body>
<div id="container">
<h1>CDK兑换</h1>
<input type="text" id="cdkInput" placeholder="输入你的CDK兑换码" />
<button id="redeemButton">兑换</button>
<h1>生成CDK</h1>
<input type="number" id="cdkLengthInput" placeholder="输入CDK长度" />
<button id="generateButton">生成CDK</button>
</div>
<script src="script.js"></script>
</body>
</html>
**nui/script.js**let isVisible = false;
window.addEventListener('message', function(event) {
if (event.data.action === 'toggle') {
isVisible = !isVisible;
document.body.style.display = isVisible ? 'flex' : 'none';
}
});
// 处理生成CDK请求
document.getElementById('generateButton').addEventListener('click', function() {
const length = document.getElementById('cdkLengthInput').value;
fetch(`https://${GetParentResourceName()}/generateCDK`, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ length: length })
}).then(() => {
document.getElementById('cdkLengthInput').value = '';
});
});
// 处理兑换CDK请求
document.getElementById('redeemButton').addEventListener('click', function() {
const cdk = document.getElementById('cdkInput').value;
fetch(`https://${GetParentResourceName()}/redeem`, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ cdk: cdk })
}).then(() => {
document.getElementById('cdkInput').value = '';
});
});
### 2. 修改 server.lua
我们需要在`server.lua`中增加处理生成CDK的请求。
**server.lua**local QBCore = exports:GetCoreObject()
local cdkCodes = {} -- 存储CDK代码的表
-- 随机字符串生成函数
local function generateRandomCDK(length)
local charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
local result = ""
for i = 1, length do
local randomIndex = math.random(1, #charset)
result = result .. charset:sub(randomIndex, randomIndex)
end
return result
end
-- 生成随机CDK并存储
RegisterNetEvent('generateCDK')
AddEventHandler('generateCDK', function(length)
local cdkLength = tonumber(length) or 10 -- 默认为10位长度
local cdk = generateRandomCDK(cdkLength) -- 生成随机CDK
table.insert(cdkCodes, cdk) -- 添加CDK到表中
TriggerClientEvent('chat:addMessage', source, {
args = { '^2系统', 'CDK已经生成: ' .. cdk }
})
end)
-- 兑换CDK
RegisterServerEvent('cdk:redeem')
AddEventHandler('cdk:redeem', function(cdk)
local src = source
if table.contains(cdkCodes, cdk) then
TriggerClientEvent('chat:addMessage', src, {
args = { '^2系统', '兑换成功! 你获得了奖励!' }
})
-- 从CDK列表中移除已兑换的CDK
cdkCodes[cdk] = nil
else
TriggerClientEvent('chat:addMessage', src, {
args = { '^1错误', '无效或已被兑换的CDK' }
})
end
end)
-- 检查表中是否包含某个值的辅助函数
function table.contains(table, element)
for _, value in ipairs(table) do
if value == element then
return true
end
end
return false
end
### 3. 更新 client.lua
我们需要在 `client.lua` 中添加处理打开生成CDK面板的逻辑。
**client.lua**local QBCore = exports:GetCoreObject()
-- 打开兑换和生成面板
RegisterCommand('openCDKPanel', function()
SetNuiFocus(true, true)
SendNUIMessage({ action = 'toggle' })
end)
-- 接收生成CDK请求
RegisterNUICallback('generateCDK', function(data, cb)
TriggerServerEvent('generateCDK', data.length)
cb('ok')
end)
-- 接收兑换CDK请求
RegisterNUICallback('redeem', function(data, cb)
TriggerServerEvent('cdk:redeem', data.cdk)
cb('ok')
end)
-- 监听按键事件以打开面板
Citizen.CreateThread(function()
while true do
Citizen.Wait(0)
if IsControlJustPressed(0, 289) then -- F2键
SetNuiFocus(true, true)
SendNUIMessage({ action = 'toggle' })
end
end
end)
-- 关闭NUI时清除焦点
RegisterNUICallback('close', function(data, cb)
SetNuiFocus(false, false)
cb('ok')
end)
### 4. 更新 fxmanifest.lua
确保在 `fxmanifest.lua` 中引入所有文件:
fx_version 'cerulean'
game 'gta5'
author '你的名字'
description 'CDK生成与兑换插件'
version '1.0.0'
server_scripts {
'server.lua'
}
client_scripts {
'client.lua'
}
ui_page 'nui/index.html'
files {
'nui/index.html',
'nui/script.js',
}
### 5. 使用说明
- 玩家可以按 **F2** 键打开NUI面板。
- 在面板上,玩家可以输入CDK长度并点击“生成CDK”按钮来生成随机CDK。
- 输入生成的CDK后,可以使用“兑换”按钮进行兑换。
这样就完成了将生成CDK的功能集成到按键打开的界面中了。如果你还有其他问题或需求,请随时告诉我! |