Mehrere Spielernamen in einer Variable speichern

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Hallo,


    ich möchte ein Kill Assist System schreiben, und hab es konzeptuell auch schon ganz gut im Kopf. Nur habe ich eben ein paar Schwierigkeiten bei den Vorüberlegungen.
    Ich möchte das ganze so machen, dass jeder Spieler eine Variable "KA_HitBy" hat. Wird ein Spieler getroffen, sollen in seine Variable alle Spielernamen von denen er getroffen wurde UND der summierte Schaden der jeweiligen Spieler gespeichert werden.


    Beispiel:
    Spieler A wird von Spieler B getroffen und nimmt 10.0 Schaden. | Spieler B - 10.0
    Spieler A wird von Spieler C getroffen und nimmt 15.0 Schaden. | Spieler B - 10.0 | Spieler C - 15.0
    Spieler A wird wieder von Spieler B getroffen und nimmt 20.0 Schaden | Spieler B - 30.0 | Spieler C - 15.0


    Das Problem ist hierbei eben, dass ich nicht weiß, wie ich mehrere IDs in eine Variable schreibe. Wenn ich eine einfache MAX_PLAYER Variable mache, wird der letzte Wert ja immer wieder neu überschrieben, wenn ein anderer Spieler das Opfer trifft.


    Danke!

  • Das kannst du einfach mit einem zweidimensionalen Array machen:
    new Float:damageMade[MAX_PLAYERS][MAX_PLAYERS];


    Angenommen "playerX" gibt "playerA" einen Damage, dann siehst das so aus:
    damageMade[playerA][playerX] += 10.0;


    Stirbt nun playerA, dann kannst du einfach durch den zweiten Index loopen und so alle Spieler herausfinden, die mehr als 0 Damage gegeben haben.
    for(new i=0; i<MAX_PLAYERS; i++)
    {
    if(damageMade[playerA][i] > 0)
    {
    //i hat playerA einen Damage gegeben
    }
    }

  • Dann hatte ich, was 2D-Arrays betrifft einen kleinen Denkfehler, danke für die Klarstellung.^^


    Im Prinzip müsste es ja...
    new Float:damageMade[MAX_PLAYERS][MAX_PLAYERS-1];
    ... sein, wenn man davon ausgeht, dass der Spieler sich nicht selbst Schaden zufügt. Er soll für seinen selbstverschuldeten Tod ja nicht durch das Kill Assist System auch noch belohnt werden.

  • Nein, denn angenommen dein MAX_PLAYERS ist 50, und playerA ist ID 1 und playerX ist ID 49. Selbes Beispiel, playerX fügt playerA Schaden zu:
    Das sähe dann so aus:
    damageMade[1][49] += damage;
    Da du aber MAX_PLAYERS-1 machst, ist der höchste zweite Index dann nicht mehr 49 (da 0bis49 = 50), sondern 48 (da 0bis48 = 50-1=49).


    Daher darf das -1 da nicht sein.

  • Das wird ja automatisch übersprungen, wenn dein Loop so aussieht:
    for(new i=0; i<MAX_PLAYERS; i++)
    {
    if(damageMade[playerA][i] > 0)
    {
    //i hat playerA einen Damage gegeben
    }
    }
    Denn wenn playerA == i wäre UND der Damage > 0, dann würde etwas nicht stimmen, der Spieler hätte sich dann selbst einen Schaden zuegfügt, was ja nicht geht.


    Beachte, dass du beim geben des Damages natürlich aufpassen musst, wenn der Schaden-Gebende-Spieler INVALID_PLAYER_ID ist.
    if(playerX != INVALID_PLAYER_ID) damageMade[playerA][playerX] += damage;


    Und beim Respawn musst du natürlich alle damageMade's des Spielers wieder auf 0 setzen, sollte klar sein. ;)