Spieler Waffen wieder zurück geben?

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
  • GetPlayerWeaponData sollte hierfür der richtige Startpunkt sein (Klick - Wiki). Auf der Wiki-Seite ist schon allerhand erklärt, wenn's beim Rest immer noch Schwierigkeiten gibt, einfach melden ;).

  • Du musst überlegen, sie her: Du willst erst dann wissen welche Waffen der Spieler hat(te), wenn er die Arena betreten will. Es leutet also ein, dass man auch erst dann einen, vielleicht sogar selbst geschriebenen, Callback dazu benutzt die nötigen Informationen zu ermitteln und diese in irgendwelchen spielerbezogenen Variablen zu speichern, damit man dann damit arbeiten kann.

  • Die Sache immer ruhig und mit Köpfchen angehen. Folgendermaßen sollte der ganze Ablauf gestaltet sein:

    • Spieler gibt den Befehl zum Betreten der Arena ein (/pbenter)
    • Alle Waffen, die der Spieler momentan besitzt, werden ermittelt, in spielerbezogenen Variablen gespeichert und anschließend dem Spieler entfernt
    • Spieler betritt die Arena (was dann passiert entscheidest du)
    • Spieler verlässt die Arena (/pbexit)
    • Alle Waffen, die der Spieler vor dem Betreten hatte, werden ihm zurückgegeben (hierfür dienen die spielerbezogenen Variablen)


    Wir sollten uns nun auf Nummer 2 und 5 beschränken, darum geht's schließlich.



    #define Function%0(%1) forward%0(%1); public%0(%1)


    new PlayerWeapon[MAX_PLAYERS][13][2];


    Function SavePlayerWeapons(playerid)
    {
    for(new weaponslot = 0; weaponslot < 13; weaponslot++)
    {
    GetPlayerWeaponData(playerid, weaponslot, PlayerWeapon[playerid][weaponslot][0], PlayerWeapon[playerid][weaponslot][1]);
    }
    return 1;
    }


    Dieser Callback "SavePlayerWeapons" bewirkt das Speichern der Waffen in der spielerbezogenen Variable PlayerWeapon, die ich zuvor über ein multi-dimensional Array deklariert habe. Einsetzen kannst du diesen Callback nun im ganzen Script. Wie man dem Spieler Waffen gibt (nach /pbexit - GivePlayerWeapon - aus den Variablen auslesen) oder wegnimmt (nach /pbenter - ResetPlayerWeapons ) schaffst du mit Hilfe des Wiki's sicherlich auch ohne uns.


    Viel Glück beim Testen ;).

  • Na, da musst du aber schon auch alles sauber einbauen ...

  • Hb das gerade auch mal in meinem script eingefügt, mir zeigt er null warnings und errors an, aber hier mal die funktion in nem stock :)

    stock SavePlayerWeapons(playerid)
    {
    new PlayerWeapon[MAX_PLAYERS][13][2];
    for(new weaponslot = 0; weaponslot < 13; weaponslot++)
    {
    GetPlayerWeaponData(playerid, weaponslot, PlayerWeapon[playerid][weaponslot][0], PlayerWeapon[playerid][weaponslot][1]);
    }
    return 1;
    }

  • firestormZ: Du solltest die Variablen nicht lokal deklarieren, sondern global. Andernfalls kannst du sie außerhalb des stock nicht verwenden.


    Pablo_Escobar96: Deine Fehler sind unabhängig von stock oder public (wie in meinem Fall), solltest du hier die Lösung des Problems suchen.

  • Das sollte so nicht stimmen. Wie oben schon mehrmals erwähnt, musst du das PlayerWeapon Array global definieren. Du solltest dir also erstmal den Unterschied zwischen globalen und lokalen Variablen klar machen.


    Globale Variablen:
    Sie stehen außerhalb von irgendwelchen Funktionen, vorzugsweise ganz Oben im Script.
    Sie können in allen Funktionen benutzt werden.


    Lokale Variablen:
    Sie stehen in einer Funktion, oder in einem Teil einer Funktion (auch if, for, while,...).
    Sie können nur in dem Teil, in dem die Variable deklariert wurde benutzt werden. Außerdem werden sie nach Beendigung der (Teil-) Funktion automatisch gelöscht.


    Mfg,
    UncleSub


    //Edit:
    Außerdem geht das


    GivePlayerWeapon(playerid, PlayerWeapon[playerid][..][0], PlayerWeapon[playerid][..][1]); // Stimmt das?


    nicht.


    Du musst die Waffen in einer Schleife (z.B. for Schleife) speichern und laden / geben.

    Einmal editiert, zuletzt von UncleSub () aus folgendem Grund: Was vergessen

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Hier, Pablo_Escobar96, wie in der PN besprochen habe ich dir mal den Code zusammengeschustert. Wenn du bei einer Zeile (oder mehreren) Verständnisprobleme hast, melde dich bitte.


    Spoiler anzeigen

    #define Function%0(%1) forward%0(%1); public%0(%1)

    Spoiler anzeigen
    new PlayerWeapon[MAX_PLAYERS][13][2];

    Spoiler anzeigen
    Function SavePlayerWeapons(playerid) // Funktion um die aktuellen Waffen samt Munition in die Spielervariablen zu speichern
    {
    for(new weaponslot = 0; weaponslot < 13; weaponslot++)
    {
    GetPlayerWeaponData(playerid, weaponslot, PlayerWeapon[playerid][weaponslot][0], PlayerWeapon[playerid][weaponslot][1]);
    }
    return 1;
    }

    Spoiler anzeigen
    Function GivePlayerWeaponEx(playerid) // Funktion um dem Spieler die vorher gespeicherten Waffen samt Munition wieder zu geben
    {
    for(new weaponslot = 0; weaponslot < 13; weaponslot++)
    {
    GivePlayerWeapon(playerid, PlayerWeapon[playerid][weaponslot][0], PlayerWeapon[playerid][weaponslot][1]);
    }
    return 1;
    }

    Spoiler anzeigen
    CMD:pbenter(playerid)
    {
    if(!IsPlayerInRangeOfPoint(playerid, 2.0, 1421.74, -1179.36, 25.32))return SendClientMessage(playerid, 0xFF0000FF, "Fehler! Du befindest dich nicht an der Arena!");

    // ------------------------------------------------------------------------

    new var = random(sizeof(pbSpawns));
    SetPlayerPos(playerid, pbSpawns[var][0], pbSpawns[var][1], pbSpawns[var][2]);
    SetPlayerInterior(playerid, 10);

    // ------------------------------------------------------------------------

    GivePlayerMoney(playerid, -500);
    SendClientMessage(playerid, 0xFF0000FF, "Du bist der Arena beigetreten! [Kosten: 500$]");

    for(new id = 0; id < GetMaxPlayers(); id++)
    {
    if(Spieler[id][Paintball] == 1)
    {
    new str[128];
    format(str, 128, "[Arena]: %s hat die Arena betreten!", GetPlayerNameEx(playerid));
    SendClientMessage(i, 0xFF0000FF, str); // Schickt jedem in der Arena die Nachricht, dass ein Spieler beigetreten ist
    }
    }

    // ------------------------------------------------------------------------

    SavePlayerWeapons(playerid); // Waffen speichern
    ResetPlayerWeapons(playerid); // Waffen löschen

    GivePlayerWeapon(playerid, 24, 150);
    GivePlayerWeapon(playerid, 27, 80);
    GivePlayerWeapon(playerid, 34, 50);

    // ------------------------------------------------------------------------

    Spieler[playerid][Paintball] = 1;
    return 1;
    }

    Spoiler anzeigen
    CMD:pbexit(playerid)
    {
    if(Spieler[playerid][Paintball] != 1)return SendClientMessage(playerid, 0xFF0000FF, "Fehler! Du befindest dich nicht in der Arena!");

    // ------------------------------------------------------------------------

    /*
    * Spielerposition setzen, etc.
    */

    // ------------------------------------------------------------------------

    GivePlayerWeaponEx(playerid); // Waffen wieder geben

    // ------------------------------------------------------------------------

    Spieler[playerid][Paintball] = 0;
    return 1;
    }


    /Edit: Zitat aus dem PN-Verlauf


  • Ich benutze zcmd, du benutzt allerdings ocmd. Deshalb das Warning. Ändere CMD zu ocmd, dann funktioniert auch schon alles ;).