lizhuoda 发表于 2024-8-13 10:06:18

写一个插件

外卖插件
可以和外卖老板进行交流
和老板交流后可以领取随机任务,可在config中增加送餐地点
开始送餐之后,可以选择车辆,可在config中增加车辆
玩家可以手动结束送餐
在结束送餐任务之后,需要玩家将车送回到外卖老板

ChatGPT 发表于 2024-8-13 10:06:35

好的,下面是一个简单的外卖插件示例,包括与外卖老板交流、领取随机任务、选择车辆和结束送餐的功能。代码将放在 `server.lua` 和 `client.lua` 中。

### config.lua
首先,我们需要一个配置文件来定义送餐地点和可用车辆。

Config = {}

-- 送餐地点配置
Config.DeliveryLocations = {
    {x = 200.0, y = -1000.0, z = 30.0},
    {x = 500.0, y = -1500.0, z = 30.0},
    {x = -400.0, y = -2000.0, z = 30.0}
}

-- 可用车辆配置
Config.Vehicles = {
    "pizza",
    "bicycle",
    "van"
}

### server.lua
在服务器端,我们需要处理任务的生成和管理。

local deliveries = {}

RegisterServerEvent('delivery:startDelivery')
AddEventHandler('delivery:startDelivery', function(playerId)
    local randomLocation = Config.DeliveryLocations
    table.insert(deliveries, {playerId = playerId, location = randomLocation})
    TriggerClientEvent('delivery:sendDeliveryLocation', playerId, randomLocation)
end)

RegisterServerEvent('delivery:endDelivery')
AddEventHandler('delivery:endDelivery', function(playerId)
    for i, delivery in ipairs(deliveries) do
      if delivery.playerId == playerId then
            table.remove(deliveries, i)
            break
      end
    end
    TriggerClientEvent('delivery:notifyEnd', playerId)
end)

### client.lua
在客户端处理与外卖老板的交流、选择车辆和结束送餐的逻辑。

local delivering = false
local currentLocation = nil

-- 和外卖老板交流
function TalkToDeliveryBoss()
    -- 这里可以添加与外卖老板的交互逻辑
    TriggerServerEvent('delivery:startDelivery', GetPlayerServerId(PlayerId()))
end

-- 接收送餐地点
RegisterNetEvent('delivery:sendDeliveryLocation')
AddEventHandler('delivery:sendDeliveryLocation', function(location)
    currentLocation = location
    delivering = true
    -- 在地图上标记送餐地点
    SetNewWaypoint(location.x, location.y)
end)

-- 结束送餐
function EndDelivery()
    if delivering then
      delivering = false
      TriggerServerEvent('delivery:endDelivery')
      -- 这里可以添加逻辑来返回外卖老板的地点
    end
end

-- 选择车辆(这里可以根据实际情况添加车辆选择界面)
function SelectVehicle()
    -- 假设玩家选择了车辆
    local selectedVehicle = Config.Vehicles
    -- 加载并生成车辆
    -- 这里可以添加生成车辆的逻辑
end

-- 绑定按键
Citizen.CreateThread(function()
    while true do
      Citizen.Wait(0)
      if IsControlJustPressed(1, 38) then -- E键
            TalkToDeliveryBoss()
      end
      if IsControlJustPressed(1, 20) then -- X键
            EndDelivery()
      end
    end
end)

### 总结
这个插件允许玩家与外卖老板互动,领取随机送餐任务,并可以选择车辆。玩家可以手动结束任务并需将车辆归还给外卖老板。根据需求,可以进一步优化和扩展功能,比如添加车辆选择界面、任务完成奖励等。

lizhuoda 发表于 2024-8-13 10:19:20

本帖最后由 lizhuoda 于 2024-8-13 10:23 编辑

ChatGPT 发表于 2024-8-13 10:06
好的,下面是一个简单的外卖插件示例,包括与外卖老板交流、领取随机任务、选择车辆和结束送餐的功能。代码 ...
增加一个外卖老板的npc,玩家找到外卖老板npc后才能和老板进行交流,可在config中修改

lizhuoda 发表于 2024-8-13 10:24:30

ChatGPT 发表于 2024-8-13 10:06
好的,下面是一个简单的外卖插件示例,包括与外卖老板交流、领取随机任务、选择车辆和结束送餐的功能。代码 ...

增加一个外卖老板的npc,玩家找到外卖老板npc后才能和老板进行交流,可在config中修改

使用ox_target,ox_lib和ox_inventory

ChatGPT 发表于 2024-8-13 10:24:39

lizhuoda 发表于 2024-08-13 10:19
增加一个外卖老板的npc,玩家找到外卖老板npc后才能和 ...

好的,我们可以在插件中增加一个外卖老板的 NPC,玩家需要找到这个 NPC 才能进行交流。我们将 NPC 的位置放入 `config.lua` 中,并在 `client.lua` 中添加与 NPC 的互动逻辑。

### config.lua
在配置文件中增加外卖老板 NPC 的位置。

Config = {}

-- 送餐地点配置
Config.DeliveryLocations = {
    {x = 200.0, y = -1000.0, z = 30.0},
    {x = 500.0, y = -1500.0, z = 30.0},
    {x = -400.0, y = -2000.0, z = 30.0}
}

-- 可用车辆配置
Config.Vehicles = {
    "pizza",
    "bicycle",
    "van"
}

-- 外卖老板 NPC 配置
Config.DeliveryBoss = {
    {x = 300.0, y = -1200.0, z = 30.0, heading = 0.0}-- NPC 的坐标和朝向
}

### client.lua
在客户端代码中添加 NPC 的创建和与之交互的逻辑。

local delivering = false
local currentLocation = nil
local isNearBoss = false

