tentative d'arithmétique sur une valeur nil
Un script a tenté un calcul sur une valeur vide, très souvent un montant d'argent ou d'objets jamais défini.
Faites d'abord ceci
Vérifiez la ligne de ce joueur dans la base, à la recherche de valeurs vides dans la colonne nommée par le message.
Ce que ça veut dire
+, -, *, /, % ou ^ a été appliqué à quelque chose qui n'est pas un nombre. Le message le nomme : attempt to perform arithmetic on a nil value (field 'amount').
Lua convertit les chaînes numériques en arithmétique ("5" + 1 fait 6), donc une chaîne déclenche rarement ceci. Un nil, presque toujours.
Ce qui la provoque
Classé par fréquence : la cause la plus probable en premier.
- 1
Un champ de table manquant
Config.Prices[item] * countalors que cet objet n'a pas d'entrée de prix. - 2
Une colonne de base qui est NULL
NULL revient en nil, pas en 0. Une ligne de joueur dont le
bankn'a jamais été initialisé casse chaque calcul de solde qui y touche. - 3
Une valeur que le client devait envoyer et n'a pas envoyée
Un gestionnaire d'événement faisant
amount * pricesur une charge où le client l'a omis. - 4
Accumuler dans une variable non initialisée
total = total + xoùtotala été déclaré sans valeur de départ.
Comment savoir laquelle est la vôtre
Affichez l'opérande nommé dans le message. S'il vient de la base, vérifiez les NULL de la colonne :
SELECT COUNT(*) FROM users WHERE bank IS NULL;
Où regarder
La ligne nommée, puis la source de cet opérande.
Comment la corriger
Mettez la valeur par défaut à la lecture, pas à l'usage :
local price = Config.Prices[item] or 0 local total = price * (count or 1)
Et côté base, rendez le problème impossible à reproduire :
ALTER TABLE users MODIFY bank INT NOT NULL DEFAULT 0;
Toujours bloqué sur votre propre code ?
Cette page explique ce que cette erreur signifie en général. Collez votre console dans Server Fixer : il classera tout ce qui s'y trouve et vous dira quoi faire en premier ; et si vous préférez ne pas y toucher, ORBIE peut réparer le script et vous rendre la ressource prête à déposer.
bug_reportOuvrir le Server FixerPour ce type d'erreur, le Script Optimizer lit le script et répare le code derrière tout ça.
Les erreurs qui voyagent avec celle-ci
- tentative de comparer deux valeurs incompatibles
- Colonne inconnue dans la liste des champs
- impossible de reprendre une coroutine morte
- SCRIPT ERROR dans citizen:/scripting/lua/scheduler.lua
- tentative d'indexer un nombre, un booléen ou du texte
- tentative de yield à travers une frontière d'appel C
- débordement de pile
- l'index de la table est nil