Beiträge von Manyula

    if(dialogid == DIALOG_LANGUAGES_CMD)
    {
    if(!response) return 1;
    if(response)
    {
    if(listitem == 0)
    {
    pInfo[playerid][Language] = "Deutsch";
    SendLanguageMessage(playerid, COLOR_RED, "[SPIELERINFO] Du hast deine Sprache auf 'Deutsch [DE]' gesetzt!", "[PLAYERINFO] You set your language to 'German [GER]'!");
    }
    if(listitem == 1)
    {
    pInfo[playerid][Language] = "English";
    SendLanguageMessage(playerid, COLOR_RED, "[SPIELERINFO] Du hast deine Sprache auf 'Englisch [EN]' gesetzt!", "[PLAYERINFO] You set your language to 'English [EN]'!");
    }
    }
    }


    stock SendLanguageMessage(playerid, color, LanguageDE[], LanguageEN[])
    {
    if(strcmp(pInfo[playerid][Language], "Deutsch", true, strlen(pInfo[playerid][Language]))) return SendClientMessage(playerid, color, LanguageDE);
    if(strcmp(pInfo[playerid][Language], "English", true, strlen(pInfo[playerid][Language]))) return SendClientMessage(playerid, color, LanguageEN);
    return 1;
    }


    Wenn ich "Deutsch" auswähle, wird die Sprache auf Englisch gesetzt, und umgekehrt.
    Jemand eine Idee?
    Falls noch weiterer Code für die Lösung benötigt wird, bitte bescheid sagen.


    Danke!

    Spielerdaten laden.
    public loadaccount_user(playerid, name[], value[])
    {
    INI_String("Password", pInfo[playerid][Password], 129);
    INI_String("IP", pInfo[playerid][IP], 16);
    INI_Int("AdminLevel", pInfo[playerid][AdminLevel]);
    INI_Int("Money", pInfo[playerid][Money]);
    INI_Int("Bank", pInfo[playerid][Bank]);
    INI_Int("Score", pInfo[playerid][Score]);
    INI_Int("Kills", pInfo[playerid][Kills]);
    INI_Int("Deaths", pInfo[playerid][Deaths]);
    INI_String("Language", pInfo[playerid][Language], 8);


    Speichern:
    new INI:file = INI_Open(Path(playerid));
    INI_SetTag(file, "User Data");
    INI_WriteString(file, "IP", pInfo[playerid][IP]);
    INI_WriteInt(file, "AdminLevel", pInfo[playerid][AdminLevel]);
    INI_WriteInt(file, "Money", GetPlayerMoney(playerid));
    INI_WriteInt(file, "Bank", pInfo[playerid][Bank]);
    INI_WriteInt(file, "Score", GetPlayerScore(playerid));
    INI_WriteInt(file, "Kills", pInfo[playerid][Kills]);
    INI_WriteInt(file, "Deaths", pInfo[playerid][Deaths]);
    INI_WriteString(file, "Language", pInfo[playerid][Language]);
    INI_Close(file);


    Ich hab jetzt mal den Sprachen-Enumerator weggelassen, da ich alles kompakt in pInfo haben möchte, anstatt, dass ich jetzt noch nen Umweg über den anderen enum mache...
    Ich möchte praktisch keine bool Variable für die beiden Sprachen haben, sondern einen Stringvergleich machen.
    Also, wenn "Deutsch" in der Spielerdatei steht, dann soll eine deutsche Nachricht ausgegeben werden.

    Hallo,


    ich habe so meine Probleme mit Strings in Verbindung mit Y_INI.


    Ich hab folgende zwei enums:


    enum PlayerInfo
    {
    Password[129],
    IP[16],
    AdminLevel,
    Money,
    Bank,
    Score,
    Kills,
    Deaths,
    Language[8] //Als String für entweder "Deutsch" oder "English"
    }
    ...für die Spielerdaten, darunter auch die Sprache.


    enum Languages
    {
    LANGUAGE_DE[8], //jeweils als Strings deklariert, da ich ja keine Zahlenwerte haben möchte
    LANGUAGE_EN[8]
    }
    ...und noch für die verfügbaren Sprachen.


    Ich hab für beide Enumeratoren jeweils eine Variable erstellt, die darauf zugreift.
    new pInfo[MAX_PLAYERS][PlayerInfo];
    new pLanguage[MAX_PLAYERS][Languages];


    Jetzt möchte ich allerdings, dass in der Spielerdatei unter der Sprache ein String steht (Bsp: Language: English), und nicht der Zahlenwert der Sprache (Bsp: Language = 0).


    Weiß jmd weiter?
    Falls es sich jmd genauer anschauen möchte -> PN an mich und via TeamViewer.

    Das Ding ist halt, dass wenn ich alles im Dialog ausschreibe, dass die Zeile zu lang wird.
    Ich hab mir jetzt von strcat erhofft, dass ich den bereits vorhandenen string (stringDE bzw stringEN) mit diesem Zusatz, dass etwas beim Vorgang falsch ablief, zusammenkoppeln kann.


    Praktisch: Einzahlungsdialog


    "Gib den Betrag ein!"
    => Wenn nicht
    "Gib den Betrag ein!\n[ROT]Ungültig!"


    EDIT: Wie sieht es eig mit strpack aus? Geht damit was?

    Ich habe bei folgendem Dialog
    ShowLanguageDialog(playerid, DIALOG_BANK_DEPOSIT, DIALOG_STYLE_INPUT, "Einzahlen", "Deposit", strcat(stringDE, "\n"#COLOR_RED_EMBED"Bitte gib einen gültigen Betrag an!"), strcat(stringEN, "\n"#COLOR_RED_EMBED"Please enter a valid amount!"), "OK", "OK", "Abbrechen", "Cancel");


    den Error
    error 035: argument type mismatch (argument 6)


    und die stock Funktion dazu ist:
    stock ShowLanguageDialog(playerid, dialogid, style, captionDE[], captionEN[], infoDE[], infoEN[], button1DE[], button1EN[], button2DE[], button2EN[])
    {
    if(pLanguage[playerid][LANGUAGE_DE]) ShowPlayerDialog(playerid, dialogid, style, captionDE, infoDE, button1DE, button2DE);
    if(pLanguage[playerid][LANGUAGE_EN]) ShowPlayerDialog(playerid, dialogid, style, captionEN, infoEN, button1EN, button2EN);
    return 1;
    }


    Soweit ich sehen kann, habe ich keinen Argumenty type mismatch. Woran liegt das?

    Hi,


    ich habe neben einfachen multilingualen ClientMessages, nun auch eine stock Funktion für multilinguale Dialoge gebastelt.


    stock ShowLanguageDialog(playerid, dialogid, style, captionDE[], captionEN[], infoDE[], infoEN[], button1DE[], button1EN[], button2DE[], button2EN[])
    {
    if(pLanguage[playerid][LANGUAGE_DE]) ShowPlayerDialog(playerid, dialogid, style, captionDE, infoDE, button1DE, button2DE);
    if(pLanguage[playerid][LANGUAGE_EN]) ShowPlayerDialog(playerid, dialogid, style, captionEN, infoEN, button1EN, button2EN);
    return 1;
    }


    Soweit, so gut.


    Nun gehe ich durchs Script, und editiere alle normalen Dialoge, bis ich auf folgendes stoße.


    if(dialogid == DIALOG_CMD_OVERVIEW)
    {
    if(!response) return 1;
    if(response)
    {
    if(listitem == 0) return ShowLanguageDialog(playerid, DIALOG_TELEPORTS, DIALOG_STYLE_LIST, "Teleports", "Teleports", "Los Santos - LS\nSan Fierro - SF\nLas Venturas - LV", "Los Santos - LS\nSan Fierro - SF\nLas Venturas - LV", "OK", "OK", "Zurück", "Back");
    if(listitem == 1) return ShowLanguageDialog(playerid, DIALOG_DM, DIALOG_STYLE_LIST, "Deathmatches", "Deathmatches", "DM1 [Desert Eagle, Shotgun, Sniper]\nDM2 [Desert Eagle, Combat Shotgun, Rifle]\nDM3 [Sawnoff Shotgun, Uzi]\nDM4 [Kettensaege]\nDM5 [Minigun]\nPaintball (PB) [9mm, Country Rifle]", "DM1 [Desert Eagle, Shotgun, Sniper]\nDM2 [Desert Eagle, Combat Shotgun, Rifle]\nDM3 [Sawnoff Shotgun, Uzi]\nDM4 [Chainsaw]\nDM5 [Minigun]\nPaintball (PB) [9mm, Country Rifle]", "OK", "OK", "Zurück", "Back");
    if(listitem == 2) return ShowLanguageDialog(playerid, DIALOG_GENERAL, DIALOG_STYLE_LIST, "Spieler Befehle", "Player Commands", "/kill - Selbstmord\n/afk - Abwesend\n/back - Wieder anwesend\n/stats - Spielerstatistik\n/givecash [ID] [Betrag] - Geld geben", "/kill - Suicide\n/afk - Away From Keyboard\n/back - Back from AFK\n/stats - Player Statistics\n/givecash [ID] [Amount] - Give money", "OK", "OK", "Zurück", "Back");
    if(listitem == 3) return ShowLanguageDialog(playerid, DIALOG_JOB_CMDS, DIALOG_STYLE_LIST, "Job Befehle", "Job Commands", "Heilen (/heal [ID])\nReparieren (/repair)\nFestnehmen (/arrest [ID])\nBombe legen (/bomb)", "Heal (/heal [ID])\nRepair (/repair)\nArrest (/arrest)\nPlant bomb (/bomb)", "OK", "OK", "Zurück", "Back");
    }
    return 1;
    }


    D:\Documents\SAMP 0.3x\gamemodes\brawl.pwn(860) : error 075: input line too long (after substitutions)
    D:\Documents\SAMP 0.3x\gamemodes\brawl.pwn(861) : error 037: invalid string (possibly non-terminated string)
    D:\Documents\SAMP 0.3x\gamemodes\brawl.pwn(861) : error 017: undefined symbol "Bac"
    D:\Documents\SAMP 0.3x\gamemodes\brawl.pwn(862) : warning 217: loose indentation
    D:\Documents\SAMP 0.3x\gamemodes\brawl.pwn(862) : error 017: undefined symbol "k"
    D:\Documents\SAMP 0.3x\gamemodes\brawl.pwn(862) : warning 215: expression has no effect
    D:\Documents\SAMP 0.3x\gamemodes\brawl.pwn(862) : error 001: expected token: ";", but found ")"
    D:\Documents\SAMP 0.3x\gamemodes\brawl.pwn(862) : error 029: invalid expression, assumed zero
    D:\Documents\SAMP 0.3x\gamemodes\brawl.pwn(862) : fatal error 107: too many error messages on one line


    Zeile 860 ist das erste "listitem".


    Ich hoffe, jemand weiß weiter.


    Danke!


    EDIT: Hat sich erledigt. Hab probeweise mal die ganzen "return" entfernt, jetzt klappts.

    Jetzt versteh ich aber nicht, warum es heißt:
    pLanguage[i][LANGUAGE_DE]


    wobei das, was als zweites zwischen den Klammern steht, doch eigentlich der Name des Enumerators sein müsste, auf den die Variable zugreift? Also "Language".

    Okay, langsam.


    Ich hab nun folgendes:


    1. Ein Language enum.
    enum Language
    {
    LANGUAGE_DE,
    LANGUAGE_EN
    }


    2. Die Variable, die darauf zugreift.
    new pLanguage[MAX_PLAYERS][Language];


    Und 3. die stock Funktion.
    stock SendLanguageMessageToAll(color, LanguageDE[], LanguageEN[])
    {
    for(new i; i < MAX_PLAYERS; i++)
    {
    switch(pLanguage[i][Language])
    {
    case 0: SendClientMessage(i, color, LanguageDE);
    case 1: SendClientMessage(i, color, LanguageEN);
    }
    }
    return 1;
    }


    Jetzt erscheint mir die Fehlermeldung: array index out of bounds (variable "pLanguage")


    EDIT: Ich korrigiere:
    D:\Documents\SAMP 0.3x\gamemodes\brawl.pwn(2079) : error 032: array index out of bounds (variable "pLanguage")
    D:\Documents\SAMP 0.3x\gamemodes\brawl.pwn(2081) : error 035: argument type mismatch (argument 2)
    D:\Documents\SAMP 0.3x\gamemodes\brawl.pwn(2082) : error 035: argument type mismatch (argument 2)
    D:\Documents\SAMP 0.3x\gamemodes\brawl.pwn(2075) : warning 203: symbol is never used: "color"


    EDIT: Immer noch array index out of bounds (variable "pLanguage")

    Hi,


    Hab mir eine stock Funktion für LanguageMessages gebastelt, bekomme aber die Fehlermeldung "undefined symbol: "playerid".


    stock SendLanguageMessageToAll(color, LanguageDE[], LanguageEN[])
    {
    switch(pLanguage[playerid][Language])
    {
    case 0: SendClientMessageToAll(color, LanguageDE);
    case 1: SendClientMessageToAll(color, LanguageEN);
    }
    return 1;
    }


    Was ist falsch?


    Danke!

    Ich hab eine rein stylistische Frage.


    Ich habe den GameMode bisher rein Deutsch gemacht, und möchte nun Englisch hinzufügen.
    Die Frage ist, wie mache ich das am besten?


    Für alles nochmal seperate Dialoge und CMDs erstellen, oder innerhalb des Dialogs oder CMDS immer die Language-Variable abfragen?
    Ersteres würde meine Zeilenanzahl ja verdoppeln, zweiteres wäre da um einiges zeilensparender, bin mir aber nicht sicher, wie das ist, was die Übersicht betrifft.

    Ich bin gerade etwas aufgeschmissen, bzgl der "Eigenheiten" meines Banksystems.


    Folgendes möchte ich haben:


    Ein Spieler kann z.B. bei einer Bank per Dialog einen Betrag einzahlen. Soweit so gut.
    Nun bietet der Dialog (DIALOG_STYLE_INPUT) die Buttonoptionen "OK" und "Zurück".


    1. Wenn der Spieler NICHTS eingibt, dann wird automatisch der gesamte Betrag auf der Hand dem Konto hinzugefügt.
    2. Wenn der Spieler einen genauen Betrag eingibt, dann wird dieser vom Geld auf der Hand abgezogen und dem Konto hinzugefügt.


    Nun ist es aber auch so, dass der Spieler einen String eingeben kann, und dasselbe, wie bei 1. passiert.


    Anliegen: Ich möchte also abfragen können, ob ein String eingegeben wird, um eine Error-Message auszugeben. Wie baue ich das ein, und wo?


    if(dialogid == DIALOG_BANK_EINZAHLEN)
    {
    if(!response) return ShowPlayerDialog(playerid, DIALOG_BANK_ACCOUNTMANAGEMENT, DIALOG_STYLE_LIST, "Benutzerkonto", "Einzahlen\nAuszahlen", "OK", "Abbrechen");
    if(response)
    {
    if(!strval(inputtext))
    {
    new CurrentMoney = GetPlayerMoney(playerid);
    pInfo[playerid][Bank] = pInfo[playerid][Bank] + CurrentMoney;
    GivePlayerMoney(playerid, -CurrentMoney);
    }
    else
    {
    if(!strval(inputtext)) return ShowPlayerDialog(playerid, DIALOG_BANK_EINZAHLEN, DIALOG_STYLE_INPUT, "Einzahlen", "Bitte gib den Betrag ein, den du einzahlen willst.\nWenn du alles einzahlen möchtest, drücke einfach\nauf OK, ohne einen Betrag anzugeben.\n"#COLOR_RED_EMBED"Bitte gib einen Betrag an!", "OK", "Abbrechen");

    new CurrentMoney = GetPlayerMoney(playerid);
    if(strval(inputtext) > CurrentMoney) return ShowPlayerDialog(playerid, DIALOG_BANK_EINZAHLEN, DIALOG_STYLE_INPUT, "Einzahlen", "Bitte gib den Betrag ein, den du einzahlen willst.\nWenn du alles einzahlen möchtest, drücke einfach\nauf OK, ohne einen Betrag anzugeben.\n"#COLOR_RED_EMBED"Du hast nicht so viel Geld auf der Hand!", "OK", "Abbrechen");
    pInfo[playerid][Bank] = pInfo[playerid][Bank] + strval(inputtext);
    GivePlayerMoney(playerid, -strval(inputtext));
    }
    }
    return 1;
    }

    Bin am Handy, deswegen ists bisschen umständlich. Loose indendation heißt generell, dass etwas falsch eingerückt ist. Und "Spielerladenn" existiert nicht, da deine stock Funktion "Spielerladen" heißt.
    So schwer ist das ganze nicht.

    Genau, Firerfan hats erfasst.
    Extra einen neuen Dialog dafür zu machen find ich ne blöde Lösung, also lass ichs einfach so, wie es ist, und weiße auf die Funktionsweise im Beschreibungstext zum Dialog hin.


    Vielen Dank!


    ~done.