-- 创建外卖老板 NPC
function CreateDeliveryBoss()
    RequestModel("a_m_y_business_01")-- 使用某个 NPC 模型
    while not HasModelLoaded("a_m_y_business_01") do
      Wait(500)
    end

    for _, boss in ipairs(Config.DeliveryBoss) do
      local npc = CreatePed(4, "a_m_y_business_01", boss.x, boss.y, boss.z, boss.heading, false, true)
      SetEntityInvincible(npc, true)-- NPC 不会受到伤害
      SetBlockingOfNonTemporaryEvents(npc, true)
      FreezeEntityPosition(npc, true)
    end
end

-- 和外卖老板交流
function TalkToDeliveryBoss()
    if isNearBoss then
      TriggerServerEvent('delivery:startDelivery', GetPlayerServerId(PlayerId()))
    end
end

-- 检查玩家是否靠近 NPC
Citizen.CreateThread(function()
    while true do
      Citizen.Wait(500)
      local playerCoords = GetEntityCoords(PlayerPedId())
      for _, boss in ipairs(Config.DeliveryBoss) do
            local distance = GetDistanceBetweenCoords(playerCoords, boss.x, boss.y, boss.z, true)
            if distance < 3.0 then
                isNearBoss = true
                break
            else
                isNearBoss = false
            end
      end
    end
end)

-- 接收送餐地点
RegisterNetEvent('delivery:sendDeliveryLocation')
AddEventHandler('delivery:sendDeliveryLocation', function(location)
    currentLocation = location
    delivering = true
    SetNewWaypoint(location.x, location.y)
end)

-- 结束送餐
function EndDelivery()
    if delivering then
      delivering = false
      TriggerServerEvent('delivery:endDelivery')
      -- 这里可以添加逻辑来返回外卖老板的地点
    end
end

-- 选择车辆(这里可以根据实际情况添加车辆选择界面)
function SelectVehicle()
    -- 假设玩家选择了车辆
    local selectedVehicle = Config.Vehicles
    -- 加载并生成车辆
    -- 这里可以添加生成车辆的逻辑
end

-- 绑定按键
Citizen.CreateThread(function()
    CreateDeliveryBoss()-- 创建外卖老板 NPC
    while true do
      Citizen.Wait(0)
      if IsControlJustPressed(1, 38) and isNearBoss then then -- E键
            TalkToDeliveryBoss()
      end
      if IsControlJustPressed(1, 20) then -- X键
            EndDelivery()
      end
    end
end)

### 总结
通过上述代码,现在有了一个外卖老板的 NPC,玩家需要找到并靠近这个 NPC,才能与其进行交流。NPC 的位置和外观可以在 `config.lua` 中进行修改。进一步优化可以包括添加对话框或更复杂的交互逻辑。

ChatGPT 发表于 2024-8-13 10:24:45

lizhuoda 发表于 2024-08-13 10:24
增加一个外卖老板的npc,玩家找到外卖老板npc后才能和 ...

好的,我们可以在之前的基础上增加一个外卖老板的NPC,并使用 `ox_target`, `ox_lib` 和 `ox_inventory` 来实现与玩家的交互。

### config.lua
我们需要在配置文件中添加外卖老板的位置信息。

Config = {}

-- 送餐地点配置
Config.DeliveryLocations = {
    {x = 200.0, y = -1000.0, z = 30.0},
    {x = 500.0, y = -1500.0, z = 30.0},
    {x = -400.0, y = -2000.0, z = 30.0}
}

-- 可用车辆配置
Config.Vehicles = {
    "pizza",
    "bicycle",
    "van"
}

-- 外卖老板的NPC位置配置
Config.DeliveryBossNPC = {x = 150.0, y = -1000.0, z = 28.0} -- 可以根据需要修改位置

### server.lua
在服务器脚本中,没有太大改动,主要是在创建任务和结束任务的逻辑中检验玩家是否已经与外卖老板进行过交互。

local deliveries = {}

RegisterServerEvent('delivery:startDelivery')
AddEventHandler('delivery:startDelivery', function(playerId)
    -- 这里可以加入检测玩家是否与老板交互的逻辑
    local randomLocation = Config.DeliveryLocations
    table.insert(deliveries, {playerId = playerId, location = randomLocation})
    TriggerClientEvent('delivery:sendDeliveryLocation', playerId, randomLocation)
end)

RegisterServerEvent('delivery:endDelivery')
AddEventHandler('delivery:endDelivery', function(playerId)
    for i, delivery in ipairs(deliveries) do
      if delivery.playerId == playerId then
            table.remove(deliveries, i)
            break
      end
    end
    TriggerClientEvent('delivery:notifyEnd', playerId)
end)

### client.lua
在客户端,我们将使用 `ox_target` 来实现与外卖老板NPC的交互。

local delivering = false
local currentLocation = nil
local interactedWithBoss = false -- 用于判断是否与老板互动

-- 创建外卖老板的NPC
Citizen.CreateThread(function()
    local pedModel = "a_m_m_business_01" -- 外卖老板模型
    RequestModel(pedModel)
    while not HasModelLoaded(pedModel) do
      Wait(500)
    end

    local npc = CreatePed(0, pedModel, Config.DeliveryBossNPC.x, Config.DeliveryBossNPC.y, Config.DeliveryBossNPC.z, 0.0, true, false)
    SetEntityInvincible(npc, true)
    SetBlockingOfNonTemporaryEvents(npc, true)

    -- 使用 ox_target 为NPC添加交互
    exports.ox_target:addLocalEntity(npc, {
      {
            name = "TalkToDeliveryBoss",
            icon = "fas fa-comment-dots",
            label = "与外卖老板交谈",
            onSelect = function()
                interactedWithBoss = true
                TriggerServerEvent('delivery:startDelivery', GetPlayerServerId(PlayerId()))
            end,
      },
    })
end)

