[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
  • @Mew:
    Nein, nicht wirklich.


    Du könntest höchstens jeder Nachricht eine ID geben, und dann eine Funktion aufrufen, die die Nachricht über die ID und die eingestellte Sprache ausgibt, dann hast du die Abfrage nicht jedes mal in jedem Code stehen.
    stock SendLanguageMessage(playerid, id)
    {
    if(pInfo[playerid][Language] == 1)
    {
    switch(id)
    {
    case 0: SendClientMessage(playerid, -1, "Hallo Welt!");
    }
    }
    if(pInfo[playerid][Language] == 2)
    {
    switch(id)
    {
    case 0: SendClientMessage(playerid, -1, "Hello World!");
    }
    }
    return 1;
    }

  • Zitat

    @Mew:
    Nein, nicht wirklich.

    Klar.


    Habe dir mal ein Filterscript vorbereitet, sollte klappen.
    Pastebin
    Und die Datenbanktabelle


    Edit: Sorry hatte falschen Pastebin eingefügt :S

    3 Mal editiert, zuletzt von Azcaq () aus folgendem Grund: Einrükung, Einrükung, Einrükung, Filterscript eingefügt

  • @Azcaq: Das ist prinzipiell ja genau das gleiche, nur dass du die Texte eben in der Datenbank speicherst, was hinsichtlich Performance keine gute Idee ist, vor allem dann, wenn du viele Nachrichten auf einmal an viele Spieler sendest.


    Ich würde davon abraten das so zu machen, da es keinen Unterschied im Handling macht, wo die Texte stehen, dafür aber sehr wohl in der Performance.

  • @Azcaq: Das ist prinzipiell ja genau das gleiche, nur dass du die Texte eben in der Datenbank speicherst, was hinsichtlich Performance keine gute Idee ist, vor allem dann, wenn du viele Nachrichten auf einmal an viele Spieler sendest.


    Ich würde davon abraten das so zu machen, da es keinen Unterschied im Handling macht, wo die Texte stehen, dafür aber sehr wohl in der Performance.


    Das wurde mir später auch klar :/
    Ist es denn möglich das alles beim Serverstart (wie ich es im anderen Thread erwähnt habe) in einen Array zu packen?
    Mit Mysql hätte man es gut das man die Texte dann auch mit einem Control Panel verwalten könnte.

  • Ja, das wäre eine Möglichkeit. Man müsste dann eben noch einen Befehl erstellen, der bei Bedarf die Daten neu aus der Datenbank ausließt.
    Allerdings kommt es darauf an, wie viele Nachrichten man hat, denn man muss beachten, dass man ja für jede Nachricht dann Speicherplatz in Form eines Arrays reservieren muss, und das kann viel werden, allerdings denke ich, dass das kein Problem werden sollte, da keiner 1 Million Nachrichten hat.

    Ist zwar auch nicht ganz so performant wie es direkt in den Code zu schreiben, allerdings hat man die Möglichkeit die Nachrichten im laufenden Betrieb anzupassen, das kann man also durchaus so machen, da der Nutzen dem Verbrauch überwiegt.
    Das wäre für ein mehrsprachiges System sicherlich eine der besten Möglichkeiten.

  • [/quote]

    Ja, das wäre eine Möglichkeit. Man müsste dann eben noch einen Befehl erstellen, der bei Bedarf die Daten neu aus der Datenbank ausließt.
    Allerdings kommt es darauf an, wie viele Nachrichten man hat, denn man muss beachten, dass man ja für jede Nachricht dann Speicherplatz in Form eines Arrays reservieren muss, und das kann viel werden, allerdings denke ich, dass das kein Problem werden sollte, da keiner 1 Million Nachrichten hat.

    Ist zwar auch nicht ganz so performant wie es direkt in den Code zu schreiben, allerdings hat man die Möglichkeit die Nachrichten im laufenden Betrieb anzupassen, das kann man also durchaus so machen, da der Nutzen dem Verbrauch überwiegt.
    Das wäre für ein mehrsprachiges System sicherlich eine der besten Möglichkeiten.


    Könntedt du mir ein Beispiel Code geben, wie ich den Array erstelle, erfülle und wie ich mit den Informationen language und text ("de", "hello.world") den String vom Array bekomme? Ich habe viel versucht und bekam es nur so hin, dass man den index als ID angibt, was ich ja nicht möchte.


    // Quotes

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Pascal.:
    new geldweniger;
    for(new i=0; i<sizeof(cInfo); i++)
    {
    if(!strcmp(cInfo[i][besitzer], SpielerName(playerid))) geldweniger += cInfo[i][csteuern];
    }
    GivePlayerMoney(playerid, payday - geldweniger);


    Schleife durch alle Fahrzeuge, wenn dem Spieler das Fahrzeug gehört wird der Steuerwert in die geldweniger Variable addiert. Am Ende wird ihm dann das geldweniger vom payday abgezogen.
    Gegebenenfalls musst du den Code etwas anpassen, wenn du den PayPay in einer Schleife hast, aber das sollte kein Problem sein.

  • Hat jemand eine Ahnung woran es liegen kann, das sich Textdraws verschieben?


    Beispiel:
    ich steig in Auto und sehe ein Tacho in Form eines textdraws. Dort steht unter anderem der Autoname.


    Das Tacho wird regelmäßig mit der entsprechenden geschwindigkeit aktualisiert.


    Angenommen es ist ein Taxi und man beginnt eine Taxifahrt. die Taxifahrt wird in form eines weiteren Textdraws angezeigt, damit man weiß wieviel man zahlen muss.


    Aufeinmal veschwindet das Textdraws der Taxifahrt, der Autoname im Tacho verschwindet auch, an stelle von dem Autonamen kommt das textdraw von der Taxifahrt.



    Ich benutze natürlich für jedes Textdraw eine eigene variabel und den Wert dieser variabel setze ich beim zerstören des textdraws auf den Wert "invalid"

  • Habe ein Problem, sobald ich als Besitzer das Haus verkaufe wird der Text entfernt aber nicht das Pickup.
    Dort sollte eigentlich ein Grünes pickup sein aber es gibt dann 2 Pickups.
    Aber wenn ich es kaufe wird alles richtig angezeigt.
    Was mache ich falsch?


    UpdateHaus(id)
    {
    new string[250];
    if(hInfo[id][h_pickup] != -1)
    {
    DestroyPickup(hInfo[id][h_pickup]);
    }
    if(hInfo[id][h_text] != Text3D:-1)
    {
    Delete3DTextLabel(hInfo[id][h_text]);
    }
    if(!strlen(hInfo[id][h_besitzer]))
    {
    format(string,250,"\
    {007AFF}Besitzer: {FEFEFE}-unbekannt-\n\
    {007AFF}Level: {FEFEFE}%d\n\
    {007AFF}Kaufpreis: {FEFEFE}%d$\n\
    {007AFF}Beschreibung: {FEFEFE}Dieses Haus steht zum Verkauf.\n\n\
    Benutze /buyhouse um das Haus zu kaufen",
    hInfo[id][h_level],hInfo[id][h_preis]);
    hInfo[id][h_pickup] = CreatePickup(1273, 1, hInfo[id][hx],hInfo[id][hy],hInfo[id][hz],-1);
    hInfo[id][h_text] = Create3DTextLabel(string,COLOR_ROT,hInfo[id][hx],hInfo[id][hy],hInfo[id][hz],10,0,1);
    hInfo[id][h_lock] = 1;
    hInfo[id][h_icon] = CreateDynamicMapIcon(hInfo[id][hx],hInfo[id][hy],hInfo[id][hz], 31, -1, -1, -1, -1, 70);
    }
    else
    {
    format(string,250,"\
    {007AFF}Besitzer: {FEFEFE}%s\n\
    {007AFF}Level: {FEFEFE}%d\n\n\
    Benutze die Taste 'ENTER' um in das Haus zu kommen.",
    hInfo[id][h_besitzer],hInfo[id][h_level]);
    hInfo[id][h_pickup] = CreatePickup(1272, 1, hInfo[id][hx],hInfo[id][hy],hInfo[id][hz],-1);
    hInfo[id][h_text] = Create3DTextLabel(string,COLOR_ROT,hInfo[id][hx],hInfo[id][hy],hInfo[id][hz],10,0,1);
    hInfo[id][h_pickup] = CreatePickup(1318, 1, hInfo[id][i_x],hInfo[id][i_y],hInfo[id][i_z],-1);
    DestroyDynamicMapIcon(hInfo[id][h_icon]);
    }
    return 1;
    }


    ocmd:sellhouse(playerid,params[])
    {
    if(pInfo[playerid][pEingeloggt] == 0)return SendClientMessage(playerid,COLOR_GRAU,"Info: Du bist nicht Eingeloggt!");
    new string[128];
    for(new i=0; i<sizeof(hInfo); i++)
    {
    if(!hInfo[i][db_id])continue;
    if(!IsPlayerInRangeOfPoint(playerid,2,hInfo[i][hx],hInfo[i][hy],hInfo[i][hz]))continue;
    if(!strlen(hInfo[i][h_besitzer]))continue;
    if(!strcmp(hInfo[i][h_besitzer], SpielerName(playerid),true))
    {
    GivePlayerMoney(playerid,hInfo[i][h_preis]/2);
    strmid(hInfo[i][h_besitzer], "",0,MAX_PLAYER_NAME,MAX_PLAYER_NAME);
    format(string,128,"** Du hast das Haus erfolgreich verkauft. Du erhälst: %d$ **",hInfo[i][h_preis]/2);
    SCM(playerid,COLOR_GELB,string);
    SCM(playerid,COLOR_GELB,"** Du erhälst nun 3 prozent weniger Zinsen zum Payday!");
    UpdateHaus(i);
    SaveHaus(i);
    pInfo[playerid][pZinsen] -=3;
    return 1;
    }
    return SCM(playerid,COLOR_GRAU,"Du bist nicht der Besitzer des Hauses!");
    }
    return 1;
    }

  • Simon: Ich kann mir eigentlich nicht vorstellen, dass der Fehler von SA-MP kommt. ( zumindest habe ich noch nicht davon gehört )
    Scheint so, als würden sich die Variablen beim update überschneiden. Kannst ja mal schaun, ob du beim Updaten der Geschwindigkeit bzw. beim Updaten der Taxi-Kosten eine Variable falsch verwendest.

  • Ja, das wäre eine Möglichkeit. Man müsste dann eben noch einen Befehl erstellen, der bei Bedarf die Daten neu aus der Datenbank ausließt.
    Allerdings kommt es darauf an, wie viele Nachrichten man hat, denn man muss beachten, dass man ja für jede Nachricht dann Speicherplatz in Form eines Arrays reservieren muss, und das kann viel werden, allerdings denke ich, dass das kein Problem werden sollte, da keiner 1 Million Nachrichten hat.

    Ist zwar auch nicht ganz so performant wie es direkt in den Code zu schreiben, allerdings hat man die Möglichkeit die Nachrichten im laufenden Betrieb anzupassen, das kann man also durchaus so machen, da der Nutzen dem Verbrauch überwiegt.
    Das wäre für ein mehrsprachiges System sicherlich eine der besten Möglichkeiten.


    Ich habe da noch nen inlcude von mir was ich gerne benutzte habe es mal angehangen, mit deisem ist es auch möglich eingefügte Variablen zu verschieben etc. und ist somit nicht an dem normalen Format gebunden.
    Das ganze läuft über files. Es hat ein paar kleine Ahnnähmlichlkeiten, so kann mann mehrere Files nutzen um es übersichtlich zu halten und man kann auch direkt Wörter oder ähnliches aus anderen Files hineinschreiben.


    Hier mal ein wenig Beispielcode:
    Herausholen eines Textes und direkt Formatieren mit Varbiablen:
    new lstr[2][126];
    GetLangVar(LANG[0],"ChatP","%sPlayer% %sText%",lstr[0],sizeof(lstr[]),GetName(playerid),text),//LANG ist ein Array indem die sprachen als 2 Buchstabige Abkürzungen stehen: In diesem Fall "DE" und "EN"
    GetLangVar(LANG[1],"ChatP","%sPlayer% %sText%",lstr[1],sizeof(lstr[]),GetName(playerid),text),
    SendClientMessage(playerid,COLOR_WHITE,lstr[SpielerInfo[playerid][pLang]]);


    Auszug der DAYZ_DE.txt: (DAYZ kommt durch ein define welches oberhalb der inculde liegt: #define DT_lf_prefix "DAYZ" )

    Code
    ChatP={A0A0A0}%sPlayer% sagt: {FFFFFF}%sText%
    ChatA={FF0000}%sPlayer% sagt: {FFFFFF}%sText%


    Auszug der DAYZ_EN.txt

    Code
    ChatP={A0A0A0}%sPlayer% tell: {FFFFFF}%sText%
    ChatA={FF0000}%sPlayer% tell: {FFFFFF}%sText%


    Einen Dialog mit format erstellen und Texte aus einer anderen Datei holen:
    new string[126];
    new tmp0[2][45];
    GetLangVar(LANG[SpielerInfo[playerid][pLang]],"Dia:Regist","",tmp0[0],sizeof(tmp0[]));
    GetLangVar(LANG[SpielerInfo[playerid][pLang]],"Dia:Regeln","",tmp0[1],sizeof(tmp0[]));
    GetLangVar(LANG[SpielerInfo[playerid][pLang]],"Dia:RegistText","%sIP%",string,sizeof(string),GetIP(playerid));
    ShowPlayerDialog(playerid,DIALOG_REGISTER,DIALOG_STYLE_PASSWORD,tmp0[0],string,tmp0[0],tmp0[1]);


    Auszug der DAYZ_DE_Dia.txt:

    Code
    Regeln=Regeln
    Regist=Registrieren
    RegistText={FEFEFE}Bitte wähle ein Passwort um dir einen {969696}Account {FEFEFE}zu erstellen!%n%Deine IP {969696}%sIP%{FEFEFE} wird aus Sicherheitsgründen gespeichert.
    %h%%n%%n%Mit der Registrierung stimmst du automatisch unseren {969696}Regeln{FEFEFE} zu.


    Auszug der DAYZ_EN_dia.txt

    Code
    RegistText={FEFEFE}Please choose a password to create an {969696}account{FEFEFE}!%n%Your IP {969696}%sIP%{FEFEFE} will be logged for security.
    %h%%n%%n%By registering you agree to our {969696}rules{FEFEFE} automatically.


    Erläuterung:
    %n% beginnt eine neue Zeile im script wie \n
    %h% benutzt diese Zeile zur vorherigen zeile


    Erstellen eines Dialogs ohen Format direkt mit der Include:
    new tmp[45];
    GetLangVar(LANG[SpielerInfo[playerid][pLang]],"Kick:PermBan","",tmp,sizeof(tmp));
    ShowPlayerLangDia(playerid,DIALOG_BAN,DIALOG_STYLE_MSGBOX,LANG[SpielerInfo[playerid][pLang]],tmp,"Kick:PermBanT","Dia:ButOk","");


    Auszug aus der DAYZ_DE_Kick.txt

    Code
    PermBan={FFFFFF}Permanenter Ban
    PermBanT={FFFFFF}Du wurdest von diesem Server {FF000F}permanent {FFFFFF}gebannt!


    Einige erklärungen zu den Tags:


    Feste Tags:
    %n% neue zeile wie bei \n
    %h% am anfang einer zeile: diese Zeile gehört zur vorhergegangenen Zeile (kann mehrmals eingesetzt werden)


    Interne Tags:
    %xIwas% Ruft den Text Iwas aus den Sprachdateien auf und baut ihn ander stelle ein.
    Beispiel:
    DAYZ_DE.txt:

    Code
    KeinBenzin=Du hast kein Benzin für die %xItem:Kettens%!


    DAYZ_DE_Item.txt:

    Code
    Kettens=Kettensäge


    Externe Tags für Variablen:
    diese sind für Format und funktionieren ähnlich, nur dass man den Variablen Namen gibt.
    %sText%
    %dNummer%


    entscheidend ist der Aufbau:
    % - Identifikation -Name - %
    als Identifikation gibt es nur:
    d - Nummer
    f - Float
    s - String

  • [DT]Sniper:
    Jo, das ist auch eine gute Variante für Leute die gerne auf MySQL verzichten (wie ich :D).



    Pascal.:
    Du erstellst zwei Pickups in die gleiche Variable.
    Schreibe es so:


    Spoiler anzeigen
    UpdateHaus(id)
    {
    new string[250];
    if(hInfo[id][h_pickup] != -1)
    {
    DestroyPickup(hInfo[id][h_pickup]);
    }
    if(hInfo[id][h_ipickup] != -1)
    {
    DestroyPickup(hInfo[id][h_ipickup]);
    hInfo[id][h_ipickup] = -1;
    }
    if(hInfo[id][h_text] != Text3D:-1)
    {
    Delete3DTextLabel(hInfo[id][h_text]);
    }
    if(!strlen(hInfo[id][h_besitzer]))
    {
    printf("Kein Besitzer");
    format(string,250,"\
    {007AFF}Besitzer: {FEFEFE}-unbekannt-\n\
    {007AFF}Level: {FEFEFE}%d\n\
    {007AFF}Kaufpreis: {FEFEFE}%d$\n\
    {007AFF}Beschreibung: {FEFEFE}Dieses Haus steht zum Verkauf.\n\n\
    Benutze /buyhouse um das Haus zu kaufen",
    hInfo[id][h_level],hInfo[id][h_preis]);
    hInfo[id][h_pickup] = CreatePickup(1273, 1, hInfo[id][hx],hInfo[id][hy],hInfo[id][hz],-1);
    hInfo[id][h_text] = Create3DTextLabel(string,COLOR_ROT,hInfo[id][hx],hInfo[id][hy],hInfo[id][hz],10,0,1);
    hInfo[id][h_lock] = 1;
    hInfo[id][h_icon] = CreateDynamicMapIcon(hInfo[id][hx],hInfo[id][hy],hInfo[id][hz], 31, -1, -1, -1, -1, 70);
    }
    else
    {
    format(string,250,"\
    {007AFF}Besitzer: {FEFEFE}%s\n\
    {007AFF}Level: {FEFEFE}%d\n\n\
    Benutze die Taste 'ENTER' um in das Haus zu kommen.",
    hInfo[id][h_besitzer],hInfo[id][h_level]);
    hInfo[id][h_pickup] = CreatePickup(1272, 1, hInfo[id][hx],hInfo[id][hy],hInfo[id][hz],-1);
    hInfo[id][h_text] = Create3DTextLabel(string,COLOR_ROT,hInfo[id][hx],hInfo[id][hy],hInfo[id][hz],10,0,1);
    hInfo[id][h_ipickup] = CreatePickup(1318, 1, hInfo[id][i_x],hInfo[id][i_y],hInfo[id][i_z],-1);
    DestroyDynamicMapIcon(hInfo[id][h_icon]);
    }
    return 1;
    }


    Das "h_ipickup" deklarierst du im enum, und initialisierst es mit -1 gleich wie "h_pickup".

  • Jeffry: kannst es gerne nutzen.


    Haha, Danke, aber dann müsste ich 5 Jahre Arbeit umschreiben, da tu ich mir nicht an, zudem dass mein Server sowieso nicht multilingual ist, sondern nur Englisch.
    Sonst hätte ich mir das schon lange gemacht. :D


    Übrigens, zu deinem System, ich hab den Code mal überflogen. Da der RAM bei 99% aller Server eigentlich keine Rolle mehr spielt (die haben alle 16GB oder mehr), wäre es besser die Daten beim Server-Start zu laden und über ein Array auszugeben, bzw. über Spieler-Variablen Dummies, auszugeben. Sonst kann es bei vielen Spielern möglicherweise zu Problemen kommen, wenn man andauernd die Datei ausliest, da SA-MP ja bekanntlich nur einen Kern unterstützt.
    Aber wie gesagt, für jemanden den auf der Suche nach sowas ist, ist es sicherlich sehr praktisch.



    Ich denke es ist ganz geschickt wenn ich hier gleich noch auf die MySQL Version verweise, dann haben wir hier beide Varianten:
    MySQL Plugin von BlueG R7 Stock aufrufen?

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