THE ORB
Arrancando el studio

intento de concatenar un valor nil

Un script intentó armar un mensaje con un valor que faltaba, normalmente un nombre de jugador o un ajuste de configuración que dejaste en blanco.

groupsEsa función deja de andarpersonPodés arreglarlo

Haz esto primero

Revisa el archivo de configuración de ese script buscando un ajuste que nunca se rellenó.

bug_reportMejor pega tu consola entera

Qué significa

Se usó el operador .. con algo que no es ni una cadena ni un número. El mensaje lo nombra: attempt to concatenate a nil value (local 'name').

Lua concatena números sin problema, así que esto casi siempre es un nil, y casi siempre está dentro de una cadena que se está armando para un print, una notificación, un mensaje de chat o una consulta.

Qué lo provoca

Ordenado por la frecuencia con la que es la respuesta.

  1. 1

    Un campo de tabla que falta dentro de un mensaje

    'Welcome ' .. player.name donde el objeto del jugador no tiene name, o el objeto entero es nil. Armar el mensaje es donde muerde por primera vez el dato que falta.

  2. 2

    Una función que no devolvió nada

    GetPlayerName(src) devuelve nil para un jugador que ya se fue, y el resultado va derecho a una línea de registro.

  3. 3

    Un valor de configuración que nunca se puso

    Config.Webhook .. '?wait=true' con la webhook vacía en una configuración que el usuario nunca llenó.

  4. 4

    Armar SQL por concatenación

    Que además es un agujero de inyección, así que este error te está haciendo un favor al llamar la atención sobre él.

Cómo saber cuál es el tuyo

Envolvé el operando en tostring() temporalmente: el error desaparece y el mensaje imprime nil exactamente donde estaba el valor que faltaba, y eso te dice cuál es sin adivinar nada.

Dónde mirar

La línea que nombra. Leé la expresión entera: una concatenación larga puede tener cinco operandos y sólo uno es nil.

Cómo arreglarlo

Poné un valor por defecto, o usá string.format, que tolera nil en %s:

local name = GetPlayerName(src) or 'unknown'
print(('player %s bought %s'):format(name, item or 'nothing'))

Y para SQL, usá marcadores de posición en vez de concatenar:

MySQL.query('SELECT * FROM users WHERE identifier = ?', { identifier })

¿Sigues atascado en tu propio código?

Esta página es lo que suele significar este error. Pega tu consola en Server Fixer y ordenará todo lo que haya en ella y te dirá qué hacer primero; y si prefieres no tocarlo, ORBIE puede reparar el script y devolverte el recurso listo para soltar.

bug_reportAbrir el Server Fixer

Para este tipo de error, el Script Optimizer lee el script y repara el código que hay detrás.

Errores que viajan con este