[SIMPLE] Verschiedene Zahltage für Fraktionen [Anfängerfreundlich]

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 liebe Community.
    Wie mir aufgefallen ist suchen oft Leute nach verschiedenen bestimmten Paydays für Fraktionen, finden aber nur die normalen Paydays bei dem jeder Spieler das gleiche bekommt.
    Ich möchte heute nun zeigen wie man ein Grundaufbau von solch einem Payday aufbaut.


    Was ihr haben müsst/können müsst:
    Lesen können.
    Kleines Scriptingwissen haben.
    Verstehen können.
    Ein Speicherungssystem für Spieler haben (z.B. mit DINI)


    Fangen wir an:


    Als erstes müssen wir angeben, wann der Zahltag stattfinden soll. Dafür benutzen wir einen bestimmten Timer. Dieser nennt sich "SetTimerEx". Warum SetTimerEx? Wir brauchen in diesem Falle nicht nur eine Zeit sowie die Wiedergabe die angegeben wird, sondern diesesmal brauchen wir nun auch ein Format sowie ein Parameter. Falls ihr nicht genau wisst was das heisst oder warum wir das verwenden, kann ich euch falls nötig ein Link zu guten Definierungen dafür reinstellen.
    Gut, wir brauchen also nun ein Timer. Wo gehört der rein? Unter OnGameModeInit! Warum? Würden wir dies für jede Person neu unter z.B. "OnPlayerConnect" starten lassen, würden wir bei einer Spieleranzahl von 7 ganze 7 Paydaytimer haben, die dann aber auch Einfluss auf andere Spieler haben. Das heißt, sollte dein Freund mal online kommen, bringt er nicht nur Spaß mit, sondern auch noch mehr Geld. Leider blickt dann keiner mehr durch, deswegen erstellen wir einen Payday der für alle Spieler im selbem Moment ausgegeben wird.


    Erstmal brauchen wir einen Funktionsnamen für unseren Payday, damit wir später angeben können was passiert wenn der Timer abgelaufen ist.
    Diesen verbinden wir mit dem Parameter playerid, den wir später im public brauchen werden.
    Nun brauchen wir erstmal ein forward für unsere Funktion. Deswegen gehen wir oben in den Header und schreiben unter den "new XYZ usw":


    forward Payday(playerid); // Payday ist nun unser Funktionsname
    (Solltet ihr noch keine "new"'s haben, schreibt den forward einfach nach den includes.


    Dann erstellen wir den eigentlichen Timer unter OnGameModeInit, wie oben schon begründet.
    Dieser sollte so aussehen:


    SetTimerEx("Payday",1000*60*20,true,"i",i); // "Payday" steht für den Funktionsnamen, dann geben wir die Zeit an, in diesem falle 1000 Millisekunden (1 Sekunde)*60 = 1 Minute*20, sprich 20 Minuten. "true" gibt an das sich das ganze wiederholen sol. "i" ist steht für Integer, was mit dem darauffolgenden "i" verbunden ist.


    Aber halt! Warum benutzen wir nicht anstatt dem zweiten "i" einfach playerid? Weil OnGameModeInit keine Parameter enthält. Da wir aber momentan noch nicht wissen was "i" ist, müssen wir eine Schleife um unseren Timer setzen.
    Dieser sollte so aussehen:


    for(new i; i != GetMaxPlayers(); i++)
    {
    Timer
    }


    Ich hoffe ihr wisst was eine Schleife ist, ansonsten müsst ihr euch dort noch einmal genau erkundigen.
    Vielleicht kann ich unten ja noch eine kleine Definition hinzufügen.


    Wir haben nun also schon einen Timer für alle, aber was soll passieren wenn die 20 Minuten abgelaufen sind?
    Dafür müssen wir eine neue public Funktion irgendwo ausserhalb der anderen machen. Wir nehmen jetzt einfach mal unsere letzte Zeile und schreiben dort folgendes rein:


    public Payday(playerid)
    {
    return 1;
    }


    Nun müssen wir das ganze ja noch mit unseren Details stopfen.
    Wir wollen das wenn der Spieler in jener Fraktion ist, dass er den und den Gehalt bekommen soll.
    Dafür machen wir erstmal, falls ihr noch keinen habt, einen neuen stock.
    Diesen kann man als Abkürzung für eine Handlung sehen.
    Wir nennen ihn jetzt einfach mal "istSpielerInFraktion".
    Dann brauchen wir noch den Parameter für den Spieler, sowie die Fraktionsid. Im diesem Falle "playerid" und "fraktionsid".
    Nun erstellen wir uns unseren stock:


    stock istSpielerInFraktion(playerid,fraktionsid)
    {
    if(GetPVarInt(playerid,"Fraktion")==fraktionsid) return 1; //Achtung! Hier müsst ihr natürlich euer Loginsystem/Speichersystem benutzen. Ich benutze dafür DINI!
    return 0;
    }
    Hier wird angesagt, dass wenn im Befehl o.Ä. "istSpielerInFraktion" steht, dass die Handlung im stock passieren soll bzw abgefragt werden soll.


    Nun starten wir mit dem Details.
    Wir sagen mal Fraktionsid 1 ist die Polizei.
    Also schreiben wir in unserem public:


    if(isPlayerInFraktion(playerid,1))
    {
    }
    Hier wird angesagt: Wenn er Spieler in der Fraktion 1 ist, mache {das}.


    Ich bin nun dafür das die Polizei einen Gehalt von 1700$ bekommt.
    Dann fügen wir einfach in unsere Funktion ein:


    GivePlayerMoney(playerid,1700);


    Natürlich soll der Spieler auch noch erfahren warum er 1700$ bekommen hat.
    Deswegen senden wir dem Spieler noch eine Nachricht.
    So könnte es etwa aussehen:


    SendClientMessage(playerid,farbe,"=======PAYDAY=======");
    SendClientMessage(playerid,farbe,"Gehalt: 1700$");
    SendClientMessage(playerid,farbe,"====================");



    Das könnt ihr nun natürlich für jede Fraktion anpassen und mit einem Banksystem mit Zinsen verbessern.
    Ist natürlich euch überlassen.



    Ich hoffe ihr konntet das meiste verstehen und habt euch die Zeit genommen alles genau durchzulesen.
    Des weiteren hoffe ich das ich euch mit dem Tutorial helfen konnte und euch was beibringen konnte.


    Bis dahin,
    DarkHell aka [XGRL]Lolifreak!

  • Sehr Schön... Es sol ja nur den Payday darstellen keine neben rechungen wie Strom etc.
    Sehr schön erklärt auch für Neulinge.. Mit liebe zum detail!


    Nice 10/10 Brote für die Welt (und dich)

  • Gefällt mir auch! 10/10 aber für mein DM Script nicht zu gebrachen leider :(


    Du kannst natürlich auch das ganze umgestalten. Wenn jemand ein Kill macht, wird in seine Spielerdatei dieser gespeichert. Dann machst du halt ein stock wo abgefragt wird wieviel Kills der Spieler hat und diesen fügst du dann beim Payday ein.
    Sind dann zwar bissl mehr stocks und Paydays, dafür aber cooler für die Spieler ;D


    MfG,
    DarkHell aka [XGRL]Lolifreak.

  • Erklär mir eins.


    Warum erstellen wir Timer für Spieler die nicht Online sind?
    Das macht wenig Sinn und zieht einfach nur Resourcen.


    Sinnvoll wäre es das in OnPlayerConnect zu schreiben.
    Denn man braucht den Timer ja erst wenn der Spieler auch online ist.


    Am besten Spiecherst du die TimerID noch mit am, damit der Timer auch beim verlassen des Server
    nicht weiterläuft, sondern "gekillt"/gestoppt wird.

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski


  • In diesem Tutorial geht es ja darum, das der Server einen regelmäßigen Payday hat.
    Man kann diesen Payday natürlich viel besser ausweiten, so das jeder Spieler seinen eigenen Payday hat.
    Auch ressourcenfreundlicher könnte er sein, das ganze sollte man sich dann aber so zusammenbauen wie man möchte.
    Es soll ja nur die Basis aufbauen und kein ganzes System ;D


    End of Stream.
    Lolifreak.


    P.S: Danke für die gute Rückmeldung, freut mich :)