-- 接收送餐地点
RegisterNetEvent('delivery:sendDeliveryLocation')
AddEventHandler('delivery:sendDeliveryLocation', function(location)
    currentLocation = location
    delivering = true
    -- 在地图上标记送餐地点
    SetNewWaypoint(location.x, location.y)
end)

-- 结束送餐
function EndDelivery()
    if delivering then
      delivering = false
      TriggerServerEvent('delivery:endDelivery')
      -- 这里可以添加逻辑来返回外卖老板的地点
    end
end

-- 选择车辆(这里可以根据实际情况添加车辆选择界面)
function SelectVehicle()
    -- 假设玩家选择了车辆
    local selectedVehicle = Config.Vehicles
    -- 加载并生成车辆
    -- 这里可以添加生成车辆的逻辑
end

-- 绑定按键
Citizen.CreateThread(function()
    while true do
      Citizen.Wait(0)
      if IsControlJustPressed(1, 38) and interactedWithBoss then -- E键
            TalkToDeliveryBoss()
      end
      if IsControlJustPressed(1, 20) then -- X键
            EndDelivery()
      end
    end
end)

### 总结
这个插件现在包含了与外卖老板NPC的交流功能,玩家必须首先找到并与外卖老板进行互动,才能领取送餐任务。使用 `ox_target` 库方便地添加了与NPC的交互。此外,还保留了送餐任务的相关逻辑。你可以根据需要进一步扩展功能,比如添加任务完成奖励、车的选择界面等。

lizhuoda 发表于 2024-8-13 10:31:18

本帖最后由 lizhuoda 于 2024-8-13 10:42 编辑

ChatGPT 发表于 2024-8-13 10:24
好的,我们可以在之前的基础上增加一个外卖老板的NPC,并使用 `ox_target`, `ox_lib` 和 `ox_inventory`...增加玩家与外卖老板的聊天对话,例如这个工作好不好做
在接受任务之后,会在ox_inventory中收到需要送餐的物品,当到达目的地之后物品会消失,可以在每个坐标后面修改

ChatGPT 发表于 2024-8-13 10:43:34

lizhuoda 发表于 2024-08-13 10:19
增加一个外卖老板的npc,玩家找到外卖老板npc后才能和 ...

好的,我们可以在配置文件中添加外卖老板的 NPC 坐标,并在代码中实现与这个 NPC 的交互。下面是如何修改插件以包括这个功能。

### config.lua
在配置文件中添加外卖老板的 NPC 坐标:

Config = {}

-- 送餐地点配置
Config.DeliveryLocations = {
    {x = 200.0, y = -1000.0, z = 30.0},
    {x = 500.0, y = -1500.0, z = 30.0},
    {x = -400.0, y = -2000.0, z = 30.0}
}

-- 可用车辆配置
Config.Vehicles = {
    "pizza",
    "bicycle",
    "van"
}

-- 外卖老板NPC坐标
Config.DeliveryBossNPC = { x = 250.0, y = -1500.0, z = 30.0 }

### server.lua
与之前的 `server.lua` 没有太大变化,主要处理逻辑仍然在这里。

local deliveries = {}

RegisterServerEvent('delivery:startDelivery')
AddEventHandler('delivery:startDelivery', function(playerId)
    local randomLocation = Config.DeliveryLocations
    deliveries = randomLocation
    TriggerClientEvent('delivery:sendDeliveryLocation', playerId, randomLocation)
end)

RegisterServerEvent('delivery:endDelivery')
AddEventHandler('delivery:endDelivery', function(playerId)
    deliveries = nil
    TriggerClientEvent('delivery:notifyEnd', playerId)
end)

-- 检查玩家是否正在送餐
RegisterServerEvent('delivery:isDelivering')
AddEventHandler('delivery:isDelivering', function(playerId)
    TriggerClientEvent('delivery:setDeliveringStatus', playerId, deliveries ~= nil)
end)

### client.lua
在客户端代码中,我们需要添加 NPC 交互的逻辑:

local delivering = false
local currentLocation = nil

-- NPC坐标
local bossCoords = Config.DeliveryBossNPC

-- 和外卖老板交流
function TalkToDeliveryBoss()
    -- 发送请求给服务器检查是否在送餐
    TriggerServerEvent('delivery:isDelivering')
end

-- 接收送餐地点
RegisterNetEvent('delivery:sendDeliveryLocation')
AddEventHandler('delivery:sendDeliveryLocation', function(location)
    currentLocation = location
    delivering = true
    -- 在地图上标记送餐地点
    SetNewWaypoint(location.x, location.y)
end)

-- 结束送餐
function EndDelivery()
    if delivering then
      delivering = false
      TriggerServerEvent('delivery:endDelivery')
      -- 这里可以添加逻辑来返回外卖老板的地点
    end
end

-- 设置玩家的送餐状态
RegisterNetEvent('delivery:setDeliveringStatus')
AddEventHandler('delivery:setDeliveringStatus', function(isDelivering)
    if not isDelivering then
      -- 只有当玩家没有进行送餐时,才能开始新的任务
      TalkToDeliveryBoss()
    else
      -- 玩家正在送餐时,可能希望显示相关信息
      print("你已经在进行送餐任务!")
    end
end)

-- 创建NPC的函数
function CreateDeliveryBoss()
    RequestModel("a_m_m_business_01") -- 请替换为你想要的NPC模型
    while not HasModelLoaded("a_m_m_business_01") do
      Wait(500)
    end

    local boss = CreatePed(4, "a_m_m_business_01", bossCoords.x, bossCoords.y, bossCoords.z, 0.0, false, true)
    SetEntityAsMissionEntity(boss, true, true)
end

