Beiträge von Manyula

    Hallo,


    ich habe mich gefragt, ob es möglich ist eine Taste gänzlich zu unterdrücken, und zwar, in meinem speziellen Fall, die Sprint-Taste.
    TogglePlayerControllable sperrt ja alle Tasten, also trifft das nicht so genau meine Absichten.


    Ist das möglich, oder braucht es hierfür clientseitige Veränderungen?

    Also setzt der Oder Operator eine neue Bedingung?


    Wie steht es dann eig, wenn ich alle von || betroffenen Sachen in Klammern mache?
    if(issuerid != INVALID_PLAYER_ID && (weaponid == SNIPER_RIFLE || weaponid == COUNTRY_RIFLE) && bodypart == BODY_PART_HEAD && GetPlayerVirtualWorld(playerid) == 0)

    public OnPlayerTakeDamage(playerid, issuerid, Float:amount, weaponid, bodypart)
    {
    if(issuerid != INVALID_PLAYER_ID && weaponid == SNIPER_RIFLE || weaponid == COUNTRY_RIFLE || weaponid == DESERT_EAGLE && bodypart == BODY_PART_HEAD && GetPlayerVirtualWorld(playerid) == 0)
    {
    SetPlayerHealth(playerid, 0);
    GameTextForPlayer(playerid, "Headshot", 2000, 4);
    }
    return BP_OnPlayerTakeDamage(playerid, issuerid, Float:amount, weaponid, bodypart);
    }


    forward BP_OnPlayerTakeDamage(playerid, issuerid, Float:amount, weaponid, bodypart);
    #if defined _ALS_OnPlayerTakeDamage
    #undef OnPlayerTakeDamage
    #else
    #define _ALS_OnPlayerTakeDamage
    #endif
    #define OnPlayerTakeDamage BP_OnPlayerTakeDamage


    Soweit ich weiß ist "||" doch der Operator entsprechend "oder", nicht wahr? Jedoch zeigt er mir bei jedem Körperteil einen Headshot an. Soweit ich mich entsinne bringt ein "&&" Operator in der Hinsicht auch nichts...

    Es klappt alles, danke für deine Hilfe!


    Mich würden Speedtests auch mal interessieren. ;)


    Wenn ichs mir recht überlege, könnte man das Tutorial doch zu einer Include bringen. Ich kann mir vorstellen, dass das sehr viel mehr genutzt werden würde, als sich jemand das Tutorial hier durchliest und es auf eigene Faust versucht.

    Okay, nun kompiliert es schon einmal.


    Das nächste Problem türmt sich auf.
    Wenn ich nun ein DM betrete bzw. verlasse, wird automatisch der Dialog sofort angezeigt. Das wird wohl an der Funktion UpdateDialogForAll liegen. Wie verändere ich sie, dass der Dialog zwar für alle geändert wird, aber nicht für den SPieler angezeigt wird, der den CMD ausführt?


    Ich habe mir etwas in der Richtung gedacht...
    stock UpdateDialogForAll(playerid, dialogid) //"playerid" hinzugefügt
    {
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(DialogOpened[i] == dialogid)
    {
    if(i != playerid) ShowPlayerDialog(i, DialogOpened[i], DIALOG_STYLE_LIST, Caption[DialogOpened[i]], Info[DialogOpened[i]], Button1[DialogOpened[i]], Button2[DialogOpened[i]]); //if-Abfrage hinzugefügt
    }
    }
    return 1;
    }

    Ja, so in der Art, allerdings nicht mit der DM ID als Parameter, sondern einen separaten Befehl für jedes DM (/dm1, /dm2, /dm3,...).


    Nehmen wir mal DM1 als Beispiel:
    COMMAND:dm1(playerid, params[])
    {
    new Random = random(sizeof(RandomSpawnsDM1)),
    pName[MAX_PLAYER_NAME],
    stringDE[128],
    stringEN[128];
    GetPlayerName(playerid, pName, sizeof(pName));
    format(stringDE, sizeof(stringDE), "»DEATHMATCH« {%06x}%s "#C_DM_E"hat das DM1 betreten! [/DM1]", GetPlayerColor(playerid) >>> 8, pName);
    format(stringEN, sizeof(stringEN), "»DEATHMATCH« {%06x}%s "#C_DM_E"has joined DM1! [/DM1]", GetPlayerColor(playerid) >>> 8, pName);
    AddToDM(playerid, stringDE, stringEN, RandomSpawnsDM1[Random][0], RandomSpawnsDM1[Random][1], RandomSpawnsDM1[Random][2], RandomSpawnsDM1[Random][3], DESERT_EAGLE, 5000, SHOTGUN, 5000, SNIPER_RIFLE, 5000, 0, 0, 1, 0);
    DM1_Counter++;


    new olditem[128],
    newitem[128];
    format(olditem, sizeof(olditem), GetItemFromDialog(dialogid, U_DIALOG_DM_DE));
    format(newitem, sizeof(newitem), "[%d] DM1 [Sniper, Desert Eagle, Shotgun]", DM1_Counter);
    UpdateItemInDialog(U_DIALOG_DM_DE, olditem, newitem);
    format(olditem, sizeof(olditem), GetItemFromDialog(dialogid, U_DIALOG_DM_EN));
    format(newitem, sizeof(newitem), "[%d] DM1 [Sniper, Desert Eagle, Shotgun]", DM1_Counter);
    UpdateItemInDialog(U_DIALOG_DM_EN, olditem, newitem);
    return 1;
    }


    Hier zeigt er mir error 017: undefined symbol "dialogid" an, da "dialogid" in UpdateUtemInDialog ja nicht definiert ist.

    Hallo!


    new Combo[MAX_PLAYERS];
    new Combo_Timer[MAX_PLAYERS];


    public OnPlayerDeath(playerid, killerid, reason)
    {
    KillTimer(Combo_Timer[killerid]);
    Combo[killerid]++;
    Combo_Timer[killerid] = SetTimerEx("ComboTimer", 10*1000, false, "i", killerid);
    return CMB_OnPlayerDeath(playerid, killerid, reason);
    }


    forward CMB_OnPlayerDeath(playerid, killerid, reason);
    #if defined _ALS_OnPlayerDeath
    #undef OnPlayerDeath
    #else
    #define _ALS_OnPlayerDeath
    #endif
    #define OnPlayerDeath CMB_OnPlayerDeath


    //==============================================================================================================================================================================================================================


    forward ComboTimer(killerid); //error 055: start of function body without function header
    public ComboTimer(killerid)
    { //error 010: invalid function or declaration
    Combo[killerid] = 0;
    return 1;
    }


    Die Errors sind im Code kommentiert! Was genau mache ich falsch?

    Da haben sich ein paar Fehler in meiner Übersetzung im Englischen Forum eingeschlichen, ich werde sie bei Gelegenheit ausbessern, tut mir Leid.^^


    Allerdings ist mir noch nicht klar wohin genau das hin muss.
    format(tmpstr, 128, GetItemFromDialog(dialogid, DM_ID_HIER));
    //dann das neue Item formatieren, also mit switch-case über die DM_ID neu setzen
    switch(DM_ID_VARIABLE)
    {
    case 0: format(newstr, 128, "[%d] DM2 [Desert Eagle, Combat Shotgun]", Spieler_In_dem_DM_0);
    //usw...
    }
    //Dann updaten:
    UpdateItemInDialog(dialogid_von_DE, tmpstr, newstr); //Die Funktion steht In Post #17


    //Dann das gleiche nochmal für Englisch machen.


    Was genau wäre denn z.B. die DM_ID_VARIABLE? Wo müsste ich die vorher benutzt haben?

    D:\Documents\San Andreas Unleashed\gamemodes\brawl.pwn(1276) : error 029: invalid expression, assumed zero
    D:\Documents\San Andreas Unleashed\gamemodes\brawl.pwn(1312) : warning 203: symbol is never used: "dialogid"
    D:\Documents\San Andreas Unleashed\gamemodes\brawl.pwn(1328) : error 033: array must be indexed (variable "-unknown-")


    Error Nr.1
    stock ShowUpdateDialog(playerid, dialogid, style, caption[], info[], button1[], button2[])
    {
    DialogOpened[playerid] = dialogid;
    ShowPlayerDialog(playerid, dialogid, style, caption[], info[], button1[], button2[]); //Zeile 1276
    if(dialogid > -1 && dialogid < MAX_DIALOGS)
    {
    format(Caption[dialogid], sizeof(Caption[]), caption);
    format(Info[dialogid], sizeof(Info[]), info);
    format(Button1[dialogid], sizeof(Button1[]), button1);
    format(Button2[dialogid], sizeof(Button2[]), button2);
    }
    return 1;
    }


    Error Nr.2
    stock UpdateDialogForAll(dialogid) //Zeile 1312
    {
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    {
    ShowPlayerDialog(i, DialogOpened[i], DIALOG_STYLE_LIST, Caption[DialogOpened[i]], Info[DialogOpened[i]], Button1[DialogOpened[i]], Button2[DialogOpened[i]]);
    }
    }
    return 1;
    }


    Error Nr.3
    stock GetItemFromDialog(dialogid, listitem)
    {
    new string[64], count, lastpos = -1, tmp[sizeof(Info[])];
    for(new i = 0; i < strlen(Info[dialogid]); i++)
    {
    if(Info[dialogid][i] == "\n") //Zeile 1328
    {
    if(count == listitem)
    {
    tmp = Info[dialogid];
    strdel(tmp, i, strlen(Info[dialogid]));
    strdel(tmp, 0, lastpos + 1);
    break;
    }
    count++;
    lastpos = i;
    }
    }
    format(string, sizeof(string), tmp);
    return string;
    }

    if(l_pos != -1) strdel(Info[dialogid], l_pos, l_pos+strlen(item)+1);


    if(ItemPosition != -1) strdel(Info[dialogid], ItemPosition, ItemPosition+strlen(item) + 1);


    Also, ich sehe keinen Unterschied, außer dem Namen der Variable...

    Die AddItemToDialog Funktion habe ich nicht verändert, nur den Namen der Variable. Selbst, wenn ich die Funktion aus deinem Tutorial kopiere bleiben die Errors.
    stock AddItemToDialog(dialogid, item[])
    {
    new l_pos = strfind(Info[dialogid], item);
    if(l_pos != -1) strdel(Info[dialogid], l_pos, l_pos+strlen(item)+1);
    format(Info[dialogid], sizeof(Info[]), "%s%s\n", Info[dialogid], item);
    return UpdateDialogForAll(dialogid);
    }

    Das ist ne ziemlich verzwickte Sache...


    Also, ich hab es jetzt einmal weitgehendst versucht umzusetzen.


    public OnGameModeInit()
    {
    //Updating Dialogs
    AddItemToDialog(U_DIALOG_DM_DE, "[0] DM1 [Sniper, Desert Eagle, Shotgun]");
    AddItemToDialog(U_DIALOG_DM_DE, "[0] DM2 [Desert Eagle, Combat Shotgun]");
    AddItemToDialog(U_DIALOG_DM_DE, "[0] DM3 [Sawnoff Shotgun, Uzi]");
    AddItemToDialog(U_DIALOG_DM_DE, "[0] DM4 [Katana]");
    AddItemToDialog(U_DIALOG_DM_DE, "[0] DM5 [Minigun]");
    AddItemToDialog(U_DIALOG_DM_DE, "[0] PB [Country Rifle]");
    AddItemToDialog(U_DIALOG_DM_DE, "[0] BF [M4, Uzi, Granaten, Combat Shotgun, Raketenwerfer]");

    AddItemToDialog(U_DIALOG_DM_EN, "[0] DM1 [Sniper, Desert Eagle, Shotgun]");
    AddItemToDialog(U_DIALOG_DM_EN, "[0] DM2 [Desert Eagle, Combat Shotgun]");
    AddItemToDialog(U_DIALOG_DM_EN, "[0] DM3 [Sawnoff Shotgun, Uzi]");
    AddItemToDialog(U_DIALOG_DM_EN, "[0] DM4 [Katana]");
    AddItemToDialog(U_DIALOG_DM_EN, "[0] DM5 [Minigun]");
    AddItemToDialog(U_DIALOG_DM_EN, "[0] PB [Country Rifle]");
    AddItemToDialog(U_DIALOG_DM_EN, "[0] BF [M4, Uzi, Grenades, Combat Shotgun, Rocket Launcher]");
    return 1;
    }


    new DM1_Counter;


    COMMAND:dm1(playerid, params[])
    {
    new Random = random(sizeof(RandomSpawnsDM1)),
    pName[MAX_PLAYER_NAME],
    stringDE[128],
    stringEN[128];
    GetPlayerName(playerid, pName, sizeof(pName));
    format(stringDE, sizeof(stringDE), "»DEATHMATCH« {%06x}%s "#C_DM_E"hat das DM1 betreten! [/DM1]", GetPlayerColor(playerid) >>> 8, pName);
    format(stringEN, sizeof(stringEN), "»DEATHMATCH« {%06x}%s "#C_DM_E"has joined DM1! [/DM1]", GetPlayerColor(playerid) >>> 8, pName);
    AddToDM(playerid, stringDE, stringEN, RandomSpawnsDM1[Random][0], RandomSpawnsDM1[Random][1], RandomSpawnsDM1[Random][2], RandomSpawnsDM1[Random][3], DESERT_EAGLE, 5000, SHOTGUN, 5000, SNIPER_RIFLE, 5000, 0, 0, 1, 0);

    DM1_Counter++;
    format(olditem, 128, GetItemFromDialog(dialogid, U_DIALOG_DM_DE)); //Zeile 498
    format(newitem, 128, "[%d] DM1 [Sniper, Desert Eagle, Combat Shotgun]", DM1_Counter); //Zeile 499
    UpdateItemInDialog(U_DIALOG_DM_DE, olditem, newitem); //Zeile 500


    format(olditem, 128, GetItemFromDialog(dialogid, U_DIALOG_DM_EN)); //Zeile 502
    format(newitem, 128, "[%d] DM1 [Sniper, Desert Eagle, Combat Shotgun]", DM1_Counter); //Zeile 503
    UpdateItemInDialog(U_DIALOG_DM_EN, olditem, newitem); //Zeile 504
    return 1;
    }


    COMMAND:dm(playerid, params[])
    {
    if(pInfo[playerid][Language] == LANGUAGE_DE) ShowUpdateDialog(playerid, U_DIALOG_DM_DE, DIALOG_STYLE_LIST, "Deathmatches", GetDialogInfo(U_DIALOG_DM_DE), "Beitreten", "Schließen");
    if(pInfo[playerid][Language] == LANGUAGE_EN) ShowUpdateDialog(playerid, U_DIALOG_DM_EN, DIALOG_STYLE_LIST, "Deathmatches", GetDialogInfo(U_DIALOG_DM_EN), "Join", "Close");
    return 1;
    }


    D:\Documents\San Andreas Unleashed\pawno\include\Systems\Deathmatches.inc(498) : error 017: undefined symbol "olditem"
    D:\Documents\San Andreas Unleashed\pawno\include\Systems\Deathmatches.inc(499) : error 017: undefined symbol "newitem"
    D:\Documents\San Andreas Unleashed\pawno\include\Systems\Deathmatches.inc(500) : error 017: undefined symbol "olditem"
    D:\Documents\San Andreas Unleashed\pawno\include\Systems\Deathmatches.inc(502) : error 017: undefined symbol "olditem"
    D:\Documents\San Andreas Unleashed\pawno\include\Systems\Deathmatches.inc(503) : error 017: undefined symbol "newitem"
    D:\Documents\San Andreas Unleashed\pawno\include\Systems\Deathmatches.inc(504) : error 017: undefined symbol "olditem"
    ____________________________________________________________________________________________________________________________________________________________________________________________________________________________


    stock ShowUpdateDialog(playerid, dialogid, style, caption[], info[], button1[], button2[])
    {
    DialogOpened[playerid] = dialogid;
    ShowPlayerDialog(playerid, dialogid, style, caption[], info[], button1[], button2[]); //Zeile 1276
    if(dialogid > -1 && dialogid < MAX_DIALOGS)
    {
    format(Caption[dialogid], sizeof(Caption[]), caption);
    format(Info[dialogid], sizeof(Info[]), info);
    format(Button1[dialogid], sizeof(Button1[]), button1);
    format(Button2[dialogid], sizeof(Button2[]), button2);
    }
    return 1;
    }


    stock AddItemToDialog(dialogid, item[])
    {
    new ItemPosition = strfind(Info[dialogid], item);
    if(ItemPosition != -1) strdel(Info[dialogid], ItemPosition, ItemPosition(item) + 1); //Zeile 1299
    format(Info[dialogid], sizeof(Info[]), "%s%s\n", Info[dialogid], item);
    return UpdateDialogForAll(dialogid);
    }


    D:\Documents\San Andreas Unleashed\gamemodes\brawl.pwn(1276) : error 029: invalid expression, assumed zero
    D:\Documents\San Andreas Unleashed\gamemodes\brawl.pwn(1299) : error 012: invalid function call, not a valid address
    D:\Documents\San Andreas Unleashed\gamemodes\brawl.pwn(1299) : warning 215: expression has no effect
    D:\Documents\San Andreas Unleashed\gamemodes\brawl.pwn(1299) : error 001: expected token: ";", but found ")"
    D:\Documents\San Andreas Unleashed\gamemodes\brawl.pwn(1299) : error 029: invalid expression, assumed zero
    D:\Documents\San Andreas Unleashed\gamemodes\brawl.pwn(1299) : fatal error 107: too many error messages on one line

    Folgendes: Ich habe diese Funktion hier, die mir die if-Abfragen erspart.
    stock ShowLanguageDialog(playerid, dialogid, style, captionDE[], captionEN[], infoDE[], infoEN[], button1DE[], button1EN[], button2DE[], button2EN[])
    {
    if(pInfo[playerid][Language] == LANGUAGE_DE) return ShowPlayerDialog(playerid, dialogid, style, captionDE, infoDE, button1DE, button2DE);
    else if(pInfo[playerid][Language] == LANGUAGE_EN) return ShowPlayerDialog(playerid, dialogid, style, captionEN, infoEN, button1EN, button2EN);
    return 1;
    }


    Deswegen hab ich bereits in den stock Funktionen an sich zu unterscheiden, damit das mit der genannten Funktion harmoniert.


    Und nochmal, brauch ich dann separate dialogids für beide Sprachen?
    COMMAND:dm(playerid, params[])
    {
    if(pInfo[playerid][Language] == LANGUAGE_DE) ShowUpdateDialog(playerid, DIALOG_DM, DIALOG_STYLE_LIST, "Deathmatches", GetDialogInfo(dialogid_von_DE), "Schließen", "Beitreten")
    if(pInfo[playerid][Language] == LANGUAGE_EN) ShowUpdateDialog(playerid, DIALOG_DM, DIALOG_STYLE_LIST, "Deathmatches", GetDialogInfo(dialogid_von_EN), "Close", "Join")
    return 1;
    }
    Hier habe ich ja in beiden Dialogen dieselbe dialogid.

    Ja, die Reihenfolge soll erhalten bleiben. Wäre schön, wenn du das noch in das Tutorial integrieren könntest! :thumbup:


    Heißt das, ich brauche 2 dialogids für zwei Sprachen?
    Also, ich hab jetzt mal versucht mein Sprachsystem in die Funktionen einzubauen.


    Spoiler anzeigen
    stock ShowUpdateDialog(playerid, dialogid, style, captionDE[], captionEN[], infoDE[], infoEN[], button1DE[], button1EN[], button2DE[], button2EN[])
    {
    DialogOpened[playerid] = dialogid;
    ShowLanguageDialog(playerid, dialogid, style, captionDE[], captionEN[], infoDE[], infoEN[], button1DE[], button1EN[], button2DE[], button2EN[]);
    if(dialogid > -1 && dialogid < MAX_DIALOGS)
    {
    if(pInfo[playerid][Language] == LANGUAGE_DE)
    {
    format(CaptionDE[dialogid], sizeof(CaptionDE[]), caption);
    format(InfoDE[dialogid], sizeof(InfoDE[]), info);
    format(Button1DE[dialogid], sizeof(Button1DE[]), button1);
    format(Button2DE[dialogid], sizeof(Button2DE[]), button2);
    }
    if(pInfo[playerid][Language] == LANGUAGE_EN)
    {
    format(CaptionEN[dialogid], sizeof(CaptionEN[]), caption);
    format(InfoEN[dialogid], sizeof(InfoEN[]), info);
    format(Button1EN[dialogid], sizeof(Button1EN[]), button1);
    format(Button2EN[dialogid], sizeof(Button2EN[]), button2);
    }
    }
    return 1;
    }

    Spoiler anzeigen
    stock GetPlayerDialog(playerid)
    {
    return DialogOpened[playerid];
    }

    Spoiler anzeigen
    stock GetDialogCaption(playerid, dialogid)
    {
    if(pInfo[playerid][Language] == LANGUAGE_DE) return CaptionDE[dialogid];
    if(pInfo[playerid][Language] == LANGUAGE_EN) return CaptionEN[dialogid];
    }

    Spoiler anzeigen
    stock GetDialogInfo(playerid, dialogid)
    {
    if(pInfo[playerid][Language] == LANGUAGE_DE) return InfoDE[dialogid];
    if(pInfo[playerid][Language] == LANGUAGE_EN) return InfoEN[dialogid];
    }

    Spoiler anzeigen
    stock GetDialogButton1(playerid, dialogid)
    {
    if(pInfo[playerid][Language] == LANGUAGE_DE) return Button1DE[dialogid];
    if(pInfo[playerid][Language] == LANGUAGE_EN) return Button1EN[dialogid];
    }

    Spoiler anzeigen
    stock GetDialogButton2(playerid, dialogid)
    {
    if(pInfo[playerid][Language] == LANGUAGE_DE) return Button2DE[dialogid];
    if(pInfo[playerid][Language] == LANGUAGE_EN) return Button2EN[dialogid];
    }

    Spoiler anzeigen
    stock AddItemToDialog(playerid, dialogid, item[])
    {
    new ItemPosition;
    if(pInfo[playerid][Language] == LANGUAGE_DE) ItemPosition = strfind(InfoDE[dialogid], item);
    if(pInfo[playerid][Language] == LANGUAGE_EN) ItemPosition = strfind(InfoEN[dialogid], item);
    if(ItemPosition != -1)
    {
    if(pInfo[playerid][Language] == LANGUAGE_DE)
    {
    strdel(InfoDE[dialogid], ItemPosition, ItemPosition(item) + 1);
    format(InfoDE[dialogid], sizeof(InfoDE[]), "%s%s\n", InfoDE[dialogid], item);
    }
    if(pInfo[playerid][Language] == LANGUAGE_EN)
    {
    strdel(InfoEN[dialogid], ItemPosition, ItemPosition(item) + 1);
    format(InfoEN[dialogid], sizeof(InfoEN[]), "%s%s\n", InfoEN[dialogid], item);
    }
    }
    return UpdateDialogForAll(dialogid);
    }

    Spoiler anzeigen
    stock RemoveItemFromDialog(playerid, dialogid, item[])
    {
    new ItemPosition;
    if(pInfo[playerid][Language] == LANGUAGE_DE) ItemPosition = strfind(InfoDE[dialogid], item);
    if(pInfo[playerid][Language] == LANGUAGE_EN) ItemPosition = strfind(InfoEN[dialogid], item);
    if(ItemPosition == -1) return 0;
    if(pInfo[playerid][Language] == LANGUAGE_DE) strdel(InfoDE[dialogid], ItemPosition, ItemPosition + strlen(item) + 1);
    if(pInfo[playerid][Language] == LANGUAGE_EN) strdel(InfoDE[dialogid], ItemPosition, ItemPosition + strlen(item) + 1);
    return UpdateDialogForAll(dialogid);
    }

    Spoiler anzeigen
    stock UpdateDialogForAll(dialogid)
    {
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    {
    ShowLanguageDialog(i, DialogOpened[i], DIALOG_STYLE_LIST, CaptionDE[DialogOpened[i]], CaptionEN[DialogOpened[i]], InfoDE[DialogOpened[i]], InfoEN[DialogOpened[i]], Button1DE[DialogOpened[i]], Button1EN[DialogOpened[i]], Button2DE[DialogOpened[i]], Button2EN[DialogOpened[i]]);
    }
    }
    return 1;
    }

    Spoiler anzeigen
    stock GetItemFromDialog(playerid, dialogid, listitem)
    {
    new l_str[64],
    c_count,
    l_lastpos = -1,
    tmpDE[sizeof(InfoDE[])],
    tmpEN[sizeof(InfoEN[])];

    Spoiler anzeigen
    if(pInfo[playerid][Language] == LANGUAGE_DE)
    {
    for(new i=0; i<strlen(InfoDE[dialogid]); i++)
    {
    if(InfoDE[dialogid][i] == "\n")
    {
    if(c_count == listitem)
    {
    tmpDE = InfoDE[dialogid];
    strdel(tmpDE, i, strlen(InfoDE[dialogid]));
    strdel(tmpDE, 0, l_lastpos+1);
    break;
    }
    c_count++;
    l_lastpos = i;
    }
    }
    format(l_str, sizeof(l_str), tmpDE);
    }
    if(pInfo[playerid][Language] == LANGUAGE_EN)
    {
    for(new i=0; i<strlen(InfoEN[dialogid]); i++)
    {
    if(InfoEN[dialogid][i] == "\n")
    {
    if(c_count == listitem)
    {
    tmpEN = InfoEN[dialogid];
    strdel(tmpEN, i, strlen(InfoEN[dialogid]));
    strdel(tmpEN, 0, l_lastpos+1);
    break;
    }
    c_count++;
    l_lastpos = i;
    }
    }
    format(l_str, sizeof(l_str), tmpEN);
    }
    return l_str;
    }

    Spoiler anzeigen
    stock UpdateItemInDialog(playerid, dialogid, olditem[], newitem[])
    {
    new l_pos;
    if(pInfo[playerid][Language] == LANGUAGE_DE) l_pos = strfind(InfoDE[dialogid], olditem);
    if(pInfo[playerid][Language] == LANGUAGE_EN) l_pos = strfind(InfoEN[dialogid], olditem);
    if(l_pos == -1) return 0;
    if(pInfo[playerid][Language] == LANGUAGE_DE) strdel(InfoDE[dialogid], l_pos, l_pos+strlen(olditem)+1);
    if(pInfo[playerid][Language] == LANGUAGE_EN) strdel(InfoEN[dialogid], l_pos, l_pos+strlen(olditem)+1);
    strcat(newitem, "\n", 256);
    if(pInfo[playerid][Language] == LANGUAGE_DE) strins(InfoDE[dialogid], newitem, l_pos);
    if(pInfo[playerid][Language] == LANGUAGE_EN) strins(InfoEN[dialogid], newitem, l_pos);
    return UpdateDialogForAll(dialogid);
    }


    Würde das so gehen? Oder gibt es einen einfacheren Weg?


    Außerdem, was meinst du mit "Dialog unter OnGameModeInit erstellen"? Ich bin es gewohnt das unter OnDialogResponse zu machen. 8|


    Edit: Code Updates.

    Das ist mir klar, deswegen "updaten" auch in Anführungsstrichen. Ich kann den Code größtenteils nachvollziehen, nur an der korrekten Anwendung hapert es noch ein wenig. Hoffentlich kann Jeffry da aushelfen.

    Ich versteh noch nicht so ganz, wie ich ein einziges listitem in einem Dialog "updaten" kann.


    Wenn ich nun diesen Dialog habe...
    COMMAND:dm(playerid, params[])
    {
    new stringDE[512],
    stringEN[512];
    format(stringDE, sizeof(stringDE), "[%d] DM1 [Sniper, Desert Eagle, Shotgun]\n[%d] DM2 [Desert Eagle, Combat Shotgun]\n[%d] DM3 [Sawnoff Shotgun, Uzi]\n");
    strcat(stringDE, "[%d] DM4 [Katana]\n[%d] DM5 [Minigun]\n[%d] Paintball [Country Rifle, 5mm Pistole]\n[%d] Battlefield [M4, Uzi, Granaten, Combat Shotgun, Raketenwerfer]");
    format(stringEN, sizeof(stringEN), "[%d] DM1 [Sniper, Desert Eagle, Shotgun]\n[%d] DM2 [Desert Eagle, Combat Shotgun]\n[%d] DM3 [Sawnoff Shotgun, Uzi]\n");
    strcat(stringEN, "[%d] DM4 [Katana]\n[%d] DM5 [Minigun]\n[%d] Paintball [Country Rifle]\n[%d] Battlefield [M4, Uzi, Grenades, Combat Shotgun, Rocket Launcher]");
    return ShowLanguageDialog(playerid, DIALOG_DM, DIALOG_STYLE_LIST, "Deathmatches", "Deathmatches", stringDE, stringEN, "OK", "OK", "Zurück", "Back");
    }


    ...und überall die aktuelle Spielerzahl zeigen möchte. Was muss ich dann genau in jedem einzelnen DM CMD und im Dialog machen lassen?


    Also, ich hab mir zuerst überlegt globale Variablen als Counter für jedes DM zu erstellen. Wenn ein Spieler das DM betritt, dann zähl ich das im CMD hoch und beim Verlassen wieder runter. Soweit so gut, das ist ja noch einfach. Muss ich dann gleich im CMD UpdateDialogForAll auch benutzen? Was genau muss ich eig im Dialog machen? Ich find das alles sehr verwirrend.^^

    Hallo,


    dieser kleine Code will nicht so recht funktionieren. Fehler entdecke ich grundsätzlich keine. Ich habe die Parameterreihenfolge beachtet. Was mache ich falsch?


    stock GivePlayerMoneyEx(playerid, money)
    {
    new mstring[15];
    if(money > 0) format(mstring, sizeof(mstring), "~g~+%d$", money);
    if(money < 0) format(mstring, sizeof(mstring), "~r~%d$", money);
    TextDrawSetString(MoneyTD[playerid], mstring); //Tag Mismatch. <================
    TextDrawShowForPlayer(playerid, MoneyTD[playerid]); //Tag Mismatch. <================
    GivePlayerMoney(playerid, money);
    SetTimerEx("MoneyTD_Timer", 3000, false, "i", playerid);
    return 1;
    }


    forward MoneyTD_Timer(playerid);
    public MoneyTD_Timer(playerid)
    {
    TextDrawHideForPlayer(playerid, MoneyTD[playerid]); //Tag Mismatch. <================
    return 1;
    }


    new PlayerText:MoneyTD[MAX_PLAYERS];


    public OnPlayerConnect(playerid)
    {
    MoneyTD[playerid] = CreatePlayerTextDraw(playerid, 496.000122, 81.303695, "+1000$");
    PlayerTextDrawLetterSize(playerid, MoneyTD[playerid], 0.326666, 1.371852);
    PlayerTextDrawAlignment(playerid, MoneyTD[playerid], 3);
    PlayerTextDrawColor(playerid, MoneyTD[playerid], -1);
    PlayerTextDrawSetShadow(playerid, MoneyTD[playerid], 0);
    PlayerTextDrawSetOutline(playerid, MoneyTD[playerid], 1);
    PlayerTextDrawBackgroundColor(playerid, MoneyTD[playerid], 51);
    PlayerTextDrawFont(playerid, MoneyTD[playerid], 3);
    PlayerTextDrawSetProportional(playerid, MoneyTD[playerid], 1);
    return TD_OnPlayerConnect(playerid);
    }


    Danke schonmal im voraus für eure Hilfe!

    Das "continue;" hat es nur noch mehr zerschossen. ;) Er hat mir bei jedem Durchwühlen alle Möglichkeiten ausgespuckt.


    Ich hab es nun.


    TrashCans_ID[i] = gettime() + 30*60;
    ...kommt unter TrashCanLoot(playerid, i);


    TrashCans_ID[i] = 0;
    Kommt weg, da überflüssig.


    Jetzt funktioniert es, danke ;)


    _________________________________________________________________________________________________________


    EDIT: Okay, das war ein Irrtum. Es funktioniert doch nicht. Es hat zunächst bei der ersten Mülltonne geklappt, bei der zweiten nicht mehr.
    Und das auch nur, wenn ich "i" statt "ii" bei SetTimerEx stehen hatte. bei "ii" kann ich nach dem Durchwühlen immer weiter wühlen.


    _________________________________________________________________________________________________________


    EDIT Nr.2: Kleines Update zur Problembeschreibung
    Wenn ich direkt nach dem Durchwühlen nochmal durchwühle, dann wird der Code irgendwie übergangen. Warte ich ein paar ms, dann funktioniert er.


    _________________________________________________________________________________________________________


    EDIT Nr.2: Tut mir Leid, wegen den vielen Edits. :wacko:
    Komischerweise ist es so, dass die Geschichte in Edit Nr.2 (Wiederholtes Durchwühlen einer Trashcan) klappt, wenn ich die Zeilen...


    AlreadySearching[playerid] = false;
    TrashCans_ID[i] = gettime() + 30*60;


    in der Timerfunktion ganz unten habe.


    Ich habe sie nun einmal probeweise gleich an den Anfang der Funktion gesetzt, und siehe da - es klappt. Das führt irgendwie zur Schlussfolgerung, dass die Funktion wohl etwas langsam sein müsste, also habe ich einmal gemessen. Jedoch kamen immer 0ms heraus.
    Also, ich weiß absolut nicht, woran es lag, aber nun klappt es. :thumbup: