Eigenes format

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
  • Heyho, ich würde gerne eine selbst eine format-Funktion erstellen, basierend auf... format :P


    Beispiel:

    forward lformat(string[256], text1[], text2[], text3[]);


    public lformat(string[256], text1[], text2[], text3[])
    {
    new i=0;
    for(; i < MAX_PLAYERS; i++)
    {
    switch(PlayerInfo[i][language]) //Als beispiel
    {
    case 0..1: { format(string, sizeof(string), "%s", text1); } //English
    case 2: { format(string, sizeof(string), "%s", text2); } //Deutsch
    case 3: { format(string, sizeof(string), "%s", text3); } //Offen
    }
    }
    return 1;
    }


    //Verwendung:
    lformat(string, "Admin %s has set your level to %d", "Admin %s hat dein Level auf %d gesetzt", "blabla", PlayerInfo[playerid][pName], wert);


    Das klappt so aber leider nicht, wie könnte ich das Richtig machen?


    Liebe Grüße :)
    Crowley

  • Ich denke, dass ist das was du meinst.

    C
    stock lformat(playerid,color,text1[],text2[],text3[])
    {
    	if(PlayerInfo[playerid][language] == 0 || PlayerInfo[playerid][language] == 1)SendClientMessage(playerid,color,text1);
    	else if(PlayerInfo[playerid][language] == 2)SendClientMessage(playerid,color,text2);
    	else if(PlayerInfo[playerid][language] == 3)SendClientMessage(playerid,color,text3);
    	return 1;
    }

    Ich habe dir jetzt noch die Parameter "playerid" und "Color" eingefügt, wenn du diese nicht brauchst (playerid brauchst du eigentlich), dann kannst du sie löschen.
    Eine Schleife durch alle Personen ist da ja unnötig, denn du möchtest es ja nicht an alle Spieler senden (zur Not kannst du lformat auch in eine Schleife ausführen lassen, ist am Ende das gleiche).

  • Angenommen ich verwende jetzt:



    new s1[16], s2[16], s3[16];
    lformat(playerid, COLOR_WHITE, "Sprache: %s", "Sprache: %s", "Sprache: %s", s1, s2, s3);


    Abgesehen von den Errors, würde ich ja dann eine Message mit "Sprache: " erhalten. Es sollen ja Parameter angegeben werden können. Ich hoffe du verstehst wie ich das meine^^


    Gruß

  • Nur aus Interesse, wofür willst du eine eigene format funktion? ^^

    Generell brauche ich es nicht, aber ich würde doch schon gerne Wissen ob und wie es klappen würde. So eine Funktion kam mir in den Sinn und alles was mir in den Sinn kommt, probier ich meist auch aus :P


    Gruß


    Edit: Nochmal als Beispiel:


    //Funktion (soll kein Send beinhalten):
    stock lformat(playerid, string[256], language1[], language2[], language3[])
    {
    switch(PlayerInfo[playerid][language])
    {
    case 0..1:
    {
    format(string, sizeof(string), "%s", language1); }
    case 2: { format(string, sizeof(string), "%s", language2); }
    case 3: { format(string, sizeof(string), "%s", language3);
    }
    }
    return 1;
    }


    //Verwendung: Ich trage 3 Inhalte auf 3 verschiedenen Sprachen ein, wenn meine Language Variable auf 2 wäre, soll mir Deutsch ausgeben werden (was mir die lformat-Funktion in ein string packt und für die entsprechende Sprach Variable formatiert). lformat(playerid, string, "Welcome %s!", "Willkommen %s!", "Benvenuto %s", PlayerInfo[playerid][pName], PlayerInfo[playerid][pName], PlayerInfo[playerid][pName]);


    Ich hoffe ich konnte es etwas verständlicher machen :)


    Gruß

    Einmal editiert, zuletzt von varrez () aus folgendem Grund: Beispiel angehängt

  • Beitrag von [Lord]AdiosGamer ()

    Dieser Beitrag wurde von maddin aus folgendem Grund gelöscht: Spam ().
  • Habe es jetzt so:


    forward lformat(playerid, output[], len, const language1[], const language2[], const language3[], {Float,_}:...);


    public lformat(playerid, output[], len, const language1[], const language2[], const language3[], {Float,_}:...)
    {
    switch(PlayerInfo[playerid][language])
    {
    case 0..1: { format(output, 128, "%s", language1); }
    case 2: { format(output, 128, "%s", language2); }
    case 3: { format(output,128, "%s", language3); }
    }
    return 1;
    }


    Wenn ich es jetzt so verwende:


    new string[24];
    lformat(playerid, string, 128, "Welcome %s!", "Willkommen %s!,", "Benvenuto %s!", PlayerInfo[playerid][pName]);
    SendClientMessage(playerid, COLOR_VAGOS, string);


    stürzt mein Testserver ab (Konsole schließt sich). Was kann das Problem sein? @Jeffry: ?

  • Beitrag von Jeffry ()

    Dieser Beitrag wurde vom Autor aus folgendem Grund gelöscht: Kaliber's Lösung ist besser - war mir so nicht bekannt :o ().
  • In diesem Fall kannst du eine sehr effiziente Variante nutzen und zwar ein schniekes Makro:


    mfg. :thumbup:

    ast2ufdyxkb1.png


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

  • ein schniekes Makro:

    Das ist es wirklich, war mir so gar nicht bekannt, dass der trotz den 6 angegebenen Parametern alle weiteren im letzten Parameter mitzieht (%5 oben), sodass es auch mit mehreren Platzhaltern geht. Man lernt nie aus.


    Allerdings rate ich dazu, das so abzuändern:
    #define lformat(%0,%1,%2,%3,%4,%5,%6); \
    switch(PlayerInfo[%0][language]) \
    { \
    case 0,1: format(%1,%2,%3,%6);\
    case 2: format(%1,%2,%4,%6);\
    case 3: format(%1,%2,%5,%6);\
    }


    Sonst geht der Code nämlich bei mehrdimensionalen Arrays auf die Bretter.


    Nutzung wäre dann:
    lformat(playerid, string, sizeof(string), "Welcome %s!", "Willkommen %s!", "Benvenuto %s!", name);
    print(string);