[SAMMELTHREAD] Kleine Scripting Fragen

Dein Problem konnte durch einen User gelöst werden? Bedank dich bei ihm indem du seinen Beitrag als Hilfreich markierst sowie einen Daumen oben dalässt
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
  • dcmd_pm(playerid,params[])
    {
    if(!strlen(params)) return
    SendClientMessage(playerid, COLOR_WHITE, "** Usage: /pm (PlayerID)");
    PMplayer1 = strval(params);

    if(PMplayer1 == playerid) return
    SendClientMessage(playerid, COLOR_MAUVE, "* You can not send yourself a PM.");

    if(!(IsPlayerConnected(PMplayer1) && PMplayer1 != INVALID_PLAYER_ID)) return
    SendClientMessage(playerid, red, "** Invalid Player.");

    new string[128];


    GetPlayerName(PMplayer1, PmReceiver, sizeof(PmReceiver));
    format(string,sizeof(string),"* PM to %s (ID: %d): %s ", PmReceiver, PMplayer1, ?????); // Was kommt denn hier rein um den Text zu sehen?
    SendClientMessage(playerid,grey,string);
    return 1;
    }



    Was kommt beim "????" rein um den Text zu sehen?

  • Was kommt beim "????" rein um den Text zu sehen?


    Musst es so machen:


    dcmd_pm(playerid,params[])
    {
    new PMplayer1,string[128];
    if(sscanf(params,"us[128]",PMplayer1,string)) return SendClientMessage(playerid, COLOR_WHITE, "** Usage: /pm (PlayerID) (Text)");
    if(PMplayer1 == playerid) return SendClientMessage(playerid, COLOR_MAUVE, "* You can not send yourself a PM.");
    if(!(IsPlayerConnected(PMplayer1) && PMplayer1 != INVALID_PLAYER_ID)) return SendClientMessage(playerid, red, "** Invalid Player.");
    GetPlayerName(PMplayer1, PmReceiver, sizeof(PmReceiver));
    format(string,sizeof(string),"* PM to %s (ID: %d): %s ", PmReceiver, PMplayer1, string); // Was kommt denn hier rein um den Text zu sehen?
    SendClientMessage(playerid,grey,string);
    return 1;
    }


    mfg. :thumbup:

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S


  • Funktioniert nicht. sobald ich /pm ID text eingebe, erscheint mir die Usage nachricht..
    habe aber das new PMplayer1 weg gelassen, weil es schon definiert war und nur warnings brachte

  • Wie kann man bei OnPlayerText machen das der Name nicht wie z.b. Fabi.StaR angezeigt wird sondern Fabi StaR angezeigt wird?


    //Edit: Das von Prototypel ist besser :)


    erscheint mir die Usage nachricht..


    Ja...nicht nur Copy Pasten :P Achte doch bei SendClientMessage...auf den User :rolleyes:


    mfg. :thumbup:

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • @Fuldara:


    dcmd_pm(playerid,params[])
    {
    new tmp[20], idx, PMplayer1, PmReceiver[MAX_PLAYER_NAME];
    tmp = strtok(params, idx);
    if(!strlen(cmdtext[strlen(tmp)+1])) return SendClientMessage(playerid, COLOR_WHITE, "** Usage: /pm (PlayerID) (Text)");
    PMplayer1 = strval(tmp);

    if(PMplayer1 == playerid) return SendClientMessage(playerid, COLOR_MAUVE, "* You can not send yourself a PM.");

    if(!IsPlayerConnected(PMplayer1) || PMplayer1 == INVALID_PLAYER_ID) return SendClientMessage(playerid, red, "** Invalid Player.");

    new string[144];
    GetPlayerName(PMplayer1, PmReceiver, sizeof(PmReceiver));
    format(string,sizeof(string),"* PM to %s (ID: %d): %s ", PmReceiver, PMplayer1, params[strlen(tmp)+1]); // Was kommt denn hier rein um den Text zu sehen?
    SendClientMessage(playerid,grey,string);
    return 1;
    }


    http://wiki.sa-mp.com/wiki/Strtok

  • Zitat

    stock IntToBool(int_value) return !!int_value;

    Das habe ich z.B. im Thread "Nützliche Codeschnipsel" gefunden.
    Meine Frage ist nun, was das "!!" nach dem Return bedeutet..


    Außerdem habe ich dort Codes mit Inhalten wie diesen gefunden:

    Zitat

    #define insert(%0,%1,%2,%3); \
    new char_buffer[(%1) + 1]; \
    format(char_buffer,%1,%2,%3); \strunpack(%0,char_buffer,%1);

    Wofür ist hier das "\"?



    #Handy

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Meine Frage ist nun, was das "!!" nach dem Return bedeutet..


    Schau dir doch den Namen der Funktion an :D


    Das wandelt einen Int Wert in einen bool Wert um ;)


    Wofür ist hier das "\"?


    Um dem Compiler zu sagen, dass das Makro in der nächsten Zeile weitergeht ;)


    mfg. :thumbup:

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S



  • 1. Das !! konvertiert eine Ausgabe zu eine booleschen Wert.


    Beispiel wie man den Rückgabewert konvertieren könnte von einer Funktion


    new bool:value = !!SendClientMessage(playerid,-1,"Hallo wie gehts");


    stock bool:example(str[])return !!strfind(str,"Hallo",false);




    2. Für einen "Zeilenbruch" des defines, damit nicht alles in einer Zeile muss das funktioniert auch bei strings
    format(str,64,"Hallo wie \
    geht es dir %s ","Benjamin");


    //edit Kaliber hat es ja schon erwähnt ich hab es nochmal ausgeführt


    Kaliber


    warum kein makro :D


    #define IntToBool(%0) !!%0
    new bool:test;
    test = IntToBool(-1);

  • warum kein makro


    Hö?! :D


    Was auch geht, anstatt das mit dem !! zu machen, kann man das auch direkt casten, indem man einfach folgendes macht:


    stock bool:IntToBool(int_value) return bool:int_value;


    Achso um das mal zu erwähnen:


    stock IntToBool(int_value) return !!int_value; //Das gibt einen Warning, weil die Funktion als bool gekennzeichnet sein muss!


    //Richtig wäre:


    stock bool:IntToBool(int_value) return !!int_value;


    mfg. :rolleyes:

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • Das mit den tag ist interessant jedoch mit deiner Aussage zu de, Warning da stimme ich nicht ganz zu :D.
    Das sollte normal nicht erscheinen.


    mit dem makro meinte ich warum IntToBool nicht als als Makro sondern als funktion.


    deine zusätzliche variante


    stock bool:IntToBool(int_value) return bool:int_value;


    funktioniert nicht

  • mit dem makro meinte ich warum IntToBool nicht als als Makro sondern als funktion.


    Das kommt doch nicht von mir :D Was weiß ich..wieso das wer so gemacht hat...wieso überhaupt Makro oder Funktion...2 Ausrufezeichen kann man auch mal so setzen :D


    Das sollte normal nicht erscheinen.


    //Edit:
    ...stell dir vor du willst es vergleichen..mit einem Boolean Wert :P


    mfg. :thumbup:

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • dcmd_admins(playerid,params[])
    {
    #pragma unused params
    new count = 0;
    new string[128];
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if (IsPlayerConnected(i))
    {
    if(AccInfo[i][Level] >= 1 && AccInfo[i][Hide] == 0)
    {

    switch(AccInfo[i][OnDuty])
    {
    case 0: AdmDuty = "Busy";
    case 1: AdmDuty = "Available";
    }
    format(string, 128, "Admin %s (ID: %i)- Level %d - %s\n",PlayerName2(i),i, AccInfo[i][Level],AdmDuty);
    count++;
    ShowPlayerDialog(playerid,DIALOG_ADMINS,DIALOG_STYLE_MSGBOX,"Online Admins",string,"Close","");
    }
    }
    }
    if (count == 0)
    ShowPlayerDialog(playerid,NO_ADMINS,DIALOG_STYLE_MSGBOX,"Online Admins","\n\n\n\nThere are no admins online.","Close","");
    return 1;
    }


    Warum wird mir nur ein Admin angezeigt?


  • Dein Befehl sendet, nachdem er einen Admin gefunden hat, der online ist, einen Dialog aus.
    Du musst den Dialog erst nach der Schleife anzeigen und alle Admins in einer Zeichenkette speichern.

  • funktioniert nicht


    Doch...


    Ob man jetzt folgendes macht:


    new bool:x = !!SendClientMessage(0,-1," ");
    printf("%s",(x == false) ? ("Funzt") : ("not"));


    oder das hier:


    new bool:x = bool:SendClientMessage(0,-1," ");
    printf("%s",(x == false) ? ("Funzt") : ("not"));


    Macht im Endeffekt keinen Unterschied, da beides den Wert in einen Bool konvertiert...


    mfg. :thumbup:

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen