Une meilleure manière de check sans utiliser un timer ?

  • Initiateur de la discussion Deadman69330
  • Date de début
  • Initiateur de la discussion
Deadman69330

Deadman69330

Psychopathe
Messages
2 289
Score réaction
309
Points
290
Salut,

J'utilise un ents.FindInBox et le problème c'est qu'il ne check que quand le script est reload, j'ai donc rajouter un timer. Mais je sait que c'est pas ouf d'en utiliser (surtout toutes les secondes / toutes les 3 secondes)

Donc je voulais savoir si vous aviez un moyen plus opti :)
Merci :)


PS: Voilà mon code:

Code:
timer.Create("timer_surface_mask", 1, 9999999, function() local blocking = ents.FindInBox( Vector(-4941.75, 4650.2813, 929.625) , Vector(5110.875, -3471.8438, 1636.0938) ) for k, p in pairs(blocking) do if IsValid(p) and p:IsPlayer() and p:Alive() then local gasmaskon = p:GetNWBool("STALKER_PlyGasMaskOn",false) -- SI IL A SON MASQUE, gasmakon = true if (not gasmaskon) and (not EBOLAMOD.Infected[ p:SteamID() ] )then EBOLAMOD.InfectPlayer( p ) DarkRP.notify(p, 1, 5, "Vous vous sentez mal !") end end end
end)
 
Feytone

Feytone

Chuck Norris
Messages
4 741
Score réaction
1 301
Points
600
Bop... Je pense que c'est peut être pas la solution + si tu veux répéter le timer infiniment, c'est 0 pas 9999999 répétitions (si je me souviens bien)
 
  • J'aime
Réactions: Deadman69330 et ᠌ ᠌ ᠌ ᠌ ᠌ ᠌ ᠌ ᠌ ᠌ ᠌ ᠌ ᠌
Mouloud Hooden

Mouloud Hooden

Geek suprême
Messages
143
Score réaction
60
Points
140
Salut a la place de boucler sur une boucle tu pourrais tout simplement boucler sur player.GetAll() et vérifier si ils ont bien dans la zone concerné grâce a cette fonction ; Vector/WithinAABox - Garry's Mod

(Tu as un exemple)

Je pense que sa sera déjà beaucoup mieux
 
  • J'aime
Réactions: While True
While True

While True

Geek suprême
Messages
445
Score réaction
395
Points
190
Mouloud Hooden à dit:
Salut a la place de boucler sur une boucle tu pourrais tout simplement boucler sur player.GetAll() et vérifier si ils ont bien dans la zone concerné grâce a cette fonction ; Vector/WithinAABox - Garry's Mod

(Tu as un exemple)

Je pense que sa sera déjà beaucoup mieux
Note que boucler sur player.GetAll ou ents.FindInBox revient au même nombre de boucles, on a juste un peu moins d'itérations.
Une fois passé au banc d'essais, on a pour 100000 exécutions :
Code:
ents.FindInBox = 0.74976220000008 sec
pos:WithinAABox = 0.15455650000013 sec
diff = 485.10557627758 %
La méthode utilisant WithinAABox tourne donc en moyenne 4,85 fois plus rapidement qu'en utilisant ents.FindInBox :D

Fonction utilisant player.GetAll:
-- Pour le benchmark, calquée sur l'exemple http://wiki.garrysmod.com/page/ents/FindInBox
function player.FindInBox( vCorner1, vCorner2 ) local tPlayersGetAll = player.GetAll() local tPlayers = {} local iPlayers = 0 for i = 1, #tPlayersGetAll do local testPos = tPlayersGetAll[i]:GetPos() if (testPos:WithinAABox(vCorner1,vCorner2)) then iPlayers = iPlayers + 1 tPlayers[ iPlayers ] = tPlayersGetAll[ i ] end end return tPlayers, iPlayers
end
Je pense que mieux encore serait de créer une entité (no draw), utiliser SetCollisionBounds et Touch serait le plus léger, mais demanderait un peu plus de boulot.
Je pense d'ailleurs que l'addon SH Safe zones travaille de cette façon (à vérifier).
 
  • J'aime
Réactions: Deadman69330 et Mouloud Hooden
Mouloud Hooden

