OOC Chat mit automatischer Ausschaltfunktion

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • OOC Chat mit automatischer Ausschaltfunktion

    Automatischer OOC Chat
    Tutorial

    Hallo alle zusammen,

    da ich heute ein bisschen im Thread Tutorialwünsche mich ein bisschen umgesehen,
    entdeckte ich, dass ein gewisser User nach dem oben genannten gesucht hat/sucht. ( @ScripterAkaMapper: !)
    Falls er es nicht mehr benötigt ist das auch egal, da ich hier noch nicht so was gesehen habe.

    Aufbau des OOC Chats:

    - mithilfe von dem Befehl /o [Text] können User/Admins globale Nachrichten, die also jeder auf dem Server lesen kann, verschicken
    - Der OOC Chat schaltet sich bei einer niedrigeren Playerzahl als 25 User aus. D.h. man kann dann keine Nachrichten mehr per /o verschicken. (Außer Admins)

    Ist ziemlich simpel aufgebaut, ihr könnt natürlich alles erweitern und 'dynamischer' gestalten, jedoch erkläre ich hier nur das nötigste.

    Was ihr braucht:

    - Ein kleines bisschen Kenntnisse in PAWN
    - OCMD + Sccanf2 Plugin oder Stock. Natürlich könnt ihr auch DCMD,ZCMD oder gleich das mit strcmp realisieren.
    - Ein kleines bisschen Geduld
    - Lernbereitschaft

    So weit so gut fangen wir doch einfach mal an.

    Zuerst scrollen wir in unserem PAWN Editor mal ganz nach oben und deklarieren uns eine neue globale Variable vom Variablentypen boolean.
    Wir nehmen hier 'nur' ein Boolean, da wir für die Abfrage, ob der Chat an/aus ist nur 'true' oder 'false' benötigen, alles andere wäre Verschwendung, da
    das Boolean am wenigsten an Ressourcen verbaucht.
    [pwn]new bool:OOCStatus = true;[/pwn]
    So nun ist das mit der Variable erledigt. Übrigens wir brauchen hier kein MAX_PLAYERS oder so hintendran, da die Meldung ja universell
    für alle Spieler gilt und nicht nur für jeden einzelnen ;)
    Wir definieren diese Variable aber gleich mit dem Wert true, da der OOC Chat standardmäßig immer an ist.

    So nun erstellen wir uns nun den /O Befehl mit dem der Spieler Nachrichten an alle verschicken soll.
    Irgendwo im Script, wenn wir mit OCMD jedenfalls arbeiten, schreiben wir uns schon mal unser Befehlsgrundgerüst.

    [pwn]ocmd:o(playerid,params[])
    {
    return 1;
    }[/pwn]
    Der Befehl übergibt im folgenden Code Statement die Parameter playerid ( der Spieler der den Befehl eingibt)
    und params ( die Parameter die evtl. nach dem Befehl eingegeben werden). In die eckigen Klammern nach params
    schreiben wir nichts herein, da dies ein Platzhalter für diese ist.
    Das return 1; gibt bloß an, dass wenn der Befehl abgeschickt wird, nicht 'Server: Unknown Command' ausgegeben wird und damit zu return 1;
    ins Callback OnPlayerCommandText "hinunterrast".


    Als aller erstes kommt die sscanf Parameter Abfrage hinzu, die überprüft, ob der Spieler nicht einen falschen Variablentypen oder überhaupt nichts nach
    dem Befehl eingegeben hat:

    [pwn]if(sscanf(params,"s",msg))return SendClientMessage(playerid,FARBE,"/o [Text]");[/pwn]
    Mit if(sscanf( ... )
    fragen wir ab ob nach den parametern ein String NICHT eingegeben wurde, dann unterbrechen wir den Code und schicken ihm die "Error Meldung".

    So wir bauen uns unseren Befehl aus und schreiben hinzu:
    [pwn]new msg[128];
    if(IsPlayerAdmin(playerid))
    {
    format(msg,sizeof msg,"(( %s: %s ))",SpielerName(playerid),msg);
    SendClietMessageToAll(DEINEFARBE,msg);
    }[/pwn]
    So schauen wir uns das mal ein bisschen genauer an.
    Wir deklarieren zuerst eine lokale Variable vom Typ String, in der Text, der nach dem Befehl eingegeben wird, gespeichert wird
    Die 128 gibt einzig und allein die max. Buchstabenlänge an, also wie lang der String max. sein darf.
    mit if(IsPlayerAdmin(playerid)) fragen wir ab, ob der Spieler als RCON-Admin eingeloggt ist, hier könnt ihr auch eure Admin Abfrage ergänzen,
    und formatieren mit format unseren String auf ein bestimmtes format. %s: %s steht für zwei Platzhalter
    für Zeichenketten, die dann danach mit dem Inhalt von 'SpielerName(playerid)' und 'msg' versehen werden.
    Mit der Funktion SendClientMessageToAll(FARBE,NACHRICHT) wird eine Nachricht an alle Spieler verschickt.
    (Admins sollen ja auch bei geschlossenem OOC Chat noch schreiben können)

    Wer die Funktion SpielerName(playerid) noch nicht besitzt, kann diese gerne hinzufügen.
    [pwn]stock SpielerName(playerid)
    {
    new Name[MAX_PLAYER_NAME+1];
    GetPlayerName(playerid,Name,sizeof Name);
    return Name;
    }[/pwn]
    Ich denke, dass obige Funktion jeder versteht.

    So weiter mit unserem Befehl:
    [pwn]else
    {
    if(OOCStatus == true)
    {
    format(msg,sizeof msg,"(( %s: %s ))",SpielerName(playerid),msg);
    SendClientMessageToAll(DEINEFARBE,msg);
    }
    else
    SendClientMessage(playerid,FARBE,"OOC Chat ist zurzeit geschlossen.");
    }[/pwn]

    Mit else sagen wir dem Script, dass wenn der Spieler unsere Bedingung IsPlayerAdmin nicht erfüllt hat,
    also kein Admin ist, soll dieser Block ausgeführt werden.
    Dann fragen wir noch mit einfachen if Abfragen ab, ob die Variable OOC Status auf true ist, soll er Nachrichten senden können, wenn aber nicht,
    soll er keine Nachricht schreiben können.

    Jetzt haben wir ja schon fast alles, jedoch soll ja jetzt der Chat noch automatisch geschlossen werden, bei einer Spielerzahl von kleiner als 25.
    Dazu gehen wir zu dem Callback OnGameModeInit() und erstellen uns dort einen Timer:
    [pwn]SetTimer("UpdateOOC",10000,true);[/pwn]
    Zur Syntax von SetTimer:
    UpdateOOC ist die Funktion, die aufgerufen werden soll.
    Die 10000, bedeutet 10 Sekunden. Nach 10 Sekunden nach dem Start der Server Konsole soll der Timer ausgeführt werden.
    true bedeutet hier nur, dass er sich danach wieder wiederholen soll. false würde das Gegenteil bedeuten.
    Wir müssen jedoch unsere Funktion "UpdateOOC" noch forwarden, das machen wir ganz oben im Script.
    [pwn]forward UpdateOOC();[/pwn]
    Die Klammern können wir hier wieder schließen, da keine Parameter übergeben werden sollen.

    So, Nun haben wir unsere Funktion 'forwarded' jetzt erstellen wir diese ganz unten im Skript:
    [pwn]public UpdateOOC()
    {
    return 1;
    }[/pwn]
    Wichtig ist es hier, keinen stock statt public zu schreiben, da SetTimer einen "Public" benötigt.
    'Publics' oder 'Timercallbacks' müssen daher immer geforwarded werden.
    Hier schreiben wir nun rein, dass der OOC Chat bei weniger als 25 Spielern geschlossen werden soll.

    Dazu erstellen wir uns eine For Schleife, die alle Spieler durchläuft.
    [pwn]new count=0;
    for(new i=0;i<GetMaxPlayers();i++) {
    if(IsPlayerConnected(i) && !IsPlayerNPC(i)) {
    count++;
    }
    }
    if(count < 25) {
    OOCStatus = false;
    SendClientMessageToAll(FARBE,"OOC Chat wurde automatisch geschlossen!");
    }[/pwn]
    Aber zuerst erstellen wir uns noch eine Variable "count", die wie schon der Name sagt, die Spieler zählen soll.
    Mit der For Schleife durchlaufen wir alle Spieler und, falls der Spieler, der gerade durchlaufen wird, verbunden ist und gleichzeitig ( durch das &&) kein NPC ist
    wird die Variable count mit ++ um eins erhöht.

    Dann wenn die Schleife zuende ist wird abgefragt ob die Variable count, die alle Spieler davor gezählt hat, kleiner als 25 ( mit < ) ist,
    wenn ja wir die Variable OOCStatus auf false gesetzt und nun kann der normale Spieler nichts mehr schreiben.

    So ich glaube damit ist der Scriptingteil auch vorbei.
    Wenn ich etwas vergessen habe oder einen Fehler eingebaut habe, scheut euch nicht, mir dies zu melden.
    Ich würde mich sehr über Feedback oder Bewertungen freuen.

    Mit Freundlichen Grüßen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Logan_Adams ()

  • Einen Timer der alle 10 Sekunden Checkt ob mehr als 25 Spieler auf dem Server sind ist zu resourcenlasstend (meinermeinung nach), da ein OOC eine Art "Informations Chat" ist und kein "Hey lass den ganzen Server mal Quatschen" Chat, und Resourcen sparender währe einfach beim Connecten eines Spielers eine Globale Variable um +1 zu erhöhen und beim verlassen um -1 zu senken ;)

    MfG

    #e
    Dann muss man wenigstens nicht diese lässtigen Timer nutzen!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von SweizY ()

  • SweizY schrieb:

    Einen Timer der alle 10 Sekunden Checkt ob mehr als 25 Spieler auf dem Server sind ist zu resourcenlasstend (meinermeinung nach), da ein OOC eine Art "Informations Chat" ist und kein "Hey lass den ganzen Server mal Quatschen" Chat, und Resourcen sparender währe einfach beim Connecten eines Spielers eine Globale Variable um +1 zu erhöhen und beim verlassen um -1 zu senken ;)

    MfG

    #e
    Dann muss man wenigstens nicht diese lässtigen Timer nutzen!
    Mhh natürlich wäre das auch eine Möglichkeit, doch 10 Sekunden sind meiner Meinung nach nicht wirklich ressourchenfressend. ( Kann man bei bedarf auch das Intervall erhöhen )
    (Der Benutzer wollte es ja so ;) )

    Wenn man bedenkt, dass "Tachotimer" jede Sekunde bis halbe Sekunde ausgeführt werden.

    Außerdem ist das mit den Timern ja nur eine Möglichkeit ;)
    Zudem ist das mit den Timern wahrscheinlich die einfachste Methode für Anfänger.
    Aber das ist natürlich dir überlassen.

    MFG