- UID
- 67
- 在线时间
- 小时
- 阅读权限
- 70
- 注册时间
- 2021-3-17
- 最后登录
- 1970-1-1
【高级】合伙人
|
好的,我们将进一步修改代码,以便玩家在接受送餐任务后能够选择车辆。我们将在配置文件中添加可选车辆,并通过 `ox_target` 菜单让玩家进行选择。以下是更新后的实现。
### 1. 更新配置文件 `config.lua`
在配置文件中,我们将添加可用车辆的列表。你可以根据需要增加或修改车辆。
Config = {}
-- 送餐坐标
Config.DeliveryLocations = {
vector3(123.4, -200.5, 54.6), -- 示例坐标
vector3(456.7, -300.8, 34.2) -- 示例坐标
}
-- NPC 信息
Config.NPCs = {
{name = "商店老板", coords = vector3(200.0, -250.0, 50.0)}, -- 商店老板 NPC 的坐标
}
-- 可选车辆
Config.Vehicles = {
{name = "外卖车", model = "vintagecar1"}, -- 示例车辆
{name = "摩托车", model = "ninja"}, -- 示例车辆
{name = "货车", model = "boxville"}, -- 示例车辆
}
### 2. 更新客户端脚本 `client.lua`
接下来,我们在客户端脚本中实现车辆选择功能。
local isDelivering = false
local deliveryLocation = nil
local selectedVehicle = nil
local keyIdentifier = 'delivery_temp_key' -- 钥匙标识符
-- 创建 NPC 交互目标
Citizen.CreateThread(function()
for _, npc in ipairs(Config.NPCs) do
local ped = CreatePed(0, GetHashKey("csb_mweather"), npc.coords.x, npc.coords.y, npc.coords.z, 0.0, false, true)
-- 使用 ox_target 创建目标
exports.ox_target:addLocalEntity(ped, {
{
name = "与商店老板交谈",
icon = "fa-solid fa-comment",
onInteract = function()
if not isDelivering then
OpenTaskMenu()
else
TriggerEvent('chat:addMessage', { args = { "你已经有一个送餐任务了!" } })
end
end
}
})
end
end)
-- 打开任务菜单
function OpenTaskMenu()
local menuOptions = {}
for i, location in ipairs(Config.DeliveryLocations) do
table.insert(menuOptions, {
title = "送餐任务 #" .. i,
description = "前往指定位置送餐",
action = function()
OpenVehicleMenu(location) -- 在选择任务后打开车辆选择菜单
end
})
end
-- 使用 ox_target 显示任务选择菜单
exports.ox_target:openSimpleMenu(menuOptions)
end
-- 打开车辆选择菜单
function OpenVehicleMenu(location)
local vehicleOptions = {}
for _, vehicle in ipairs(Config.Vehicles) do
table.insert(vehicleOptions, {
title = vehicle.name,
description = "选择这辆车进行送餐",
action = function()
StartDelivery(location, vehicle.model) -- 启动送餐任务并选择车辆
end
})
end
-- 使用 ox_target 显示车辆选择菜单
exports.ox_target:openSimpleMenu(vehicleOptions)
end
-- 开始送餐任务
function StartDelivery(location, vehicleModel)
isDelivering = true
deliveryLocation = location
selectedVehicle = vehicleModel
TriggerEvent('chat:addMessage', { args = { "你已经接到送餐任务,请前往目的地:" .. tostring(deliveryLocation) } })
-- 给予临时钥匙
GiveTempKey()
SpawnVehicle(vehicleModel) -- 生成所选的车辆
end
-- 给予临时钥匙使用 renzu_garage 插件
function GiveTempKey()
local playerId = PlayerId() -- 获取玩家ID
TriggerServerEvent('renzu_garage:addKey', playerId, keyIdentifier) -- 向服务器请求发放钥匙
end
-- 生成所选车辆
function SpawnVehicle(vehicleModel)
local playerPed = PlayerPedId()
local coords = GetEntityCoords(playerPed)
RequestModel(vehicleModel)
while not HasModelLoaded(vehicleModel) do
Citizen.Wait(500)
end
local vehicle = CreateVehicle(vehicleModel, coords.x, coords.y, coords.z, GetEntityHeading(playerPed), true, false)
TaskWarpPedIntoVehicle(playerPed, vehicle, -1)
end
-- 监测角色到达送餐地点
Citizen.CreateThread(function()
while true do
Citizen.Wait(1000)
if isDelivering and deliveryLocation then
local playerCoords = GetEntityCoords(PlayerPedId())
if Vdist(playerCoords, deliveryLocation) < 5.0 then
TriggerEvent('chat:addMessage', { args = { "你已到达送餐地点,任务完成!" } })
-- 撤销钥匙
RemoveTempKey()
isDelivering = false
deliveryLocation = nil
selectedVehicle = nil
end
end
end
end)
-- 撤销临时钥匙使用 renzu_garage 插件
function RemoveTempKey()
local playerId = PlayerId()
TriggerServerEvent('renzu_garage:removeKey', playerId, keyIdentifier) -- 向服务器请求撤销钥匙
end
### 总结
1. **车辆选择**:玩家在接受送餐任务后,可以选择可用的车辆,这些车辆在配置文件中定义。
2. **生成车辆**:根据选择的车型,玩家的角色将被传送到新生成的车辆中。
3. **用户友好**:使用 `ox_target` 提供的UI,确保用户可以流畅地选择任务和车辆。
请确保在服务器中正确设置车辆模型,并检查所选择的车辆是否存在于游戏中。如果你还有其他需求或问题,请随时告诉我! |
|