qazw01 发表于 2024-10-7 14:28:18

帮助

[新老插件兼容性问题]ESX服务端后台出现 getSharedObject 解决方法
帮我改好!





local isDriving = false;
local isUnderwater = false;


ESX = nil
Citizen.CreateThread(function()
    while ESX == nil do
      TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end)
      if Config.UnitOfSpeed == "kmh" then
            SpeedMultiplier = 3.6
      elseif Config.UnitOfSpeed == "mph" then
            SpeedMultiplier = 2.236936
      end
      Wait(100)
    end
end)


Citizen.CreateThread(function()
    while true do
      Wait(100)


      if isDriving and IsPedInAnyVehicle(PlayerPedId(), true) then
            local veh = GetVehiclePedIsUsing(PlayerPedId(), false)
            local speed = math.floor(GetEntitySpeed(veh) * SpeedMultiplier)
            local vehhash = GetEntityModel(veh)
            local maxspeed = GetVehicleModelMaxSpeed(vehhash) * 3.6
            SendNUIMessage({speed = speed, maxspeed = maxspeed})
      end
    end
end)


Citizen.CreateThread(function()
    while true do
      Wait(1000)
      if Config.ShowSpeedo then
            if IsPedInAnyVehicle(PlayerPedId(), false) and
                not IsPedInFlyingVehicle(PlayerPedId()) and
                not IsPedInAnySub(PlayerPedId()) then
                isDriving = true
                SendNUIMessage({showSpeedo = true})
            elseif not IsPedInAnyVehicle(PlayerPedId(), false) then
                isDriving = false
                SendNUIMessage({showSpeedo = false})
            end
      end
    end
end)


Citizen.CreateThread(function()
    while true do
      Wait(500)


      local isTalking = NetworkIsPlayerTalking(PlayerId())
      if IsPedSwimmingUnderWater(PlayerPedId()) then
            isUnderwater = true
            SendNUIMessage({showOxygen = true})
      elseif not IsPedSwimmingUnderWater(PlayerPedId()) then
            isUnderwater = false
            SendNUIMessage({showOxygen = false})
      end
      TriggerEvent('esx_status:getStatus', 'hunger',
                     function(status) hunger = status.val / 10000 end)
      TriggerEvent('esx_status:getStatus', 'thirst',
                     function(status) thirst = status.val / 10000 end)
      if Config.ShowStress == true then
            TriggerEvent('esx_status:getStatus', 'stress',
                         function(status) stress = status.val / 10000 end)
      end


      if Config.UseRadio then
            local radioStatus = exports["rp-radio"]:IsRadioOn()
            SendNUIMessage({radio = radioStatus})
      end


      SendNUIMessage({
            action = "update_hud",
            hp = GetEntityHealth(PlayerPedId()) - 100,
            armor = GetPedArmour(PlayerPedId()),
            hunger = hunger,
            thirst = thirst,
            stress = stress,
            oxygen = GetPlayerUnderwaterTimeRemaining(PlayerId()) * 10,
            talking = isTalking
      })
      if IsPauseMenuActive() then
            SendNUIMessage({showUi = false})
      elseif not IsPauseMenuActive() then
            SendNUIMessage({showUi = true})
      end
    end
end)


-- Map stuff below
local x = -0.025
local y = -0.015
local w = 0.16
local h = 0.25


Citizen.CreateThread(function()


    local minimap = RequestScaleformMovie("minimap")
    RequestStreamedTextureDict("circlemap", false)
    while not HasStreamedTextureDictLoaded("circlemap") do Wait(100) end
    AddReplaceTexture("platform:/textures/graphics", "radarmasksm", "circlemap",
                      "radarmasksm")


    SetMinimapClipType(1)
    SetMinimapComponentPosition('minimap', 'L', 'B', x, y, w, h)
    SetMinimapComponentPosition('minimap_mask', 'L', 'B', x + 0.17, y + 0.09,
                              0.072, 0.162)
    SetMinimapComponentPosition('minimap_blur', 'L', 'B', -0.035, -0.03, 0.18,
                              0.22)
    Wait(5000)
    SetRadarBigmapEnabled(true, false)
    Wait(0)
    SetRadarBigmapEnabled(false, false)


    while true do
      Wait(0)
      BeginScaleformMovieMethod(minimap, "SETUP_HEALTH_ARMOUR")
      ScaleformMovieMethodAddParamInt(3)
      EndScaleformMovieMethod()
      BeginScaleformMovieMethod(minimap, 'HIDE_SATNAV')
      EndScaleformMovieMethod()
    end
end)


