Briefesystem Wie schreibe ich das um?

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
  • Guten Abend liebe Community,


    ich habe mein Briefesystem gemacht nur würde ich paar sachen wissen.
    Wie kann er \n auch wirklich ausführen den wen er es ausliest bleibt es im dialog als \n und nicht als neue Zeile.
    Meine Zweite Frage wäre wie kann ich es machen das wenn ich mich einlogge das dort kommt "Du hast x ungelesene Briefe?"
    Meine dritte Frage wäre wie kann ich von absenderID den Namen des Spielers auslesen wen dieser nicht online ist?



    Jeffry:


    Mein Code:
    enum letterEnum{
    bdb_id,
    babsenderID,
    bempfangID,
    bInhalt[128],
    bName1[MAX_PLAYER_NAME],
    bName2[MAX_PLAYER_NAME]
    }
    new letterInfo[999][letterEnum];


    public OnPlayerLettersLoad(playerid)
    {
    new num_fields,num_rows;
    cache_get_data(num_rows,num_fields,dbhandle);
    for(new i=0; i<num_rows; i++)
    {
    new id=getFreeLetterID();
    letterInfo[id][bdb_id]=cache_get_field_content_int(i, "id", dbhandle);
    letterInfo[id][babsenderID]=cache_get_field_content_int(i, "absenderID", dbhandle);
    letterInfo[id][bempfangID]=cache_get_field_content_int(i, "empfangID", dbhandle);
    cache_get_field_content(i, "Text", letterInfo[id][bInhalt], dbhandle, 128);
    }
    return 1;
    }


    getFreeLetterID()
    {
    for(new i=0; i<sizeof(letterInfo); i++)
    {
    if(letterInfo[i][bdb_id]==0)return i;
    }
    return 0;
    }


    loadLetters(playerid)
    {
    new query[512];
    format(query,512, "SELECT * FROM briefe WHERE empfangID='%i'", pInfo[playerid][db_id]);
    mysql_function_query(dbhandle,query,true,"OnPlayerLettersLoad","d",playerid);
    return 1;
    }


    Liebe Grüße,
    Genadj_Andrenov


    /edit: 3. Frage hinzugefügt!

    ...Lerne C#, JS für RageMP...

    2 Mal editiert, zuletzt von Genadj_Andrenov () aus folgendem Grund: 3. Frage hinzugefügt!

  • 1.)
    Beim Anzeigen des Textes der einen Zeilenumbruch hat:


    new string[512];
    format(string, sizeof(string), variable);
    for(new i=0; i<strlen(string); i++) if(string[i] == '~') string[i] = '\n';
    ShowPlayerDialog(playerid,DIALOG_INFO,DIALOG_STYLE_MSGBOX,"Titel",string,"Schließen",""); variable = Die Variable in der der Text steht.


    Und so speicherst du es in der Datenbank:

    Zitat

    Dieser Zeilenumbruch~wird nun beachtet.


    ~ ist dann das Zeichen für einen Umbruch.



    2.)
    http://www.w3schools.com/sql/sql_func_count.asp


    3.)
    Mit einem SELECT und dann den Cache auslesen.


  • Wie genau füge ich das jetzt ein?
    Und worauf muss ich dort achten?


    Liebe Grüße,
    Genadj_Andrenov

    ...Lerne C#, JS für RageMP...

  • Code: ocmd:read(playerid, params[])
    {
    new bID;
    if(sscanf(params,"i",bID))return scm(playerid, COLOR_RED, "Benutze: /read [Brief-ID]");
    for(new x=0; x<sizeof(letterInfo); x++)
    {
    if(letterInfo[x][bempfangID] != pInfo[playerid][db_id])continue;
    if(letterInfo[x][bdb_id] != bID)continue;
    new stirng[999];
    format(stirng, 999, "Brief #%d | Inhalt: %s", bID, letterInfo[x][bInhalt]);
    SendClientMessage(playerid, COLOR_YELLOW, stirng);
    return 1;
    }
    return 1;
    }

    ...Lerne C#, JS für RageMP...

  • In SendClientMessage geht ein Zeilenumbruch gar nicht.
    Außerdem kann SendClientMessage nur 145 Zeichen ausgeben, keine 999, das kannst du verkleinern.


    Du musst es in einem Dialog machen.
    Und da nutzt du nach dem format:
    for(new i=0; i<strlen(string); i++) if(string[i] == '~') string[i] = '\n';
    Dann den Dialog anzeigen.

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • In SendClientMessage geht ein Zeilenumbruch gar nicht.
    Außerdem kann SendClientMessage nur 145 Zeichen ausgeben, keine 999, das kannst du verkleinern.


    Du musst es in einem Dialog machen.
    Und da nutzt du nach dem format:
    [pwn]for(new i=0; iDann den Dialog anzeigen.

    Ja ich wollte dies auch in Dialog umschreiben :)
    Nur weiß ich nicht ganz was ich wohin tuhen soll ob es auch wirklich richtig ist.
    Kannst mir nen Beispiel geben?


    Liebe Grüße,
    Genadj_Andrenov

    ...Lerne C#, JS für RageMP...

  • ocmd:read(playerid, params[])
    {
    new bID;
    if(sscanf(params,"i",bID))return scm(playerid, COLOR_RED, "Benutze: /read [Brief-ID]");
    for(new x=0; x<sizeof(letterInfo); x++)
    {
    if(letterInfo[x][bempfangID] != pInfo[playerid][db_id])continue;
    if(letterInfo[x][bdb_id] != bID)continue;
    new string[512];
    format(string, sizeof(string), "Brief #%d \nInhalt:\n%s", bID, letterInfo[x][bInhalt]);
    for(new i=0; i<strlen(string); i++) if(string[i] == '~') string[i] = '\n';
    ShowPlayerDialog(playerid, 1424, DIALOG_STYLE_MSGBOX, "Brief", string, "Ok", "Abbrechen");
    return 1;
    }
    return 1;
    }

  • Das du das selbst schreiben willst ist natürlich völlig okay, ich zeige dir aber trotzdem mal ein Filterscript von mir dazu:
    http://forum.sa-mp.de/gta-mult…pm-nachrichtenverwaltung/
    Ist definitiv umfangreicher als das, was du hier (vor) hast :-0.


    Zitat

    Und wie kann ich machen /write [Spieler-Name(großkleinschreibung beachten] machen und per Dialog schreibe? Und er den Namen erst Kontrolliert bevor er den Dialog erscheinen lässt?


    In dem du :
    1) Beim Ausführen des Befehles (/write) ein SELECT auf den angegeben Namen machst und bei Fertigstellung ein Callback aufrust (zB OnUserSearch)
    2) Im Callback des o.g. SELECTs prüfst ob es 1 Ergebnis gibt
    2.1) Falls es 1 Ergebnis gibt, dann den Dialog anzeigen lässt. --> OnDialogResponse dann die Texteingabe verarbeiten
    2.2) Benutzer existiert nicht, Dialog nicht anzeigen bzw Fehlermeldung