example
example

心得 群友偶遇逆天插件,使用物品没有效果,拼尽全力无法战胜

Cata_a

论坛名人
管理成员
FiveM版主
论坛元老
高级用户
认证用户
黄金
92.95G

发生肾摸逝了?​

原始问题,如果你也这样描述问题,请看《提问的智慧》《如何向开源社区提问题》《如何有效地报告 Bug》《如何向开源项目提交无法解答的问题》
弄了个消耗品插件和mhud对接缓解压力 顺便加护甲 弄好了 但是现在有个问题就是 比如我服务器刚重启完 一个玩家都没有 然后开始进来玩家 这个时候他们喝酒 只能缓解压力 却不能加护甲 插件没有报错 我必须手动重启一次插件 才会有加护甲的效果 后面进来的玩家也是没效果 得重启 反正就是在我插件开启的时候 后面进来的 都没效果 必须重启一次 目前在游戏内的 才能有效果
总结:消耗品插件使用物品只能降低压力值不能增加护甲值,插件无报错,玩家在服务器时手动重启插件可以正常增加护甲值,后加入服务器的玩家不能正常增加。(后面补充提示可以正常显示)

问题代码​

这是简化之后的伪代码,看看你能不能根据他的描述猜到问题
Lua:
-- client.lua
CreateThread(function()
    for k, v in pairs(Config.Items) do
        local event = 'heist_consumables:' .. v.name
        local playerPed = PlayerPedId()
        RegisterNetEvent(event)
        AddEventHandler(event, function()
            local notify = '你使用了 ' .. v.label
            ESX.ShowNotification(notify)

            -- Armor
            if v.armour then
                local currentarmour = GetPedArmour(playerPed)
                local maxarmour = 100
                local newarmour = currentarmour + v.armour
                if newarmour > maxarmour then
                    newarmour = maxarmour
                end
                SetPedArmour(playerPed, newarmour)
                -- 触发HUD系统的护甲耐久度更新
                TriggerServerEvent('hud:server:UpdateArmour', newarmour)

                -- 添加护甲恢复通知
                local armourAddedAmount = newarmour - currentarmour
                ESX.ShowNotification('护甲恢复了 ' .. armourAddedAmount .. ' 点')
            end

            -- 压力相关逻辑
            -- ...
        end)
    end
end)

问题出在哪里?​

是不是 SetPedArmour 函数传入的 newarmour 变量类型不对?加个取整操作?
有些原生函数确实会存在这样的问题,似乎和 use_experimental_fxv2_oal 'yes' 也有关系,还有待进一步研究。
SetPedArmour 这个函数,如果你尝试传入小数,如 1.1 或其他任何小数,玩家的护甲值将被设置为 100。
所以到底发生了什么?请看下图:
1737715673602.png
ox_lib cache 文档:https://overextended.dev/ox_lib/Modules/Cache/Client

修复后的代码​

需要按照文档在资源清单中引入 ox_lib。文档:https://overextended.dev/ox_lib#usage
Lua:
-- client.lua
CreateThread(function()
    for k, v in pairs(Config.Items) do
        local event = 'heist_consumables:' .. v.name
        RegisterNetEvent(event)
        AddEventHandler(event, function()
            local notify = '你使用了 ' .. v.label
            ESX.ShowNotification(notify)

            -- Armor
            if v.armour then
                local currentarmour = GetPedArmour(cache.ped)
                local maxarmour = 100
                local newarmour = currentarmour + v.armour
                if newarmour > maxarmour then
                    newarmour = maxarmour
                end
                SetPedArmour(cache.ped, newarmour)
                -- 触发HUD系统的护甲耐久度更新
                TriggerServerEvent('hud:server:UpdateArmour', newarmour)

                -- 添加护甲恢复通知
                local armourAddedAmount = newarmour - currentarmour
                ESX.ShowNotification('护甲恢复了 ' .. armourAddedAmount .. ' 点')
            end

            -- 压力相关逻辑
            -- ...
        end)
    end
end)
不推荐的方式(原因:增加开发者心智负担)
Lua:
-- client.lua
CreateThread(function()
    for k, v in pairs(Config.Items) do
        local event = 'heist_consumables:' .. v.name
        RegisterNetEvent(event)
        AddEventHandler(event, function()
            local playerPed = PlayerPedId()
            local notify = '你使用了 ' .. v.label
            ESX.ShowNotification(notify)
            -- Armor
            if v.armour then
                local currentarmour = GetPedArmour(playerPed)
                local maxarmour = 100
                local newarmour = currentarmour + v.armour
                if newarmour > maxarmour then
                    newarmour = maxarmour
                end
                SetPedArmour(playerPed, newarmour)
                -- 触发HUD系统的护甲耐久度更新
                TriggerServerEvent('hud:server:UpdateArmour', newarmour)
                -- 添加护甲恢复通知
                local armourAddedAmount = newarmour - currentarmour
                ESX.ShowNotification('护甲恢复了 ' .. armourAddedAmount .. ' 点')
            end
            -- 压力相关逻辑
            -- ...
        end)
    end
end)
更加不推荐的方式(原因:消耗更多资源的同时代码不美观、不便于查看,试想有一个函数需要传入 Ped、Vehicle、位置等一系列参数,代码直接长出天际)
Lua:
-- client.lua
CreateThread(function()
    for k, v in pairs(Config.Items) do
        local event = 'heist_consumables:' .. v.name
        RegisterNetEvent(event)
        AddEventHandler(event, function()
            local notify = '你使用了 ' .. v.label
            ESX.ShowNotification(notify)
            -- Armor
            if v.armour then
                local currentarmour = GetPedArmour(PlayerPedId())
                local maxarmour = 100
                local newarmour = currentarmour + v.armour
                if newarmour > maxarmour then
                    newarmour = maxarmour
                end
                SetPedArmour(PlayerPedId(), newarmour)
                -- 触发HUD系统的护甲耐久度更新
                TriggerServerEvent('hud:server:UpdateArmour', newarmour)
                -- 添加护甲恢复通知
                local armourAddedAmount = newarmour - currentarmour
                ESX.ShowNotification('护甲恢复了 ' .. armourAddedAmount .. ' 点')
            end
            -- 压力相关逻辑
            -- ...
        end)
    end
end)
 
最后编辑:
处于简化脚本的思想我一般会避免去增加依赖插件
不过句柄类信息是必须在使用时获取的
因为会经常随着实体被替换而变更
在脚本开头获取一次后续无限套用就很蠢
无用的低级错误图鉴+1
 
处于简化脚本的思想我一般会避免去增加依赖插件
这就是取舍了,是在多个脚本里加入重复代码,还是用户安装时需要多下载一些依赖。
 
后退
顶部