-- 绑定按键
Citizen.CreateThread(function()
    CreateDeliveryBoss() -- 创建外卖老板NPC

    while true do
      Citizen.Wait(0)
      
      -- 检查玩家与外卖老板距离
      local playerCoords = GetEntityCoords(PlayerPedId())
      local distance = Vdist(playerCoords.x, playerCoords.y, playerCoords.z, bossCoords.x, bossCoords.y, bossCoords.z)

      if distance < 3.0 then
            DisplayHelpText("按 ~INPUT_CONTEXT~ 与外卖老板交流")

            if IsControlJustPressed(1, 38) then -- E键
                TalkToDeliveryBoss()
            end
      end

      if IsControlJustPressed(1, 20) then -- X键
            EndDelivery()
      end
    end
end)

-- 显示帮助文本
function DisplayHelpText(text)
    SetTextComponentFormat("STRING")
    AddTextComponentString(text)
    DisplayHelpTextFromStringLabel(0, 0, 1, -1)
end

### 总结
现在,插件的功能已经扩展,包含一个可与玩家互动的外卖老板 NPC。玩家需要找到这个 NPC 并与其交流才能领取送餐任务。你可以在 `config.lua` 中自由修改 NPC 的位置以及其他设定。

lizhuoda 发表于 2024-8-13 10:45:32

ChatGPT 发表于 2024-8-13 10:43
好的,我们可以在配置文件中添加外卖老板的 NPC 坐标,并在代码中实现与这个 NPC 的交互。下面是如何修改 ...

在接受任务之后,会在ox_inventory中收到需要送餐的物品,当到达目的地之后物品会消失,可以在每个坐标后面修改

ChatGPT 发表于 2024-8-13 10:47:53

lizhuoda 发表于 2024-08-13 10:45
在接受任务之后,会在ox_inventory中收到需要送餐的物 ...

好的,我们可以在插件中添加与 `ox_inventory` 的集成,以便在玩家接受送餐任务时,将需要送餐的物品添加到玩家的库存中,并在送达目的地时移除这些物品。

以下是更新后的代码示例:

### config.lua
在配置文件中为每个送餐位置指定需要的送餐物品。可以在每个坐标后面添加一个对应的物品。

Config = {}

-- 送餐地点配置及相应的物品
Config.DeliveryLocations = {
    {x = 200.0, y = -1000.0, z = 30.0, item = "pizza"},-- 此处指定送餐物品
    {x = 500.0, y = -1500.0, z = 30.0, item = "burger"},
    {x = -400.0, y = -2000.0, z = 30.0, item = "drink"}
}

-- 可用车辆配置
Config.Vehicles = {
    "pizza",
    "bicycle",
    "van"
}

-- 外卖老板NPC坐标
Config.DeliveryBossNPC = { x = 250.0, y = -1500.0, z = 30.0 }

### server.lua
在服务器脚本中,我们需要在开始送餐时给玩家添加物品,以及在送达时移除物品。

local deliveries = {}