Mouloud Hooden

Geek suprême
Messages
143
Score réaction
60
Points
140
While True à dit:
Note que boucler sur player.GetAll ou ents.FindInBox revient au même nombre de boucles, on a juste un peu moins d'itérations.
Une fois passé au banc d'essais, on a pour 100000 exécutions :
Code:
ents.FindInBox = 0.74976220000008 sec
pos:WithinAABox = 0.15455650000013 sec
diff = 485.10557627758 %
La méthode utilisant WithinAABox tourne donc en moyenne 4,85 fois plus rapidement qu'en utilisant ents.FindInBox :D

Fonction utilisant player.GetAll:
-- Pour le benchmark, calquée sur l'exemple http://wiki.garrysmod.com/page/ents/FindInBox
function player.FindInBox( vCorner1, vCorner2 ) local tPlayersGetAll = player.GetAll() local tPlayers = {} local iPlayers = 0 for i = 1, #tPlayersGetAll do local testPos = tPlayersGetAll[i]:GetPos() if (testPos:WithinAABox(vCorner1,vCorner2)) then iPlayers = iPlayers + 1 tPlayers[ iPlayers ] = tPlayersGetAll[ i ] end end return tPlayers, iPlayers
end
Je pense que mieux encore serait de créer une entité (no draw), utiliser SetCollisionBounds et Touch serait le plus léger, mais demanderait un peu plus de boulot.
Je pense d'ailleurs que l'addon SH Safe zones travaille de cette façon (à vérifier).
A oui effectivement okk moi je prends note pour l'avenir merci !
 
  • J'aime
Réactions: While True
Feytone

Feytone

Chuck Norris
Messages
4 741
Score réaction
1 301
Points
600
While True à dit:
Note que boucler sur player.GetAll ou ents.FindInBox revient au même nombre de boucles, on a juste un peu moins d'itérations.
Une fois passé au banc d'essais, on a pour 100000 exécutions :
Code:
ents.FindInBox = 0.74976220000008 sec
pos:WithinAABox = 0.15455650000013 sec
diff = 485.10557627758 %
La méthode utilisant WithinAABox tourne donc en moyenne 4,85 fois plus rapidement qu'en utilisant ents.FindInBox :D

Fonction utilisant player.GetAll:
-- Pour le benchmark, calquée sur l'exemple http://wiki.garrysmod.com/page/ents/FindInBox
function player.FindInBox( vCorner1, vCorner2 ) local tPlayersGetAll = player.GetAll() local tPlayers = {} local iPlayers = 0 for i = 1, #tPlayersGetAll do local testPos = tPlayersGetAll[i]:GetPos() if (testPos:WithinAABox(vCorner1,vCorner2)) then iPlayers = iPlayers + 1 tPlayers[ iPlayers ] = tPlayersGetAll[ i ] end end return tPlayers, iPlayers
end
Je pense que mieux encore serait de créer une entité (no draw), utiliser SetCollisionBounds et Touch serait le plus léger, mais demanderait un peu plus de boulot.
Je pense d'ailleurs que l'addon SH Safe zones travaille de cette façon (à vérifier).
Pas bête le touch ! Je n'y aurais pas pensé...
 
  • Initiateur de la discussion
Deadman69330

Deadman69330

Psychopathe
Messages
2 289
Score réaction
309
Points
290
Merci beaucoup à tous pour vos réponses, je vais réfléchir à vos solutions meme si celle de @While True semble pas mal
 
While True

While True

Geek suprême
Messages
445
Score réaction
395
Points
190
Deadman69330 à dit:
Merci beaucoup à tous pour vos réponses, je vais réfléchir à vos solutions meme si celle de @While True semble pas mal
C'est la méthode la plus complexe, mais si d'aventure tu préfères passer par un timer (si tu n'as qu'une seule zone à checker, c'est pas si grave), opte pour la méthode proposée par @Mouloud Hooden (utilisant player.GetAll), elle est clairement plus rapide que ents.FindInBox; ce sera déjà ça de pris ;)
 
  • J'aime
Réactions: Deadman69330
Discord d'entraide
Rejoignz-nous sur Discord