- UID
- 67
- 在线时间
- 小时
- 阅读权限
- 70
- 注册时间
- 2021-3-17
- 最后登录
- 1970-1-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"}, -- 示例车辆
}
-- 完成任务奖励范围
Config.RewardMin = 500 -- 最低奖励
Config.RewardMax = 1000 -- 最高奖励
### 更新后的客户端脚本 `client.lua`
我们需要在任务完成后,根据配置文件中的奖励范围随机给玩家发放奖励:
local isDelivering = false
local deliveryLocation = nil
local selectedVehicle = nil
local keyIdentifier = 'delivery_temp_key' -- 钥匙标识符
local spawnedVehicle = nil -- 用于存放生成的车辆
-- 创建 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
OpenChatMenu() -- 打开聊天菜单
else
TriggerEvent('chat:addMessage', { args = { "你已经有一个送餐任务了!" } })
end
end
}
})
end
end)
-- 打开聊天菜单
function OpenChatMenu()
local chatOptions = {
{
title = "请给我一些任务。",
description = "请求老板提供任务。",
action = function()
OpenTaskMenu() -- 请求任务
end
},
{
title = "你最近怎么样?",
description = "询问老板的近况。",
action = function()
TriggerEvent('chat:addMessage', { args = { "老板说: 我最近的生意不错,谢谢关心!" } })
end
},
{
title = "你的外卖服务快吗?",
description = "询问配送速度。",
action = function()
TriggerEvent('chat:addMessage', { args = { "老板说: 我们会尽量做到快速送达!" } })
end
},
{
title = "有其他工作吗?",
description = "询问其他可能的工作机会。",
action = function()
TriggerEvent('chat:addMessage', { args = { "老板说: 现在没有,但欢迎随时来咨询。" } })
end
},
{
title = "谢谢再见!",
description = "结束对话。",
action = function()
TriggerEvent('chat:addMessage', { args = { "你告别了老板,准备去接任务。" } })
end
}
}
-- 使用 ox_target 显示聊天选择菜单
exports.ox_target:openSimpleMenu(chatOptions)
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)
spawnedVehicle = vehicle -- 将生成的车辆存储在变量中
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
-- 随机奖励
local reward = math.random(Config.RewardMin, Config.RewardMax)
TriggerEvent('chat:addMessage', { args = { "你已到达送餐地点,任务完成!你获得了 $" .. reward .. " 的奖励!" } })
-- 撤销钥匙
RemoveTempKey()
DeleteSpawnedVehicle() -- 删除生成的车辆
RewardPlayer(reward) -- 发放奖励
isDelivering = false
deliveryLocation = nil
selectedVehicle = nil
end
end
end
end)
-- 发放奖励
function RewardPlayer(amount)
-- 这里可以添加把奖励加到玩家账户的逻辑,例如:
TriggerServerEvent('addPlayerMoney', amount) -- 举例,触发服务器事件来增加玩家金钱
end
-- 撤销临时钥匙使用 renzu_garage 插件
function RemoveTempKey()
local playerId = PlayerId()
TriggerServerEvent('renzu_garage:removeKey', playerId, keyIdentifier) -- 向服务器请求撤销钥匙
end
-- 删除生成的车辆
function DeleteSpawnedVehicle()
if spawnedVehicle and DoesEntityExist(spawnedVehicle) then
DeleteVehicle(spawnedVehicle) -- 删除车辆
spawnedVehicle = nil -- 清空变量
end
end
### 代码说明
1. **奖励范围**:在 `config.lua` 中,我们添加了 `RewardMin` 和 `RewardMax` 用于定义奖励的范围。
2. **随机奖励**:在检测到任务完成后(即玩家到达目的地时),代码会随机选择一个奖励金额,并通过 `TriggerEvent` 通知玩家。
3. **奖励函数**:通过 `RewardPlayer` 函数将奖励金额传递给服务器,你可以根据自己的服务器逻辑实现给予玩家金钱的具体方法(如调用一个服务器事件)。在示例中,假设有一个名为 `addPlayerMoney` 的服务器事件,用于将奖励金额加给玩家。
### 总结
通过这种方式,玩家完成任务后将获得一定的金钱奖励,奖励范围可以在配置文件中方便地进行修改。如果你还有其他需求或希望增加更多功能,请随时告诉我! |
|