Jump to content

Boucle Cibles


Recommended Posts

Bonjours, j'aimerais créer un script qui permet de bouger des cibles, j'aimerais savoir comment je peut faire pour que le mouvement soit infini, et que l'on puisse le stopper avec une commande.

Je voulais le faire avec des timers, mais le script sera trop long.

Voilà le code:

function bougerCible()
    if moveCibles == 0 then
        moveObject( cible1, 5000, 2575.3, -2389.8, 881.40002)
        setTimer(moveObject, 10000, 1, cible1, 5000, 2568.3, -2389.8, 881.40002)
        setTimer(moveObject, 10000, 1, cible1, 5000, 2560.3, -2389.8, 881.40002)
        --moveObject( cible2, 1000, 2576, -2393.2, 881.40002)
        --moveObject( cible3, 1000, 2571.7, -2395.7, 881.40002)
        --moveObject( cible4, 1000, 2562.6001, -2391, 881.40002)
        --moveObject( cible5, 1000, 2567.3, -2392.1001, 881.40002)
        --moveObject( cible6, 1000, 2561, -2397.8999, 881.40002)
        moveCibles = moveCibles + 1
    -- Test elseif moveCibles == 1 then
    --    moveObject( cible1, 5000, 2568.3, -2389.8, 881.40002)
    --    moveCibles = moveCibles - 1
    end
end
addCommandHandler("bougercibles", bougerCible)
addCommandHandler("movecibles", bougerCible)

 

Edited by Citizen
Merci de sélectionner Lua comme coloration syntaxique
Link to comment

Je te propose d'utiliser un onClientRender si tu utilise ce script en client et tu met à jour la position à chaque loop de la fonction, avec un booléan qui vas servir de direction pour l'élément, en gros, s'il est sur false ton élément ira vers la gauche et à l'inverse, s'il est sur true il ira vers la droite.

A la fin de tout ça, soit tu fais un "removeEventHandler" pour supprimer le mouvement de tes cibles, ou tu fais un autre booléan qui return au début de ta fonction pour "freeze" le tout.

 

Tu veux un exemple? En serveur ou en client ?

Link to comment

Tiens je t'ai rédigé cet exemple, il fonctionne en jeu, je t'ai ajouté quelques commentaire si tu as besoin de savoir pourquoi j'ai écris telle ou telle chose, dit le moi je t'expliquerai.

 

Tu n'as plus qu'à le tester, ajouter des objets, changer les positions et jouer avec les timer du "moveObject" la j'ai mis une petite opération qui fait un mouvement différent entre les deux objets.

objects = {
  -- [index] = object
}

function startResource()
  local object1 = createObject(1700, 0, 0, 2)
  setElementData(object1, "direction", true)
  local object1X, object1Y, object1Z = getElementPosition(object1)
  setElementData(object1, "start:X", object1X)
  setElementData(object1, "start:Y", object1Y)
  setElementData(object1, "start:Z", object1Z)
  setElementData(object1, "end:X", 10)
  setElementData(object1, "end:Y", 0)
  setElementData(object1, "end:Z", 2)
  setElementData(object1, "moving", false)
  table.insert(objects, object1)
  local object2 = createObject(1800, 5, 0, 2)
  setElementData(object2, "direction", true)
  local object2X, object2Y, object2Z = getElementPosition(object2)
  setElementData(object2, "start:X", object2X)
  setElementData(object2, "start:Y", object2Y)
  setElementData(object2, "start:Z", object2Z)
  setElementData(object2, "end:X", 15)
  setElementData(object2, "end:Y", 0)
  setElementData(object2, "end:Z", 2)
  setElementData(object2, "moving", false)
  table.insert(objects, object2)
  setTimer(verifierCiblePosition, 3000, 0)
  -- Faire de même avec les différentes cibles
end
addEventHandler("onResourceStart", getResourceRootElement(getThisResource()), startResource)

function verifierCiblePosition()
  for key, cible in pairs(objects) do
    if (isElement(cible)) then -- On vérifie si la cible existe
      if (getElementData(cible, "direction")) then -- Si la direction est "true"
        -- On dit que "true" c'est vers la droite
        local endX = getElementData(cible, "end:X")
        local endY = getElementData(cible, "end:Y")
        local endZ = getElementData(cible, "end:Z")
        local cibleX, cibleY, cibleZ = getElementPosition(cible)
        if (cibleX >= endX and cibleZ >= endZ) then
          setElementData(cible, "direction", false) -- On change de direction
          setElementData(cible, "moving", true) -- Il est en mouvement
          local startX = getElementData(cible, "start:X")
          local startY = getElementData(cible, "start:Y")
          local startZ = getElementData(cible, "start:Z")
          moveObject(cible, 3000*key/2, startX, startY, startZ)
        else
          if (not getElementData(cible, "moving")) then -- On vérifie s'il ne bouge pas, de le faire bouger
            moveObject(cible, 3000*key/2, endX, endY, endZ)
          end
        end
      else
        -- On dit que "false" c'est vers la gauche
        local endX = getElementData(cible, "end:X")
        local endY = getElementData(cible, "end:Y")
        local endZ = getElementData(cible, "end:Z")
        local cibleX, cibleY, cibleZ = getElementPosition(cible)
        if (cibleX <= endX and cibleZ <= endZ) then
          setElementData(cible, "direction", true) -- On change de direction
          setElementData(cible, "moving", true) -- Il est en mouvement
          moveObject(cible, 3000*key/2, endX, endY, endZ)
        else
          if (not getElementData(cible, "moving")) then -- On vérifie s'il ne bouge pas, de le faire bouger
            moveObject(cible, 3000*key/2, endX, endY, endZ)
          end
        end
      end
    end
  end
