Wanteds über den Benutzer

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
  • Also ich nenne nun mal ein paar beispiele.


    Max und Moritz nehmen wir da einmal



    Max besitzt insgesamt 3 Wanteds. Nun soll Moritz aber sehen können wenn er in 5 Meter reichweite ist z.b das über seinen Namen eine Anzahl seiner Wanteds steht.

  • Du musst für den Spieler ein 3DTextLabel erstellen, dieses aktalisierst du wenn du dem Spieler neue Wanteds gibst oder wenn die Wanteds weg gehen, wenn die Wanteds weg gehen lösch du das Label,
    Das Label kannst du mit Attach3DTextLabelToPlayer ransetzen...


    Du brauchst folgende funktionen:


    https://wiki.sa-mp.com/wiki/Attach3DTextLabelToPlayer
    https://wiki.sa-mp.com/wiki/Create3DTextLabel


    https://wiki.sa-mp.com/wiki/Delete3DTextLabel


    https://wiki.sa-mp.com/wiki/Update3DTextLabelText



    Wenn du dem Spieler Wanteds gibst, nimmst du am besten Update3D....



    Bei Fragen, einfach stellen :D

  • Soweit verstanden und durchgeführt.



    Wanteds werden mir nicht bei jedem Spieler angezeigt der den Rang pMember == 1 hat.



    if(PlayerInfo[playerid][pMember]==1)
    {
    new string2[128];
    format(string2,sizeof(string2), "Wanteds: %d", PlayerInfo[p_id][pWanted]);
    label=Create3DTextLabel(string2, COLOR_BUSBLUE, 0.0, 0.0, 0.4,10, 0, 1);
    }


    Wo könnt da der Fehler sein

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • as Label soll nur für den pMember Angezeigt werden der den Wert 1 hat. Attachet ist das woanders. Denn es soll ja nicht nur der Attechet werden der pMember == 1 ist



    if(Spieler[i][Fraktion] == 1)
    {
    new PlayerText3D:label;
    for(new pwtds=0; pwtds<MAX_PLAYERS; pwtds++)
    {
    if(Spieler[pwtds][Wanteds] > 0)
    {
    new string[50];
    format(string,sizeof(string),"(%d) %s\nWanteds: %d\nWantedgrund: %s",pwtds,SpielerName(pwtds),Spieler[pwtds][Wanteds],Spieler[pwtds][WantedGrund]);
    label = CreatePlayer3DTextLabel(i,string,COLOR_WHITE,0.0,0.0,1.0,20.0,pwtds,INVALID_VEHICLE_ID,1);
    }
    else if(Spieler[pwtds][Wanteds] == 0)
    {
    DeletePlayer3DTextLabel(pwtds,label);
    }
    }
    }


    Hier bitteschön, funktioniert einwandfrei. Musst nur die einzelnen Variabeln ändern. Das ganze Paket packst du in einen 1-Sekunden Timer, kann Global sein.


    vergiss die For-Schleife nicht

    for(new i=0; i<MAX_PLAYERS; i++)




    Gruß, Kevin

    Mit freundlichen Grüßen,


    Keslo

  • Das Label muss für jeden Spieler separat definiert und erstellt werden. Daher unter den Includes:
    new Text3D:wantedLabel[MAX_PLAYERS];


    In OnPlayerConnect:
    wantedLabel[playerid] = Create3DTextLabel("Wanted: 0", COLOR_BUSBLUE, 0.0, 0.0, 0.4,10, 0, 1);


    In OnPlayerSpawn:
    Attach3DTextLabelToPlayer(wantedLabel[playerid], playerid, 0.0, 0.0, 0.7);


    In OnPlayerDisconnect:
    Delete3DTextLabel(wantedLabel[playerid]);


    Und an der Stelle, an der sich das Wanted aktualisiert (kein Timer notwendig):
    new str[16];
    format(str, sizeof(str), "Wanted: %d", PlayerInfo[p_id][pWanted]);
    Update3DTextLabelText(wantedLabel[p_id], COLOR_BUSBLUE, str);

  • So, wie ich das verstanden habe, sollen es nur Mitglieder einer Fraktion sehen können.

    Dem ersten Post war das nicht zu entnehmen.


    Da es im Thread-Verlauf aber wohl dazu kommt:
    Dann würde der Code so aussehen:


    new PlayerText3D:wantedLabel[MAX_PLAYERS][MAX_PLAYERS];


    Nach dem Login (und, falls der Spieler seinen pMember im laufen Betrieb ändern kann, zusätzlich dort wo das geändert wird):
    if(PlayerInfo[playerid][pMember] == 1)
    {
    new str[16];
    for(new i = 0, j = GetMaxPlayers(); i < j; i++)
    {
    format(str, sizeof(str), "Wanted: %d", PlayerInfo[i][pWanted]);
    wantedLabel[playerid][i] = CreatePlayer3DTextLabel(playerid, str, COLOR_BUSBLUE, 0.0, 0.0, 0.4, 10, i);
    }
    }



    In OnPlayerDisconnect (und, falls der Spieler seinen pMember im laufen Betrieb ändern kann, zusätzlich dort wo das geändert wird und zwar bevor pMember gesetzt wird):
    if(PlayerInfo[playerid][pMember] == 1)
    {
    for(new i = 0, j = GetMaxPlayers(); i < j; i++)
    {
    DeletePlayer3DTextLabel(playerid, wantedLabel[playerid][i]);
    }
    }



    An der Stelle, an der sich das Wanted aktualisiert (kein Timer notwendig):
    new str[16];
    for(new i = 0, j = GetMaxPlayers(); i < j; i++)
    {
    if(PlayerInfo[i][pMember] == 1)
    {
    format(str, sizeof(str), "Wanted: %d", PlayerInfo[p_id][pWanted]);
    UpdatePlayer3DTextLabelText(i, wantedLabel[i][p_id], COLOR_BUSBLUE, str);
    }
    }



    Wobei ich hier voraussetze, dass SA-MP das Label einem Spieler auch attached, wenn dieser nach dem pMember = 1 auf den Server kommt.
    Sollte das nicht der Fall sein, verkompliziert sich die ganze Sache nochmal.

  • Beitrag von robbi2304 ()

    Dieser Beitrag wurde vom Autor aus folgendem Grund gelöscht: // Edit Jeffry fügte neues hinzu ().
  • Das attachen wird hier geregelt:
    wantedLabel[playerid][i] = CreatePlayer3DTextLabel(playerid, str, COLOR_BUSBLUE, 0.0, 0.0, 0.4, 10, i);
    Das "i" am Ende heißt, dass es an den Spieler mit der ID "i" attached wird.


    Sprich, alle pMember = 1 sehen für alle Spieler das Label (sofern SA-MP das auch für nicht-online Spieler versteht, teste das bitte so).

  • Das attachen wird hier geregelt:
    wantedLabel[playerid][i] = CreatePlayer3DTextLabel(playerid, str, COLOR_BUSBLUE, 0.0, 0.0, 0.4, 10, i);
    Das "i" am Ende heißt, dass es an den Spieler mit der ID "i" attached wird.


    Sprich, alle pMember = 1 sehen für alle Spieler das Label (sofern SA-MP das auch für nicht-online Spieler versteht, teste das bitte so).

    Habe ich nun getestet, bei ID 0 kann man den Richtigen Wert sehen. Bei ID 1 wird der Wert nicht ausgegeben.

  • Ok.
    Dann füge bei OnPlayerConnect das mal hinzu:
    new str[16];
    for(new i = 0, j = GetMaxPlayers(); i < j; i++)
    {
    if(PlayerInfo[i][pMember] == 1)
    {
    DeletePlayer3DTextLabel(i, wantedLabel[i][playerid]);
    format(str, sizeof(str), "Wanted: %d", PlayerInfo[playerid][pWanted]);
    wantedLabel[i][playerid] = CreatePlayer3DTextLabel(i, str, COLOR_BUSBLUE, 0.0, 0.0, 0.4, 10, playerid);
    }
    }


    Klappt es dann?