Archiv verlassen und diese Seite im Standarddesign anzeigen : Table - attempt to index a nil value
Hallöchen,
kommen wir direkt zu meinem Problem:
Definition:
player = {}
Er printet nie "doing stuff". Wie bring ich ihn dazu, dass er alle durch geht, bis er ein leeres gefunden hat?
function GM:PlayerAuthed( ply, steamID, uniqueID )
i = 0
while not player[i] do
print("doing stuff")
player[i].steam = steamID
player[i].skin = 0
i = i+1
break
end
end
Woran liegt das? Was mache ich falsch?
Danke im Voraus!
monky2k6
15.06.2014, 10:30
Ich habe ewig nix mehr in LUA gemacht, aber das sieht mir... falsch aus. o_O
Les dir mal die Seite hier durch:
http://maurits.tv/data/garrysmod/wiki/wiki.garrysmod.com/index327b.html
Besonders interessant dürfte folgender Part sein:
mytable = {"one", "two", "three"}
for i, v in ipairs(mytable) do
print(i, v)
end
Hallo,
danke erstmal für deine Antwort. - Jetzt, nach etwa 2 Stunden rumschrauben, komme ich gar nicht mehr darauf klar.
function GM:PlayerAuthed( ply, steamID, uniqueID )
int = 0
for i,v in ipairs(player) do
if player[int] == nil then break end
int = i+1
end
player[int].steam = steamID
player[int].skin = 0
end
Er bringt den Error attempt to index a nil value raus. bei dem player[int].steam...
Muss ich, bevor ich das setzen kann, dort noch was machen, da die Definition davon ja einfach nur player = {} ist?
Gruß,
Neo. c:
Was genau hast du denn vor? Möchtest du wenn ein Spieler connected, dass dieser in die Tabelle geschrieben wird?
Mit folgender Funktion bekommst du auch alle Spieler:
http://wiki.garrysmod.com/page/player/GetAll
Grüße
DypoX
monky2k6
16.06.2014, 11:19
Du hast auch die Funktion etwas missverstanden. :)
Die ipairs-Funktion bricht die Tabelle automatisch in Key und Value (also den Wert) auf und durchläuft die Tabelle automatisch. In Verbindung mit der "GetAll"-Funktion müsste das ungefähr so aussehen:
function GM:PlayerAuthed( ply, steamID, uniqueID )
for key, value in ipairs(player.GetAll()) do
// Hier kannst du nun etwas mit "value" machen. Value ist nun vom Typ "Player", also Spieler.
end
end
Ich habe mir noch einmal dein initiales Problem angeschaut... Ich bin mir noch nicht ganz sicher was du versuchst. Willst du Spieler, die sich Authentifiziert haben, in eine Tabelle eintragen?
Die Table, die du erstellst, ist ja erst einmal leer. Danach gibt es keine "Leeren Blöcke", denn die Table-Größe beträgt 0 (null).
Also kannst du quasi "Blind" einfach neue Spieler in die Table packen. (http://wiki.garrysmod.com/page/table/Add)
Ich denke einfacher wäre es, wenn du einmal schreibst was genau du eigentlich vorhast. ;)
Das meine ich auch... Wir müssen erstmal wissen was du machen möchtest...
Im ersten Post sieht es so aus, alls würdest du den Spieler, der grade seinen Auth bekommen hat in das Player table speichern wollen.
Vom Prinzip ist die Idee ok, solange du nicht versuchst spezielle Daten vom Spieler zu speichern. Dieser hat zum aktuellen Zeitpunkt (hook PlayerAuthed) wenn du pech hast, noch garkeine statischen Daten.
Zudem fehlte deinem Code der hook.
hook.add("PlayerAuthed", "MyBadSpelling", meinefunktionsolltenichtsoheißenwiederhook)
Gruß
Hallo,
danke für eure Antworten.
Was ich versuche zu machen, ist, wie ihr schon richtig bemerkt habt, jeden Spieler, welcher auf den Server connected, in eine Tabelle zu schmeißen und ihm dort die SteamID und den Skin zu speichern, damit das am Ende im Prinzip so aussieht:
player[0].steam = STEAMIDVONSPIELER0
player[0].skin = 1
player[1].steam = STEAMIDVONSPIELER1
player[1].skin = 1
Und so weiter..
Diese GetAll Funktion bringt mich ja nicht viel weiter, da ich doch nur den Spieler in die Liste eintrage, der gerade drauf connected.
Sprich, wenn er sich authed hat, dann will ich die ganze player[] Tabelle durch gehen, bis er was findet, das noch nicht belegt ist.
"Dieser hat zum aktuellen Zeitpunkt (hook PlayerAuthed) wenn du pech hast, noch garkeine statischen Daten."
Wieso das denn? - Bei PlayerAuthed kann ich doch die SteamID und die UniqueID benutzen, oder nicht?
Das mit dem Add würde, wenn ich das richtig verstehe, auch nicht wirklich weiter helfen. Da ich dort ja nur Variablen hinzufügen kann, allerdings ja keine neue "Zeile" beginnen, oder?
Hmm, wie sieht das aus, wenn player[0].steam etc. leer ist? Dann ist es doch nil, oder nicht? Müsste ich dann nicht einfach alle durchgehen, bis er bei irgendwas nil findet?
Gruß,
Neo. c:
monky2k6
16.06.2014, 14:00
Jetzt versteh ich was du möchtest.
Also zu aller erst musst du ein Verständnis einer "Table" in LUA etwas verbessern. Ein Table ist keine Excel-Tabelle mit 65536 Feldern und in einer Spalte steht dann irgendwann "nil". Die Table ist immer so groß wie Daten vorhanden sind.
Das ganze müsste dann in etwa so aussehen:
players = {}
function GM:PlayerAuthed( ply, steamID, uniqueID )
// Alle Player in der Tabelle Players durchgehen
for key, value in ipairs(players) do
// Wenn ein Spieler mit entsprechender ID gefunden wurde...
if (value.steamid == steamID) then
// ...überprüfen ob ein Skin gesetzt ist und ggfs. setzen
if (not value.skin) then
value.skin = irgendeinstandardskin
end
// Vermerken das ein passender Spieler gefunden wurde
player_gefunden = true;
break;
end
end
// Wurde kein Spieler in der Table gefunden, den Spieler in die Table einfügen
if (not player_gefunden) then
ply.skin = irgendeinstandardskin
table.add( players, { ply } )
end
end
So in etwas sollte es dann wohl aussehen.
ALL YOU CAN EAT
06.07.2014, 21:45
Hi,
Wenn du den table der Spieler haben möchtest, dann benutz einfach player.GetAll() oder in deinem Fall bekommst du das Object "ply" übergeben mit dem du arbeiten kannst.
Der hook "PlayerAuthed" wird für jeden einzeln aufgerufen, daher brauchst du dort nicht alle Spieler abzufragen ;)
function GM:PlayerAuthed( ply, steamID, uniqueID )
--Beispiel
if( ply:GetName() == "Peter Lustig" ) then
--mach was
end
end
Powered by vBulletin® Version 4.2.2 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.