CreateThread(function()
    while true do
      Wait(2000)
      SetRadarZoom(1150)
      if Config.AlwaysShowRadar == false then
            if IsPedInAnyVehicle(PlayerPedId(-1), false) then
                DisplayRadar(true)
            else
                DisplayRadar(false)
            end
      elseif Config.AlwaysShowRadar == true then
            DisplayRadar(true)
      end
      if Config.ShowStress == false then
            SendNUIMessage({action = "disable_stress"})
      end


      if Config.ShowVoice == false then
            SendNUIMessage({action = "disable_voice"})
      end


      if Config.ShowFuel == true then
            if isDriving and IsPedInAnyVehicle(PlayerPedId(), true) then
                local player = GetPlayerPed(-1)
                local vehicle = GetVehiclePedIsIn(player, false)
                local vehicleFuel
                vehicleFuel = GetVehicleFuelLevel(veh)
                SendNUIMessage({
                  action = "update_fuel",
                  fuel = vehicleFuel,
                  showFuel = true
                })
            end
      elseif Config.ShowFuel == false then
            SendNUIMessage({showFuel = false})
      end
    end
end)


function Voicelevel(val)
    SendNUIMessage({action = "voice_level", voicelevel = val})
end


exports('Voicelevel', Voicelevel)


RegisterCommand("togglehud",
                function()SendNUIMessage({action = "toggle_hud"}) end, false)






ChatGPT 发表于 2024-10-7 14:28:24

确保你在 `server.lua` 文件中适当地包含了 ESX 共享对象的获取方法。在你的代码中,`getSharedObject` 的问题可能源于 ESX 服务器未正确初始化或未正确引用。

在你的 `server.lua` 文件中,你可以添加以下内容,确保 ESX 被正确设置:

ESX = nil

TriggerEvent('esx:getSharedObject', function(obj)
    ESX = obj
end)

-- 额外的代码...

接下来是你的客户端代码,确保在执行 `TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end)` 时,ESX 已经被加载。

### 更新后的代码:

local isDriving = false
local isUnderwater = false
ESX = nil

-- 启动线程以获取 ESX 共享对象
Citizen.CreateThread(function()
    while ESX == nil do
      TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end)
      Wait(100)-- 等待 100 毫秒再尝试
    end
end)

Citizen.CreateThread(function()
    while true do
      Wait(100)

      if isDriving and IsPedInAnyVehicle(PlayerPedId(), true) then
            local veh = GetVehiclePedIsUsing(PlayerPedId(), false)
            local speed = math.floor(GetEntitySpeed(veh) * SpeedMultiplier)
            local vehhash = GetEntityModel(veh)
            local maxspeed = GetVehicleModelMaxSpeed(vehhash) * 3.6
            SendNUIMessage({speed = speed, maxspeed = maxspeed})
      end
    end
end)

-- 其他线程和函数...

### 注意事项:
1. 请确保服务器端正确加载了 ESX 框架并且 ESX 确实可用。
2. 确保该代码片段放置在 `client.lua` 文件中,因为 `TriggerEvent` 是客户端向服务器请求对象。
3. 如果问题仍然存在,检查你的 ESX 版本是否正确,并查看服务器控制台是否有其他错误信息。

请随时让我知道你是否还有其他问题或需要进一步的帮助!

qazw01 发表于 2024-10-7 14:32:52

ChatGPT 发表于 2024-10-7 14:28
确保你在 `server.lua` 文件中适当地包含了 ESX 共享对象的获取方法。在你的代码中,`getSharedObject` 的 ...

没看懂,详细说明,没有server文件

ChatGPT 发表于 2024-10-7 14:33:01

qazw01 发表于 2024-10-07 14:32
没看懂,详细说明,没有server文件

好的,没问题。让我详细说明一下你的代码以及如何解决 `getSharedObject` 的问题。

1. **问题描述**:你提到在 ESX 服务端后台出现 `getSharedObject` 的问题。这通常是因为 ESX 没有正确被初始化或者无法在客户端找到。

2. **解读你的代码**:
   - 你的代码中使用了 `ESX` 变量来获取共享对象。
   - 通过 `TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end)` 尝试获取 ESX 对象。
   - 如果 `ESX` 为 `nil`,这意味着你没有成功获取它。

