
Zitat von
Eddman
I know, Ich hatte den Code sehr simpel gehalten, da es mir erstmal nur darum geht zu verstehen wie ich überhaupt vorgehen muss und ich ein schnelles Beispiel bräuchte. Danach kümmere ich mich um die Performance

Quellcode gleich ordentlich zu schreiben ist meist einfacher als diesen später umstrukturieren/umschreiben zu müssen. Vor allem weil man dann wieder Sachen übersieht/vergisst.

Zitat von
Eddman
Ich denke ich würde einen Timer verwenden der jede Sekunde ausgeführt wird, aber was soll der Auslöser vom Timer sein? GM:PlayerSpawn() vielleicht?
Ich erklär es dir am besten mit einem beispiel:
PHP-Code:
local checkPlayers = {} // Tabelle in der Spieler eingetragen werden bei denen die Position genau überprüft werden soll
// grobe positionsbestimmung
timer.Create('checkPlayerPos1', 1000, 0, function() // timer der alle 1000 ms (also jede sekunde) ausgeführt wird
for index, ply in pairs(player.GetAll()) do // alle spieler die am server sind durchgehen
local plyPos = ply:GetPos() // auslesen der position des spielers
if plyPos > Vector(100, 100, 100) and plyPos < Vector(200, 200, 200) then // befindet sich er spieler in der nähe des gewünschten punktes?
checkPlayers[ply:SteamID64()] = ply // spieler in die tabelle eintragen
elseif checkPlayers[ply:SteamID64()] ~= nil // spieler ist in der tabelle eingetragen, befindet sicher aber nicht mehr in der nähe des gewünschten punktes
table.remove(checkPlayers, index) // spieler aus tabelle löschen
end
end
end)
local counter = 0
local playersInPos = {}
// genaue positionsbestimmung
timer.Create('checkPlayerPos2', 100, 0, function() // genauere positionsbestimmung, timer der öfter läuft, 100 ms sollten für diesen zweck ausreichen, think ist eigentlich sowieso nicht nötig da die position sicher nicht so genau bestimmt werden muss
for index, ply in pairs(checkPlayers) do // tabelle checkPlayers durchlaufen
local plyPos = ply:GetPos() // auslesen der position des spielers
if plyPos > Vector(125, 125, 125) and plyPos < Vector(175, 175, 175) and playersInPos[ply:SteamID64()] ~= true then // befindet sich der spieler im vorgesehenen bereich?
counter = counter + 1 // variable um 1 inkrementieren
playersInPos[ply:SteamID64()] = true // zwischenspeichern das variable bei nächstem schleifendurchlauf nicht wieder inkrementiert wird
else
playersInPos[ply:SteamID64()] = false // spieler befindet sich nicht (mehr) im gewünschten bereich, zwischenspeicher löschen das variable erhöht wird wenn spieler den bereich wieder betritt
end
end
end)
Enthaltet vermutlich ein paar Fehler der Code da ich ihn nicht getestet habe.