Spielerdaten im Textdraw

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
  • Hallo,


    ich habe in einem TV System eine TextdrawBox erstellt, in dieser Box möchte ich einige Spielerdaten (z.B HP, Name, etc) des Beobachteten darstellen, hab jedoch kein Plan wie.


    Aktueller Code;




    ocmd:tv(playerid,params[])
    {
    new pID,string[128];
    if(!isAdmin(playerid,1))return SendClientMessage(playerid,COLOR_GREY,"Du darfst diesen Befehl nicht benutzen.");
    if(sscanf(params,"u",pID))return SendClientMessage(playerid,COLOR_GREY,"Verwendung: /tv [Spieler]");
    if(!IsPlayerConnected(pID))return SendClientMessage(playerid,COLOR_GREY,"Dieser Spieler ist nicht online.");
    if(pID == playerid)return SendClientMessage(playerid,COLOR_GREY,"Du kannst dich nicht selbst beobachten.");
    TogglePlayerSpectating(playerid,1);
    PlayerSpectatePlayer(playerid, pID);
    format(string,sizeof(string),"Du beobachtest nun Spieler: %s.",PlayerName(pID));
    SendClientMessage(playerid,COLOR_BLUE,string);
    Textdraw0 = TextDrawCreate(636.399963, 309.873321, "usebox");
    TextDrawLetterSize(Textdraw0, 0.000000, 9.390002);
    TextDrawTextSize(Textdraw0, 463.600006, 0.000000);
    TextDrawAlignment(Textdraw0, 1);
    TextDrawColor(Textdraw0, 0);
    TextDrawUseBox(Textdraw0, true);
    TextDrawBoxColor(Textdraw0, 102);
    TextDrawSetShadow(Textdraw0, 0);
    TextDrawSetOutline(Textdraw0, 0);
    TextDrawFont(Textdraw0, 0);
    Textdraw1 = TextDrawCreate(495.199920, 309.119934, "Leben:");
    TextDrawLetterSize(Textdraw1, 0.264399, 2.257065);
    TextDrawTextSize(Textdraw1, 2.399998, 8.213332);
    TextDrawAlignment(Textdraw1, 3);
    TextDrawColor(Textdraw1, -1);
    TextDrawSetShadow(Textdraw1, 0);
    TextDrawSetOutline(Textdraw1, 0);
    TextDrawBackgroundColor(Textdraw1, 51);
    TextDrawFont(Textdraw1, 1);
    TextDrawSetProportional(Textdraw1, 1);
    TextDrawShowForPlayer(playerid,Textdraw0);
    TextDrawShowForPlayer(playerid,Textdraw1);
    return 1;
    }


    ocmd:tvoff(playerid,params[])
    {
    if(!isAdmin(playerid,1))return SendClientMessage(playerid,COLOR_GREY,"Du darfst diesen Befehl nicht benutzen.");
    TogglePlayerSpectating(playerid,0);
    SetCameraBehindPlayer(playerid);
    SendClientMessage(playerid,COLOR_BLUE,"Du hast die Beobachtung beendet.");
    TextDrawDestroy(Textdraw0);
    TextDrawDestroy(Textdraw1);
    return 1;
    }
    ( Jeffry: ) <3
    Danke im Voraus.


    Viele Grüße

    4 Mal editiert, zuletzt von Aviero ()

  • Schritt 1:
    Erstelle die Textdraws als PlayerTextDraws in OnPlayerConnect.


    Schritt 2:
    Setze beim tv Befehl eine SpielerVariable für playerid auf den Wert von pID, damit du später drauf zugreifen kannst.


    Schritt 3:
    Starte bei OnGameModeInit einen 1 Sekunden Timer, der die Werte für alle (Schleife!) die Spieler aktualisiert, die das Textdraw sehen (SpielerVariable nicht -1).
    Hier wird die SpielerVariable von Schritt 2 benötigt, damit klar ist, von welchem Spieler die Daten angezeigt werden sollen.


    Schritt 4:
    Beim beenden des tv-Modus und bei OnPlayerConnect muss die SpielerVariable auf -1 gesetzt werden.

  • Hey,


    habe jetzt nur die Box erstellt, aktueller Befehl:


    new PlayerText:tvbox[MAX_PLAYERS];


    SetTimer("tvbox",1000,1);


    tvbox[playerid] = CreatePlayerTextDraw(playerid,636.399963, 309.873321, "usebox");
    PlayerTextDrawUseBox(playerid, tvbox[playerid], 1);
    PlayerTextDrawBoxColor(playerid, tvbox[playerid], 0x00000066);
    PlayerTextDrawLetterSize(playerid,tvbox[playerid], 0.000000, 9.390002);
    PlayerTextDrawTextSize(playerid,tvbox[playerid], 463.600006, 0.000000);
    PlayerTextDrawAlignment(playerid,tvbox[playerid], 1);
    PlayerTextDrawColor(playerid,tvbox[playerid], 0);
    PlayerTextDrawUseBox(playerid,tvbox[playerid], true);
    PlayerTextDrawBoxColor(playerid,tvbox[playerid], 102);
    PlayerTextDrawSetShadow(playerid,tvbox[playerid], 0);
    PlayerTextDrawSetOutline(playerid,tvbox[playerid], 0);
    PlayerTextDrawFont(playerid,tvbox[playerid], 0);



    ocmd:tv(playerid,params[])
    {
    new pID,string[128];
    if(!isAdmin(playerid,1))return SendClientMessage(playerid,COLOR_GREY,"Du darfst diesen Befehl nicht benutzen.");
    if(sscanf(params,"u",pID))return SendClientMessage(playerid,COLOR_GREY,"Verwendung: /tv [Spieler]");
    if(!IsPlayerConnected(pID))return SendClientMessage(playerid,COLOR_GREY,"Dieser Spieler ist nicht online.");
    if(pID == playerid)return SendClientMessage(playerid,COLOR_GREY,"Du kannst dich nicht selbst beobachten.");
    TogglePlayerSpectating(playerid,1);
    PlayerSpectatePlayer(playerid, pID);
    format(string,sizeof(string),"Du beobachtest nun Spieler: %s.",PlayerName(pID));
    SendClientMessage(playerid,COLOR_BLUE,string);
    PlayerTextDrawShow(playerid,tvbox[playerid]);
    return 1;
    }


    ocmd:tvoff(playerid,params[])
    {
    if(!isAdmin(playerid,1))return SendClientMessage(playerid,COLOR_GREY,"Du darfst diesen Befehl nicht benutzen.");
    TogglePlayerSpectating(playerid,0);
    SetCameraBehindPlayer(playerid);
    SendClientMessage(playerid,COLOR_BLUE,"Du hast die Beobachtung beendet.");
    PlayerTextDrawHide(playerid,tvbox[playerid]);
    return 1;
    }


    Das mit der Box war nicht besonderes, ich konnte leider nicht weiter machen, da ich nicht genau verstanden habe, wie ich diesen Schritt machen soll:

    Setze beim tv Befehl eine SpielerVariable für playerid auf den Wert von pID, damit du später drauf zugreifen kannst.

    Wie & wo genau muss ich das anstellen? Verstehe das nicht ganz, tut mir leid. :p


    Jeffry:

    Einmal editiert, zuletzt von Aviero ()

  • Du erstellst eine Spielervariable unter deinen Includes:
    new tvID[MAX_PLAYERS] = {-1,...};


    Dann bei OnPlayerConnect/OnPlayerDisconnect:
    tvID[playerid] = -1;


    Beim tv Befehl:
    tvID[playerid] = pID;


    Beim tvoff Befehl:
    tvID[playerid] = -1;


    Und dann das Callback zum Timer:
    forward tvbox();
    public tvbox()
    {
    for(new i=0; i<MAX_PLAYERS; i++)
    {
    if(!IsPlayerConnected(i) || tvID[i] != -1)
    {
    //Und hier dann das Textdraw updaten lassen. Am besten du machst über die Box ein zweites Textdraw mit den Daten des Spielers.
    //Die playerid die das Textdraw sieht ist "i", die playerid dessen Daten ausgelesen werden ist "tvID[i]".
    //TextDrawSetString etc...
    }
    }
    }



    Edit: LeijaT: Danke haha, klar :p

    3HZXdYd.png

    Einmal editiert, zuletzt von Jeffry () aus folgendem Grund: Klammer

  • Also erst einmal checke ich nicht, mit welcher Funktion ich das Textdraw Updaten lassen soll. Also hier, bei dem Callback;

    public tvbox()
    {
    for(new i=0; i<MAX_PLAYERS; i++)
    {
    if(!IsPlayerConnected(i) || tvID[i] != -1)
    {
    //Und hier dann das Textdraw updaten lassen. Am besten du machst über die Box ein zweites Textdraw mit den Daten des Spielers.
    //Die playerid die das Textdraw sieht ist "i", die playerid dessen Daten ausgelesen werden ist "tvID[i]".
    //TextDrawSetString etc...
    }
    }
    }


    Soll ich, wenn ich ein TextDraw für die Spielerdaten erstellen möchte, für alles ein neues Textdraw erstellen? Also bspw, für health ein neues textdraw und für armour auch noch ein separates Textdraw für Armour


    Kann ich das nicht einfach hier machen?;

    tvbox[playerid] = CreatePlayerTextDraw(playerid,636.399963, 309.873321, "usebox");
    PlayerTextDrawUseBox(playerid, tvbox[playerid], 1);
    PlayerTextDrawBoxColor(playerid, tvbox[playerid], 0x00000066);
    PlayerTextDrawLetterSize(playerid,tvbox[playerid], 0.000000, 9.390002);
    PlayerTextDrawTextSize(playerid,tvbox[playerid], 463.600006, 0.000000);
    PlayerTextDrawAlignment(playerid,tvbox[playerid], 1);
    PlayerTextDrawColor(playerid,tvbox[playerid], 0);
    PlayerTextDrawUseBox(playerid,tvbox[playerid], true);
    PlayerTextDrawBoxColor(playerid,tvbox[playerid], 102);
    PlayerTextDrawSetShadow(playerid,tvbox[playerid], 0);
    PlayerTextDrawSetOutline(playerid,tvbox[playerid], 0);
    PlayerTextDrawFont(playerid,tvbox[playerid], 0);


    Dann irgendwie die HP in einer Variable speichern und diese dann im TextDraw speichern und wiedergeben

  • tvbox[playerid] = CreatePlayerTextDraw(playerid,636.399963, 309.873321, "usebox");
    PlayerTextDrawUseBox(playerid, tvbox[playerid], 1);
    PlayerTextDrawBoxColor(playerid, tvbox[playerid], 0x00000066);
    PlayerTextDrawLetterSize(playerid,tvbox[playerid], 1.000000, 9.390002);
    PlayerTextDrawTextSize(playerid,tvbox[playerid], 463.600006, 0.000000);
    PlayerTextDrawAlignment(playerid,tvbox[playerid], 1);
    PlayerTextDrawColor(playerid,tvbox[playerid], 0xFF0000FF);
    PlayerTextDrawUseBox(playerid,tvbox[playerid], true);
    PlayerTextDrawBoxColor(playerid,tvbox[playerid], 102);
    PlayerTextDrawSetShadow(playerid,tvbox[playerid], 0);
    PlayerTextDrawSetOutline(playerid,tvbox[playerid], 0);
    PlayerTextDrawFont(playerid,tvbox[playerid], 0);


    forward tvboxTimer();
    public tvboxTimer()
    {
    new str[256], pname[MAX_PLAYER_NAME];
    for(new i=0; i<MAX_PLAYERS; i++)
    {
    if(!IsPlayerConnected(i) || tvID[i] != -1)
    {
    GetPlayerName(tvID[i], pname, MAX_PLAYER_NAME);
    format(str, sizeof(str), "%s (ID: %d)", pname, tvID[i]);
    PlayerTextDrawSetString(i, tvbox[i], str);
    PlayerTextDrawShow(i, tvbox[i]);
    }
    else PlayerTextDrawHide(i, tvbox[i]);
    }
    return 1;
    }


    Bei OnGameModeInit:
    SetTimer("tvboxTimer", 1000, true);


    Dann solltest du, wenn du jemanden TV'st, den Name sehen, des Spielers den du TV'st.

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

  • ocmd:tv(playerid,params[])
    {
    new pID,string[128];
    if(!isAdmin(playerid,1))return SendClientMessage(playerid,COLOR_GREY,"Du darfst diesen Befehl nicht benutzen.");
    if(sscanf(params,"u",pID))return SendClientMessage(playerid,COLOR_GREY,"Verwendung: /tv [Spieler]");
    if(!IsPlayerConnected(pID))return SendClientMessage(playerid,COLOR_GREY,"Dieser Spieler ist nicht online.");
    if(pID == playerid)return SendClientMessage(playerid,COLOR_GREY,"Du kannst dich nicht selbst beobachten.");
    TogglePlayerSpectating(playerid,1);
    PlayerSpectatePlayer(playerid, pID);
    format(string,sizeof(string),"Du beobachtest nun Spieler: %s.",PlayerName(pID));
    SendClientMessage(playerid,COLOR_BLUE,string);
    PlayerTextDrawShow(playerid,tvbox[playerid]);
    tvID[playerid] = pID;
    return 1;
    }


    ocmd:tvoff(playerid,params[])
    {
    if(!isAdmin(playerid,1))return SendClientMessage(playerid,COLOR_GREY,"Du darfst diesen Befehl nicht benutzen.");
    TogglePlayerSpectating(playerid,0);
    SetCameraBehindPlayer(playerid);
    SendClientMessage(playerid,COLOR_BLUE,"Du hast die Beobachtung beendet.");
    PlayerTextDrawHide(playerid,tvbox[playerid]);
    tvID[playerid] = -1;
    return 1;
    }


    Das einzige was ich anders gemacht habe, war das hier;

    Hab ich zu das gemacht: new tvID[MAX_PLAYERS]; - Ein Kollege meinte, so würde es auch gehen

  • Doch, das macht einen Unterschied, das muss mit -1 deklariert werden, da es ja eine ID 0 geben kann, daher weiß der Code dann nicht, ob 0 jetzt nichts heißt, oder ID 0. Bei -1 weiß er das.

    So wie das aussieht wird der Timer bei dir gar nicht aufgerufen, sonst würde es dir die Box schon anzeigen, bevor du überhaupt den TV Befehl nutzt (dadurch, dass du es auf 0

  • Nichts, das muss genau so bleiben (Edit: Mit } am Ende anstatt ]) . ;)
    Das heißt, dass beim instanziieren alle Werte, sprich jeder Index von 0 bis MAX_PLAYERS-1 auf -1 gesetzt werden. Die 3 Punkte sind hier eine korrekte Anweisung.

    3HZXdYd.png

    Einmal editiert, zuletzt von Jeffry ()