好的,下面是一个简单的银行插件示例,包括功能描述和相关代码。为了符合你的需求,这里会使用`ox_lib`的菜单和通知,同时结合`ox_target`来对准NPC打开菜单。以下是完整的代码,分为`server.lua`和`client.lua`两部分。
### 1. server.lua
local bankData = {}
-- 初始化银行数据
RegisterServerEvent('banking:init')
AddEventHandler('banking:init', function()
local src = source
bankData[src] = bankData[src] or { balance = 0, loans = 0 }
end)
-- 取钱
RegisterServerEvent('banking:withdraw')
AddEventHandler('banking:withdraw', function(amount)
local src = source
if bankData[src].balance >= amount then
bankData[src].balance = bankData[src].balance - amount
TriggerClientEvent('ox_lib:notify', src, '取钱成功,金额: $' .. amount)
else
TriggerClientEvent('ox_lib:notify', src, '余额不足!')
end
end)
-- 存钱
RegisterServerEvent('banking:deposit')
AddEventHandler('banking:deposit', function(amount)
local src = source
bankData[src].balance = bankData[src].balance + amount
TriggerClientEvent('ox_lib:notify', src, '存钱成功,金额: $' .. amount)
end)
-- 贷款
RegisterServerEvent('banking:applyLoan')
AddEventHandler('banking:applyLoan', function(amount)
local src = source
if amount % 10000 == 0 and amount <= 50000 then
bankData[src].loans = bankData[src].loans + amount
TriggerClientEvent('ox_lib:notify', src, '贷款成功,金额: $' .. amount)
else
TriggerClientEvent('ox_lib:notify', src, '请申请10000, 20000, 30000, 40000或50000的贷款!')
end
end)
-- 还款
RegisterServerEvent('banking:repayLoan')
AddEventHandler('banking:repayLoan', function(amount)
local src = source
if bankData[src].loans >= amount then
bankData[src].loans = bankData[src].loans - amount
TriggerClientEvent('ox_lib:notify', src, '还款成功,金额: $' .. amount)
else
TriggerClientEvent('ox_lib:notify', src, '您没有足够的贷款可还!')
end
end)
### 2. client.lua
local function openBankMenu()
local menu = {
{label = '取钱', value = 'withdraw'},
{label = '存钱', value = 'deposit'},
{label = '贷款', value = 'loan'},
{label = '还款', value = 'repay'}
}
local choice = exports.ox_lib:Menu(menu)
if choice == 'withdraw' then
local amount = exports.ox_lib:Prompt('请输入取钱金额:', '')
TriggerServerEvent('banking:withdraw', tonumber(amount))
elseif choice == 'deposit' then
local amount = exports.ox_lib:Prompt('请输入存款金额:', '')
TriggerServerEvent('banking:deposit', tonumber(amount))
elseif choice == 'loan' then
local amount = exports.ox_lib:Prompt('请输入贷款金额(10000, 20000, 30000, 40000, 50000):', '')
TriggerServerEvent('banking:applyLoan', tonumber(amount))
elseif choice == 'repay' then
local amount = exports.ox_lib:Prompt('请输入还款金额:', '')
TriggerServerEvent('banking:repayLoan', tonumber(amount))
end
end
-- 当玩家靠近NPC时打开银行菜单
local npcCoords = { x = 123.45, y = -456.78, z = 21.0 } -- 在这里替换为你的NPC坐标
local npc = nil
CreateThread(function()
while true do
Wait(0)
local playerCoords = GetEntityCoords(PlayerPedId())
if Vdist(playerCoords, npcCoords.x, npcCoords.y, npcCoords.z) < 3.0 then
DrawText3D(npcCoords.x, npcCoords.y, npcCoords.z, "[E] 打开银行")
if IsControlJustReleased(0, 38) then -- E键
openBankMenu()
end
end
end
end)
-- 3D文本绘制函数
function DrawText3D(x, y, z, text)
SetDrawOrigin(x, y, z, 0)
SetTextFont(4)
SetTextProportional(1)
SetTextScale(0.0, 0.35)
SetTextColour(255, 255, 255, 215)
SetTextEntry("STRING")
AddTextComponentString(text)
DrawText(0.0, 0.0)
local factor = (string.len(text)) / 370
DrawRect(0.0, 0.02, 0.005 + factor, 0.03, 0, 0, 0, 75)
ClearDrawOrigin()
end
-- 自动检测 ATM 机 (这里可以指定您的 ATM 坐标)
local atmCoords = {
{ x = 150.0, y = -1040.0, z = 29.0 },
{ x = 170.0, y = -1040.0, z = 29.0 }
}
CreateThread(function()
for _, atm in pairs(atmCoords) do
local blip = AddBlipForCoord(atm.x, atm.y, atm.z)
SetBlipSprite(blip, 108) -- ATM 图标
SetBlipDisplay(blip, 4)
SetBlipScale(blip, 0.7)
SetBlipColour(blip, 2)
SetBlipAsShortRange(blip, true)
BeginTextCommandSetBlipName("STRING")
AddTextComponentString("ATM机")
EndTextCommandSetBlipName(blip)
end
end)
### 配置说明
- 在代码中,您可以修改 `npcCoords` 和 `atmCoords` 变量以设置银行NPC和ATM的坐标。
- 确保已安装`ox_lib`和`ox_target`库。
以上代码提供了基本的银行功能和ATM功能。根据需要您可以进一步扩展和自定义。希望这个示例对您有帮助!如果有其他问题,请随时询问。 |