Beiträge von Logan

    Eigentlich ganz einfach. Ich würde es so machen:
    rCmd["D(100)"]->tanken(playerid,success,&tankmenge) { //100 eben mit deiner vollen Tankmenge ersetzen D hier groß schreiben, d.h. optional. 100 bedeutet wenn ichts eingesetzt wurde //soll es 100 einsetzen
    new veh = GetPlayerVehicleID(playerid);
    Tank[veh] = tankmenge; //wie auch immer du den Tank vom Fahrzeug setzt
    new str[128];
    format(str,sizeof str,"Du hast dein Fahrzeug mit %d Litern erfolgreich betankt!",tankmenge);
    SendClientMessage(playerid,-1,str);
    return 1;
    }


    Ich hoffe, dass das jetzt stimmt, da ich mich noch fast noch gar nicht mit optionalen Parametern beschäftigt habe,
    aber eigentlich sollte das funktionieren.


    @Topic: /push


    LG

    Hallo,
    auch wenn ich dich aufgrund deiner langen Beschäftigungszeit verstehen kann, dass du nicht willst,
    dass irgendwelche Kiddys dein Script als ihres ausgeben wollen.
    Jedoch,nach deiner jetzigen Methode, kann das gleiche wieder passieren.
    Du kannst das o.g. nicht ganz verhindern, wenn du es veröffentlichst, damit muss man klar kommen.


    P.S: Und nein, ich habe nicht das Script angefragt und werde es auch nicht.


    LG

    Befehle mit rCmd v2 erstellen:

    Befehle so einfach wie nie!


    Vorwort:

    Hallo Leute,
    ich heiße euch hiermit herzlich Willkommen zu einem weiteren Tutorial von mir.
    Bevor jetzt irgendeiner damit kommt, dass es ein Tutorial über dieses Thema schon einmal gabt,
    möchte ich gerne darüber aufmerksam machen, dass dieses Tutorial sich auf die v2 bezieht.
    Die Include wurde nochmal komplett neugeschrieben, da einige Bugs drinnen waren, die zur Folge hatten, das viele Befehle nicht
    funktioniert haben & die "Art" bzw. "Vorangehensweise" Befehle zu erstellen hat sich auch geändert.


    rCmd ? Oh Gott, bitte nicht noch ein anderer Commandprozessor ...

    werden sich sicherlich viele von euch just gerade in diesem Augenblick denken.
    Viele kennen es ja: OCMD,DCMD,ZCMD,BCMD, uvm. ( Ich kann hier nur Maddin zitieren: "XCMD [für X bitte einen beliebigen Buchstaben aus dem Alphabet einfügen]"). Bei solchen Commandprozessoren ist eben der Fall, dass die Syntax immer die selbe ist. Die Befehle für OCMD,DCMD,ZCMD,etc. erstellen sich immer gleich.
    Doch das hier soll nicht das Thema des Tutorials sein.
    Es geht hier um rCmd. Dieser Commandprozessor hebt sich von diesen andern CMDProzessoren erheblich ab.
    Die Include wurde von RyDeR` aus dem englischen SAMP-Forum entwickelt.
    Ihr könnt sozusagen "dynamische Parameter" in euren Befehlen verwenden (wie eben in sscanf auch), jedoch ist diese Art, meiner Meinung nach
    einfacher & auch leichter zu handhaben.
    Um sich hier einfach mal konkret auf die v2 zu beziehen, hat sich geändert, dass das sscanf2 Plugin nun mit integriert wurde.
    D.h., ihr braucht die sscanf2 Include und auch dementsprechend dann das Plugin für den Server.



    Benötigte Includes:

    So, wie bei vielen anderen Sachen, braucht ihr auch hier ein paar Dinge im Voraus.
    Das wären:
    --- > sscanf2 Include + Plugin
    ---> rCmd.inc
    ---> dynamicparams.inc
    Ihr verschiebt alle Includes in den pawno/includes Ordner und das sscanf.dll/so Plugin in den Ordner "plugins".
    Danach passt ihr in der server.cfg bitte noch den Abschnitt "plugins" an.
    Natürlich müsst ihr dann auch noch mit #include <rCmd> den Commandprozessor in euer/en Filterscript/Gamemode inkludieren.
    Wichtig: Bitte unbedingt rCmd so schreiben! Bei mir gabs sonst Fehler! Bei den Befehlen auch immer: rCmd[]->...



    Befehlserstellung:

    Doch wie kann ich nun mit rCmd dementsprechend Befehle erstellen ?
    Ruhig, dazu kommen wir genau jetzt :)
    Wenn ich mich jetzt grob ausdrücken könnte, würde ich den allgemeinen rCmd Befehl ungefährt so gliedern:
    rCmd["Bezeichner für die Befehlsparameter"]->befehlsname(playerid,success,parameter1,parameter2,...)
    Wir werden dann noch genauer darauf eingehen, jedoch unterteile ich dieses "Kapitel" jetzt noch einmal in zwei Untergliederungen.


    Befehle mit Parameter:

    So da wären wir mal bei den Befehlen mit Parametern.
    Wir beziehen uns oben jetzt mal auf den Grobaufbau, den ich oben ausführlich geschildert habe.
    Man schreibt generell immer "rCmd" vor den eigentlichen Befehl.
    Danach, in den eckigen Klammern, kommen die entsprechenden sscanf2 Bezeichner für die Datentypen der Parameter jeweils hin (so wie ihr immer u für playerid, usw. nehmt). Danach folgt ein "->". Das bedeutet eigentlich nur so viel, dass hier danach der eigentliche Befehl folgt.
    Für den Befehlsnamen gebt ihr dann eben den Namen für den gewünschten Befehl an (z.B ban,kick,etc.).
    In der runden Klammern bzw. der Parameterliste danach, folgt danach erst einmal "playerid" & danach "success".
    "playerid" steht hier einfach nur für den ID des Spielers, die den Befehl ausführt.
    "success" steht hier dafür, ob der Spieler "inGame" die richtige Syntax für den Befehl eingegeben hat (z.B ob der auch wirklich alle Parameter für den /kick Befehl belegt hat). Danach für den Parameter1 bzw. 2 und 3. ( wie viele ihr eben haben wollt) schreibt ihr dann die Variablennamen für die Parameter hin ( Bei OCMD z.B habt ihr dann einfach halt, das im Funktionsbauch gemacht, z.B new pID oder new grund[]).


    Wichtig: Vor alle nicht array Variablen (also Floats,Integers ...) müsst ihr immer ein & Zeichen davor setzen (aber nicht vor playerid und success), da sonst die Parameter verbuggt wären würden.
    Hier schreibe ich einfach mal ein kleines Beispiel rein:
    rCmd["r"]->kick(playerid,success,&pID) { //"r" ist hier der Bezeichner für pID (da das nur eine Spielerid oder Name sein soll). Vor pID muss ein &! (nicht array Variable)
    if(!success)return SendClientMessage(playerid,-1,"Falsche Verwendung! Benutze: /kick <playerid>"); //"Syntax" Check
    if(pID == INVALID_PLAYER_ID)return SendClientMessage(playerid,-1,"Ungültiger Spieler!"); //Wenn Spieler nicht verbunden
    Kick(pID); //Ansonsten kicke den Spieler vor dem Server
    return 1;
    }
    Ich denke, dass im Code in den Kommentaren alles nochmals ausführlich erklärt ist.
    Wer immer noch nicht weiß, wie die richtigen Bezeichner für die "Datentypen" der Parameter ist, sollte sich mal das sscanf2 Tutorial von maddin: ! anschauen!



    Befehle ohne Parameter:

    Jetzt werden sich aber einige fragen, was denn ist, wenn man z.B einen Befehl ohne Parameter erstellen will ?
    Das geht auch sehr einfach. Man lässt einfach die Bezeichner in den eckigen Klammern weg und schreibt in die Parameterliste einfach nur "playerid" noch mit rein.
    Beispiel:
    rCmd[]->test(playerid) {
    SendClientMessage(playerid,-1,"Du hast gerade einen Befehl ohne Parameter eingegeben!");
    return 1;
    }


    Callbacks:


    Wie auch in ZCMD, gibt es in rCmd die gleichen Callbacks, da Sie ziemlich nützlich sind.
    Fangen wir mal beim 1. von zweien an.
    forward OnPlayerCommandReceived(playerid, cmdtext[]);
    Dieser Callback wird aufgerufen, bevor der eigentliche Befehl ausgeführt wird. Sprich: Wenn man hier return 0; hinschreibt, hat das die Folge,
    dass der eigentliche Befehl deaktiviert wird. Das eignet sich prima zum Deaktivieren von Befehlen, wenn man z.B gemutet ist.
    public OnPlayerCommandReceived(playerid,cmdtext[]) {
    if(!strcmp(cmdtext,"/notenabled",true)) { //checken ob der "notenabled" Befehl eingegeben wurde
    SendClientMessage(playerid,-1,"Dieser Command ist derzeit leider deaktiviert!"); // Sende ihm dementsprechend eine Nachricht
    return 0; //Und verhinder hier, dass der Befehl ausgeführt wird.
    }
    return 1;
    }


    Dann kommen wir auch noch zum letzen Callback:
    forward OnPlayerCommandPerformed(playerid, cmdtext[], success);
    Dieser Callback wird dann aufgerufen, nachdem der Befehl ausgeführt wurde.
    Nutzen kann man dies z.B um zu überprüfen, ob der Spieler überhaupt einen gültigen Befehl eingegeben hat, wenn nicht, sende ihm eine Nachricht, die ihn über die Nichtexistenz
    aufklären soll.

    public OnPlayerCommandPerformed(playerid,cmdtext[],success) { //cmdtext ist der eingegebene Befehl, success ob der CMD erfolgreich ausgeführt wurde
    if(!success) { //Wenn der CMD nicht ausgeführt wurde, sprich er eigentlich gar nicht existiert ...
    return SendClientMessage(playerid,-1,"Dieser Befehl existiert nicht. Benutze /help für verfügbare Befehle!"); //sende ihm eine Infonachricht
    }
    return 1;
    }




    Probleme mit rCmd:


    Es gibt vielleicht auch Leute, bei denen die Benutzung von rCmd zu Problemen führt, bzw. bei denen vielleicht einfach gar kein Befehl klappen will.
    Dazu gebe ich folgenden Tipps:
    - Wenn ihr ein anders CMD-System wie OCMD,etc. benutzt, entfernt es
    - Wenn OnPlayerCommandText sich noch in eurem Script befindet, entfernt es!



    Schlusswort:


    Ich muss sagen, dass die Befehle mit rCMD auf den ersten Blick ein wenig kompliziert wirken.
    Das war auch der erste Eindruck auf mich. Jedoch wenn man es wirklich verstanden hat, geht es nach einiger Zeit wirklich viel einfacher so Befehle
    mit Parametern zu erstellen, da diese Methode sehr effektiv ist. Mittlerweile bin auch Nutzer der Include.
    Falls ihr irgendwelche Fehler findet, scheut euch nicht, diese mir mitzuteilen!
    Ich hoffe, dass euch mein Tutorial gefallen hat!


    LG

    Hey Leute,
    wollte mal wieder den SAMP Map Editor starten.
    Doch da wurde mir nur ein Fehler ins Gesicht geschleudert.
    Und zwar wird mir erst iwas einer kryptischen Sprache angezeigt wenn ich auf LOAD drücke, und danach der Fehler:
    "List index out of bounds".
    Danach wird einfach die "Welt" nicht geladen ...


    Hier mal ein Screen dazu:


    Hatte jmd. schon ein Mal dieses Problem oder weiß, wie ich es beheben kann ?


    Danke im Voraus!


    LG

    Google Chrome eignet sich eigentlich am besten zum Surfen im Internet.
    Schnell, kaum bis keine Wartezeit und auf Seiten mit viel Javascript Verwendung wird die Seite eigentlich nur mit dem Chrome richtig
    dargestellt (wie z.B auf mega.co.nz, da funzt die Seite mit dem Firefox nicht,Opera,Safari mit dem IE 10 zu 80 %).
    Jedoch muss ich auch sagen, dass der Internet Explorer in seiner aktuellsten Version 10 auch nicht schlecht ist.
    Edit: Safari empfehle ich für WINDOWS überhaupt NICHT, da er einfach ziemlich langsam ist, Massen an Sicherheitslücken hat, und ihm ziemlich viele
    wichtige Features fehlen.


    MfG

    Yo Leute,
    wie schon die Überschrift sagt, habe
    Ich seit neustem das Problem, das der Windows Server bzw. der lokale Server nach Anklicken eines Textdraws, in diesem Falle das Login Textdraw crasht.
    Folgendes kommt in der Server.log durch crashdetect:


    Sehr komisch, weil ich NICHTS in OnPlayerClickPlayerTextDraw geändert habe.
    Aber hier, das dementsprechende Callback:
    public OnPlayerClickPlayerTextDraw(playerid,PlayerText:playertextid)
    {
    if(playertextid != PlayerText:INVALID_TEXT_DRAW) {
    if(playertextid == PlayerTextDraw[playerid][LoginBetreten]) {
    CancelSelectTextDraw(playerid);
    new query[128],name[MAX_PLAYER_NAME];
    GetPlayerName(playerid,name,sizeof name);
    mysql_real_escape_string(name,name);
    format(query,sizeof query,"SELECT * FROM accounts WHERE Name = '%s'",name);
    mysql_function_query(dbhandle,query,true,"THREAD_CheckAccount","i",playerid);
    }
    if(playertextid == PlayerTextDraw[playerid][LoginChangelog]) {
    ShowUpdates(playerid);
    }
    if(playertextid == PlayerTextDraw[playerid][LoginVerlassen]) {
    CancelSelectTextDraw(playerid);
    SendClientMessage(playerid,ROT,"Auf Wunsch wurdest du vom Server gekickt!");
    Kick(playerid);
    }
    }
    return 1;
    }


    Danke im Voraus!


    MfG