Aktuelle Score auslesen und Updaten

  • Aktuelle Score auslesen und Updaten

    Nabend Ich habe ein kleines Score System was per Befehl die aktuellen kills des Servers ausliest und per Texdraw anzeigt nun möchte Ich aber das es ab dem Spawn angezeigt wird und alle 5 Sekunden automatisch updatet kriege es nicht hin habe schon mit public scoreupdate() versucht und einen timer eingebaut klappt aber nicht kann mir wer helfen ?(

    [pwn]
    new Text: text_Top[2];
    enum rankingEnum
    {
    player_Score,
    player_ID
    }

    public OnFilterScriptInit()
    {
    text_Top[0] = TextDrawCreate(79.000000, 135.000000, "Aktuelle Toplist");
    TextDrawAlignment(text_Top[0], 2);
    TextDrawBackgroundColor(text_Top[0], 255);
    TextDrawFont(text_Top[0], 1);
    TextDrawLetterSize(text_Top[0], 0.280000, 1.499999);
    TextDrawColor(text_Top[0], -1);
    TextDrawSetOutline(text_Top[0], 0);
    TextDrawSetProportional(text_Top[0], 1);
    TextDrawSetShadow(text_Top[0], 0);
    text_Top[1] = TextDrawCreate(16.000000, 135.000000, " ");
    TextDrawBackgroundColor(text_Top[1], 255);
    TextDrawFont(text_Top[1], 1);
    TextDrawLetterSize(text_Top[1], 0.200000, 0.999999);
    TextDrawColor(text_Top[1], -1);
    TextDrawSetOutline(text_Top[1], 0);
    TextDrawSetProportional(text_Top[1], 1);
    TextDrawSetShadow(text_Top[1], 0);
    TextDrawUseBox(text_Top[1], 1);
    TextDrawBoxColor(text_Top[1], 150);
    TextDrawTextSize(text_Top[1], 143.000000, 20.000000);
    return 1;
    }

    public OnFilterScriptExit()
    {
    TextDrawDestroy(text_Top[0]);
    TextDrawDestroy(text_Top[1]);
    return 1;
    }

    stock GetPlayerHighestScores(array[][rankingEnum], left, right)
    {
    new
    tempLeft = left,
    tempRight = right,
    pivot = array[(left + right) / 2][player_Score],
    tempVar
    ;
    while(tempLeft <= tempRight)
    {
    while(array[tempLeft][player_Score] > pivot) tempLeft++;
    while(array[tempRight][player_Score] < pivot) tempRight--;

    if(tempLeft <= tempRight)
    {
    tempVar = array[tempLeft][player_Score], array[tempLeft][player_Score] = array[tempRight][player_Score], array[tempRight][player_Score] = tempVar;
    tempVar = array[tempLeft][player_ID], array[tempLeft][player_ID] = array[tempRight][player_ID], array[tempRight][player_ID] = tempVar;
    tempLeft++, tempRight--;
    }
    }
    if(left < tempRight) GetPlayerHighestScores(array, left, tempRight);
    if(tempLeft < right) GetPlayerHighestScores(array, tempLeft, right);
    }

    public OnPlayerCommandText(playerid, cmdtext[])
    {
    if(!strcmp(cmdtext, "/bester", true))
    {
    new
    playerScores[MAX_PLAYERS][rankingEnum],
    index
    ;
    for(new i; i != MAX_PLAYERS; ++i)
    {
    if(IsPlayerConnected(i) && !IsPlayerNPC(i))
    {
    playerScores[index][player_Score] = GetPlayerScore(i);
    playerScores[index++][player_ID] = i;
    }
    }
    GetPlayerHighestScores(playerScores, 0, index);

    new
    score_Text[256] = "~n~",
    player_Name[20]
    ;
    for(new i; i < 5; ++i)
    {
    if(i < index)
    {
    GetPlayerName(playerScores[player_ID], player_Name, sizeof(player_Name));
    format(score_Text, sizeof(score_Text), "%s~n~~b~%d. ~w~%s - ~r~%d", score_Text, i + 1, player_Name, playerScores[i][player_Score]);
    }
    else
    format(score_Text, sizeof(score_Text), "%s~n~~b~%d. ~r~Niemand", score_Text, i + 1);
    }
    TextDrawSetString(text_Top[1], score_Text);
    TextDrawShowForPlayer(playerid, text_Top[0]);
    TextDrawShowForPlayer(playerid, text_Top[1]);
    return 1;
    }
    return 0;
    }[/pwn]

    Also möchte das Die Box ab dem Spawn angezeigt und alle 5 Sekunden automatisch upgedatet wird bis zum Disconnect (nicht mehr über Befehl)
  • TextDrawShowForPlayer(playerid, text_Top[0]);
    TextDrawShowForPlayer(playerid, text_Top[1]);

    einfach unter OnPlayerConnect und dann mit einem Timer jede 5 Sekunden durchlaufen lassen, kannst uns ja deinen Ansatz zeigen, den du versucht hast
  • :( [pwn]public OnPlayerConnect(playerid)
    {
    TextDrawShowForPlayer(playerid, text_Top[0]);
    TextDrawShowForPlayer(playerid, text_Top[1]);
    return 1;
    }[/pwn]

    [pwn]#define Topupdate 2500[/pwn]

    [pwn]forward Topupdate();
    public Topupdate()
    {
    TextDrawShowForPlayer(playerid, text_Top[0]);
    TextDrawShowForPlayer(playerid, text_Top[1]);
    }
    return 1;
    }[/pwn]

    [pwn]public OnFilterScriptInit()
    {
    SetTimer("Topupdate",Topupdate,1);[/pwn]

    geht so leider nicht
  • [pwn]C:\Users\SERVER\Desktop\to.pwn(113) : error 010: invalid function or declaration
    C:\Users\SERVER\Desktop\to.pwn(114) : error 001: expected token: "-identifier-", but found "-integer value-"
    C:\Users\SERVER\Desktop\to.pwn(119) : error 010: invalid function or declaration[/pwn]

    Bei Topupdate

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Mafiafight ()

  • Du kannst die Begriffe ja auch nicht einfach vertauschen, Beispiel:
    Du erstellt einen Timer/TimerEx und rufst den dann auf dann könnte der Inhalt des Callbacks so aussehen, ich würde dir aber raten das ganze in einer Funktion zu machen, sprich in einem Stock:
    [pwn]new str[50];
    format(str, sizeof str, "%i", GetPlayerScore(playerid));
    TextDrawSetString(TextDrawDefinition[playerid], str);[/pwn]
    "Das müsste jetzt funktionieren..."

    ---
    Mit freundlichen Grüßen,
    Vincent Petritz
  • also mit dem befehl kan man ne box einblenden die alle aktuellen kills anzeigt . eigtl soll der befehl per timer ausgeführt werden, also müsste man es ja umbauen somit wird es ja dan für jeden angezeigt, anzeigen lassen kann ich es ja per public OnGameModeInit() nur müssen jetzt die daten geholt werden so wie sie im befehl sind /bester
  • [pwn]//Stock:
    stock Statistiken()
    {
    new playerScores[MAX_PLAYERS][rankingEnum], index;
    for(new i; i != MAX_PLAYERS; ++i)
    {
    if(IsPlayerConnected(i) && !IsPlayerNPC(i))
    {
    playerScores[index][player_Score] = GetPlayerScore(i);
    playerScores[index++][player_ID] = i;
    }
    }
    GetPlayerHighestScores(playerScores, 0, index);
    new score_Text[256] = "~n~", player_Name[20];
    for(new i; i < 5; ++i)
    {
    if(i < index)
    {
    GetPlayerName(playerScores[player_ID], player_Name, sizeof(player_Name));
    format(score_Text, sizeof(score_Text), "%s~n~~b~%d. ~w~%s - ~r~%d", score_Text, i + 1, player_Name, playerScores[i][player_Score]);
    }
    else {
    format(score_Text, sizeof(score_Text), "%s~n~~b~%d. ~r~Niemand", score_Text, i + 1);
    }
    }
    TextDrawSetString(text_Top[1], score_Text);
    TextDrawShowForPlayer(playerid, text_Top[0]);
    TextDrawShowForPlayer(playerid, text_Top[1]);
    return 1;
    }

    //OnPlayerDeath z.B.:
    Statistiken();[/pwn]
    "Das müsste jetzt funktionieren..."

    ---
    Mit freundlichen Grüßen,
    Vincent Petritz
  • Man blöder Fehler sollte mal mehr pennen X( Danke klappt soweit, aber die Daten werden nun nur für ID 0 angezeigt

    [pwn]public Punkteupdate(playerid)
    {
    new playerScores[MAX_PLAYERS][rankingEnum], index;
    for(new i; i != MAX_PLAYERS; ++i)
    {
    if(IsPlayerConnected(i) && !IsPlayerNPC(i))
    {
    playerScores[index][player_Score] = GetPlayerScore(i);
    playerScores[index++][player_ID] = i;
    }
    }
    GetPlayerHighestScores(playerScores, 0, index);
    new score_Text[256] = "~n~", player_Name[20];
    for(new i; i < 5; ++i)
    {
    if(i < index)
    {
    GetPlayerName(playerScores[player_ID], player_Name, sizeof(player_Name));
    format(score_Text, sizeof(score_Text), "%s~n~~b~%d. ~w~%s - ~r~%d", score_Text, i + 1, player_Name, playerScores[i][player_Score]);
    }
    else {
    format(score_Text, sizeof(score_Text), "%s~n~~b~%d. ~r~Niemand", score_Text, i + 1);
    }
    }
    TextDrawSetString(text_Top[1], score_Text);
    TextDrawShowForPlayer(playerid, text_Top[0]);
    TextDrawShowForPlayer(playerid, text_Top[1]);
    return 1;
    }[/pwn]
  • Also die Punkte werden richtig gezählt! Nur der Texdraw + die Box werden nur für ID0 angezeigt


    [pwn]stock GetPlayerHighestScores(array[][rankingEnum], left, right)
    {
    new
    tempLeft = left,
    tempRight = right,
    pivot = array[(left + right) / 2][player_Score],
    tempVar
    ;
    while(tempLeft <= tempRight)
    {
    while(array[tempLeft][player_Score] > pivot) tempLeft++;
    while(array[tempRight][player_Score] < pivot) tempRight--;
    if(tempLeft <= tempRight)
    {
    tempVar = array[tempLeft][player_Score], array[tempLeft][player_Score] = array[tempRight][player_Score], array[tempRight][player_Score] = tempVar;
    tempVar = array[tempLeft][player_ID], array[tempLeft][player_ID] = array[tempRight][player_ID], array[tempRight][player_ID] = tempVar;
    tempLeft++, tempRight--;
    }
    }
    if(left < tempRight) GetPlayerHighestScores(array, left, tempRight);
    if(tempLeft < right) GetPlayerHighestScores(array, tempLeft, right);
    }[/pwn]