MySQL Plugin von BlueG R7 Stock aufrufen?

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
  • mysql_function_query(MySQL, Query, true, "FunktionTest", "d", playerid);
    Wie bekomme ich es hin, dass FunktionTest ein Stock ist, statt eine public Funktion?
    Der Stock wird nicht aufgerufen, aber mit public Funktionen kriege ich keine Strings returnt.

  • aber mit public Funktionen kriege ich keine Strings returnt.


    Doch auch das ist möglich
    Hier mal nen test


    stock bla()
    {
    new str[12];
    strcat(str, " Hallo!");
    return str;
    }


    Diese Funktion gibt Hallo aus.


    Nun mal als Callback (public)


    forward bla();
    public bla()
    {
    new str[12];
    strcat(str, " Hallo!");
    return str;
    }


    Ergibt genau das selbe.
    Wie hast du es denn gemacht bisher?

    All in all it's just another brick in the wall

  • Ergibt genau das selbe.


    Nein. Public Funktionen dürfen keine Arrays zurück geben (Error 090).



    Was willst du denn eigentlich machen? Es ist völlig irrelevant was die Funktion zurück gibt, da du es ohnehin nicht abfangen kannst. Der return Wert spielt keine Rolle.
    Erkläre mal was du vor hast.


  • Nein. Public Funktionen dürfen keine Arrays zurück geben (Error 090).



    Was willst du denn eigentlich machen? Es ist völlig irrelevant was die Funktion zurück gibt, da du es ohnehin nicht abfangen kannst. Der return Wert spielt keine Rolle.
    Erkläre mal was du vor hast.


    Ich möchte eine GetTextFromLanguage(language[], text[]); Funktion einfügen.


    Edit
    Wäre es möglich, ein Array beim Serverstart zu erstellen? Weil ich denke durch meine Variante würde der Mysql Server irgendwann nichtmehr mitmachen. Aber das Array soll so sein, sodass ich es in ungefähr so abrufen kann:
    Text[de][hello.world]

  • Das kannst du so direkt nicht mit diesen Funktionen machen, da dir die Funktion wie gesagt keinen String zurückgibt.
    Du solltest das wie folgt machen:
    GetTextFromLanguage(language[], text[]);
    zu:
    SendPlayerLanguageMessage(playerid, color, text[]);

    Dann kannst du in dem public direkt die Nachricht ausgeben:
    mysql_function_query(MySQL, Query, true, "SendPlayerLanguageMessage", "dds", playerid, 0xFF0000FF, "Hallo Welt!");


    In der Funktion kannst du dann die entsprechende Sprache von playerid abfragen und die entsprechende Nachricht ausgeben.
    Dem Prinzip nach wie wir es in den kleinen Scripting Fragen besprochen haben, das kommt gut hin.



    Zu deinem Edit:
    Nein, du musst einen Loop durch das Array machen, den Text auf deutsch suchen und die entsprechende Sprache ausgeben.


  • Zu deinem Edit:
    Nein, du musst einen Loop durch das Array machen, den Text auf deutsch suchen und die entsprechende Sprache ausgeben.


    Ich verstehe das nicht :/


    Edit:
    Das Problem ist ja, ich möchte die Funktionen auch in den Dialogen usw. nutzen. Vielleicht kann ich dir mein Vorhaben besser erklären, wenn ich ein Code zeige, wie ichs mir ungefähr vorstelle:

    new Language[][];


    stock GetTextFromLanguage(lang[], text[]) {
    return Language[lang][text];
    }


    public OnTextsLoad() {
    //cache etc
    new result[128], language[8], text[64];
    for(new i = 0; i < rows; i++) {
    Language[language][text] = result;
    }
    }

    So sollte dann also meine Variable aussehen
    Language["de"]["hello.world"] = "Hallo Welt";

    Aber das klappt so ja nicht und meine Frage ist wie ich das umsetzen könnte.

    Einmal editiert, zuletzt von Azcaq ()

  • Ich nutze das R7 Plugin nicht, verwendet das die Cache Funktionen? Wenn nicht, dann rate ich dir dringend, auf R39-2 umzusteigen.
    Die Performance ist wesentlich besser.


    Ansonsten musst du den Code ggf. anpassen.


    Deklaration:
    #define MAX_TEXTS 100
    #define MAX_LANGS 3
    #define MAX_TLEN 145
    #define MAX_DLEN 32
    new gLanguageText[MAX_TEXTS][MAX_LANGS][MAX_TLEN]; //100 Texte in 3 Sprachen zu je maximal 145 Zeichen.
    new gDefinition[MAX_TEXTS][MAX_DLEN]; //100 Texte die jeweils eine Definition ("hello.world") zu 32 Zeichen haben.


    Laden aus Datenbank:
    OnGameModeInit:
    mysql_tquery(conHandle, "SELECT * FROM texts", "OnTexteInit", "");


    Unten im Code:
    forward OnTextsInit();
    public OnTextsInit()
    {
    new rows = cache_get_row_count();
    new str[MAX_TLEN], inserted, textID;
    for(new i = 0; i < rows; i++)
    {
    cache_get_field_content(i, "language", str);
    if(!strcmp(str, "de")) lang = 0;
    else if(!strcmp(str, "en")) lang = 1;
    else if(!strcmp(str, "es")) lang = 2;
    cache_get_field_content(i, "definition", str);
    textID = -1;
    for(new j = 0; j < inserted; j++)
    {
    if(!strcmp(gDefinition[j], str))
    {
    textID = j;
    break;
    }
    }
    if(textID == -1)
    {
    if(inserted >= MAX_TEXTS) return print("Error: Text-Limit überschritten");
    format(gDefinition[inserted], MAX_DLEN, str);
    textID = inserted;
    inserted++;
    }
    cache_get_field_content(i, "text", str);
    format(gLanguageText[textID][lang], MAX_TLEN, str);
    }
    return 1;
    }


    Textausgabe:
    Hier kannst du dir es sogar mit einem Stock zurückgeben lassen, da du ja kein Query mehr brauchst.


    stock GetLanguageText(langstr[], def[])
    {
    new str[MAX_TLEN], lang=-1, textID=-1;
    if(!strcmp(langstr, "de")) lang = 0;
    else if(!strcmp(langstr, "en")) lang = 1;
    else if(!strcmp(langstr, "es")) lang = 2;

    for(new i = 0; i < MAX_TEXTS; i++)
    {
    if(!strcmp(gDefinition[i], def) && strlen(gDefinition[i]) > 0)
    {
    textID = i;
    break;
    }
    }

    if(lang != -1 && textID != -1) format(str, sizeof(str), gLanguageText[textID][lang]);
    return str;
    }


    In der Tabelle hast du die Spalten:
    language
    definition
    text



    Beachte:
    Ich habe das ohne Compiler und ohne es ausprobieren zu können geschrieben.
    Falls Fehler auftreten, poste bzw. beschreibe diese bitte.


    Bei Fragen einfach melden.