3. **解决方案**:
   - 确保 ESX 资源已经被正确启动并且在你的服务器上运行。
   - 你提到没有 `server.lua` 文件,实际上获取 `ESX` 对象的代码应该在你的客户端代码中执行,而你应该确保 ESX 资源在服务器上已经启动。

### 修改后的代码示例:

这是你的 `/client/main.lua` 的代码(假设你把这个代码放在 `client.lua` 中):

local isDriving = false
local isUnderwater = false
local ESX = nil
local SpeedMultiplier = 1

Citizen.CreateThread(function()
    while ESX == nil do
      TriggerEvent('esx:getSharedObject', function(obj)
            ESX = obj
      end)
      Wait(100)-- 每 100 毫秒查看一次
    end
end)

-- 这里是获取速度的代码
Citizen.CreateThread(function()
    while true do
      Wait(100)
      
      if isDriving and IsPedInAnyVehicle(PlayerPedId(), true) then
            local veh = GetVehiclePedIsUsing(PlayerPedId(), false)
            local speed = math.floor(GetEntitySpeed(veh) * SpeedMultiplier)
            local vehhash = GetEntityModel(veh)
            local maxspeed = GetVehicleModelMaxSpeed(vehhash) * 3.6
            SendNUIMessage({speed = speed, maxspeed = maxspeed})
      end
    end
end)

-- 其他线程和逻辑...

### 重要说明:
- **确保服务端资源**:请确保你的服务器上 ESX 资源是正常运行的。打开服务器控制台查看是否有 ESX 启动的相关信息。
- **确保客户端代码**:确保你将以上代码放入你的客户端脚本中,通常是 `client.lua`。

### 测试:
启动服务器后,加入游戏,查看控制台。如果 ESX 成功初始化,应该不会再出现 `getSharedObject` 的错误。

如果你还是不明白某些部分,欢迎继续提问,我会尽量用更简单的语言来解释!

qazw01 发表于 2024-10-7 14:37:09

ChatGPT 发表于 2024-10-7 14:33
好的,没问题。让我详细说明一下你的代码以及如何解决 `getSharedObject` 的问题。

1. **问题描述**:你 ...

还是报错

ChatGPT 发表于 2024-10-7 14:41:08

qazw01 发表于 2024-10-07 14:37
还是报错

如果你仍然遇到 `getSharedObject` 的错误,可以尝试以下几步进行进一步的排查和修复。

### 1. 确保 ESX 正常运行

首先,确保你服务器上已正确安装并启动了 ESX。检查以下几点:

- 确保服务器资源列表中包含了 ESX。
- 启动服务器后,观察控制台,确认有没有 ESX 加载后的成功信息。

### 2. 检查资源依赖

确保你的客户端脚本依赖 ESX。比如在 `__resource.lua` 或 `fxmanifest.lua` 中添加:

dependency 'es_extended' -- 或者 'esx'

### 3. 确保获取 ESX 代码在 Client.lua 中

确保你有如下代码,并且放在你的 `client.lua` 中的最顶部:

ESX = nil

Citizen.CreateThread(function()
    while ESX == nil do
      TriggerEvent('esx:getSharedObject', function(obj)
            ESX = obj
      end)
      Wait(100) -- 每100毫秒检查一次
    end
end)

### 4. 检查 ESX 版本

有时候 ESX 更新可能会导致某些变化。确保你使用的 ESX 版本与文档或者其他资源的版本相匹配。

### 5. 清理及重启服务器

如果没有问题,请尝试重启服务器。在控制台中清除错误执行以下步骤:

- 关闭你的服务器。
- 删除 `cache` 文件夹(这会强制服务器重新加载资源)。
- 重启你的服务器并检查控制台输出。

### 6. 使用 “print” 调试

在 `esx:getSharedObject` 的回调中使用 `print` 函数来确认是否成功获取到对象,像这样:

Citizen.CreateThread(function()
    while ESX == nil do
      TriggerEvent('esx:getSharedObject', function(obj)
            ESX = obj
            print("ESX 已加载") -- 这条信息将会在控制台输出
      end)
      Wait(100)
    end
end)

### 7. 查看其他日志

查看服务器端的日志,可能会有其他相关错误,这能帮助你找到问题的根源。

### 8. 简化代码

如果问题仍然存在,尝试暂时简化代码,将所有代码注释掉,只保留获取 ESX 的部分,看是否仍然报错。

如果经过以上步骤仍然没有解决问题,欢迎你把服务器控制台的具体错误信息提供给我,我会根据错误信息帮你进一步分析。
页: [1]
查看完整版本: 帮助