Beiträge von Equ

    Inhalt:


    • Warn System
    • Dini
    • ocmd
    • sscanf



    Um was geht es in diesem Tutorial?



    Ich erkläre euch Heute mal wie ihr ein, Warn System erstellen könnt.
    Falls einige nicht wissen was damit gemeint ist, erkläre ich es mal.
    Ein warn System ist dazu da um andere Spieler eine Verwarnungen zu geben,
    bei einer bestimmten anzahl an Verwarnungen könnt ihr den Spieler vom Server bannen lassen, oder was auch immer ihr mit ihm anstellen wollt ^^


    Was benötigen wir?

    • Dini ( Zum Speichern/Laden der Warns )
    • OCMD ( Zum erstellen der Befehle )
    • sscanf ( Für die einzelnen Parameter für die Befehle. Für mehr Infos dazu hier KLICKEN )




    Die Erstellung der einzelnen Befehle:


    Befehl zum verteilen der Verwarnungen:




    ocmd:setwarn(playerid, params[])
    {
    if(IsPlayerAdmin(playerid))return SendClientMessage(playerid, WEIS, " Du bist kein Rcon Admin!"); // Hier wird jetzt abgefragt ob der Spieler Rcon Admin ist. Natürlich könnt ihr diese Abfrage mit eure ersetzen.
    new warnid, warnanzahl, warngrund[60];
    if(sscanf(params,"uds",warnid, warnanzahl, warngrund))return SendClientMessage(playerid, WEIS,"Verwendung: /setwarn [Name/ID] [Warn-Anzahl] [Warn-Grund]"); // Sollte sich eigentlich von selbst erklären. wenn nicht KLICK
    if(!IsPlayerConnected(warnid))return SendClientMessage(playerid, WEIS, " Dieser Spieler ist nicht Online!"); // Falls der Spieler (Warnid) sich nicht auf den Server befindet erhält man eine Fehlermeldung.
    if(strlen(warngrund) > 60)return SendClientMessage(playerid,0xC34600FF,"Benutzung: [Warn-Grund darf Maximal nur 60 Zeichen beinhalten!]"); // die 60 steht für die anzahl der Zeichen die Verwendet werden dürfen.
    {
    new string[150]; // Hier erstellen wir den Array für die Nachrichten die wir nun mit der 'format' Funktion formatieren werden.
    format(string,sizeof(string), "Du hast an den Spieler %s %d Warns verteilt, Grund: %s", SpielerName(warnid), warnanzahl, warngrund);SendClientMessage(playerid, WEIS, string);
    SendClientMessage(warnid, WEIS, string);format(string,sizeof(string),"%s vergibt dir %d Warns, sein Grund: %s",SpielerName(playerid), warnanzahl, warngrund);
    SetPVarInt(playerid,"Warns",GetPVarInt(playerid,"Warns")+warnanzahl);
    if(GetPVarInt(warnid, "Warns") >= 3) // Falls der Spieler nun 3 Warns oder mehr hat soll was passieren?. Ich sage er soll eine Nachricht erhalten und im Anschluss gebannt werden.
    {
    SendClientMessage(warnid, WEIS, "Du hast die Maximale Warn anzahl erreicht und wirst nun gebannt!"); // eine Nachricht an den Spieler wird ausgegeben.
    Ban(warnid); // hier durch wird der Spieler gebannt und vom Server gekickt
    }
    }
    return 1;
    }


    Befehl zum löschen der Verwarnungen:



    ocmd:delwarn(playerid, params[])
    {
    if(IsPlayerAdmin(playerid))return SendClientMessage(playerid, WEIS, " Du bist kein Rcon Admin!"); // Hier wird jetzt abgefragt ob der Spieler Rcon Admin ist. Natürlich könnt ihr diese Abfrage mit eure ersetzen.
    new warnid, warnanzahl, warngrund[60];
    if(sscanf(params,"uds",warnid, warnanzahl, warngrund))return SendClientMessage(playerid, WEIS,"Verwendung: /givewarn [Name/ID] [Warn-Anzahl] [Warn-Grund]"); // Sollte sich eigentlich von selbst erklären. wenn nicht KLICK
    if(strlen(warngrund) > 60)return SendClientMessage(playerid,0xC34600FF,"Benutzung: [Warn-Grund darf Maximal nur 60 Zeichen beinhalten!]"); // die 60 steht für die anzahl der Zeichen die Verwendet werden dürfen.
    if(!IsPlayerConnected(warnid))return SendClientMessage(playerid, WEIS, " Dieser Spieler ist nicht Online!"); // Falls der Spieler (Warnid) sich nicht auf den Server befindet erhält man eine Fehlermeldung.
    if(GetPVarInt(warnid,"Warns") - warnanzahl >= 0)return SendClientMessage(playerid,GRUN," Der Spieler hat entweder 0 Warns oder die Warn-Anzahl ist zu groß!"); //Wenn der Spieler 0 Warns hat erhält der Admin diese Fehlermeldung. Oder wählt der Admin mehr Warns aus als der Spieler eigentlich hat erhält er diese Nachricht.
    {
    new string[128]; // Hier erstellen wir wieder den Array für die Nachrichten die wir nun mit der 'format' Funktion formatieren werden.
    format(string,sizeof(string), "Du hast vom Spieler %s %d Warns gelöscht, Grund: %s", SpielerName(warnid), warnanzahl, warngrund);
    SendClientMessage(playerid, WEIS, string);format(string,sizeof(string),"%s löscht dir %d Warns, sein Grund: %s",SpielerName(playerid), warnanzahl, warngrund);
    SendClientMessage(warnid, WEIS, string);
    SetPVarInt(playerid,"Warns",GetPVarInt(playerid,"Warns")-warnanzahl);
    }
    return 1;
    }


    Jetzt müsst ihr nur noch den stock SpielerName erstellen:



    stock SpielerName(playerid)
    {
    new name[MAX_PLAYER_NAME];
    GetPlayerName(playerid,name,sizeof(name));
    return name;
    }


    Bei eurem stock Laden muss es so aussehen:


    SetPVarInt(playerid,"Warns",dini_Int(Spielerdatei,"Warns"));

    Bei eurem stock SpielerSpeichern muss es so aussehen:


    dini_IntSet(Spielerdatei,"Warns",GetPVarInt(playerid,"Warns"));




    So das war nun das kleine Tutorial wie man sich ein Warn-System erstellt.
    Ich werde es so gut es geht noch weiter ausbessern, falls ihr Fehler im Code findet bitte Posten sie mir doch hier im Thread damit ich diese ausbessern kann.
    Über Positives Feedback würde ich mich freuen :D


    Hoffe euch hat das Tut gefallen. Klein aber Fein :P



    Edit: einige Fehler ausgebessert. Danke @west123



    Grüße

    So, so müsste eigentlich alles Funktionieren aber ich würde dir empfehlen, mit [MAX_PLAYERS] hierbei zu arbeiten.
    weil wenn 2Spieler auf dem Server z.B sind, und beide den TextDraw angezeigt bekommen, und der erste auf abbrechen geht ist es bei dem 2ten Spieler auch geschlossen. Daher mit [MAX_PLAYERS] arbeiten.
    public OnPlayerClickTextDraw(playerid, Text:clickedid)
    {
    if(clickedid == Reg2) //Wir fangen indem Fall bei 1 an weil wir ja nicht wollen das 0 anklickbar ist.
    {
    new Spielerdatei[64];
    new name[MAX_PLAYER_NAME];
    GetPlayerName(playerid,name,sizeof(name));
    format(Spielerdatei,sizeof(Spielerdatei),"/Accounts/%s.txt",name);
    if(dini_Exists(Spielerdatei))
    {
    ShowPlayerDialog(playerid,DIALOG_REGISTER,DIALOG_STYLE_INPUT,"Registrieren","Dein Account wurde nicht gefunden bitte gebe dein gewünschtes Passwort ein.","Spielen","Abbrechen");
    }
    else
    {
    SendClientMessage(playerid,ROT,"Du besitzt ein Account!");
    }
    }
    if(clickedid == Reg4)
    {
    new Spielerdatei[64];
    if(dini_Exists(Spielerdatei))
    {
    SendClientMessage(playerid,ROT,"Du besitzt kein Account!");
    }
    else
    {
    ShowPlayerDialog(playerid,DIALOG_LOGIN,DIALOG_STYLE_INPUT,"Login","Hallo {F50000}%s . {FFFFFF}Dein Account wurde in der Datenbank gefunden. Bitte logge dich ein!","Spielen","Abbrechen");
    }
    }
    if(clickedid == Reg6)
    {
    SendClientMessage(playerid,ROT,"ERROR");
    TextDrawHideForPlayer(playerid,Reg0);
    TextDrawHideForPlayer(playerid,Reg1);
    TextDrawHideForPlayer(playerid,Reg2);
    TextDrawHideForPlayer(playerid,Reg3);
    TextDrawHideForPlayer(playerid,Reg4);
    TextDrawHideForPlayer(playerid,Reg5);
    TextDrawHideForPlayer(playerid,Reg6);
    TextDrawHideForPlayer(playerid,Reg7);
    TextDrawHideForPlayer(playerid,Reg8);
    CancelSelectTextDraw(playerid);
    }
    return 1;
    }

    Diese Funktion noch unter, TextDrawSetSelectable:


    SelectTextDraw(playerid, farbe);


    Und da du ja auch nur den Textdraw erstellt hast, musst du weiter arbeiten mit "public OnPlayerClickTextDraw"
    das sieht dann in etwa so aus:

    public OnPlayerClickTextDraw(playerid, Text:clickedid)
    {
    if(clickedid == Reg)
    {
    // Hier was passieren soll wenn er drauf klickt
    }
    }


    EDIT:


    Arbeite unter OnPlayerConnect mit [playerid] bei den Textdraws, also ich meine das so:


    new Reg[MAX_PLAYERS]; // Globale Vari

    // Dann das so unter OnPlayerconnect:
    public OnPlayerConnect()
    {
    Reg2[playerid] = TextDrawCreate(87.144943, 249.083282, "Registrieren");
    TextDrawLetterSize(Reg2[playerid], 0.449999, 1.600000);
    TextDrawTextSize(Reg2[playerid], 279.707336, 78.749992);
    TextDrawTextSize(Reg2[playerid], 87.144943, 249.083282);
    TextDrawAlignment(Reg2[playerid], 1);
    TextDrawColor(Reg2[playerid], -1);
    TextDrawSetShadow(Reg2[playerid], 0);
    TextDrawSetOutline(Reg2[playerid], 1);
    TextDrawBackgroundColor(Reg2[playerid], 51);
    TextDrawFont(Reg2[playerid], 1);
    TextDrawSetProportional(Reg2[playerid], 1);
    TextDrawSetSelectable(Reg2[playerid], true); SelectTextDraw(playerid, farbe);
    return 1;
    }

    Ich weiß! denkst du ich bin blöd? Ich wollte wissen ob es mit false geht!

    Wenn du es weisst, warum fragst du dann?


    Diese funktion wo man einstellen kann "true/false oder 0/1" ist die so genannte repeating funktion.
    wenn du den Timer z.B auf 5Sekunden stehen hast, und repeating auf true, dann wird der Timer immer alle 5Sekunden dauerhaft ausgeführt.
    Hast du diesen auf false, wird er nur 1x ausgeführt.


    schau dir am besten die Funktion nochmal genauer an: SetTimerEx


    repeatingBoolean (true/false (or 1/0)) that states whether the timer should be called repeatedly (can only be stopped with KillTimer) or only once.

    Alles klar ich hab es soweit jetzt hinbekommen das nicht mehr Button 2 und 3 sich mit Makieren, aber seit dem ich jetzt "TextDrawTextSize", drin hab sieht der Text so verrutscht aus, schaut selbst:



    Screenshoot




    Neuer Code:


    AccountErstellen[playerid] = TextDrawCreate(139.999954, 258.844299, "-> Account erstellen");
    TextDrawLetterSize(AccountErstellen[playerid], 0.298999, 1.409183);
    TextDrawTextSize(AccountErstellen[playerid], 200.0, 30.0 );
    // TextDrawTextSize(AccountErstellen[playerid], 135.666656, 0.000000);
    TextDrawAlignment(AccountErstellen[playerid], 1);
    TextDrawColor(AccountErstellen[playerid], -2139062017);
    TextDrawSetShadow(AccountErstellen[playerid], 0);
    TextDrawSetOutline(AccountErstellen[playerid], 2);
    TextDrawBackgroundColor(AccountErstellen[playerid], 255);
    TextDrawFont(AccountErstellen[playerid], 3);
    TextDrawSetProportional(AccountErstellen[playerid], 1);
    TextDrawSetSelectable(AccountErstellen[playerid], true);


    Einloggen[playerid] = TextDrawCreate(139.666671, 326.044311, "-> Einloggen");
    TextDrawLetterSize(Einloggen[playerid], 0.298999, 1.409183);
    TextDrawTextSize( Einloggen[playerid], 200.0, 30.0 );
    // TextDrawTextSize(Einloggen[playerid], 135.333343, 0.000000);
    TextDrawAlignment(Einloggen[playerid], 1);
    TextDrawColor(Einloggen[playerid], -2139062017);
    TextDrawSetShadow(Einloggen[playerid], 0);
    TextDrawSetOutline(Einloggen[playerid], 2);
    TextDrawBackgroundColor(Einloggen[playerid], 255);
    TextDrawFont(Einloggen[playerid], 3);
    TextDrawSetProportional(Einloggen[playerid], 1);
    TextDrawSetSelectable(Einloggen[playerid], true);

    Abend



    Ich habe mal ein paar Anklickbare Textdraws erstellt.
    und das Problem ist jetzt folgendes.


    also, es ist so. Man geht auf den 1Button und der Text wird wie gewollt blau makiert, geht man dann mit der Maus über den 2 oder 3ten werden diese mit Makiert, hier mal ein Screenshot was ich meine:



    Screenshot ( Wenn ich bis zum 3ten Button runter gehe )
    Screenshot ( Wenn ich nur den ersten Button auswähle )



    Code:


    AccountErstellen[playerid] = TextDrawCreate(139.999954, 258.844299, "-> Account erstellen");
    TextDrawLetterSize(AccountErstellen[playerid], 0.298999, 1.409183);
    TextDrawAlignment(AccountErstellen[playerid], 1);
    TextDrawColor(AccountErstellen[playerid], -2139062017);
    TextDrawSetShadow(AccountErstellen[playerid], 0);
    TextDrawSetOutline(AccountErstellen[playerid], 2);
    TextDrawBackgroundColor(AccountErstellen[playerid], 255);
    TextDrawFont(AccountErstellen[playerid], 3);
    TextDrawSetProportional(AccountErstellen[playerid], 1);
    TextDrawSetSelectable(AccountErstellen[playerid], true);


    Einloggen[playerid] = TextDrawCreate(139.666671, 326.044311, "-> Einloggen");
    TextDrawLetterSize(Einloggen[playerid], 0.298999, 1.409183);
    TextDrawAlignment(Einloggen[playerid], 1);
    TextDrawColor(Einloggen[playerid], -2139062017);
    TextDrawSetShadow(Einloggen[playerid], 0);
    TextDrawSetOutline(Einloggen[playerid], 2);
    TextDrawBackgroundColor(Einloggen[playerid], 255);
    TextDrawFont(Einloggen[playerid], 3);
    TextDrawSetProportional(Einloggen[playerid], 1);
    TextDrawSetSelectable(Einloggen[playerid], true);


    KlickMich[playerid] = TextDrawCreate(138.000000, 391.585174, "-> Klick Mich");
    TextDrawLetterSize(KlickMich[playerid], 0.298999, 1.409183);
    TextDrawAlignment(KlickMich[playerid], 1);
    TextDrawColor(KlickMich[playerid], -2139062017);
    TextDrawSetShadow(KlickMich[playerid], 0);
    TextDrawSetOutline(KlickMich[playerid], 2);
    TextDrawBackgroundColor(KlickMich[playerid], 255);
    TextDrawFont(KlickMich[playerid], 3);
    TextDrawSetProportional(KlickMich[playerid], 1);
    TextDrawSetSelectable(KlickMich[playerid], true);


    Hoffe ihr könnt mir da weiter helfen ^^




    Grüße

    Du machst define und erstellst ein new mit den gleichen Namen.


    Denke mal das dies der Fehler ist.

    ?( Du definest und erstellst es....Ist mir ehrlich gesagt neu.
    Wieso erstellst du es nicht als Globale Array und weißt ihnen hinterher den String zu?


    L.G.

    Uff, Stimmt da habt ihr recht, kleiner Denkfehler von mir Passiert halt ^^
    Nun gut funktioniert jetzt alles, danke euch :)



    Grüße

    Da haste es doch... (Fehler von mir, dachte du wolltest strings formatieren).
    Wo ist denn die Index angabe? :)


    L.G.
    heyho

    Macht nichts, Diese sind unter den Includes:



    ///////////////////////////////////////////////////////////////////////////////


    // BSystem Stufen


    #define HS1 "Kritisch"
    #define HS2 "Muss Pinkeln"
    #define HS3 "Alles Fit"



    ///////////////////////////////////////////////////////////////////////////////

    Ersteinmal solltest du dir das mal ansehen [ SCRIPTING ] Switch + Case ,
    denn jede Case abzufragen ist unnötig, wenns diese schönen "pünktchen" gibt ^^.


    Zu deinem Fehler:
    Du kannst keinem String einen wert Zuweisen.
    Dafür gibt es strcat und format ;)


    L.G.

    Ich Weis selber auch das der ganze Spaß kürzer geht >.<, Trotzdem danke.
    Und wo weise ich denn bitte den string einen wert zu, ich lege nur den 'Array' für die Zeichenlänge fest ..

    Abend



    Ich habe mal wieder ein Kleines Problem, und zwar.
    kriege ich eine Fehlermeldung rein, wo eigentlich gar kein Fehler ist, aber einer angeblich Vorhanden sein soll ?


    Fehlermeldung:


    error 001: expected token: "-string end-", but found "-identifier-"


    Code:


    stock HandrangStufen(playerid)
    {
    new HStufen[15], HS1[80], HS2[80], HS3[80];
    switch(GetPVarInt(playerid,"SHandrang"))
    {
    case 0, 2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29:{HStufen=HS1;}
    case 30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59:{HStufen=HS2;}
    case 60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100:{HStufen=HS3;}
    }
    return HStufen;
    }

    new string[256];
    PlayerTextDrawShow(playerid,PAYDAYdraw[playerid]);
    format(string,sizeof(string),"~b~PayDay: ~w~%i~b~/~w~60",GetPVarInt(playerid,"Payday"));
    PlayerTextDrawSetString(playerid,PAYDAYdraw[playerid],string);


    Mach es so:


    new string[256];
    format(string,sizeof(string),"~b~PayDay: ~w~%i~b~/~w~60",GetPVarInt(playerid,"Payday"));
    TextDrawSetString(PAYDAYdraw[playerid],string);
    TextDrawShowForPlayer(playerid,PAYDAYdraw[playerid]);

    Moin



    Ich habe ein Problem, mit dem Erstellen von Textdraws bzw der Funktion "TextDrawUseBox".
    Also, das Problem ist, ich habe den Textdraw Editor von iPleomax und erstelle damit meine Textdraws,
    Aber das Problem hierbei ist, wenn ich die Funktion "TextDrawUseBox" nutze und damit eine Box ziehe.
    Und dann anschließend ein par Texte wie z.B Test1, Test2 über die Box ziehe sieht es so aus:


    Beim Erstellen sieht alles Perfekt aus:



    Wenn ich es jedoch schließe und erneut Öffne sieht es so aus:




    Woran liegt es, ist es ein Fehler vom Textdraw Editor selbst oder ein Fehler von der SA:MP Funktion selbst?
    hoffe ihr könnt mir da weiter helfen ..



    Grüße

    Hab auch einen in meiner Klasse der 21 Jahre ist, und keiner Sagt etwas, es ist nie zuspät für irgendwas. Mach es einfach!



    Grüße

    Bitte Poste den Code hier rein, und zudem auch noch bitte die Zeilen wo die Errors sich befinden.

    Hier versuch es so:


    ocmd:aw(playerid,params[])
    {
    if(SpielerInfo[playerid][pAdmin] != 0)return SendClientMessage(playerid, COLOR_GREY,"Fehler: Du bist kein Administrator");
    new text[60], string[80],string2[80] ,splayerid;
    if(sscanf(params,"us",splayerid,text))return SendClientMessage(playerid, COLOR_YELLOW,"Hinweis: /aw [playerid][Text]");
    {
    new player[MAX_PLAYER_NAME];
    GetPlayerName(playerid,player,sizeof(player));
    format(string,sizeof(string),"(( %s: %s ))",player,text);
    SendClientMessage(splayerid,COLOR_YELLOW, string);
    format(string2,sizeof(string2),"(( %s %s ))",splayerid,text);
    SendClientMessage(playerid,COLOR_YELLOW, string2);
    }
    return 1;
    }