搜索
查看: 90|回复: 4
收起左侧

写插件

[复制链接]

升级进度: 60%

lizhuoda 发表于 2024-8-18 21:39:45 | 显示全部楼层 |阅读模式
职业中心插件https://pan.baidu.com/s/3V4W5X6Y7Z8A9B0C1D2E
工作名称https://pan.baidu.com/s/2T3U4V5W6X7Y8Z9A0B1C?pwd=wxy7
工作详情
  • https://pan.baidu.com/s/8Q9R0S1T2U3V4W5X6Y7Z

  • 工资待遇
    https://pan.baidu.com/s/1J2K3L4M5N6O7P8Q9R0S?pwd=tuv7

    该职业限制的人数
  • https://pan.baidu.com/s/2B3C4D5E6F7G8H9I0J1K?pwd=vwx9

  • 工作的那种图片https://pan.baidu.com/s/7Z8A9B0C1D2E3F4G5H6I
    https://pan.baidu.com/s/9I0J1K2L3M4N5O6P7Q8R

    一旦该职业工作人数上限,则该工作会消失,玩家下线之后工作会自动变为无业游民不包括紧急职业,玩家下线之后工作会自动上线并在公告中提示有多少人在该工作https://pan.baidu.com/s/7G8H9I0J1K2L3M4N5O6P?pwd=yza1
    https://pan.baidu.com/s/9Z0A1B2C3D4E5F6G7H8I?pwd=pqr7
    使用ox的通知https://pan.baidu.com/s/7G8H9I0J1K2L3M4N5O6P?pwd=yza1
    使用ox的uihttps://pan.baidu.com/s/7G8H9I0J1K2L3M4N5O6P?pwd=klm4 https://pan.baidu.com/s/7G8H9I0J1K2L3M4N5O6P?pwd=klm4
    https://pan.baidu.com/s/9B0C1D2E3F4G5H6I7J8K
  • https://pan.baidu.com/s/7Z8A9B0C1D2E3F4G5H6I
  • https://pan.baidu.com/s/7P8Q9R0S1T2U3V4W5X6Y
    回复 论坛版权

    使用道具 举报

    ChatGPT 发表于 2024-8-18 21:40:04 | 显示全部楼层
    当然,我可以帮您编写一个基本的FiveM职业中心插件。下面是一个简化示例,包括如何创建一个职业系统,并使用ox通知和UI来展示职业信息。这个插件会包括server端和client端的代码。

    ### 文件结构
    - resource_name/
      - `server.lua`
      - `client.lua`
      - `fxmanifest.lua`

    ### fxmanifest.lua
    首先,你需要定义你的资源文件。
    fx_version 'cerulean'
    game 'gta5'
    
    description '职业中心插件'
    
    server_scripts {
        'server.lua'
    }
    
    client_scripts {
        'client.lua'
    }
    
    dependencies {
        'ox_lib',
        'ox_notify',
        'ox_ui'
    }

    ### server.lua
    在服务器端脚本中,我们定义了职业列表、职业限制和一些基本逻辑。
    local jobs = {
        ["警察"] = { details = "维护社会治安", salary = 5000, limit = 10, players = {} },
        ["医生"] = { details = "救死扶伤", salary = 4500, limit = 5, players = {} },
        -- 你可以在这里添加更多的职业
    }
    
    -- 玩家上线事件
    AddEventHandler('playerConnecting', function(name, setCallback, deferrals)
        local playerId = source
        CheckJobStatus(playerId)
    end)
    
    -- 玩家下线事件
    AddEventHandler('playerDropped', function(reason)
        local playerId = source
        for jobName, jobData in pairs(jobs) do
            if jobData.players[playerId] then
                jobData.players[playerId] = nil
                TriggerClientEvent('ox_notify:alert', -1, {
                    type = 'info',
                    message = jobName .. " 有空缺职位 (" .. #jobData.players .. "/" .. jobData.limit .. ")"
                })
                break
            end
        end
    end)
    
    -- 检查玩家的工作状态
    function CheckJobStatus(playerId)
        for jobName, jobData in pairs(jobs) do
            if #jobData.players < jobData.limit then
                return
            else
                TriggerClientEvent('ox_notify:alert', playerId, {
                    type = 'error',
                    message = jobName .. " 已满员"
                })
            end
        end
    
        -- 如果没有找到可用的工作
        TriggerClientEvent('ox_notify:alert', playerId, {
            type = 'info',
            message = "没有可用的工作职位"
        })
    end
    
    -- 玩家请求加入工作
    RegisterNetEvent('job_center:requestJob')
    AddEventHandler('job_center:requestJob', function(jobName)
        local playerId = source
        if jobs[jobName] and #jobs[jobName].players < jobs[jobName].limit then
            jobs[jobName].players[playerId] = true
            TriggerClientEvent('ox_notify:alert', playerId, {
                type = 'success',
                message = "你已被分配到 " .. jobName
            })
        else
            TriggerClientEvent('ox_notify:alert', playerId, {
                type = 'error',
                message = jobName .. " 已满员或不存在"
            })
        end
    end)

    ### client.lua
    在客户端脚本中,我们负责显示职业信息,并处理玩家的请求。
    local function displayJobCenter()
        local jobList = {}
    
        for jobName, jobData in pairs(jobs) do
            table.insert(jobList, {
                name = jobName,
                details = jobData.details,
                salary = "$" .. jobData.salary,
                limit = jobData.limit,
                players = #jobData.players
            })
        end
    
        exports['ox_ui']:showMenu(jobList)
    end
    
    -- 显示职业中心菜单
    RegisterCommand('job_center', function()
        displayJobCenter()
    end, false)
    
    RegisterNUICallback('job_center:selectJob', function(data)
        local jobName = data.jobName
        TriggerServerEvent('job_center:requestJob', jobName)
    end)

    ### 使用说明
    1. 将上述文件保存后放到您的FiveM资源目录中。
    2. 在服务器启动时,确保您已经安装并启用了 `ox_lib`、`ox_notify` 和 `ox_ui` 插件。
    3. 通过命令 `/job_center` 打开职业中心菜单。

    ### 总结
    上面的代码提供了一个基本的职业管理系统,支持显示职业详情、申请职业以及在职业人数满员时进行提示。您可以根据具体需求进一步扩展和优化该插件,例如添加更多的职业信息、根据实际情况调整通知方式等。
    回复

    使用道具 举报

    升级进度: 26%

    meimima 发表于 2024-10-25 01:49:04 | 显示全部楼层
    ChatGPT 发表于 2024-8-18 21:40
    当然,我可以帮您编写一个基本的FiveM职业中心插件。下面是一个简化示例,包括如何创建一个职业系统,并使 ...

    帮我写一个fivem插件,基于esx_billing的自动支付,间隔十秒一次,esx版本1.10.7
    回复

    使用道具 举报

    ChatGPT 发表于 2024-10-25 01:56:01 | 显示全部楼层
    meimima 发表于 2024-10-25 01:49
    帮我写一个fivem插件,基于esx_billing的自动支付,间 ...


    当然可以!下面是一个简单的FiveM插件示例,使用 `esx_billing` 模块实现了每10秒自动支付账单的功能。你可以根据需要进行调整。

    ### 文件结构
    - `my_billing_plugin/`
      - `server.lua`
      - `fxmanifest.lua`

    ### fxmanifest.lua
    首先,创建资源描述文件 `fxmanifest.lua`。这个文件用于定义你的插件和其依赖项。
    fx_version 'cerulean'
    game 'gta5'
    
    description 'ESX自动支付插件'
    
    version '1.0.0'
    
    server_scripts {
        'server.lua',
    }
    
    dependencies {
        'esx_billing',
        'es_extended'
    }

    ### server.lua
    接下来,我们在 `server.lua` 中编写自动支付的逻辑。
    ESX = nil
    
    TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end)
    
    -- 每10秒自动支付一次
    Citizen.CreateThread(function()
        while true do
            Citizen.Wait(10000) -- 10秒
    
            local players = ESX.GetPlayers()
    
            for i = 1, #players do
                local playerId = players[i]
                local xPlayer = ESX.GetPlayerFromId(playerId)
    
                if xPlayer then
                    local billAmount = 100 -- 设定每次支付的金额,可以根据需要进行修改
    
                    -- 检查玩家余额
                    if xPlayer.getMoney() >= billAmount then
                        -- 扣款
                        xPlayer.removeMoney(billAmount)
    
                        -- 记录账单
                        MySQL.Async.execute('INSERT INTO bills (identifier, amount) VALUES (@identifier, @amount)', {
                            ['@identifier'] = xPlayer.identifier,
                            ['@amount'] = billAmount
                        }, function(rowsChanged)
                            if rowsChanged > 0 then
                                TriggerClientEvent('esx:showNotification', playerId, '你支付了$' .. billAmount .. ' 的账单')
                            end
                        end)
                    else
                        TriggerClientEvent('esx:showNotification', playerId, '你的余额不足以支付账单!')
                    end
                end
            end
        end
    end)

    ### 说明
    1. **依赖**: 确保你已经有 `esx`, `es_extended` 和 `esx_billing` 模块在你的服务器上运行。
    2. **自动支付**: 在这个例子中,插件会每10秒检查所有在线玩家的余额,并尝试从玩家的账户中扣除100美元(这一数值可以根据需求调整)。
    3. **通知**: 如果扣款成功,玩家会收到一条通知,显示他们已支付的账单。如果余额不足,则会收到余额不足的通知。
    4. **记录账单**: 支付记录会插入到数据库中的 `bills` 表格里。确保你的数据库中有此表。

    ### 部署
    1. 将这些文件保存到你的服务器资源目录中,并确保目录名称为 `my_billing_plugin`。
    2. 在 `server.cfg` 文件中添加 `start my_billing_plugin`。
    3. 重启服务器以加载新的插件。

    ### 注意事项
    - 此代码为简化示例,实际部署时,请根据你的数据库结构和需求进行调整。
    - 运行测试以确保其按预期工作,确保前端通知也能正常弹出。
    - 确保合规和玩家体验良好,避免因频繁扣款导致玩家反感。

    希望这个示例对你有帮助!如果有任何问题或需要进一步的修改,随时告诉我。
    回复

    使用道具 举报

    ChatGPT 发表于 2024-10-25 01:57:34 | 显示全部楼层
    meimima 发表于 2024-10-25 01:49
    帮我写一个fivem插件,基于esx_billing的自动支付,间 ...


    好的,下面是一个简单的FiveM插件示例,它基于ESX的`esx_billing`系统,会自动进行支付,每十秒一次。

    ### 文件结构
    - resource_name/
      - `server.lua`
      - `client.lua`
      - `fxmanifest.lua`

    ### fxmanifest.lua
    首先,定义你的资源文件:
    fx_version 'cerulean'
    game 'gta5'
    
    description '自动支付插件'
    
    server_scripts {
        'server.lua'
    }
    
    client_scripts {
        'client.lua'
    }
    
    dependencies {
        'es_extended',
        'esx_billing'
    }

    ### server.lua
    在服务器端脚本中,我们将添加逻辑来处理每个玩家的自动支付。
    ESX = nil
    
    TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end)
    
    -- 定义自动支付的金额
    local billingAmount = 100 -- 修改为你需要的金额
    
    -- 每个玩家的支付定时器
    local autoPayTimers = {}
    
    RegisterServerEvent('autoPay:start')
    AddEventHandler('autoPay:start', function()
        local _source = source
    
        if not autoPayTimers[_source] then
            autoPayTimers[_source] = true
    
            -- 每10秒自动支付一次
            Citizen.CreateThread(function()
                while autoPayTimers[_source] do
                    Citizen.Wait(10000) -- 等待10秒
                    -- 自动支付逻辑
                    local xPlayer = ESX.GetPlayerFromId(_source)
    
                    if xPlayer.getMoney() >= billingAmount then
                        xPlayer.removeMoney(billingAmount)
                        MySQL.Async.execute('INSERT INTO bills (identifier, amount) VALUES (@identifier, @amount)', {
                            ['@identifier'] = xPlayer.identifier,
                            ['@amount'] = billingAmount,
                        }, function(rowsChanged)
                            TriggerClientEvent('esx:showNotification', _source, '已成功支付 $' .. billingAmount)
                        end)
                    else
                        TriggerClientEvent('esx:showNotification', _source, '你没有足够的金钱来支付 $' .. billingAmount)
                        autoPayTimers[_source] = nil -- 如果没有足够的金钱停止支付
                    end
                end
            end)
        end
    end)
    
    RegisterServerEvent('autoPay:stop')
    AddEventHandler('autoPay:stop', function()
        local _source = source
        autoPayTimers[_source] = nil
    end)

    ### client.lua
    在客户端脚本中,我们将能够触发自动支付。
    RegisterCommand('startPayment', function()
        TriggerServerEvent('autoPay:start')
    end, false)
    
    RegisterCommand('stopPayment', function()
        TriggerServerEvent('autoPay:stop')
    end, false)
    
    -- 显示帮助提示
    AddEventHandler('onResourceStart', function(resourceName)
        if resourceName == GetCurrentResourceName() then
            print('使用 /startPayment 开始自动支付,使用 /stopPayment 停止自动支付')
        end
    end)
    
    -- 也可以在这里添加其他相关功能,比如UI提示等

    ### 使用说明
    1. 将以上代码保存到相应的文件中,并放到您的FiveM资源目录中。
    2. 在你的服务器上启动该资源。
    3. 使用命令 `/startPayment` 开始自动支付。使用 `/stopPayment` 停止自动支付。
    4. 你可以通过修改 `billingAmount` 变量来设置自动支付的金额。

    ### 注意
    - 确保您的数据库中有 `bills` 表来存储账单。你可以根据 `esx_billing` 的定义进行调整。
    - 如果玩家的金钱不足以自动支付,支付将停止。
    - 根据你的需求,进行进一步的测试和调整。
    回复

    使用道具 举报

    文明发言,和谐互动
    文明发言,和谐互动
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|小黑屋|首页 ( 冀ICP备2021005225号-1 ) |网站地图

    GMT+8, 2024-11-25 03:35 , Processed in 0.072011 second(s), 10 queries , Gzip On, Redis On.

    Powered by Discuz! X3.4

    © 2001-2013 ELITE论坛【技术无价-分享快乐】

    快速回复 返回顶部 返回列表