问题的根源在于 `Config.BankLocations` 中没有 `name` 字段,导致在尝试拼接字符串时出现 `"attempt to concatenate a nil value"` 错误。我们需要为每个银行位置添加一个默认的 `name` 字段,或者在代码中处理 `name` 字段为 `nil` 的情况。
为了修复这个问题,我们可以为每个银行位置生成一个默认的名称,防止因为 `name` 字段缺失而报错。
以下是修正后的代码:
ESX = nil
Citizen.CreateThread(function()
-- 等待 ESX 初始化
while ESX == nil do
TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end)
Citizen.Wait(0)
end
-- 遍历配置中的银行位置并添加目标区域
for i, location in ipairs(Config.BankLocations) do
local zoneName = location.name or ('default_zone_' .. i) -- 给每个银行位置一个默认的名称
ox_target:addBoxZone('bank_zone_' .. zoneName, vec3(location.x, location.y, location.z), 2, 2, {
name = 'bank_zone_' .. zoneName, -- 区域名称
rotation = 45, -- 定义区域的旋转角度
debug = false, -- 是否启用调试模式
minZ = location.z - 1, -- 定义区域的最小Z坐标
maxZ = location.z + 1, -- 定义区域的最大Z坐标
options = {
{
name = 'open_bank', -- 选项名称
event = 'bank:openMenu', -- 触发事件
icon = 'fas fa-university', -- 图标
label = '与银行交谈', -- 标签
canInteract = function() -- 定义交互条件,即玩家需要有银行卡
return ESX.PlayerData.inventory.bankcard ~= nil
end
}
}
})
end
-- 遍历配置中的ATM模型并添加目标模型
for _, model in ipairs(Config.ATMModels) do
ox_target:addModel(model, {
options = {
{
name = 'open_atm', -- 选项名称
event = 'atm:openMenu', -- 触发事件
icon = 'fas fa-credit-card', -- 图标
label = '使用 ATM', -- 标签
canInteract = function() -- 定义交互条件,即玩家需要有银行卡
return ESX.PlayerData.inventory.bankcard ~= nil
end
}
}
})
end
end)
RegisterNetEvent('bank:openMenu')
AddEventHandler('bank:openMenu', function()
-- 打开银行菜单
end)
RegisterNetEvent('atm:openMenu')
AddEventHandler('atm:openMenu', function()
-- 打开ATM菜单
end)
### 修正内容:
1. **生成默认区域名称**:为没有 `name` 字段的银行位置生成一个默认的名称 `default_zone_<index>`,防止拼接 `nil` 值时报错。
2. **遍历银行位置**:在 `for` 循环中添加索引 `i`,以便为每个银行位置生成唯一的默认名称。
### 确认 `Config.BankLocations` 示例:
确保 `config.lua` 中的 `Config.BankLocations` 如下所示:
Config = {}
Config.BankLocations = {
{x = 150.266, y = -1040.203, z = 29.374},
{x = -1212.980, y = -330.841, z = 37.787},
-- 添加更多银行坐标
}
Config.ATMModels = {
`prop_atm_01`,
`prop_atm_02`,
-- 添加更多ATM模型
}
Config.BankCardItem = 'bankcard' -- ox_inventory中的银行卡物品名称
Config.TransferAmounts = {1000, 2000, 3000, 4000, 5000}
Config.LoanAmounts = {1000, 2000, 3000, 4000, 5000}
Config.LoanInterestRate = 0.02 -- 每月2%的利息
通过这种方式,即使 `Config.BankLocations` 中缺少 `name` 字段,也能避免报错。希望这能解决你的问题,如果还有其他问题,请随时告知! |