ESX é nil: corrigindo esx:getSharedObject em ESX Legacy

attempt to index a nil value (global 'ESX')? O antigo evento esx:getSharedObject desapareceu de ESX Legacy. Aqui está a correção de uma linha e o que fazer com scripts que você não pode editar.

Você inicia seu servidor, abre o console F8 e aí está:

text
SCRIPT ERROR: @my_script/client/main.lua:12: attempt to index a nil value (global 'ESX')

Ou o gêmeo do lado do servidor, attempt to index a nil value (upvalue 'ESX'). O script está correto, ESX está em execução e ESX ainda está nil. Este é o erro ESX mais comum que existe e quase sempre tem a mesma causa.

Por que ESX é nil

Scripts ESX mais antigos obtêm o objeto ESX assim:

lua
ESX = nil

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

Esse evento foi como ESX 1.1 e 1.2 distribuíram seu objeto compartilhado. ESX Legacy o substituiu e as versões atuais não respondem mais. O script aciona o evento, ninguém responde e ESX permanece nil até que a primeira linha que o utiliza trave.

Você verá isso principalmente em scripts escritos anos atrás ou copiados de tutoriais antigos.

A solução: pergunte es_extended diretamente

Substitua essas linhas pela exportação que ESX Legacy fornece:

lua
ESX = exports['es_extended']:getSharedObject()

Funciona da mesma forma no cliente e no servidor. Faça isso em todos os arquivos que usam ESX. Se o script também tiver um loop de espera como este, exclua-o; a exportação responde imediatamente:

lua
-- old code: remove it
Citizen.CreateThread(function()
    while ESX == nil do
        TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end)
        Citizen.Wait(0)
    end
end)

Ainda mais simples: imports.lua

es_extended envia um pequeno arquivo que configura ESX para você. Adicione-o ao fxmanifest.lua do script:

lua
fx_version 'cerulean'
game 'gta5'
lua54 'yes'

shared_script '@es_extended/imports.lua'

client_scripts { 'client/*.lua' }
server_scripts { 'server/*.lua' }

Agora cada arquivo de cliente e servidor tem um ESX global, e no cliente ESX.PlayerData permanece atualizado conforme o trabalho e o dinheiro do jogador mudam. Você pode excluir totalmente as getSharedObject linhas.

Dica: use uma abordagem por script. A exportação no topo de cada arquivo ou imports.lua no manifesto; misturar os dois funciona, mas é ruído.

Ainda nil? Verifique a ordem de início

Se você já usa a exportação e ESX ainda é nil, ou obtém No such export getSharedObject in resource es_extended, o script está iniciando antes de es_extended. Seu server.cfg decide a ordem:

cfg
ensure oxmysql
ensure ox_lib
ensure es_extended
ensure [esx]

ensure my_script

Mais duas coisas para verificar no console do servidor, desde o início:

  • es_extended foi iniciado sem erros. Se falhar (um mysql_connection_string ruim, um oxmysql ausente), todos os scripts que dependem dele também falharão.
  • A pasta se chama es_extended. Uma cópia renomeada ou duplicada quebra o nome de exportação e, no Linux, o nome diferencia maiúsculas de minúsculas.

Examinamos esse erro detalhadamente em Não existe essa exportação getSharedObject no recurso es_extended.

Dados do jogador no cliente

Scripts antigos também leem o player assim:

lua
-- old
ESX.GetPlayerData()
RegisterNetEvent('esx:playerLoaded')
AddEventHandler('esx:playerLoaded', function(xPlayer) PlayerData = xPlayer end)

Isso ainda funciona em ESX Legacy, com um detalhe: espere até que o player seja carregado antes de ler trabalho ou dinheiro na inicialização.

lua
CreateThread(function()
    while not ESX.IsPlayerLoaded() do Wait(250) end
    local job = ESX.GetPlayerData().job
    print(('job: %s (%s)'):format(job.name, job.grade))
end)

RegisterNetEvent('esx:setJob', function(job)
    -- the job changed: refresh whatever shows it
end)

Com imports.lua, ESX.PlayerData.job é mantido atualizado para você.

Scripts que você não pode editar

Se o script estiver sob custódia (criptografado) e ainda usar o evento antigo, você não poderá alterar seu código. Em ordem de preferência:

  1. Peça uma atualização ao autor. Qualquer script ainda vendido por ESX deve usar a exportação.
  2. Responda você mesmo ao evento antigo de ESX. Em es_extended, adicione isto a um arquivo do servidor e a um arquivo do cliente:
lua
AddEventHandler('esx:getSharedObject', function(cb)
    cb(ESX)
end)

Atenção: este é um patch para o próprio es_extended. Atualizar ESX o sobrescreve, então você terá que adicioná-lo novamente após cada atualização. Mantenha isso como um paliativo, não como uma solução.

Lista de verificação rápida

Sintoma Corrigir
attempt to index a nil value (global 'ESX') Substitua TriggerEvent('esx:getSharedObject'…) por exports['es_extended']:getSharedObject()
Ainda nil após a mudança Iniciar es_extended antes do script em server.cfg
No such export getSharedObject es_extended não foi iniciado, falhou ou tem um nome diferente
ESX.PlayerData.job está nil na inicialização Aguarde ESX.IsPlayerLoaded() primeiro
Script garantido com o evento antigo Pergunte ao autor; enquanto isso, responda ao evento de es_extended

Respostas rápidas

Por que ESX nil está no meu script?

O script solicita ESX com a antiga chamada TriggerEvent('esx:getSharedObject'), que o ESX Legacy atual não atende mais. Substitua-o por ESX = exports['es_extended']:getSharedObject() ou adicione shared_script '@es_extended/imports.lua' ao fxmanifest.

Preciso alterar os arquivos do cliente e do servidor?

Sim. Todo arquivo que usa ESX precisa do objeto, no cliente e no servidor. A linha imports.lua no fxmanifest cobre todos eles de uma vez.

E se o script estiver sob custódia e eu não puder editá-lo?

Peça primeiro ao autor uma atualização. Como último recurso, você pode responder ao evento antigo de es_extended, mas será necessário adicioná-lo novamente sempre que atualizar ESX.

Scripts sem esse problema

Advanced BoostingBoosting de veículos pelo tablet: contratos da classe D à S+, crews e fila ao vivo.Ver script →Item Creator V2Crie itens usáveis com animações, props, efeitos e muito mais — sem escrever código.Ver script →Shop CreatorMonte uma loja em menos de um minuto — donos, funcionários, cofres e assaltos inclusos.Ver script →

Continue lendo