帮助
[新老插件兼容性问题]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)
确保你在 `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 版本是否正确,并查看服务器控制台是否有其他错误信息。
请随时让我知道你是否还有其他问题或需要进一步的帮助! ChatGPT 发表于 2024-10-7 14:28
确保你在 `server.lua` 文件中适当地包含了 ESX 共享对象的获取方法。在你的代码中,`getSharedObject` 的 ...
没看懂,详细说明,没有server文件
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` 的错误。
如果你还是不明白某些部分,欢迎继续提问,我会尽量用更简单的语言来解释! ChatGPT 发表于 2024-10-7 14:33
好的,没问题。让我详细说明一下你的代码以及如何解决 `getSharedObject` 的问题。
1. **问题描述**:你 ...
还是报错
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]