Tom_Anderson Posted November 13, 2015 Share Posted November 13, 2015 Bonjour je viens de trouvé un Gamemodes Dayz sur MTA et j'ai ce problème. Merci de votre aide Message Logs : WARNING: DayZ\zombies.lua:329: Bad argument @ 'getDistanceBetweenPoints3D' [Expected number at argument 6, got boolean] ERROR: DayZ\zombies.lua:329: attempt to compare boolean with number Ces la ligne 4 Le code lua : function createZomieForPlayer(x, y, z) x, y, z = getElementPosition(source) counter = 0 if getElementData(source, "lastzombiespawnposition") then local xL, yL, zL = getElementData(source, "lastzombiespawnposition")[3] or getElementData(source, "lastzombiespawnposition")[1] or false, getElementData(source, "lastzombiespawnposition")[2] or false, false if xL and getDistanceBetweenPoints3D(x, y, z, xL, yL, zL) < 50 then return end end if getElementData(source, "spawnedzombies") + 3 <= gameplayVariables.playerzombies then for i = 1, gameplayVariables.amountzombies do counter = counter + 1 local number1 = math.random(-50, 50) local number2 = math.random(-50, 50) if number1 < 18 and number1 > -18 then number1 = 20 end if number2 < 18 and number2 > -18 then number2 = -20 end randomZskin = math.random(1, table.getn(ZombiePedSkins)) zombie = call(getResourceFromName("slothbot"), "spawnBot", x + number1, y + number2, z, math.random(0, 360), ZombiePedSkins[randomZskin], 0, 0, getTeamFromName("Zombies")) setElementData(zombie, "zombie", true) setElementData(zombie, "blood", gameplayVariables.zombieblood) setElementData(zombie, "owner", source) call(getResourceFromName("slothbot"), "setBotGuard", zombie, x + number1, y + number2, z, false) end setElementData(source, "lastzombiespawnposition", { x, y, z }) setElementData(source, "spawnedzombies", getElementData(source, "spawnedzombies") + 3) end end Link to comment
Moderators Citizen Posted November 13, 2015 Moderators Share Posted November 13, 2015 Bonjour, Déjà on aurait aimé avoir plus de détails que juste "ça marche pas, trouvez le problème pour moi svp, voici les logs" C'est pas vraiment ce que tu as dit, je sais, mais je le ressent pareil. Ensuite le problème (ligne 329 dans les logs) n'est pas du tout la ligne 4 dans ce que tu as collé, c'est la ligne 7. Prenons juste ce bout de code: local xL, yL, zL = getElementData(source, "lastzombiespawnposition")[3] or getElementData(source, "lastzombiespawnposition")[1] or false, getElementData(source, "lastzombiespawnposition")[2] or false, false if xL and getDistanceBetweenPoints3D(x, y, z, xL, yL, zL) < 50 then return end C'est pareil que d'écrire sous cette forme (que tu comprendras déjà mieux): local xL = getElementData(source, "lastzombiespawnposition")[3] or getElementData(source, "lastzombiespawnposition")[1] or false local yL = getElementData(source, "lastzombiespawnposition")[2] or false local zL = false if xL and getDistanceBetweenPoints3D(x, y, z, xL, yL, zL) < 50 then return end On peut donc constater que quoi qu'il arrive, zL vaudra toujours false lorsqu'on va l'utiliser dans le getDistanceBetweenPoints3Dà la ligne 4 ce qui est interdit vu que la fonction n'accepte que des nombres (d'où le warning qui engendre ensuite l'erreur). Enfait si on réfléchit bien, on comprends que lorsqu'on crée un zombie pour un joueur (source) on va vérifier si le dernier zombie qu'on a spawn pour le joueur est à moins de 50m de distance du joueur en question. Si c'est le cas (le dernier était à moins de 50m) on annule l’exécution du reste de la fonction via le "return". On peut aussi facilement deviner que le getElementData(source, "lastzombiespawnposition") doit nous retourner un tableau de ce style: local pos = { 1200, -2590, 12.3 } qui représente la position x, y et z de la map où le dernier zombie spawné pour le joueur a apparu. Et donc pour accéder à chacun des nombres du tableau, il suffit de faire: local x = pos[1] -- 1200 local y = pos[2] -- -2590 local z = pos[3] -- 12.3 Là le codeur c'est un peu mélangé les pinceaux (ou alors t'as récupérer une version foireuse, ou alors t'as édité sans faire exprès en déplaçant un bout de code qu'il ne fallait pas) et il fallait plutôt l'écrire comme ceci: local xL = getElementData(source, "lastzombiespawnposition")[1] or false local yL = getElementData(source, "lastzombiespawnposition")[2] or false local zL = getElementData(source, "lastzombiespawnposition")[3] or false if xL and getDistanceBetweenPoints3D(x, y, z, xL, yL, zL) < 50 then return end Solution 1: Qu'on peut optimiser en appelant qu'une seule fois le getElementData comme ceci: local lastPos = getElementData(source, "lastzombiespawnposition") local xL = lastPos[1] or false local yL = lastPos[2] or false local zL = lastPos[3] or false if xL and getDistanceBetweenPoints3D(x, y, z, xL, yL, zL) < 50 then return end Solution 2: (Pareil que la Solution 1 mais avec xL, yL et zL mit sur une seule ligne comme au tout début) local lastPos = getElementData(source, "lastzombiespawnposition") local xL, yL, zL = lastPos[1] or false, lastPos[2] or false, lastPos[3] or false if xL and getDistanceBetweenPoints3D(x, y, z, xL, yL, zL) < 50 then return end Choisi l'une ou l'autre des solutions, ce sont exactement les même du point de vu exécutions et résultats. Je te conseille la 1ère vu qu'elle est plus facile à lire et donc à modifier si besoin (toujours anticiper). Cordialement, Citizen Link to comment
Tom_Anderson Posted November 15, 2015 Author Share Posted November 15, 2015 je te a te remercier et en effet j'aurait pu donnée plus de détail désoler. Link to comment
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now