Jump to content

Problème Spawn Zombie


Recommended Posts

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

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

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...