RegisterServerEvent('delivery:startDelivery')
AddEventHandler('delivery:startDelivery', function(playerId)
    local src = source
    local randomIndex = math.random(#Config.DeliveryLocations)-- 随机选择一个送餐地点
    local deliveryLocation = Config.DeliveryLocations

    -- 将物品添加到玩家的库存
    exports.ox_inventory:AddItem(src, deliveryLocation.item, 1)

    deliveries = deliveryLocation
    TriggerClientEvent('delivery:sendDeliveryLocation', src, deliveryLocation)
end)

RegisterServerEvent('delivery:endDelivery')
AddEventHandler('delivery:endDelivery', function()
    local src = source
    local deliveryLocation = deliveries

    if deliveryLocation then
      -- 从玩家库存中移除物品
      exports.ox_inventory:RemoveItem(src, deliveryLocation.item, 1)
      Deliveries = nil-- 清除该玩家的送餐任务
      TriggerClientEvent('delivery:notifyEnd', src)
    end
end)

### client.lua
在客户端,我们需要在到达目的地时触发结束送餐的事件。

local delivering = false
local currentDeliveryLocation = nil

-- 接收送餐地点
RegisterNetEvent('delivery:sendDeliveryLocation')
AddEventHandler('delivery:sendDeliveryLocation', function(location)
    currentDeliveryLocation = location
    delivering = true
    -- 在地图上标记送餐地点
    SetNewWaypoint(location.x, location.y)
end)

-- 记录到达目的地
Citizen.CreateThread(function()
    while true do
      Citizen.Wait(1000)-- 每秒检查一次
      if delivering and currentDeliveryLocation then
            local playerCoords = GetEntityCoords(PlayerPedId())
            local distance = Vdist(playerCoords.x, playerCoords.y, playerCoords.z, currentDeliveryLocation.x, currentDeliveryLocation.y, currentDeliveryLocation.z)
            
            if distance < 3.0 then
                -- 到达目的地,结束送餐
                EndDelivery()
            end
      end
    end
end)

-- 结束送餐
function EndDelivery()
    if delivering then
      delivering = false
      TriggerServerEvent('delivery:endDelivery')
      -- 这里可以添加逻辑来返回外卖老板的地点
    end
end

-- ... 其余代码保持不变

### 总结
现在,当玩家接受送餐任务时,会在 `ox_inventory` 中收到所需的送餐物品。在到达送餐目的地后,该物品将从玩家的库存中移除。你可以根据需要在 `config.lua` 中自由修改送餐地点和相应的物品。

lizhuoda 发表于 2024-8-13 10:50:41

ChatGPT 发表于 2024-8-13 10:47
好的,我们可以在插件中添加与 `ox_inventory` 的集成,以便在玩家接受送餐任务时,将需要送餐的物品添加 ...

扩展与老板的对话

ChatGPT 发表于 2024-8-13 10:51:23

lizhuoda 发表于 2024-08-13 10:11
增加一个外卖老板的npc,可在config中修改 ...

好的,我们可以在插件中增加一个外卖老板的NPC,允许玩家与之互动以领取送餐任务。

### config.lua
我们需要在配置文件中添加外卖老板的NPC信息。

Config = {}

-- 送餐地点配置
Config.DeliveryLocations = {
    {x = 200.0, y = -1000.0, z = 30.0},
    {x = 500.0, y = -1500.0, z = 30.0},
    {x = -400.0, y = -2000.0, z = 30.0}
}

-- 可用车辆配置
Config.Vehicles = {
    "pizza",
    "bicycle",
    "van"
}

-- 外卖老板NPC配置
Config.DeliveryBoss = {
    model = "a_m_y_business_01", -- NPC模型名称
    coords = {x = 250.0, y = -1000.0, z = 30.0}, -- NPC坐标
    heading = 90.0 -- NPC朝向
}

### server.lua
服务器代码没有太大变化,只是确保 NPC 相关的交互正常。

local deliveries = {}

RegisterServerEvent('delivery:startDelivery')
AddEventHandler('delivery:startDelivery', function(playerId)
    local randomLocation = Config.DeliveryLocations
    table.insert(deliveries, {playerId = playerId, location = randomLocation})
    TriggerClientEvent('delivery:sendDeliveryLocation', playerId, randomLocation)
end)

RegisterServerEvent('delivery:endDelivery')
AddEventHandler('delivery:endDelivery', function(playerId)
    for i, delivery in ipairs(deliveries) do
      if delivery.playerId == playerId then
            table.remove(deliveries, i)
            break
      end
    end
    TriggerClientEvent('delivery:notifyEnd', playerId)
end)

### client.lua
客户端需要加载外卖老板的NPC并处理与之的交互。

local delivering = false
local currentLocation = nil

-- 创建外卖老板NPC
function CreateDeliveryBoss()
    RequestModel(Config.DeliveryBoss.model)
   
    while not HasModelLoaded(Config.DeliveryBoss.model) do
      Wait(500)
    end

    local npc = CreatePed(4, Config.DeliveryBoss.model, Config.DeliveryBoss.coords.x, Config.DeliveryBoss.coords.y, Config.DeliveryBoss.coords.z, Config.DeliveryBoss.heading, false, true)
    SetEntityInvincible(npc, true) -- NPC不可被攻击
    SetBlockingOfNonTemporaryEvents(npc, true)
    TaskWatching(npc)
end

-- NPC与玩家的交互
function TalkToDeliveryBoss()
    -- 这里可以添加提示玩家按E键
    local playerPed = PlayerPedId()
    local bossCoords = vector3(Config.DeliveryBoss.coords.x, Config.DeliveryBoss.coords.y, Config.DeliveryBoss.coords.z)
    if Vdist(GetEntityCoords(playerPed), bossCoords) < 2.0 then
      TriggerServerEvent('delivery:startDelivery', GetPlayerServerId(PlayerId()))
    end
end

-- 接收送餐地点
RegisterNetEvent('delivery:sendDeliveryLocation')
AddEventHandler('delivery:sendDeliveryLocation', function(location)
    currentLocation = location
    delivering = true
    SetNewWaypoint(location.x, location.y)
end)

-- 结束送餐
function EndDelivery()
    if delivering then
      delivering = false
      TriggerServerEvent('delivery:endDelivery')
      -- 返回外卖老板的地点
    end
end

-- 绑定按键
Citizen.CreateThread(function()
    CreateDeliveryBoss()-- 创建NPC
    while true do
      Citizen.Wait(0)
      if IsControlJustPressed(1, 38) then -- E键
            TalkToDeliveryBoss()
      end
      if IsControlJustPressed(1, 20) then -- X键
            EndDelivery()
      end
    end
end)

-- 计算玩家与NPC的距离
function Vdist(x1, y1, z1, x2, y2, z2)
    local dx = x2 - x1
    local dy = y2 - y1
    local dz = z2 - z1
    return math.sqrt(dx * dx + dy * dy + dz * dz)
end

### 总结
现在这个外卖插件已经增加了外卖老板的NPC,玩家可以与之进行交互以领取送餐任务。NPC的位置和角色模型都可以在 `config.lua` 中轻松配置。可以根据实际需求进行进一步的优化,比如添加对话框、任务数量限制等。

ChatGPT 发表于 2024-8-13 10:56:01

lizhuoda 发表于 2024-08-13 10:50
扩展与老板的对话

好的,我们可以扩展与外卖老板的对话功能,让玩家与老板进行多轮交互,以增加游戏的趣味性。以下是如何修改代码以实现这一点,包括对话框和选择选项的实现。

### config.lua
在配置中添加对话内容,具体实现可以根据需要进行修改:

Config = {}

-- 送餐地点及相应的物品
Config.DeliveryLocations = {
    {x = 200.0, y = -1000.0, z = 30.0, item = "pizza"},
    {x = 500.0, y = -1500.0, z = 30.0, item = "burger"},
    {x = -400.0, y = -2000.0, z = 30.0, item = "drink"}
}

-- 可用车辆配置
Config.Vehicles = {
    "pizza",
    "bicycle",
    "van"
}

-- 外卖老板NPC坐标
Config.DeliveryBossNPC = { x = 250.0, y = -1500.0, z = 30.0 }

-- 外卖老板的对话内容
Config.Dialogues = {
    "这个工作好不好做?",
    "送餐有时候挺累的,但我就是喜欢。",
    "你觉得外卖公司怎么样?",
    "希望你能给我带来更多的客户!"
}

### server.lua
我们可以扩展服务器端逻辑来处理对话内容,并在客户端与外卖老板交互时展示对话:

local deliveries = {}

RegisterServerEvent('delivery:startDelivery')
AddEventHandler('delivery:startDelivery', function()
    local src = source
    local randomIndex = math.random(#Config.DeliveryLocations)-- 随机选择一个送餐地点
    local deliveryLocation = Config.DeliveryLocations

    -- 将物品添加到玩家的库存
    exports.ox_inventory:AddItem(src, deliveryLocation.item, 1)

    TriggerClientEvent('delivery:sendDeliveryLocation', src, deliveryLocation)
end)

RegisterServerEvent('delivery:getDialogue')
AddEventHandler('delivery:getDialogue', function()
    local src = source
    local randomDialogue = Config.Dialogues
    TriggerClientEvent('delivery:showDialogue', src, randomDialogue)
end)

-- (其余代码保持不变)

### client.lua
在客户端部分,我们扩展了与外卖老板的对话功能:

local delivering = false
local currentDeliveryLocation = nil

-- 创建 NPC 的函数
function CreateDeliveryBoss()
    RequestModel("a_m_m_business_01")
    while not HasModelLoaded("a_m_m_business_01") do
      Wait(500)
    end

    local boss = CreatePed(4, "a_m_m_business_01", Config.DeliveryBossNPC.x, Config.DeliveryBossNPC.y, Config.DeliveryBossNPC.z, 0.0, false, true)
    SetEntityAsMissionEntity(boss, true, true)

    -- 使用 ox_target 为 NPC 添加交互
    exports.ox_target:addLocalEntity(boss, {
      {
            name = "TalkToDeliveryBoss",
            icon = "fas fa-comment-dots",
            label = "与外卖老板交谈",
            onSelect = function()
                TalkToDeliveryBoss()
            end,
      },
    })
end

-- 和外卖老板交流
function TalkToDeliveryBoss()
    TriggerServerEvent('delivery:getDialogue')-- 请求对话
end

-- 接收送餐地点
RegisterNetEvent('delivery:sendDeliveryLocation')
AddEventHandler('delivery:sendDeliveryLocation', function(location)
    currentDeliveryLocation = location
    delivering = true
    SetNewWaypoint(location.x, location.y)
end)

-- 接收并显示对话
RegisterNetEvent('delivery:showDialogue')
AddEventHandler('delivery:showDialogue', function(dialogue)
    BeginTextCommandDisplayHelp("STRING")
    AddTextComponentSubstringPlayerName(dialogue)
    EndTextCommandDisplayHelp(0, false, true, -1)

    Citizen.Wait(2000) -- 显示2秒后自动消失
end)

-- 结束送餐
function EndDelivery()
    if delivering then
      delivering = false
      TriggerServerEvent('delivery:endDelivery')
    end
end

-- (其余代码保持不变)

### 总结
现在,玩家与外卖老板的对话扩展到了多条信息。在玩家与 NPC 互动时,会随机选择一条对话内容展示给玩家。你可以根据需要在 `config.lua` 中添加更多对话内容,使得交互更加丰富。

lizhuoda 发表于 2024-8-13 10:57:18

ChatGPT 发表于 2024-8-13 10:51
好的,我们可以在插件中增加一个外卖老板的NPC,允许玩家与之互动以领取送餐任务。

### config.lua


送完餐之后会得到500到1000块钱的随机奖励

ChatGPT 发表于 2024-8-13 10:58:25

lizhuoda 发表于 2024-08-13 10:11
增加一个外卖老板的npc,可在config中修改 ...

好的,下面我们将增加一个外卖老板的NPC,可以在配置文件中修改其位置。接下来,我们更新 `config.lua` 和 `client.lua` 来添加这一功能。

### config.lua
在配置文件中添加外卖老板的NPC位置。

Config = {}

-- 送餐地点配置
Config.DeliveryLocations = {
    {x = 200.0, y = -1000.0, z = 30.0},
    {x = 500.0, y = -1500.0, z = 30.0},
    {x = -400.0, y = -2000.0, z = 30.0}
}

-- 可用车辆配置
Config.Vehicles = {
    "pizza",
    "bicycle",
    "van"
}

-- 外卖老板NPC配置
Config.DeliveryBoss = {
    model = "a_m_m_business_01", -- NPC模型名称
    position = {x = 100.0, y = -1500.0, z = 29.0} -- NPC位置
}

### client.lua
在客户端代码中,我们将加载外卖老板的NPC,并为其添加交互功能。

local delivering = false
local currentLocation = nil
local deliveryBoss = nil

-- 加载外卖老板NPC
function SpawnDeliveryBoss()
    local bossModel = GetHashKey(Config.DeliveryBoss.model)
   
    RequestModel(bossModel)
    while not HasModelLoaded(bossModel) do
      Wait(500)
    end
   
    deliveryBoss = CreatePed(4, bossModel, Config.DeliveryBoss.position.x, Config.DeliveryBoss.position.y, Config.DeliveryBoss.position.z, 0.0, false, true)
    SetEntityAsMissionEntity(deliveryBoss, true, true)
end

-- 和外卖老板交流
function TalkToDeliveryBoss()
    -- 判断与NPC的距离,进行互动
    local playerCoords = GetEntityCoords(PlayerPedId())
    local bossCoords = GetEntityCoords(deliveryBoss)
   
    if Vdist(playerCoords.x, playerCoords.y, playerCoords.z, bossCoords.x, bossCoords.y, bossCoords.z) < 2.0 then
      -- 这里可以添加与外卖老板的交互逻辑
      TriggerServerEvent('delivery:startDelivery', GetPlayerServerId(PlayerId()))
    else
      Notify("你需要靠近外卖老板才能交流。")
    end
end

-- 接收送餐地点
RegisterNetEvent('delivery:sendDeliveryLocation')
AddEventHandler('delivery:sendDeliveryLocation', function(location)
    currentLocation = location
    delivering = true
    -- 在地图上标记送餐地点
    SetNewWaypoint(location.x, location.y)
end)

-- 结束送餐
function EndDelivery()
    if delivering then
      delivering = false
      TriggerServerEvent('delivery:endDelivery')
      -- 这里可以添加逻辑来返回外卖老板的地点
      Notify("你已经结束了送餐任务。")
    end
end

-- 选择车辆(这里可以根据实际情况添加车辆选择界面)
function SelectVehicle()
    -- 假设玩家选择了车辆
    local selectedVehicle = Config.Vehicles
    -- 加载并生成车辆
    -- 这里可以添加生成车辆的逻辑
end

-- 通知玩家
function Notify(text)
    SetNotificationTextEntry("STRING")
    AddTextComponentString(text)
    DrawNotification(false, true)
end

-- 绑定按键
Citizen.CreateThread(function()
    SpawnDeliveryBoss() -- 生成外卖老板NPC

    while true do
      Citizen.Wait(0)
      if IsControlJustPressed(1, 38) then -- E键
            TalkToDeliveryBoss()
      end
      if IsControlJustPressed(1, 20) then -- X键
            EndDelivery()
      end
    end
end)

### 总结
现在,外卖老板的NPC已经成功添加到插件中,并且可以通过玩家接近NPC进行交互。在配置文件中可以自由更改NPC的模型和位置。根据具体的需求,您还可以扩展与NPC的交互内容,例如显示菜单、提供不同的任务等。

lizhuoda 发表于 2024-8-13 10:59:31

ChatGPT 发表于 2024-8-13 10:58
好的,下面我们将增加一个外卖老板的NPC,可以在配置文件中修改其位置。接下来,我们更新 `config.lua`...

送完餐之后会得到500到1000块钱的随机奖励

ChatGPT 发表于 2024-8-13 11:01:49

lizhuoda 发表于 2024-08-13 10:59
送完餐之后会得到500到1000块钱的随机奖励 ...

好的,我们可以在送餐完成后为玩家添加随机奖励。具体实现方法是,在服务器端逻辑中进行处理,在玩家成功送完餐后随机选择一个奖励金额并将其添加到玩家的账户中。

### config.lua
我们不需要对配置文件做修改,因为奖励金额将在 `server.lua` 进行处理。

### server.lua
在服务器代码中,我们需要更新 `endDelivery` 事件,以在完成送餐后分配一个随机奖励:

local deliveries = {}

RegisterServerEvent('delivery:startDelivery')
AddEventHandler('delivery:startDelivery', function()
    local src = source
    local randomIndex = math.random(#Config.DeliveryLocations)-- 随机选择一个送餐地点
    local deliveryLocation = Config.DeliveryLocations-- 获取随机送餐位置

    -- 将物品添加到玩家的库存
    exports.ox_inventory:AddItem(src, deliveryLocation.item, 1)

    TriggerClientEvent('delivery:sendDeliveryLocation', src, deliveryLocation)
end)

RegisterServerEvent('delivery:endDelivery')
AddEventHandler('delivery:endDelivery', function()
    local src = source
    local deliveryLocation = deliveries

    if deliveryLocation then
      -- 从玩家库存中移除送餐物品
      exports.ox_inventory:RemoveItem(src, deliveryLocation.item, 1)

      -- 给予随机奖励
      local reward = math.random(500, 1000)-- 随机生成500到1000的奖励
      TriggerEvent('es:getPlayerFromId', src, function(user)
            user.addMoney(reward)-- 假设有addMoney函数,可以加钱给玩家
      end)

      -- 通知玩家获得奖励
      TriggerClientEvent('notification:addNotification', src, "你获得了 $" .. reward .. " 的奖励!")

      deliveries = nil-- 清除该玩家的送餐任务
      TriggerClientEvent('delivery:notifyEnd', src)
    end
end)

### client.lua
在客户端中,当玩家结束送餐后通知他们获得奖励,我们需要在 `client.lua` 中增加相应的代码来显示通知。

-- 通知玩家
RegisterNetEvent('notification:addNotification')
AddEventHandler('notification:addNotification', function(text)
    SetNotificationTextEntry("STRING")
    AddTextComponentString(text)
    DrawNotification(false, true)
end)

### 总结
现在,玩家在成功完成送餐任务后,将会获得随机金额(从500到1000不等)的奖励,并在游戏中收到通知。你可以根据实际情况进一步调整奖励的数值范围或添加其他功能,比如日志记录等。

ChatGPT 发表于 2024-8-13 11:02:49

lizhuoda 发表于 2024-08-13 10:11
增加一个外卖老板的npc,可在config中修改 ...

好的,我们可以在配置文件中添加外卖老板的 NPC 信息,并在代码中创建这个 NPC。下面是修改后的代码示例。

### config.lua
在配置文件中添加外卖老板的 NPC 坐标和模型。

Config = {}

-- 送餐地点配置
Config.DeliveryLocations = {
    {x = 200.0, y = -1000.0, z = 30.0},
    {x = 500.0, y = -1500.0, z = 30.0},
    {x = -400.0, y = -2000.0, z = 30.0}
}

-- 可用车辆配置
Config.Vehicles = {
    "pizza",
    "bicycle",
    "van"
}

-- 外卖老板 NPC 配置
Config.DeliveryBoss = {
    model = "a_m_y_business_01", -- NPC 模型
    position = {x = 250.0, y = -1000.0, z = 30.0} -- NPC 坐标
}

### server.lua
服务器端不需要做太多修改,我们只需要处理玩家的任务。

local deliveries = {}

RegisterServerEvent('delivery:startDelivery')
AddEventHandler('delivery:startDelivery', function(playerId)
    local randomLocation = Config.DeliveryLocations
    table.insert(deliveries, {playerId = playerId, location = randomLocation})
    TriggerClientEvent('delivery:sendDeliveryLocation', playerId, randomLocation)
end)

RegisterServerEvent('delivery:endDelivery')
AddEventHandler('delivery:endDelivery', function(playerId)
    for i, delivery in ipairs(deliveries) do
      if delivery.playerId == playerId then
            table.remove(deliveries, i)
            break
      end
    end
    TriggerClientEvent('delivery:notifyEnd', playerId)
end)

### client.lua
在客户端,我们需要创建外卖老板的 NPC,并允许玩家与之互动。

local delivering = false
local currentLocation = nil
local deliveryBossPed = nil

-- 创建外卖老板 NPC
function CreateDeliveryBoss()
    local model = GetHashKey(Config.DeliveryBoss.model)
    RequestModel(model)

    while not HasModelLoaded(model) do
      Wait(500)
    end

    deliveryBossPed = CreatePed(1, model, Config.DeliveryBoss.position.x, Config.DeliveryBoss.position.y, Config.DeliveryBoss.position.z, 0.0, true, false)
    SetEntityAsMissionEntity(deliveryBossPed, true, true)
end

-- 和外卖老板交流
function TalkToDeliveryBoss()
    -- 这里可以添加与外卖老板的交互逻辑
    TriggerServerEvent('delivery:startDelivery', GetPlayerServerId(PlayerId()))
end

-- 接收送餐地点
RegisterNetEvent('delivery:sendDeliveryLocation')
AddEventHandler('delivery:sendDeliveryLocation', function(location)
    currentLocation = location
    delivering = true
    -- 在地图上标记送餐地点
    SetNewWaypoint(location.x, location.y)
end)

-- 结束送餐
function EndDelivery()
    if delivering then
      delivering = false
      TriggerServerEvent('delivery:endDelivery')
      -- 这里可以添加逻辑来返回外卖老板的地点
    end
end

-- 选择车辆(这里可以根据实际情况添加车辆选择界面)
function SelectVehicle()
    -- 假设玩家选择了车辆
    local selectedVehicle = Config.Vehicles
    -- 加载并生成车辆
    -- 这里可以添加生成车辆的逻辑
end

-- 绑定按键
Citizen.CreateThread(function()
    while true do
      Citizen.Wait(0)
      if IsControlJustPressed(1, 38) then -- E键
            TalkToDeliveryBoss()
      end
      if IsControlJustPressed(1, 20) then -- X键
            EndDelivery()
      end
    end
end)

-- 创建外卖老板 NPC
Citizen.CreateThread(function()
    CreateDeliveryBoss()
end)

### 总结
这段代码中新增了外卖老板的 NPC,玩家可以跟这个 NPC 进行交互以开始送餐任务。您可以通过修改 `config.lua` 中的 `Config.DeliveryBoss` 来更改 NPC 的模型和位置。

ChatGPT 发表于 2024-8-13 11:04:06

lizhuoda 发表于 2024-08-13 10:57
送完餐之后会得到500到1000块钱的随机奖励 ...

好的,我们可以在玩家完成送餐任务后,给予他们一个随机的金钱奖励。下面是如何在代码中实现这一点的更新。

### config.lua
不需要更改此文件,随机奖励会直接在服务器端处理。

### server.lua
在结束送餐的事件中,我们将添加发放奖励的逻辑:

local deliveries = {}
local math_random = math.random

RegisterServerEvent('delivery:startDelivery')
AddEventHandler('delivery:startDelivery', function()
    local src = source
    local randomIndex = math.random(#Config.DeliveryLocations)-- 随机选择一个送餐地点
    local deliveryLocation = Config.DeliveryLocations

    -- 将物品添加到玩家的库存
    exports.ox_inventory:AddItem(src, deliveryLocation.item, 1)

    TriggerClientEvent('delivery:sendDeliveryLocation', src, deliveryLocation)
end)

RegisterServerEvent('delivery:endDelivery')
AddEventHandler('delivery:endDelivery', function()
    local src = source
    local deliveryLocation = deliveries-- 取出当前送餐任务

    if deliveryLocation then
      -- 从玩家库存中移除物品
      exports.ox_inventory:RemoveItem(src, deliveryLocation.item, 1)

      -- 给予随机奖励
      local reward = math_random(500, 1000)
      -- 假设你有一个函数来增加玩家的金钱
      TriggerEvent('es:addMoney', src, reward)-- 这里使用 esx 维护金钱,如果你使用其他框架,请替换此行

      deliveries = nil-- 清除该玩家的送餐任务
      TriggerClientEvent('delivery:notifyEnd', src, reward)-- 通知玩家获得奖励
    end
end)

### client.lua
我们需要在客户端通知玩家获得随机奖励。

-- 接收并显示奖励信息
RegisterNetEvent('delivery:notifyEnd')
AddEventHandler('delivery:notifyEnd', function(reward)
    -- 显示给玩家
    ShowNotification("任务完成!你获得了 $" .. reward .. " 的奖励!")
end)

-- 显示通知函数
function ShowNotification(text)
    BeginTextCommandThefeedPost("STRING")
    AddTextComponentSubstringPlayerName(text)
    EndTextCommandThefeedPostMessag(1, 1, 0, text)
end

### 总结
现在,玩家在成功送完餐后会获得随机的500到1000块钱的奖励。请根据你的框架调整金钱奖励的调用方法,比如使用 `ESX`, `QBCore` 或者其他的经济系统。以上代码展示了基本的逻辑,你可以根据实际需要做更多的扩展和优化。

lizhuoda 发表于 2024-8-13 11:11:33

ChatGPT 发表于 2024-8-13 11:04
好的,我们可以在玩家完成送餐任务后,给予他们一个随机的金钱奖励。下面是如何在代码中实现这一点的更新 ...

修改与老板的对话
页: [1] 2
查看完整版本: 写一个插件