end

 

Link to comment

Par contre...

 

Le CPU va vraiment être surchargé hein, getElementData va synchroniser entre tous les joueurs du côté serveur ET client, du coup créer autant d'elementdata ça peut créer du lag.

Moi je te conseillerais plutôt de le faire avec une table, je ferai un exemple ce soir.

Link to comment

Ouais j'avais commencé avec des tables puis pour que ce soit plus clair pour un débutant j'ai fais via elementData

Au début j'ai mis ces lignes là pour donner un visuel de la structure de la table :

  1. objects = {
  2. -- [index] = object
  3. }

En réunissant tout dans une table, ta structure pourrait ressembler à celle-ci: 

  1. objects = {
  2. -- [index] = {object, direction=false, startPosition={0, 0, 0}, endPosition={0, 0, 0}, moving=false}
  3. }
Link to comment

Tiens, voici la version avec les table, j'ai mis en commentaire ce qui ne servait plus comme ça tu peux voir les changements.

objects = {
  -- [index] = {object, direction=false, startPosition={0, 0, 0}, endPosition={0, 0, 0}, moving=false},
}

function startResource()
  local object1 = createObject(1700, 0, 0, 2)
  --setElementData(object1, "direction", true)
  local object1X, object1Y, object1Z = getElementPosition(object1)
  objects[1] = {object1, direction=true, startPosition={object1X, object1Y, object1Z}, endPosition={8, 0, 2}, moving=false}
  -- setElementData(object1, "start:X", object1X)
  -- setElementData(object1, "start:Y", object1Y)
  -- setElementData(object1, "start:Z", object1Z)
  -- setElementData(object1, "end:X", 10)
  -- setElementData(object1, "end:Y", 0)
  -- setElementData(object1, "end:Z", 2)
  -- setElementData(object1, "moving", false)
  --table.insert(objects, object1)
  local object2 = createObject(1800, 5, 0, 2)
  -- setElementData(object2, "direction", true)
  local object2X, object2Y, object2Z = getElementPosition(object2)
  objects[2] = {object2, direction=true, startPosition={object2X, object2Y, object2Z}, endPosition={15, 0, 2}, moving=false}
  -- setElementData(object2, "start:X", object2X)
  -- setElementData(object2, "start:Y", object2Y)
  -- setElementData(object2, "start:Z", object2Z)
  -- setElementData(object2, "end:X", 15)
  -- setElementData(object2, "end:Y", 0)
  -- setElementData(object2, "end:Z", 2)
  -- setElementData(object2, "moving", false)
  --table.insert(objects, object2)
  setTimer(verifierCiblePosition, 3000, 0)
  -- Faire de même avec les différentes cibles
end
addEventHandler("onResourceStart", getResourceRootElement(getThisResource()), startResource)

function verifierCiblePosition()
  for key, cible in pairs(objects) do
    if (isElement(cible[1])) then -- On vérifie si la cible existe
      if (cible.direction) then -- Si la direction est "true"
      --if (getElementData(cible, "direction")) then -- Si la direction est "true"
        -- On dit que "true" c'est vers la droite
        local endX, endY, endZ = unpack(cible.endPosition)
        -- local endX = getElementData(cible, "end:X")
        -- local endY = getElementData(cible, "end:Y")
        -- local endZ = getElementData(cible, "end:Z")
        local cibleX, cibleY, cibleZ = getElementPosition(cible[1])
        if (cibleX >= endX and cibleZ >= endZ) then
          cible.direction = false
          cible.moving = true
          --setElementData(cible, "direction", false) -- On change de direction
          --setElementData(cible, "moving", true) -- Il est en mouvement
          local startX, startY, startZ = unpack(cible.startPosition)
          -- local startX = getElementData(cible, "start:X")
          -- local startY = getElementData(cible, "start:Y")
          -- local startZ = getElementData(cible, "start:Z")
          moveObject(cible[1], 3000*key*0.5, startX, startY, startZ)
        else
          if (not cible.moving) then -- On vérifie s'il ne bouge pas, de le faire bouger
          --if (not getElementData(cible, "moving")) then -- On vérifie s'il ne bouge pas, de le faire bouger
            moveObject(cible[1], 3000*key*0.5, endX, endY, endZ)
          end
        end
      else
        -- On dit que "false" c'est vers la gauche
        local endX, endY, endZ = unpack(cible.endPosition)
        -- local endX = getElementData(cible, "end:X")
        -- local endY = getElementData(cible, "end:Y")
        -- local endZ = getElementData(cible, "end:Z")
        local cibleX, cibleY, cibleZ = getElementPosition(cible[1])
        if (cibleX <= endX and cibleZ <= endZ) then
          cible.direction = true
          cible.moving = true
          -- setElementData(cible, "direction", true) -- On change de direction
          -- setElementData(cible, "moving", true) -- Il est en mouvement
          moveObject(cible[1], 3000*key*0.5, endX, endY, endZ)
        else
          if (not cible.moving) then -- On vérifie s'il ne bouge pas, de le faire bouger
          --if (not getElementData(cible, "moving")) then -- On vérifie s'il ne bouge pas, de le faire bouger
            moveObject(cible[1], 3000*key*0.5, endX, endY, endZ)
          end
        end
      end
    end
  end
end

 

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...